summaryrefslogtreecommitdiff
path: root/src/net/messagein.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/messagein.cpp')
-rw-r--r--src/net/messagein.cpp151
1 files changed, 151 insertions, 0 deletions
diff --git a/src/net/messagein.cpp b/src/net/messagein.cpp
new file mode 100644
index 00000000..2710d132
--- /dev/null
+++ b/src/net/messagein.cpp
@@ -0,0 +1,151 @@
+/*
+ * The Mana World
+ * 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 "messagein.h"
+#include <SDL_net.h>
+#ifdef MACOSX
+#include "win2mac.h"
+#endif
+
+#define MAKEWORD(low,high) \
+ ((unsigned short)(((unsigned char)(low)) | \
+ ((unsigned short)((unsigned char)(high))) << 8))
+
+
+MessageIn::MessageIn(const char *data, unsigned int length):
+ mData(data),
+ mLength(length),
+ mPos(0)
+{
+ // Read the message ID
+ mId = readShort();
+}
+
+char
+MessageIn::readByte()
+{
+ assert(mPos < mLength);
+ return mData[mPos++];
+}
+
+short
+MessageIn::readShort()
+{
+ assert(mPos + 2 <= mLength);
+ mPos += 2;
+#ifdef MACOSX
+ return DR_SwapTwoBytes(*(short*)(mData + (mPos - 2)));
+#else
+ return (*(short*)(mData + (mPos - 2)));
+#endif
+}
+
+long
+MessageIn::readLong()
+{
+ assert(mPos + 4 <= mLength);
+ mPos += 4;
+#ifdef MACOSX
+ return DR_SwapFourBytes(*(long*)(mData + (mPos - 4)));
+#else
+ return (*(long*)(mData + (mPos - 4)));
+#endif
+}
+
+void
+MessageIn::readCoordinates(unsigned short &x,
+ unsigned short &y,
+ unsigned char &direction)
+{
+ assert(mPos + 3 <= mLength);
+
+ const char *data = mData + mPos;
+ short temp;
+
+ temp = MAKEWORD(data[1] & 0x00c0, data[0] & 0x00ff);
+ x = temp >> 6;
+ temp = MAKEWORD(data[2] & 0x00f0, data[1] & 0x003f);
+ y = temp >> 4;
+
+ direction = data[2] & 0x000f;
+
+ mPos += 3;
+}
+
+void
+MessageIn::readCoordinatePair(unsigned short &srcX, unsigned short &srcY,
+ unsigned short &dstX, unsigned short &dstY)
+{
+ assert(mPos + 5 <= mLength);
+
+ const char *data = mData + mPos;
+ short temp;
+
+ temp = MAKEWORD(data[3], data[2] & 0x000f);
+ dstX = temp >> 2;
+
+ dstY = MAKEWORD(data[4], data[3] & 0x0003);
+
+ temp = MAKEWORD(data[1], data[0]);
+ srcX = temp >> 6;
+
+ temp = MAKEWORD(data[2], data[1] & 0x003f);
+ srcY = temp >> 4;
+
+ mPos += 5;
+}
+
+void
+MessageIn::skip(unsigned int length)
+{
+ assert(mPos + length <= mLength);
+ mPos += length;
+}
+
+std::string
+MessageIn::readString(int length)
+{
+ int stringLength = 0;
+ std::string readString = "";
+
+ // Get string length
+ if (length < 0) {
+ stringLength = readShort();
+ } else {
+ stringLength = length;
+ }
+
+ // Make sure there is enough data available
+ assert(mPos + length <= mLength);
+
+ // Read the string
+ char *tmpString = new char[stringLength + 1];
+ memcpy(tmpString, (void*)&mData[mPos], stringLength);
+ tmpString[stringLength] = 0;
+ mPos += stringLength;
+
+ readString = tmpString;
+ delete tmpString;
+
+ return readString;
+}