00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <cstring>
00023 #include <iomanip>
00024 #include <iostream>
00025 #include <string>
00026 #include <enet/enet.h>
00027
00028 #include "net/messagein.hpp"
00029
00030 MessageIn::MessageIn(const char *data, int length):
00031 mData(data),
00032 mLength(length),
00033 mPos(0)
00034 {
00035
00036 mId = readShort();
00037 }
00038
00039 int MessageIn::readByte()
00040 {
00041 int value = -1;
00042 if (mPos < mLength)
00043 {
00044 value = (unsigned char) mData[mPos];
00045 }
00046 mPos += 1;
00047 return value;
00048 }
00049
00050 int MessageIn::readShort()
00051 {
00052 int value = -1;
00053 if (mPos + 2 <= mLength)
00054 {
00055 uint16_t t;
00056 memcpy(&t, mData + mPos, 2);
00057 value = (unsigned short) ENET_NET_TO_HOST_16(t);
00058 }
00059 mPos += 2;
00060 return value;
00061 }
00062
00063 int MessageIn::readLong()
00064 {
00065 int value = -1;
00066 if (mPos + 4 <= mLength)
00067 {
00068 uint32_t t;
00069 memcpy(&t, mData + mPos, 4);
00070 value = ENET_NET_TO_HOST_32(t);
00071 }
00072 mPos += 4;
00073 return value;
00074 }
00075
00076 std::string MessageIn::readString(int length)
00077 {
00078
00079 if (length < 0)
00080 {
00081 length = readShort();
00082 }
00083
00084
00085 if (length < 0 || mPos + length > mLength)
00086 {
00087 mPos = mLength + 1;
00088 return std::string();
00089 }
00090
00091
00092 const char *stringBeg = mData + mPos;
00093 const char *stringEnd = (const char *)memchr(stringBeg, '\0', length);
00094 std::string readString(stringBeg,
00095 stringEnd ? stringEnd - stringBeg : length);
00096 mPos += length;
00097
00098 return readString;
00099 }
00100
00101 std::ostream&
00102 operator <<(std::ostream &os, const MessageIn &msg)
00103 {
00104 os << std::setw(6) << std::hex << std::showbase << std::internal
00105 << std::setfill('0') << msg.getId()
00106 << std::dec << " (" << msg.getLength() << " B)";
00107 return os;
00108 }