diff options
author | Thorbjørn Lindeijer <bjorn@lindeijer.nl> | 2025-03-05 16:03:28 +0100 |
---|---|---|
committer | Thorbjørn Lindeijer <bjorn@lindeijer.nl> | 2025-03-07 22:27:48 +0100 |
commit | f1fa20dbaa8769d928c00c24f860ea5e62ccf945 (patch) | |
tree | d42e89d0af50bd23f8fd905d2185f08e0fe07825 /src | |
parent | ad8a68be501d8ffef9fbfceacdc4c13b84a0d74a (diff) | |
download | mana-f1fa20dbaa8769d928c00c24f860ea5e62ccf945.tar.gz mana-f1fa20dbaa8769d928c00c24f860ea5e62ccf945.tar.bz2 mana-f1fa20dbaa8769d928c00c24f860ea5e62ccf945.tar.xz mana-f1fa20dbaa8769d928c00c24f860ea5e62ccf945.zip |
Fixed GeneralHandler deletion when switching server types
When switching between tmwAthena and Manaserv the GeneralHandler was not
getting deleted, resulting in crashes later on when the still around
instance (or one of its child handlers) would try to respond to events
it was listening to.
Diffstat (limited to 'src')
-rw-r--r-- | src/client.cpp | 5 | ||||
-rw-r--r-- | src/net/generalhandler.h | 2 | ||||
-rw-r--r-- | src/net/manaserv/adminhandler.cpp | 6 | ||||
-rw-r--r-- | src/net/manaserv/connection.cpp | 5 | ||||
-rw-r--r-- | src/net/manaserv/generalhandler.cpp | 29 | ||||
-rw-r--r-- | src/net/manaserv/generalhandler.h | 2 | ||||
-rw-r--r-- | src/net/messagehandler.h | 5 | ||||
-rw-r--r-- | src/net/net.cpp | 17 | ||||
-rw-r--r-- | src/net/tmwa/generalhandler.cpp | 9 | ||||
-rw-r--r-- | src/net/tmwa/generalhandler.h | 2 | ||||
-rw-r--r-- | src/net/tmwa/guildhandler.cpp | 5 |
11 files changed, 33 insertions, 54 deletions
diff --git a/src/client.cpp b/src/client.cpp index e5178048..2743a8b2 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -908,13 +908,10 @@ int Client::exec() case STATE_EXIT: logger->log("State: EXIT"); - Net::unload(); break; case STATE_FORCE_QUIT: logger->log("State: FORCE QUIT"); - if (Net::getGeneralHandler()) - Net::getGeneralHandler()->unload(); mState = STATE_EXIT; break; @@ -932,6 +929,8 @@ int Client::exec() } } + Net::unload(); + return 0; } diff --git a/src/net/generalhandler.h b/src/net/generalhandler.h index 21653265..93d76421 100644 --- a/src/net/generalhandler.h +++ b/src/net/generalhandler.h @@ -35,8 +35,6 @@ class GeneralHandler virtual void unload() = 0; virtual void flushNetwork() = 0; - - virtual void clearHandlers() = 0; }; } // namespace Net diff --git a/src/net/manaserv/adminhandler.cpp b/src/net/manaserv/adminhandler.cpp index 78e6acb2..ef155a38 100644 --- a/src/net/manaserv/adminhandler.cpp +++ b/src/net/manaserv/adminhandler.cpp @@ -31,17 +31,11 @@ extern Connection *chatServerConnection; AdminHandler::AdminHandler() { - static const uint16_t _messages[] = - { - 0 - }; - handledMessages = _messages; adminHandler = this; } void AdminHandler::handleMessage(MessageIn &msg) { - } void AdminHandler::kick(const std::string &name) diff --git a/src/net/manaserv/connection.cpp b/src/net/manaserv/connection.cpp index 896d86ad..1b6f757a 100644 --- a/src/net/manaserv/connection.cpp +++ b/src/net/manaserv/connection.cpp @@ -45,6 +45,8 @@ Connection::~Connection() bool Connection::connect(const std::string &address, enet_uint16 port) { logger->log("Net::Connection::connect(%s, %i)", address.c_str(), port); + if (mConnection) + disconnect(); if (address.empty()) { @@ -87,8 +89,7 @@ void Connection::disconnect() bool Connection::isConnected() { - return (mConnection) ? - (mConnection->state == ENET_PEER_STATE_CONNECTED) : false; + return mConnection && mConnection->state == ENET_PEER_STATE_CONNECTED; } void Connection::send(const ManaServ::MessageOut &msg) diff --git a/src/net/manaserv/generalhandler.cpp b/src/net/manaserv/generalhandler.cpp index b947cff4..7f5f5081 100644 --- a/src/net/manaserv/generalhandler.cpp +++ b/src/net/manaserv/generalhandler.cpp @@ -47,8 +47,6 @@ #include "resources/attributes.h" -extern Net::GeneralHandler *generalHandler; - extern ManaServ::LoginHandler *loginHandler; namespace ManaServ { @@ -84,8 +82,6 @@ GeneralHandler::GeneralHandler(): gameServerConnection = getConnection(); chatServerConnection = getConnection(); - generalHandler = this; - listen(Event::ClientChannel); listen(Event::GameChannel); } @@ -129,18 +125,28 @@ void GeneralHandler::reload() void GeneralHandler::unload() { - clearHandlers(); + clearNetworkHandlers(); if (accountServerConnection) + { accountServerConnection->disconnect(); + delete accountServerConnection; + accountServerConnection = nullptr; + } + if (gameServerConnection) + { gameServerConnection->disconnect(); + delete gameServerConnection; + gameServerConnection = nullptr; + } + if (chatServerConnection) + { chatServerConnection->disconnect(); - - delete accountServerConnection; - delete gameServerConnection; - delete chatServerConnection; + delete chatServerConnection; + chatServerConnection = nullptr; + } finalize(); } @@ -157,11 +163,6 @@ void GeneralHandler::flushNetwork() } } -void GeneralHandler::clearHandlers() -{ - clearNetworkHandlers(); -} - void GeneralHandler::event(Event::Channel channel, const Event &event) { diff --git a/src/net/manaserv/generalhandler.h b/src/net/manaserv/generalhandler.h index 865bbd0d..de0e3138 100644 --- a/src/net/manaserv/generalhandler.h +++ b/src/net/manaserv/generalhandler.h @@ -43,8 +43,6 @@ class GeneralHandler : public Net::GeneralHandler, public EventListener void flushNetwork() override; - void clearHandlers() override; - void event(Event::Channel channel, const Event &event) override; protected: diff --git a/src/net/messagehandler.h b/src/net/messagehandler.h index adf61090..21973fa9 100644 --- a/src/net/messagehandler.h +++ b/src/net/messagehandler.h @@ -31,9 +31,12 @@ namespace Net { class MessageHandler { public: - const uint16_t *handledMessages; + const uint16_t *handledMessages = _no_messages; virtual ~MessageHandler() {} + + private: + static constexpr uint16_t _no_messages[] = { 0 }; }; } // namespace Net diff --git a/src/net/net.cpp b/src/net/net.cpp index 93003280..dc86bc89 100644 --- a/src/net/net.cpp +++ b/src/net/net.cpp @@ -124,7 +124,8 @@ Net::TradeHandler *Net::getTradeHandler() namespace Net { -ServerType networkType = ServerType::UNKNOWN; + +static ServerType networkType = ServerType::UNKNOWN; void connectToServer(ServerInfo &server) { @@ -146,20 +147,17 @@ void connectToServer(ServerInfo &server) } else { - if (networkType != ServerType::UNKNOWN && getGeneralHandler() != nullptr) - { - getGeneralHandler()->unload(); - } + unload(); switch (server.type) { #ifdef MANASERV_SUPPORT case ServerType::MANASERV: - new ManaServ::GeneralHandler; + generalHandler = new ManaServ::GeneralHandler; break; #endif case ServerType::TMWATHENA: - new TmwAthena::GeneralHandler; + generalHandler = new TmwAthena::GeneralHandler; break; default: logger->error(_("Server protocol unsupported")); @@ -178,9 +176,10 @@ void connectToServer(ServerInfo &server) void unload() { - if (GeneralHandler *handler = getGeneralHandler()) + if (generalHandler) { - handler->unload(); + generalHandler->unload(); + delete generalHandler; } } diff --git a/src/net/tmwa/generalhandler.cpp b/src/net/tmwa/generalhandler.cpp index 2a8afb4e..2cf7d30f 100644 --- a/src/net/tmwa/generalhandler.cpp +++ b/src/net/tmwa/generalhandler.cpp @@ -60,8 +60,6 @@ #include <list> -extern Net::GeneralHandler *generalHandler; - namespace TmwAthena { ServerInfo charServer; @@ -92,7 +90,6 @@ GeneralHandler::GeneralHandler(): 0 }; handledMessages = _messages; - generalHandler = this; std::list<ItemStat> stats; stats.emplace_back("str", _("Strength %+d")); @@ -155,6 +152,7 @@ void GeneralHandler::handleMessage(MessageIn &msg) void GeneralHandler::load() { + // This sets mNetwork to the created Network instance (new Network)->registerHandler(this); mNetwork->registerHandler(mAdminHandler.get()); @@ -209,11 +207,6 @@ void GeneralHandler::flushNetwork() } } -void GeneralHandler::clearHandlers() -{ - mNetwork->clearHandlers(); -} - void GeneralHandler::event(Event::Channel channel, const Event &event) { diff --git a/src/net/tmwa/generalhandler.h b/src/net/tmwa/generalhandler.h index 529c1661..1da81ba8 100644 --- a/src/net/tmwa/generalhandler.h +++ b/src/net/tmwa/generalhandler.h @@ -48,8 +48,6 @@ class GeneralHandler final : public MessageHandler, public Net::GeneralHandler, void flushNetwork() override; - void clearHandlers() override; - void event(Event::Channel channel, const Event &event) override; protected: diff --git a/src/net/tmwa/guildhandler.cpp b/src/net/tmwa/guildhandler.cpp index 1877f0f1..e8ee4848 100644 --- a/src/net/tmwa/guildhandler.cpp +++ b/src/net/tmwa/guildhandler.cpp @@ -40,11 +40,6 @@ Guild *taGuild; GuildHandler::GuildHandler() { - static const Uint16 _messages[] = { - 0 - }; - handledMessages = _messages; - guildHandler = this; } |