Some endianess related fixes and cleanups

* Fixed: build fail at bigendian platform in result typo in code
* Hide endianess related convertions into EndianConvert/EndianConvertReverse calls
* Linkning errors protection from attemps convertion pointers.
This commit is contained in:
VladimirMangos 2008-10-24 04:06:27 +04:00
parent 89893215e5
commit 51b2290be6
3 changed files with 17 additions and 19 deletions

View file

@ -46,12 +46,18 @@ namespace ByteConverter
#if MANGOS_ENDIAN == MANGOS_BIGENDIAN
template<typename T> inline void EndianConvert(T& val) { ByteConverter::apply<T>(&val); }
template<typename T> inline void EndianConvertReverse(T&) { }
#else
template<typename T> inline void EndianConvert(T&) { }
template<typename T> inline void EndianConvertReverse(T& val) { ByteConverter::apply<T>(&val); }
#endif
template<typename T> inline void EndianConvert(T*) { }
template<typename T> void EndianConvert(T*); // will generate link error
template<typename T> void EndianConvertReverse(T*); // will generate link error
inline void EndianConvert(uint8&) { }
inline void EndianConvert( int8&) { }
inline void EndianConvertReverse(uint8&) { }
inline void EndianConvertReverse( int8&) { }
#endif

View file

@ -377,21 +377,14 @@ int WorldSocket::handle_input_header (void)
ClientPktHeader& header = *((ClientPktHeader*) m_Header.rd_ptr ());
header.size = ACE_NTOHS (header.size);
EndianConvertReverse(header.size);
EndianConvert(header.cmd);
#if ACE_BYTE_ORDER == ACE_BIG_ENDIAN
header.cmd = ACE_SWAP_LONG (header.cmd)
#endif // ACE_BIG_ENDIAN
if ((header.size < 4) ||
(header.size > 10240) ||
(header.cmd < 0) ||
(header.cmd > 10240)
)
if ((header.size < 4) || (header.size > 10240) ||
(header.cmd < 0) || (header.cmd > 10240) )
{
sLog.outError ("WorldSocket::handle_input_header: client sent mailformed packet size = %d , cmd = %d",
header.size,
header.cmd);
header.size, header.cmd);
errno = EINVAL;
return -1;
@ -974,13 +967,10 @@ int WorldSocket::iSendPacket (const WorldPacket& pct)
ServerPktHeader header;
header.cmd = pct.GetOpcode ();
#if ACE_BYTE_ORDER == ACE_BIG_ENDIAN
header.cmd = ACE_SWAP_WORD (header.cmd)
#endif
EndianConvert(header.cmd);
header.size = (uint16) pct.size () + 2;
header.size = ACE_HTONS (header.size);
EndianConvertReverse(header.size);
m_Crypt.EncryptSend ((uint8*) & header, sizeof (header));

View file

@ -22,6 +22,8 @@
#include "Common.h"
#include "ByteBuffer.h"
// Note: m_opcode and size stored in platfom dependent format
// ignore endianess until send, and converted at receive
class WorldPacket : public ByteBuffer
{
public: