diff options
author | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2005-07-16 18:37:38 +0000 |
---|---|---|
committer | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2005-07-16 18:37:38 +0000 |
commit | 49bc551cc81f23c6e5243e1ddb0ddf6d0159c544 (patch) | |
tree | 7cb6958a430334830c6fa2ef14eafb0051ecc54b /src/messageout.cpp | |
parent | b38bedf85a7582d20a1fee993cc6078f9463b40a (diff) | |
download | manaserv-49bc551cc81f23c6e5243e1ddb0ddf6d0159c544.tar.gz manaserv-49bc551cc81f23c6e5243e1ddb0ddf6d0159c544.tar.bz2 manaserv-49bc551cc81f23c6e5243e1ddb0ddf6d0159c544.tar.xz manaserv-49bc551cc81f23c6e5243e1ddb0ddf6d0159c544.zip |
Removed a lot of tabs used for indenting (please don't do that...), redid
MessageOut a bit so that it uses SDL_net, writes strings correctly and doesn't
rely on Packet to be expandable. Also specified message IDs explicitly.
Diffstat (limited to 'src/messageout.cpp')
-rw-r--r-- | src/messageout.cpp | 79 |
1 files changed, 56 insertions, 23 deletions
diff --git a/src/messageout.cpp b/src/messageout.cpp index 9c3ea453..a2faf33e 100644 --- a/src/messageout.cpp +++ b/src/messageout.cpp @@ -23,59 +23,92 @@ #include "messageout.h" #include <iostream> -#include <cstdlib> +#include <SDL_net.h> MessageOut::MessageOut(): - packet(0) + mPacket(0), + mData(0), + mDataSize(0), + mPos(0) { - packet = new Packet(NULL, 0); } MessageOut::~MessageOut() { - if (packet) { - delete packet; + if (mPacket) { + delete mPacket; } + + if (mData) { + free(mData); + } +} + +void MessageOut::expand(size_t bytes) +{ + mData = (char*)realloc(mData, bytes); + mDataSize = bytes; } void MessageOut::writeByte(char value) { - packet->expand(sizeof(char)); - packet->data[packet->length] = value; - packet->length += sizeof(char); + expand(mPos + sizeof(char)); + mData[mPos] = value; + mPos += sizeof(char); } void MessageOut::writeShort(short value) { - packet->expand(sizeof(short)); - memcpy(&packet->data[packet->length], (void*)&value, sizeof(short)); - packet->length += sizeof(short); + expand(mPos + sizeof(short)); + SDLNet_Write16(value, &mData[mPos]); + mPos += sizeof(short); } void MessageOut::writeLong(long value) { - packet->expand(sizeof(long)); - memcpy(&packet->data[packet->length], (void*)&value, sizeof(long)); - packet->length += sizeof(long); + expand(mPos + sizeof(long)); + SDLNet_Write32(value, &mData[mPos]); + mPos += sizeof(long); } void MessageOut::writeString(const std::string &string, int length) { + std::string toWrite = string; + if (length < 0) - length = string.length(); + { + // Write the length at the start if not fixed + writeShort(string.length()); + std::string toWrite = string; - packet->expand(length + sizeof(unsigned short)); + expand(mPos + string.length()); + } + else if (length < (int)string.length()) + { + // Make sure the length of the string is no longer than specified + toWrite = string.substr(0, length); + + expand(mPos + length); + } - // length prefix - memcpy(&packet->data[packet->length], (void*)&length, sizeof(unsigned short)); - // actual string - memcpy(&packet->data[packet->length + sizeof(unsigned short)], - (void*)string.c_str(), length); + // Write the actual string + memcpy(&mData[mPos], (void*)toWrite.c_str(), toWrite.length()); + mPos += toWrite.length(); - packet->length += length + sizeof(unsigned short); + // Pad remaining space with zeros + if (length > (int)toWrite.length()) + { + memset(&mData[mPos], '\0', length - toWrite.length()); + mPos += length - toWrite.length(); + } } const Packet *MessageOut::getPacket() { - return packet; + if (!mPacket) + { + mPacket = new Packet(mData, mDataSize); + } + + return mPacket; } |