aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2014-07-27 20:59:22 +0200
committerShauren <shauren.trinity@gmail.com>2014-07-27 20:59:22 +0200
commit2cba07d6a1e319fec6d763daa69af3e29ba837c4 (patch)
tree990d4a22193c066fa9aa20a7c33b4330e9a60086 /src/server/game/Server
parent55eafa247d91e24bd59a369daa05b05d20334791 (diff)
parente502e01f5d16964e67685c956e204ae41b756d26 (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.h23
-rw-r--r--src/server/game/Server/WorldSession.cpp10
-rw-r--r--src/server/game/Server/WorldSession.h4
-rw-r--r--src/server/game/Server/WorldSocket.cpp24
-rw-r--r--src/server/game/Server/WorldSocket.h60
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;