aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Scripting/ScriptMgr.cpp10
-rw-r--r--src/server/game/Scripting/ScriptMgr.h20
-rw-r--r--src/server/game/Server/WorldSession.cpp6
-rw-r--r--src/server/game/Server/WorldSession.h4
-rw-r--r--src/server/game/Server/WorldTcpSession.cpp19
-rw-r--r--src/server/game/Server/WorldTcpSession.h7
6 files changed, 35 insertions, 31 deletions
diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp
index 06f6094c511..b45ed6b640c 100644
--- a/src/server/game/Scripting/ScriptMgr.cpp
+++ b/src/server/game/Scripting/ScriptMgr.cpp
@@ -400,35 +400,35 @@ void ScriptMgr::OnNetworkStop()
FOREACH_SCRIPT(ServerScript)->OnNetworkStop();
}
-void ScriptMgr::OnSocketOpen(WorldTcpSession* socket)
+void ScriptMgr::OnSocketOpen(std::shared_ptr<WorldTcpSession> socket)
{
ASSERT(socket);
FOREACH_SCRIPT(ServerScript)->OnSocketOpen(socket);
}
-void ScriptMgr::OnSocketClose(WorldTcpSession* socket, bool wasNew)
+void ScriptMgr::OnSocketClose(std::shared_ptr<WorldTcpSession> socket, bool wasNew)
{
ASSERT(socket);
FOREACH_SCRIPT(ServerScript)->OnSocketClose(socket, wasNew);
}
-void ScriptMgr::OnPacketReceive(WorldTcpSession* socket, WorldPacket packet)
+void ScriptMgr::OnPacketReceive(std::shared_ptr<WorldTcpSession> socket, WorldPacket packet)
{
ASSERT(socket);
FOREACH_SCRIPT(ServerScript)->OnPacketReceive(socket, packet);
}
-void ScriptMgr::OnPacketSend(WorldTcpSession* socket, WorldPacket packet)
+void ScriptMgr::OnPacketSend(std::shared_ptr<WorldTcpSession> socket, WorldPacket packet)
{
ASSERT(socket);
FOREACH_SCRIPT(ServerScript)->OnPacketSend(socket, packet);
}
-void ScriptMgr::OnUnknownPacketReceive(WorldTcpSession* socket, WorldPacket packet)
+void ScriptMgr::OnUnknownPacketReceive(std::shared_ptr<WorldTcpSession> socket, WorldPacket packet)
{
ASSERT(socket);
diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h
index 530d99b9ad2..81c764cb1ca 100644
--- a/src/server/game/Scripting/ScriptMgr.h
+++ b/src/server/game/Scripting/ScriptMgr.h
@@ -221,23 +221,23 @@ class ServerScript : public ScriptObject
virtual void OnNetworkStop() { }
// Called when a remote socket establishes a connection to the server. Do not store the socket object.
- virtual void OnSocketOpen(WorldTcpSession* /*socket*/) { }
+ virtual void OnSocketOpen(std::shared_ptr<WorldTcpSession> /*socket*/) { }
// Called when a socket is closed. Do not store the socket object, and do not rely on the connection
// being open; it is not.
- virtual void OnSocketClose(WorldTcpSession* /*socket*/, bool /*wasNew*/) { }
+ virtual void OnSocketClose(std::shared_ptr<WorldTcpSession> /*socket*/, bool /*wasNew*/) { }
// Called when a packet is sent to a client. The packet object is a copy of the original packet, so reading
// and modifying it is safe.
- virtual void OnPacketSend(WorldTcpSession* /*socket*/, WorldPacket& /*packet*/) { }
+ virtual void OnPacketSend(std::shared_ptr<WorldTcpSession> /*socket*/, WorldPacket& /*packet*/) { }
// Called when a (valid) packet is received by a client. The packet object is a copy of the original packet, so
// reading and modifying it is safe.
- virtual void OnPacketReceive(WorldTcpSession* /*socket*/, WorldPacket& /*packet*/) { }
+ virtual void OnPacketReceive(std::shared_ptr<WorldTcpSession> /*socket*/, WorldPacket& /*packet*/) { }
// Called when an invalid (unknown opcode) packet is received by a client. The packet is a reference to the orignal
// packet; not a copy. This allows you to actually handle unknown packets (for whatever purpose).
- virtual void OnUnknownPacketReceive(WorldTcpSession* /*socket*/, WorldPacket& /*packet*/) { }
+ virtual void OnUnknownPacketReceive(std::shared_ptr<WorldTcpSession> /*socket*/, WorldPacket& /*packet*/) { }
};
class WorldScript : public ScriptObject
@@ -908,11 +908,11 @@ class ScriptMgr
void OnNetworkStart();
void OnNetworkStop();
- void OnSocketOpen(WorldTcpSession* socket);
- void OnSocketClose(WorldTcpSession* socket, bool wasNew);
- void OnPacketReceive(WorldTcpSession* socket, WorldPacket packet);
- void OnPacketSend(WorldTcpSession* socket, WorldPacket packet);
- void OnUnknownPacketReceive(WorldTcpSession* socket, WorldPacket packet);
+ void OnSocketOpen(std::shared_ptr<WorldTcpSession> socket);
+ void OnSocketClose(std::shared_ptr<WorldTcpSession> socket, bool wasNew);
+ void OnPacketReceive(std::shared_ptr<WorldTcpSession> socket, WorldPacket packet);
+ void OnPacketSend(std::shared_ptr<WorldTcpSession> socket, WorldPacket packet);
+ void OnUnknownPacketReceive(std::shared_ptr<WorldTcpSession> socket, WorldPacket packet);
public: /* WorldScript */
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index 68f06676fdb..a369eabfcdb 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -97,7 +97,7 @@ bool WorldSessionFilter::Process(WorldPacket* packet)
}
/// WorldSession constructor
-WorldSession::WorldSession(uint32 id, WorldTcpSession* sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter, bool isARecruiter):
+WorldSession::WorldSession(uint32 id, std::shared_ptr<WorldTcpSession> sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter, bool isARecruiter):
m_muteTime(mute_time),
m_timeOutTime(0),
AntiDOS(this),
@@ -149,7 +149,7 @@ WorldSession::~WorldSession()
if (m_Socket)
{
m_Socket->CloseSocket();
- m_Socket = NULL;
+ m_Socket = nullptr;
}
delete _warden;
@@ -420,7 +420,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
expireTime -= expireTime > diff ? diff : expireTime;
if (expireTime < diff || forceExit)
{
- m_Socket = NULL;
+ m_Socket = nullptr;
}
}
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 709650a8119..d864a2ca76d 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -208,7 +208,7 @@ struct PacketCounter
class WorldSession
{
public:
- WorldSession(uint32 id, WorldTcpSession* sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter, bool isARecruiter);
+ WorldSession(uint32 id, std::shared_ptr<WorldTcpSession> sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter, bool isARecruiter);
~WorldSession();
bool PlayerLoading() const { return m_playerLoading; }
@@ -981,7 +981,7 @@ class WorldSession
uint32 m_GUIDLow; // set logined or recently logout player (while m_playerRecentlyLogout set)
Player* _player;
- WorldTcpSession* m_Socket;
+ std::shared_ptr<WorldTcpSession> m_Socket;
std::string m_Address; // Current Remote Address
// std::string m_LAddress; // Last Attempted Remote Adress - we can not set attempted ip for a non-existing session!
diff --git a/src/server/game/Server/WorldTcpSession.cpp b/src/server/game/Server/WorldTcpSession.cpp
index 6fd54fffc17..7f2b560f35b 100644
--- a/src/server/game/Server/WorldTcpSession.cpp
+++ b/src/server/game/Server/WorldTcpSession.cpp
@@ -28,6 +28,11 @@
using boost::asio::ip::tcp;
using boost::asio::streambuf;
+WorldTcpSession::WorldTcpSession(tcp::socket socket)
+ : _socket(std::move(socket)), _authSeed(static_cast<uint32>(rand32())), _worldSession(nullptr)
+{
+}
+
void WorldTcpSession::Start()
{
AsyncReadHeader();
@@ -54,7 +59,8 @@ void WorldTcpSession::HandleSendAuthSession()
void WorldTcpSession::AsyncReadHeader()
{
- _socket.async_read_some(boost::asio::buffer(_readBuffer, sizeof(ClientPktHeader)), [this](boost::system::error_code error, size_t transferedBytes)
+ auto self(shared_from_this());
+ _socket.async_read_some(boost::asio::buffer(_readBuffer, sizeof(ClientPktHeader)), [this, self](boost::system::error_code error, size_t transferedBytes)
{
if (!error && transferedBytes == sizeof(ClientPktHeader))
{
@@ -74,7 +80,8 @@ void WorldTcpSession::AsyncReadHeader()
void WorldTcpSession::AsyncReadData(size_t dataSize)
{
- _socket.async_read_some(boost::asio::buffer(&_readBuffer[sizeof(ClientPktHeader)], dataSize), [this, dataSize](boost::system::error_code error, size_t transferedBytes)
+ auto self(shared_from_this());
+ _socket.async_read_some(boost::asio::buffer(&_readBuffer[sizeof(ClientPktHeader)], dataSize), [this, dataSize, self](boost::system::error_code error, size_t transferedBytes)
{
if (!error && transferedBytes == dataSize)
{
@@ -104,12 +111,12 @@ void WorldTcpSession::AsyncReadData(size_t dataSize)
break;
}
- sScriptMgr->OnPacketReceive(this, packet);
+ sScriptMgr->OnPacketReceive(shared_from_this(), packet);
HandleAuthSession(packet);
break;
case CMSG_KEEP_ALIVE:
TC_LOG_DEBUG("network", "%s", opcodeName.c_str());
- sScriptMgr->OnPacketReceive(this, packet);
+ sScriptMgr->OnPacketReceive(shared_from_this(), packet);
break;
default:
{
@@ -366,7 +373,7 @@ void WorldTcpSession::HandleAuthSession(WorldPacket& recvPacket)
LoginDatabase.Execute(stmt);
// NOTE ATM the socket is single-threaded, have this in mind ...
- _worldSession = new WorldSession(id, this, AccountTypes(security), expansion, mutetime, locale, recruiter, isRecruiter);
+ _worldSession = new WorldSession(id, shared_from_this(), AccountTypes(security), expansion, mutetime, locale, recruiter, isRecruiter);
_authCrypt.Init(&k);
@@ -391,4 +398,4 @@ void WorldTcpSession::SendAuthResponseError(uint8 code)
packet << uint8(code);
AsyncWrite(packet);
-}
+} \ No newline at end of file
diff --git a/src/server/game/Server/WorldTcpSession.h b/src/server/game/Server/WorldTcpSession.h
index 8b1285b0a85..dedc248d7ec 100644
--- a/src/server/game/Server/WorldTcpSession.h
+++ b/src/server/game/Server/WorldTcpSession.h
@@ -40,13 +40,10 @@ struct ClientPktHeader
#pragma pack(pop)
-class WorldTcpSession
+class WorldTcpSession : public std::enable_shared_from_this<WorldTcpSession>
{
public:
- WorldTcpSession(tcp::socket socket) :
- _socket(std::move(socket)), _authSeed(static_cast<uint32> (rand32()))
- {
- }
+ WorldTcpSession(tcp::socket socket);
WorldTcpSession(WorldTcpSession const& right) = delete;
WorldTcpSession& operator=(WorldTcpSession const& right) = delete;