diff options
| author | jackpoz <giacomopoz@gmail.com> | 2016-08-19 22:29:00 +0200 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-08-19 22:29:00 +0200 | 
| commit | 4073cc510a5c73ede8a38687e92ec9b3ed0ee4e5 (patch) | |
| tree | 4d198d8d591563dcd900f97de5ea39f8d02ddea1 /src/server/game/Server/Packet.h | |
| parent | 628792f960e035ca1ce10dcfbea2297a20c1e00c (diff) | |
Core/Packets: Port packet handling rework from 6.x branch (#17777)
* Core/Packets: Port packet handling rework from 6.x branch
Port packet handling reword from 6.x branch. Old handlers are still used at the moment, these changes allow to port old handlers to new packet-specifc ones.
Diffstat (limited to 'src/server/game/Server/Packet.h')
| -rw-r--r-- | src/server/game/Server/Packet.h | 75 | 
1 files changed, 75 insertions, 0 deletions
| diff --git a/src/server/game/Server/Packet.h b/src/server/game/Server/Packet.h new file mode 100644 index 00000000000..64a4a9bd267 --- /dev/null +++ b/src/server/game/Server/Packet.h @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef PacketBaseWorld_h__ +#define PacketBaseWorld_h__ + +#include "WorldPacket.h" + +namespace WorldPackets +{ +    class TC_GAME_API Packet +    { +    public: +        Packet(WorldPacket&& worldPacket) : _worldPacket(std::move(worldPacket)) { } + +        virtual ~Packet() = default; + +        Packet(Packet const& right) = delete; +        Packet& operator=(Packet const& right) = delete; + +        virtual WorldPacket const* Write() = 0; +        virtual void Read() = 0; + +        WorldPacket const* GetRawPacket() const { return &_worldPacket; } +        size_t GetSize() const { return _worldPacket.size(); } + +    protected: +        WorldPacket _worldPacket; +    }; + +    class ServerPacket : public Packet +    { +    public: +        ServerPacket(OpcodeServer opcode, size_t initialSize = 200) : Packet(WorldPacket(opcode, initialSize)) { } + +        void Read() override final { ASSERT(!"Read not implemented for server packets."); } + +        void Clear() { _worldPacket.clear(); } +        WorldPacket&& Move() { return std::move(_worldPacket); } + +        OpcodeServer GetOpcode() const { return OpcodeServer(_worldPacket.GetOpcode()); } +    }; + +    class ClientPacket : public Packet +    { +    public: +        ClientPacket(WorldPacket&& packet) : Packet(std::move(packet)) { } +        ClientPacket(OpcodeClient expectedOpcode, WorldPacket&& packet) : Packet(std::move(packet)) { ASSERT(GetOpcode() == expectedOpcode); } + +        WorldPacket const* Write() override final +        { +            ASSERT(!"Write not allowed for client packets."); +            // Shut up some compilers +            return nullptr; +        } + +        OpcodeClient GetOpcode() const { return OpcodeClient(_worldPacket.GetOpcode()); } +    }; +} + +#endif // PacketBaseWorld_h__ | 
