summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThorbjørn Lindeijer <bjorn@lindeijer.nl>2025-03-05 16:03:28 +0100
committerThorbjørn Lindeijer <bjorn@lindeijer.nl>2025-03-07 22:27:48 +0100
commitf1fa20dbaa8769d928c00c24f860ea5e62ccf945 (patch)
treed42e89d0af50bd23f8fd905d2185f08e0fe07825 /src
parentad8a68be501d8ffef9fbfceacdc4c13b84a0d74a (diff)
downloadmana-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.cpp5
-rw-r--r--src/net/generalhandler.h2
-rw-r--r--src/net/manaserv/adminhandler.cpp6
-rw-r--r--src/net/manaserv/connection.cpp5
-rw-r--r--src/net/manaserv/generalhandler.cpp29
-rw-r--r--src/net/manaserv/generalhandler.h2
-rw-r--r--src/net/messagehandler.h5
-rw-r--r--src/net/net.cpp17
-rw-r--r--src/net/tmwa/generalhandler.cpp9
-rw-r--r--src/net/tmwa/generalhandler.h2
-rw-r--r--src/net/tmwa/guildhandler.cpp5
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;
}