diff options
| author | Shauren <shauren.trinity@gmail.com> | 2014-07-27 20:59:22 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2014-07-27 20:59:22 +0200 |
| commit | 2cba07d6a1e319fec6d763daa69af3e29ba837c4 (patch) | |
| tree | 990d4a22193c066fa9aa20a7c33b4330e9a60086 /src/server/game/Server | |
| parent | 55eafa247d91e24bd59a369daa05b05d20334791 (diff) | |
| parent | e502e01f5d16964e67685c956e204ae41b756d26 (diff) | |
Merge branch 'master' of https://github.com/TrinityCore/TrinityCore into 4.3.4
Conflicts:
README.md
src/server/game/Entities/Object/Object.cpp
src/server/game/Entities/Object/Updates/UpdateData.h
src/server/game/Server/WorldPacket.h
src/server/game/Server/WorldSession.cpp
src/server/game/Server/WorldSession.h
src/server/game/Server/WorldSocket.cpp
src/server/game/Server/WorldSocket.h
src/server/shared/Packets/ByteBuffer.h
Diffstat (limited to 'src/server/game/Server')
| -rw-r--r-- | src/server/game/Server/WorldPacket.h | 23 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.cpp | 10 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.h | 4 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSocket.cpp | 24 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSocket.h | 60 |
5 files changed, 88 insertions, 33 deletions
diff --git a/src/server/game/Server/WorldPacket.h b/src/server/game/Server/WorldPacket.h index e2498e64f0a..3e812621b48 100644 --- a/src/server/game/Server/WorldPacket.h +++ b/src/server/game/Server/WorldPacket.h @@ -33,15 +33,28 @@ class WorldPacket : public ByteBuffer { } - WorldPacket(Opcodes opcode, size_t res = 200) : ByteBuffer(res), m_opcode(opcode) + explicit WorldPacket(Opcodes opcode, size_t res=200) : ByteBuffer(res), m_opcode(opcode) { } + + WorldPacket(WorldPacket&& packet) : ByteBuffer(std::move(packet)), m_opcode(packet.m_opcode) + { + } + + WorldPacket(WorldPacket const& right) : ByteBuffer(right), m_opcode(right.m_opcode) { } - // copy constructor - WorldPacket(WorldPacket const& packet) : ByteBuffer(packet), m_opcode(packet.m_opcode) + + WorldPacket& operator=(WorldPacket const& right) { + if (this != &right) + { + m_opcode = right.m_opcode; + ByteBuffer::operator =(right); + } + + return *this; } - void Initialize(Opcodes opcode, size_t newres = 200) + void Initialize(Opcodes opcode, size_t newres=200) { clear(); _storage.reserve(newres); @@ -58,5 +71,5 @@ class WorldPacket : public ByteBuffer void Compress(void* dst, uint32 *dst_size, const void* src, int src_size); z_stream_s* _compressionStream; }; -#endif +#endif diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 46411b35522..227555c1dfa 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -206,7 +206,7 @@ uint32 WorldSession::GetGuidLow() const } /// Send a packet to the client -void WorldSession::SendPacket(WorldPacket const* packet, bool forced /*= false*/) +void WorldSession::SendPacket(WorldPacket* packet, bool forced /*= false*/) { if (!m_Socket) return; @@ -350,7 +350,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) } else if (_player->IsInWorld()) { - sScriptMgr->OnPacketReceive(m_Socket, WorldPacket(*packet)); + sScriptMgr->OnPacketReceive(m_Socket, *packet); (this->*opHandle->Handler)(*packet); LogUnprocessedTail(packet); } @@ -363,7 +363,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) else { // not expected _player or must checked in packet hanlder - sScriptMgr->OnPacketReceive(m_Socket, WorldPacket(*packet)); + sScriptMgr->OnPacketReceive(m_Socket, *packet); (this->*opHandle->Handler)(*packet); LogUnprocessedTail(packet); } @@ -375,7 +375,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) LogUnexpectedOpcode(packet, "STATUS_TRANSFER", "the player is still in world"); else { - sScriptMgr->OnPacketReceive(m_Socket, WorldPacket(*packet)); + sScriptMgr->OnPacketReceive(m_Socket, *packet); (this->*opHandle->Handler)(*packet); LogUnprocessedTail(packet); } @@ -393,7 +393,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) if (packet->GetOpcode() == CMSG_CHAR_ENUM) m_playerRecentlyLogout = false; - sScriptMgr->OnPacketReceive(m_Socket, WorldPacket(*packet)); + sScriptMgr->OnPacketReceive(m_Socket, *packet); (this->*opHandle->Handler)(*packet); LogUnprocessedTail(packet); break; diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 96a66bf2421..bd159475c37 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -185,7 +185,7 @@ class CharacterCreateInfo protected: CharacterCreateInfo(std::string const& name, uint8 race, uint8 cclass, uint8 gender, uint8 skin, uint8 face, uint8 hairStyle, uint8 hairColor, uint8 facialHair, uint8 outfitId, WorldPacket& data) : Name(name), Race(race), Class(cclass), Gender(gender), Skin(skin), Face(face), HairStyle(hairStyle), HairColor(hairColor), FacialHair(facialHair), - OutfitId(outfitId), Data(data), CharCount(0) + OutfitId(outfitId), Data(std::move(data)), CharCount(0) { } /// User specified variables @@ -227,7 +227,7 @@ class WorldSession void SendAddonsInfo(); bool IsAddonRegistered(const std::string& prefix) const; - void SendPacket(WorldPacket const* packet, bool forced = false); + void SendPacket(WorldPacket* packet, bool forced = false); void SendNotification(const char *format, ...) ATTR_PRINTF(2, 3); void SendNotification(uint32 string_id, ...); void SendPetNameInvalid(uint32 error, std::string const& name, DeclinedName *declinedName); diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 48c12f84870..46a1bf8f16d 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -18,7 +18,6 @@ #include <memory> #include "WorldSocket.h" -#include "ServerPktHeader.h" #include "BigNumber.h" #include "Opcodes.h" #include "ScriptMgr.h" @@ -175,35 +174,24 @@ void WorldSocket::ReadDataHandler(boost::system::error_code error, size_t transf CloseSocket(); } -void WorldSocket::AsyncWrite(WorldPacket const& packet) +void WorldSocket::AsyncWrite(WorldPacket& packet) { if (sPacketLog->CanLogPacket()) sPacketLog->LogPacket(packet, SERVER_TO_CLIENT); - WorldPacket const* pkt = &packet; - WorldPacket buff; // Empty buffer used in case packet should be compressed if (_worldSession && packet.size() > 0x400) - { - buff.Compress(_worldSession->GetCompressionStream(), pkt); - pkt = &buff; - } - - TC_LOG_TRACE("network.opcode", "S->C: %s %s", (_worldSession ? _worldSession->GetPlayerInfo() : GetRemoteIpAddress().to_string()).c_str(), GetOpcodeNameForLogging(pkt->GetOpcode()).c_str()); - - ServerPktHeader header(pkt->size() + 2, pkt->GetOpcode()); + packet.Compress(_worldSession->GetCompressionStream()); - std::vector<uint8> data(header.getHeaderLength() + pkt->size()); - std::memcpy(data.data(), header.header, header.getHeaderLength()); + TC_LOG_TRACE("network.opcode", "S->C: %s %s", (_worldSession ? _worldSession->GetPlayerInfo() : GetRemoteIpAddress().to_string()).c_str(), GetOpcodeNameForLogging(packet.GetOpcode()).c_str()); - if (!pkt->empty()) - std::memcpy(&data[header.getHeaderLength()], pkt->contents(), pkt->size()); + ServerPktHeader header(packet.size() + 2, packet.GetOpcode()); std::lock_guard<std::mutex> guard(_writeLock); bool needsWriteStart = _writeQueue.empty(); - _authCrypt.EncryptSend(data.data(), header.getHeaderLength()); + _authCrypt.EncryptSend(header.header, header.getHeaderLength()); - _writeQueue.push(std::move(data)); + _writeQueue.emplace(header, std::move(packet)); if (needsWriteStart) AsyncWrite(_writeQueue.front()); diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h index ca50b46efb0..4e1cbe743fd 100644 --- a/src/server/game/Server/WorldSocket.h +++ b/src/server/game/Server/WorldSocket.h @@ -19,14 +19,26 @@ #ifndef __WORLDSOCKET_H__ #define __WORLDSOCKET_H__ +// Forward declare buffer function here - Socket.h must know about it +struct WorldPacketBuffer; +namespace boost +{ + namespace asio + { + WorldPacketBuffer const& buffer(WorldPacketBuffer const& buf); + } +} + #include "Common.h" #include "WorldPacketCrypt.h" +#include "ServerPktHeader.h" #include "Socket.h" #include "Util.h" #include "WorldPacket.h" #include "WorldSession.h" #include <chrono> #include <boost/asio/ip/tcp.hpp> +#include <boost/asio/buffer.hpp> using boost::asio::ip::tcp; @@ -40,8 +52,50 @@ struct ClientPktHeader #pragma pack(pop) -class WorldSocket : public Socket<WorldSocket> +struct WorldPacketBuffer { + typedef boost::asio::const_buffer value_type; + + typedef boost::asio::const_buffer const* const_iterator; + + WorldPacketBuffer(ServerPktHeader header, WorldPacket&& packet) : _header(header), _packet(std::move(packet)) + { + _buffers[0] = boost::asio::const_buffer(_header.header, _header.getHeaderLength()); + if (!_packet.empty()) + _buffers[1] = boost::asio::const_buffer(_packet.contents(), _packet.size()); + } + + const_iterator begin() const + { + return _buffers; + } + + const_iterator end() const + { + return _buffers + (_packet.empty() ? 1 : 2); + } + +private: + boost::asio::const_buffer _buffers[2]; + ServerPktHeader _header; + WorldPacket _packet; +}; + +namespace boost +{ + namespace asio + { + inline WorldPacketBuffer const& buffer(WorldPacketBuffer const& buf) + { + return buf; + } + } +} + +class WorldSocket : public Socket<WorldSocket, WorldPacketBuffer> +{ + typedef Socket<WorldSocket, WorldPacketBuffer> Base; + public: WorldSocket(tcp::socket&& socket); @@ -50,8 +104,8 @@ public: void Start() override; - void AsyncWrite(WorldPacket const& packet); - using Socket<WorldSocket>::AsyncWrite; + using Base::AsyncWrite; + void AsyncWrite(WorldPacket& packet); protected: void ReadHeaderHandler(boost::system::error_code error, size_t transferedBytes) override; |
