summaryrefslogtreecommitdiff
path: root/src/net/messageout.cpp
diff options
context:
space:
mode:
authorGuillaume Melquiond <guillaume.melquiond@gmail.com>2006-12-29 13:43:24 +0000
committerGuillaume Melquiond <guillaume.melquiond@gmail.com>2006-12-29 13:43:24 +0000
commit291ad04d5b5c4ab08d85eadde116f968cd579b77 (patch)
treee4dced5715a5d9792cfdc0455a6b3ee6d3116079 /src/net/messageout.cpp
parent3d404e743105bb9168c89e3451cf35d7d59120b1 (diff)
downloadmanaserv-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.cpp135
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;
+}