diff options
author | Guillaume Melquiond <guillaume.melquiond@gmail.com> | 2006-12-29 13:43:24 +0000 |
---|---|---|
committer | Guillaume Melquiond <guillaume.melquiond@gmail.com> | 2006-12-29 13:43:24 +0000 |
commit | 291ad04d5b5c4ab08d85eadde116f968cd579b77 (patch) | |
tree | e4dced5715a5d9792cfdc0455a6b3ee6d3116079 /src/net/messageout.cpp | |
parent | 3d404e743105bb9168c89e3451cf35d7d59120b1 (diff) | |
download | manaserv-291ad04d5b5c4ab08d85eadde116f968cd579b77.tar.gz manaserv-291ad04d5b5c4ab08d85eadde116f968cd579b77.tar.bz2 manaserv-291ad04d5b5c4ab08d85eadde116f968cd579b77.tar.xz manaserv-291ad04d5b5c4ab08d85eadde116f968cd579b77.zip |
Physically split the server into one tmwserv-acount program (account +
chat + database) and multiple tmwserv-game programs (selected with
respect to the maps). Cleaned the repository by moving server-specific
source files into dedicated directories.
Diffstat (limited to 'src/net/messageout.cpp')
-rw-r--r-- | src/net/messageout.cpp | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/src/net/messageout.cpp b/src/net/messageout.cpp new file mode 100644 index 00000000..34655e4c --- /dev/null +++ b/src/net/messageout.cpp @@ -0,0 +1,135 @@ +/* + * The Mana World Server + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#include <cstdlib> +#include <iosfwd> +#include <string> +#include <enet/enet.h> + +#include "net/messageout.hpp" + +/** Initial amount of bytes allocated for the messageout data buffer. */ +const unsigned int INITIAL_DATA_CAPACITY = 16; + +/** Factor by which the messageout data buffer is increased when too small. */ +const unsigned int CAPACITY_GROW_FACTOR = 2; + +MessageOut::MessageOut(): + mPos(0) +{ + mData = (char*) malloc(INITIAL_DATA_CAPACITY); + mDataSize = INITIAL_DATA_CAPACITY; +} + +MessageOut::MessageOut(short id): + mPos(0) +{ + mData = (char*) malloc(INITIAL_DATA_CAPACITY); + mDataSize = INITIAL_DATA_CAPACITY; + + writeShort(id); +} + +MessageOut::~MessageOut() +{ + free(mData); +} + +void +MessageOut::expand(size_t bytes) +{ + if (bytes > mDataSize) + { + do + { + mDataSize *= CAPACITY_GROW_FACTOR; + } + while (bytes > mDataSize); + + mData = (char*) realloc(mData, mDataSize); + } +} + +void +MessageOut::writeByte(char value) +{ + expand(mPos + 1); + mData[mPos] = value; + mPos += 1; +} + +void +MessageOut::writeShort(short value) +{ + expand(mPos + 2); + uint16_t t = ENET_HOST_TO_NET_16(value); + memcpy(mData + mPos, &t, 2); + mPos += 2; +} + +void +MessageOut::writeLong(long value) +{ + expand(mPos + 4); + uint32_t t = ENET_HOST_TO_NET_32(value); + memcpy(mData + mPos, &t, 4); + mPos += 4; +} + +void MessageOut::writeCoordinates(int x, int y) +{ + expand(mPos + 3); + char *p = mData + mPos; + p[0] = x & 0x00FF; + p[1] = ((x & 0x0700) >> 8) | ((y & 0x001F) << 3); + p[2] = (y & 0x07E0) >> 5; + mPos += 3; +} + +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 + writeShort(stringLength); + length = stringLength; + } + else if (length < stringLength) + { + // Make sure the length of the string is no longer than specified + stringLength = length; + } + expand(mPos + length); + + // Write the actual string + memcpy(mData + mPos, string.c_str(), stringLength); + + if (length > stringLength) + { + // Pad remaining space with zeros + memset(mData + mPos + stringLength, '\0', length - stringLength); + } + mPos += length; +} |