/*
* Copyright (C) 2008-2015 TrinityCore
*
* 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 .
*/
#ifndef ConnectionPackets_h__
#define ConnectionPackets_h__
#include "PacketsBase.h"
namespace Battlenet
{
namespace Connection
{
enum Opcode
{
CMSG_PING = 0x0,
CMSG_ENABLE_ENCRYPTION = 0x5,
CMSG_LOGOUT_REQUEST = 0x6,
CMSG_DISCONNECT_REQUEST = 0x7, // Not handled
CMSG_CONNECTION_CLOSING = 0x9,
SMSG_PONG = 0x0,
SMSG_BOOM = 0x1, // Not implemented
SMSG_REGULATOR_UPDATE = 0x2, // Not implemented
SMSG_SERVER_VERSION = 0x3, // Not implemented
SMSG_STUN_SERVERS = 0x4 // Not implemented
};
class Ping final : public ClientPacket
{
public:
Ping(PacketHeader const& header, BitStream& stream) : ClientPacket(header, stream)
{
ASSERT(header == PacketHeader(CMSG_PING, CONNECTION) && "Invalid packet header for Ping");
}
void Read() override { }
std::string ToString() const override;
void CallHandler(Session* session) override;
};
class EnableEncryption final : public ClientPacket
{
public:
EnableEncryption(PacketHeader const& header, BitStream& stream) : ClientPacket(header, stream)
{
ASSERT(header == PacketHeader(CMSG_ENABLE_ENCRYPTION, CONNECTION) && "Invalid packet header for EnableEncryption");
}
void Read() override { }
std::string ToString() const override;
void CallHandler(Session* session) override;
uint8* GetRemainingData() { return _stream.GetBuffer() + (((_stream.GetReadPos() + 7) & ~7) / 8); }
size_t GetRemainingSize() { return _stream.GetSize() - (((_stream.GetReadPos() + 7) & ~7) / 8); }
};
class LogoutRequest final : public ClientPacket
{
public:
LogoutRequest(PacketHeader const& header, BitStream& stream) : ClientPacket(header, stream)
{
ASSERT(header == PacketHeader(CMSG_LOGOUT_REQUEST, CONNECTION) && "Invalid packet header for LogoutRequest");
}
void Read() override { }
std::string ToString() const override;
void CallHandler(Session* session) override;
};
class DisconnectRequest final : public ClientPacket
{
public:
DisconnectRequest(PacketHeader const& header, BitStream& stream) : ClientPacket(header, stream)
{
ASSERT(header == PacketHeader(CMSG_DISCONNECT_REQUEST, CONNECTION) && "Invalid packet header for DisconnectRequest");
}
void Read() override;
std::string ToString() const override;
uint16 Timeout = 0;
uint32 Tick = 0;
};
class ConnectionClosing final : public ClientPacket
{
public:
enum ClosingReason
{
PACKET_TOO_LARGE,
PACKET_CORRUPT,
PACKET_INVALID,
PACKET_INCORRECT,
HEADER_CORRUPT,
HEADER_IGNORED,
HEADER_INCORRECT,
PACKET_REJECTED,
CHANNEL_UNHANDLED,
COMMAND_UNHANDLED,
COMMAND_BAD_PERMISSIONS,
DIRECT_CALL,
TIMEOUT,
};
struct PacketInfo
{
uint16 LayerId;
std::string Channel;
uint32 Timestamp;
std::string CommandName;
uint16 Size;
};
ConnectionClosing(PacketHeader const& header, BitStream& stream) : ClientPacket(header, stream)
{
ASSERT(header == PacketHeader(CMSG_CONNECTION_CLOSING, CONNECTION) && "Invalid packet header for ConnectionClosing");
}
void Read() override;
std::string ToString() const override;
void CallHandler(Session* session) override;
PacketHeader Header;
ClosingReason Reason = PACKET_CORRUPT;
std::vector Packets;
time_t Now = 0;
};
class Pong final : public ServerPacket
{
public:
Pong() : ServerPacket(PacketHeader(SMSG_PONG, CONNECTION))
{
}
void Write() override { }
std::string ToString() const override;
};
}
}
#endif // ConnectionPackets_h__