diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Scripting/ScriptMgr.cpp | 10 | ||||
| -rw-r--r-- | src/server/game/Scripting/ScriptMgr.h | 20 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.h | 4 | ||||
| -rw-r--r-- | src/server/game/Server/WorldTcpSession.cpp | 19 | ||||
| -rw-r--r-- | src/server/game/Server/WorldTcpSession.h | 7 |
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; |
