10 #include <boost/noncopyable.hpp> 18 #include <type_traits> 20 #include "../../clib/clib_endian.h" 21 #include "../../clib/compilerspecifics.h" 22 #include "../../clib/logfacility.h" 23 #include "../../clib/passert.h" 24 #include "../../clib/rawtypes.h" 25 #include "../../clib/spinlock.h" 26 #include "../../clib/strutil.h" 27 #include "../layers.h" 28 #include "../pktboth.h" 29 #include "../pktbothid.h" 30 #include "../pktdef.h" 31 #include "../pktoutid.h" 32 #include "../realms.h" 33 #include "../uconst.h" 40 #define MAX_PACKETS_INSTANCES 100 41 namespace PacketWriterDefs
57 virtual
size_t Count() const POL_OVERRIDE {
return _packets.size(); };
75 virtual
size_t Count() const POL_OVERRIDE;
76 virtual
bool HasSubs() const POL_OVERRIDE {
return true; };
82 namespace PktWriterTemplateSpecs
88 static void Write( T x,
char buffer[],
u16& offset );
89 static void WriteFlipped( T x,
char buffer[],
u16& offset );
98 std::memcpy( &buffer[offset], &x,
sizeof( x ) );
104 std::memcpy( &buffer[offset], &x,
sizeof( x ) );
113 std::memcpy( &buffer[offset], &x,
sizeof( x ) );
119 std::memcpy( &buffer[offset], &x,
sizeof( x ) );
128 std::memcpy( &buffer[offset], &x,
sizeof( x ) );
134 std::memcpy( &buffer[offset], &x,
sizeof( x ) );
143 std::memcpy( &buffer[offset], &x,
sizeof( x ) );
149 std::memcpy( &buffer[offset], &x,
sizeof( x ) );
168 template <u8 _
id, u16 _size, u16 _sub = 0>
172 static const u8 ID = _id;
173 static const u16 SUB = _sub;
174 static const u16 SIZE = _size;
185 template <
class T,
typename N>
186 typename std::enable_if<std::is_same<T, N>::value,
void>::type
Write( N x )
188 static_assert( std::is_integral<N>::value || std::is_enum<N>::value,
189 "Invalid argument type integral type is needed!" );
193 template <
class T,
typename N>
194 typename std::enable_if<!std::is_same<T, N>::value,
void>::type
Write( N x )
196 static_assert( std::is_integral<N>::value || std::is_enum<N>::value,
197 "Invalid argument type integral type is needed!" );
198 static_assert( std::is_signed<T>::value == std::is_signed<N>::value,
199 "Signed/Unsigned missmatch!" );
203 if ( std::numeric_limits<T>::max() < x )
206 "ERROR: Write: trying to write {} on offset {} for pkt 0x{:X}/0x{:X} and only {} is " 208 << x << offset << (int)ID << SUB << std::numeric_limits<T>::max();
216 template <
class T,
typename N>
217 typename std::enable_if<std::is_same<T, N>::value,
void>::type
WriteFlipped( N x )
219 static_assert( std::is_integral<N>::value || std::is_enum<N>::value,
220 "Invalid argument type integral type is needed!" );
225 template <
class T,
typename N>
226 typename std::enable_if<!std::is_same<T, N>::value,
void>::type
WriteFlipped( N x )
228 static_assert( std::is_integral<N>::value || std::is_enum<N>::value,
229 "Invalid argument type integral type is needed!" );
230 static_assert( std::is_signed<T>::value == std::is_signed<N>::value,
231 "Signed/Unsigned missmatch!" );
235 if ( std::numeric_limits<T>::max() < x )
238 "ERROR: WriteFlipped: trying to write {} on offset {} for pkt 0x{:X}/0x{:X} and only {} " 240 << x << offset << (int)ID << SUB << std::numeric_limits<T>::max();
248 void Write(
const char* x,
u16 len,
bool nullterm =
true )
253 strncpy( &buffer[offset], x, nullterm ? len - 1 : len );
261 memcpy( &buffer[offset], x, len );
267 std::memcpy( &buffer[offset], x, 2 * len );
278 s32 signedlen =
static_cast<s32>( len );
279 while ( signedlen-- > 0 )
282 std::memcpy( &buffer[offset], &tmp, 2 );
295 template <u8 _
id, u16 _size>
309 template <u8 _
id, u16 _suboff, u16 _sub, u16 _size>
325 template <u8 _
id, u16 _size>
329 static const u8 ID = _id;
330 static const u8 SUB = 0;
331 static const u16 SIZE = _size;
336 memset( buffer, 0, SIZE );
349 #define ENCRYPTEDPKTBUFFER static_cast<u8>( 0 ) virtual void ReSetBuffer() POL_OVERRIDE
std::enable_if<!std::is_same< T, N >::value, void >::type WriteFlipped(N x)
PacketWriterDefs::PacketTemplateSub< Core::PKTBI_BF_ID, 3, Core::PKTBI_BF::TYPE_CLOSE_GUMP, 5+8 > PktOut_BF_Sub4
virtual void ReSetBuffer() POL_OVERRIDE
PacketWriterDefs::PacketTemplateSub< Core::PKTBI_BF_ID, 3, Core::PKTBI_BF::TYPE_EXTENDED_STATS_OUT, 5+7 > PktOut_BF_Sub19
std::queue< PacketInterface * > PacketInterfaceQueue
PacketWriterDefs::PacketTemplateSub< Core::PKTBI_BF_ID, 3, Core::PKTBI_BF::TYPE_ACTIVATE_CUSTOM_HOUSE_TOOL, 5+12 > PktOut_BF_Sub20
PacketWriterDefs::PacketTemplate< Core::PKTOUT_82_ID, 2 > PktOut_82
PacketWriterDefs::PacketTemplate< Core::PKTOUT_1B_ID, 37 > PktOut_1B
PacketWriterDefs::PacketTemplate< Core::PKTOUT_A5_ID, URL_MAX_LEN+4 > PktOut_A5
PacketWriterDefs::PacketTemplate< Core::PKTOUT_74_ID, 0xFFFF > PktOut_74
PacketWriterDefs::PacketTemplate< Core::PKTOUT_55_ID, 1 > PktOut_55
PacketWriterDefs::PacketTemplate< Core::PKTBI_56_ID, 11 > PktOut_56
static void WriteFlipped(s16 x, char buffer[], u16 &offset)
PacketWriterDefs::PacketTemplate< Core::PKTOUT_11_ID, 121 > PktOut_11
std::enable_if< std::is_same< T, N >::value, void >::type Write(N x)
PacketWriterDefs::PacketTemplate< Core::PKTOUT_1A_ID, 20 > PktOut_1A
PacketWriterDefs::PacketTemplate< Core::PKTOUT_E2_ID, 10 > PktOut_E2
virtual char * getBuffer() POL_OVERRIDE
PacketWriterDefs::PacketTemplate< Core::PKTOUT_1C_ID, 44+SPEECH_MAX_LEN+1 > PktOut_1C
PacketWriterDefs::PacketTemplate< Core::PKTOUT_AB_ID, 531 > PktOut_AB
PacketWriterDefs::PacketTemplate< Core::PKTBI_93_ID, 99 > PktOut_93
PacketWriterDefs::PacketTemplate< Core::PKTOUT_AF_ID, 13 > PktOut_AF
PacketWriterDefs::PacketTemplate< Core::PKTBI_99_ID, 30 > PktOut_99
PacketWriterDefs::PacketTemplate< Core::PKTOUT_A2_ID, 9 > PktOut_A2
PacketWriterDefs::PacketTemplate< Core::PKTOUT_21_ID, 8 > PktOut_21
static void Write(s8 x, char buffer[], u16 &offset)
static void WriteFlipped(u8 x, char buffer[], u16 &offset)
virtual u8 getID() const POL_OVERRIDE
void Write(const u16 *x, u16 len, bool nullterm=true)
void Write(u8 x[], u16 len)
virtual PacketInterfaceQueueMap * GetSubs() POL_OVERRIDE
PacketWriterDefs::PacketTemplate< Core::PKTOUT_E3_ID, 77 > PktOut_E3
PacketWriterDefs::PacketTemplate< Core::PKTOUT_BC_ID, 3 > PktOut_BC
void Write(const char *x, u16 len, bool nullterm=true)
PacketWriterDefs::PacketTemplate< Core::PKTBI_B8_OUT_ID, 7+5 *(SPEECH_MAX_LEN+1)> PktOut_B8
PacketWriterDefs::PacketTemplateSub< Core::PKTBI_BF_ID, 3, Core::PKTBI_BF::TYPE_CHARACTER_RACE_CHANGER, 5+2 > PktOut_BF_Sub2A
PacketWriterDefs::PacketTemplate< Core::PKTBI_98_OUT_ID, 37 > PktOut_98
PacketWriterDefs::PacketTemplate< Core::PKTBI_66_ID, 0xFFFF > PktOut_66
virtual size_t estimateSize() const POL_OVERRIDE
PacketWriterDefs::PacketTemplateSub< Core::PKTBI_BF_ID, 3, Core::PKTBI_BF::TYPE_CURSOR_HUE, 5+1 > PktOut_BF_Sub8
PacketWriterDefs::PacketTemplate< Core::PKTBI_3B_ID, 8 > PktOut_3B
virtual u16 getSubID() const POL_OVERRIDE
std::map< u16, PacketInterfaceQueue > PacketInterfaceQueueMap
PacketWriterDefs::PacketTemplate< Core::PKTOUT_1D_ID, 5 > PktOut_1D
PacketWriterDefs::PacketTemplate< Core::PKTBI_2C_ID, 2 > PktOut_2C
PacketWriterDefs::PacketTemplate< Core::PKTOUT_DF_ID, 0xFFFF > PktOut_DF
PacketWriterDefs::PacketTemplate< Core::PKTOUT_DD_ID, 0xFFFF > PktOut_DD
PacketWriterDefs::PacketTemplate< Core::PKTOUT_6D_ID, 3 > PktOut_6D
PacketWriterDefs::PacketTemplate< Core::PKTOUT_29_ID, 1 > PktOut_29
virtual void Add(PacketInterface *pkt) POL_OVERRIDE
PacketWriterDefs::PacketTemplate< Core::PKTOUT_78_ID, 19+(9 *Core::HIGHEST_LAYER)+4 > PktOut_78
PacketWriterDefs::PacketTemplate< Core::PKTBI_D6_OUT_ID, 0xFFFF > PktOut_D6
virtual size_t estimateSize() const POL_OVERRIDE
virtual u16 getSize() const POL_OVERRIDE
virtual u8 getID() const POL_OVERRIDE
PacketWriterDefs::PacketTemplateSub< Core::PKTBI_BF_ID, 3, Core::PKTBI_BF::TYPE_CLOSE_WINDOW, 5+8 > PktOut_BF_Sub16
PacketWriterDefs::PacketTemplate< Core::PKTOUT_BA_ID, 10 > PktOut_BA
PacketWriterDefs::PacketTemplate< Core::PKTOUT_A9_ID, 10000 > PktOut_A9
std::string hexint(unsigned short v)
virtual size_t estimateSize() const POL_OVERRIDE
PacketWriterDefs::PacketTemplate< Core::PKTOUT_89_ID, 7+(5 *(Core::NUM_LAYERS+1))+1 > PktOut_89
PacketWriterDefs::PacketTemplateSub< Core::PKTBI_BF_ID, 3, Core::PKTBI_BF::TYPE_OBJECT_CACHE, 5+8 > PktOut_BF_Sub10
std::enable_if< std::is_same< T, N >::value, void >::type WriteFlipped(N x)
PacketWriterDefs::PacketTemplate< Core::PKTBI_6C_ID, 19 > PktOut_6C
PacketWriterDefs::PacketTemplate< Core::PKTOUT_88_ID, 66 > PktOut_88
virtual char * getBuffer() POL_OVERRIDE
PacketWriterDefs::PacketTemplate< Core::PKTOUT_AA_ID, 5 > PktOut_AA
virtual bool HasSubs() const
PacketWriterDefs::PacketTemplate< Core::PKTOUT_8C_ID, 11 > PktOut_8C
PacketWriterDefs::PacketTemplate< Core::PKTOUT_2E_ID, 15 > PktOut_2E
PacketWriterDefs::PacketTemplate< Core::PKTOUT_2D_ID, 17 > PktOut_2D
static void Write(s32 x, char buffer[], u16 &offset)
PacketWriterDefs::PacketTemplate< Core::PKTOUT_25_ID, 21 > PktOut_25
PacketWriterDefs::PacketTemplate< Core::PKTOUT_77_ID, 17 > PktOut_77
std::enable_if<!std::is_same< T, N >::value, void >::type Write(N x)
static void Write(u32 x, char buffer[], u16 &offset)
static void WriteFlipped(u16 x, char buffer[], u16 &offset)
PacketWriterDefs::PacketTemplate< Core::PKTOUT_9E_ID, 0xFFFF > PktOut_9E
static void Write(u8 x, char buffer[], u16 &offset)
PacketWriterDefs::PacketTemplate< Core::PKTBI_C2_ID, 21 > PktOut_C2
virtual void ReSetBuffer() POL_OVERRIDE
PacketWriterDefs::PacketTemplate< Core::PKTBI_3A_ID, 6+100 *9 > PktOut_3A
PacketWriterDefs::PacketTemplate< Core::PKTBI_72_ID, 5 > PktOut_72
static void Write(s16 x, char buffer[], u16 &offset)
PacketWriterDefs::PacketTemplate< Core::PKTOUT_53_ID, 2 > PktOut_53
PacketWriterDefs::PacketTemplate< Core::PKTOUT_2F_ID, 10 > PktOut_2F
PacketWriterDefs::PacketTemplate< Core::PKTOUT_F6_ID, 0xFFFF > PktOut_F6
PacketWriterDefs::PacketTemplate< Core::PKTOUT_B0_ID, 0xFFFF > PktOut_B0
PacketWriterDefs::PacketTemplate< Core::PKTOUT_C1_ID, 48+(SPEECH_MAX_LEN+1)+2 > PktOut_C1
virtual size_t Count() const POL_OVERRIDE
PacketWriterDefs::PacketTemplate< Core::PKTOUT_6E_ID, 14 > PktOut_6E
static void WriteFlipped(s32 x, char buffer[], u16 &offset)
PacketWriterDefs::PacketTemplate< Core::PKTOUT_70_ID, 28 > PktOut_70
PacketWriterDefs::PacketTemplate< Core::PKTOUT_AE_ID,(SPEECH_MAX_LEN+1)*2+48 > PktOut_AE
PacketWriterDefs::PacketTemplate< Core::PKTOUT_3C_ID, 5+MAX_CONTAINER_ITEMS *20 > PktOut_3C
PacketWriterDefs::EmptyBufferTemplate< ENCRYPTEDPKTBUFFER, 0xFFFF > EncryptedPktBuffer
PacketInterfaceQueueMap _packets
PacketWriterDefs::PacketTemplate< Core::PKTOUT_C7_ID, 49 > PktOut_C7
PacketWriterDefs::PacketTemplate< Core::PKTBI_95_ID, 9 > PktOut_95
#define passert_always_r(exp, reason)
PacketWriterDefs::PacketTemplate< Core::PKTOUT_20_ID, 19 > PktOut_20
static void WriteFlipped(T x, char buffer[], u16 &offset)
virtual u16 getSize() const POL_OVERRIDE
PacketWriterDefs::PacketTemplate< Core::PKTOUT_F3_ID, 26 > PktOut_F3
PacketWriterDefs::PacketTemplateSub< Core::PKTBI_BF_ID, 3, Core::PKTBI_BF::TYPE_DAMAGE, 5+6 > PktOut_BF_Sub22
PacketWriterDefs::PacketTemplate< Core::PKTOUT_65_ID, 4 > PktOut_65
static void Write(u16 x, char buffer[], u16 &offset)
PacketWriterDefs::PacketTemplate< Core::PKTBI_6F_ID, 47 > PktOut_6F
PacketWriterDefs::PacketTemplate< Core::PKTOUT_7C_ID, 2000 > PktOut_7C
void WriteFlipped(const u16 *x, u16 len, bool nullterm=true)
PacketWriterDefs::PacketTemplate< Core::PKTOUT_A8_ID, 2000 > PktOut_A8
PacketWriterDefs::PacketTemplate< Core::PKTOUT_DC_ID, 9 > PktOut_DC
PacketWriterDefs::PacketTemplate< Core::PKTOUT_A6_ID, 10010 > PktOut_A6
PacketWriterDefs::PacketTemplate< Core::PKTOUT_54_ID, 12 > PktOut_54
PacketWriterDefs::PacketTemplateSub< Core::PKTBI_BF_ID, 3, Core::PKTBI_BF::TYPE_PARTY_SYSTEM, 0xFFFF > PktOut_BF_Sub6
PacketWriterDefs::PacketTemplate< Core::PKTOUT_0B_ID, 7 > PktOut_0B
static void Write(T x, char buffer[], u16 &offset)
PacketWriterDefs::PacketTemplate< Core::PKTOUT_90_ID, 19 > PktOut_90
static void WriteFlipped(s8 x, char buffer[], u16 &offset)
PacketWriterDefs::PacketTemplate< Core::PKTOUT_A3_ID, 9 > PktOut_A3
PacketWriterDefs::PacketTemplate< Core::PKTOUT_4F_ID, 2 > PktOut_4F
PacketWriterDefs::PacketTemplate< Core::PKTBI_9A_ID, 16 > PktOut_9A
virtual PacketInterface * GetNext(u8 id, u16 sub=0) POL_OVERRIDE
PacketWriterDefs::PacketTemplate< Core::PKTOUT_B7_ID, 521 > PktOut_B7
PacketWriterDefs::PacketTemplate< Core::PKTOUT_76_ID, 16 > PktOut_76
PacketWriterDefs::PacketTemplate< Core::PKTOUT_A1_ID, 9 > PktOut_A1
PacketWriterDefs::PacketTemplate< Core::PKTBI_22_APPROVED_ID, 3 > PktOut_22
PacketWriterDefs::PacketTemplateSub< Core::PKTBI_BF_ID, 3, Core::PKTBI_BF::TYPE_ENABLE_MAP_DIFFS, 5+4+MAX_NUMER_REALMS *8 > PktOut_BF_Sub18
PacketWriterDefs::PacketTemplate< Core::PKTOUT_27_ID, 2 > PktOut_27
PacketWriterDefs::PacketTemplate< Core::PKTOUT_F7_ID, 0xFFFF > PktOut_F7
PacketWriterDefs::PacketTemplateSub< Core::PKTBI_BF_ID, 3, Core::PKTBI_BF::TYPE_NEW_SPELLBOOK, 5+18 > PktOut_BF_Sub1B
PacketWriterDefs::PacketTemplate< Core::PKTOUT_B9_ID, 5 > PktOut_B9
static void WriteFlipped(u32 x, char buffer[], u16 &offset)
PacketWriterDefs::PacketTemplate< Core::PKTOUT_17_ID, 12 > PktOut_17
PacketInterfaceQueue _packets
virtual ~PacketQueueSingle()
PacketWriterDefs::PacketTemplateSub< Core::PKTBI_BF_ID, 3, Core::PKTBI_BF::TYPE_CUSTOM_HOUSE_SHORT, 5+8 > PktOut_BF_Sub1D
PacketWriterDefs::PacketTemplate< Core::PKTOUT_F5_ID, 21 > PktOut_F5
PacketWriterDefs::PacketTemplateSub< Core::PKTBI_BF_ID, 3, Core::PKTBI_BF::TYPE_DISPLAY_POPUP_MENU, 0xFFFF > PktOut_BF_Sub14
PacketWriterDefs::PacketTemplate< Core::PKTOUT_24_ID, 9 > PktOut_24