From c7e7b62aa94bf295ca1dc556762ad6070221e0cd Mon Sep 17 00:00:00 2001 From: Eugenio Favalli Date: Tue, 25 Jul 2006 18:04:38 +0000 Subject: Switched client to use enet and modified login sequence to work with the new protocol from tmwserv. --- src/net/messageout.cpp | 102 ++++++++++++++++++++++++------------------------- 1 file changed, 51 insertions(+), 51 deletions(-) (limited to 'src/net/messageout.cpp') diff --git a/src/net/messageout.cpp b/src/net/messageout.cpp index f6ed5de6..5e8a5d72 100644 --- a/src/net/messageout.cpp +++ b/src/net/messageout.cpp @@ -1,5 +1,5 @@ /* - * The Mana World + * The Mana World Server * Copyright 2004 The Mana World Development Team * * This file is part of The Mana World. @@ -24,93 +24,93 @@ #include "messageout.h" #include -#include -#include -#include "network.h" +#include + #include "packet.h" -MessageOut::MessageOut(Network *network): - mNetwork(network), +MessageOut::MessageOut(): mData(0), mDataSize(0), mPos(0) { - mData = mNetwork->mOutBuffer + mNetwork->mOutSize; } -void MessageOut::writeInt8(Sint8 value) +MessageOut::~MessageOut() { - mData[mPos] = value; - mPos += sizeof(Sint8); - mNetwork->mOutSize+= sizeof(Sint8); + if (mData) { + free(mData); + } +} + +void +MessageOut::expand(size_t bytes) +{ + mData = (char*)realloc(mData, bytes); + mDataSize = bytes; } -void MessageOut::writeInt16(Sint16 value) +void +MessageOut::writeByte(char value) { -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - (*(Sint16 *)(mData + mPos)) = SDL_Swap16(value); -#else - (*(Sint16 *)(mData + mPos)) = value; -#endif - mPos += sizeof(Sint16); - mNetwork->mOutSize += sizeof(Sint16); + expand(mPos + 1); + mData[mPos] = value; + mPos += 1; } -void MessageOut::writeInt32(Sint32 value) +void MessageOut::writeShort(short value) { -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - (*(Sint32 *)(mData + mPos)) = SDL_Swap32(value); -#else - (*(Sint32 *)(mData + mPos)) = value; -#endif - mPos += sizeof(Sint32); - mNetwork->mOutSize += sizeof(Sint32); + expand(mPos + 2); + uint16_t t = ENET_HOST_TO_NET_16(value); + memcpy(mData + mPos, &t, 2); + mPos += 2; } -void MessageOut::writeString(const std::string &string, int length) +void +MessageOut::writeLong(long value) { - std::string toWrite = string; + expand(mPos + 4); + uint32_t t = ENET_HOST_TO_NET_32(value); + memcpy(mData + mPos, &t, 4); + mPos += 4; +} +void +MessageOut::writeString(const std::string &string, int length) +{ + int stringLength = string.length(); if (length < 0) { // Write the length at the start if not fixed - writeInt16(string.length()); + writeShort(stringLength); + length = stringLength; } - else + else if (length < stringLength) { // Make sure the length of the string is no longer than specified - toWrite = string.substr(0, length); + stringLength = length; } + expand(mPos + length); // Write the actual string - memcpy(&mData[mPos], (void*)toWrite.c_str(), toWrite.length()); - mPos += toWrite.length(); - mNetwork->mOutSize += toWrite.length(); + memcpy(mData + mPos, string.c_str(), stringLength); // Pad remaining space with zeros - if (length > (int)toWrite.length()) + if (length > stringLength) { - memset(&mData[mPos], '\0', length - toWrite.length()); - mPos += length - toWrite.length(); - mNetwork->mOutSize += length - toWrite.length(); + memset(mData + mPos + stringLength, '\0', length - stringLength); } + mPos += length; } -MessageOut& operator<<(MessageOut &msg, const Sint8 &rhs) -{ - msg.writeInt8(rhs); - return msg; -} - -MessageOut& operator<<(MessageOut &msg, const Sint16 &rhs) +char* +MessageOut::getData() { - msg.writeInt16(rhs); - return msg; + return mData; } -MessageOut& operator<<(MessageOut &msg, const Sint32 &rhs) +unsigned int +MessageOut::getDataSize() { - msg.writeInt32(rhs); - return msg; + return mDataSize; } -- cgit v1.2.3-70-g09d2