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 #if MANGOS_ENDIAN == MANGOS_BIGENDIAN
template<typename T> inline void EndianConvert(T& val) { ByteConverter::apply<T>(&val); } template<typename T> inline void EndianConvert(T& val) { ByteConverter::apply<T>(&val); }
template<typename T> inline void EndianConvertReverse(T&) { }
#else #else
template<typename T> inline void EndianConvert(T&) { } template<typename T> inline void EndianConvert(T&) { }
template<typename T> inline void EndianConvertReverse(T& val) { ByteConverter::apply<T>(&val); }
#endif #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(uint8&) { }
inline void EndianConvert( int8&) { } inline void EndianConvert( int8&) { }
inline void EndianConvertReverse(uint8&) { }
inline void EndianConvertReverse( int8&) { }
#endif #endif

View file

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

View file

@ -22,6 +22,8 @@
#include "Common.h" #include "Common.h"
#include "ByteBuffer.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 class WorldPacket : public ByteBuffer
{ {
public: public: