Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #pragma once
00015
00019 #include "kNet/Types.h"
00020
00021 #include "BasicSerializedDataTypes.h"
00022 #include "SerializedDataIterator.h"
00023
00024 namespace kNet
00025 {
00026
00033 class DataDeserializer
00034 {
00035 public:
00039 DataDeserializer(const char *data, size_t size);
00040
00049 DataDeserializer(const char *data, size_t size, const SerializedMessageDesc *msgTemplate);
00050
00052 void ResetTraversal();
00053
00055 template<typename T>
00056 T Read();
00057
00058 static const u32 VLEReadError = 0xFFFFFFFF;
00059
00061 template<typename VLEType>
00062 u32 ReadVLE();
00063
00067 template<typename T>
00068 void ReadArray(T *dst, size_t numElems);
00069
00076 std::string ReadString();
00077
00080 u32 ReadBits(int numBits);
00081
00082 u32 GetDynamicElemCount();
00083
00085 u32 BytesLeft() const { return (u32)((elemOfs >= size) ? 0 : (size - elemOfs)); }
00086
00088 u32 BitsLeft() const { return (u32)((elemOfs >= size) ? 0 : ((size - elemOfs)*8 - bitOfs)); }
00089
00091 u32 BytePos() const { return (u32)elemOfs; }
00092
00094 u32 BitPos() const { return bitOfs; }
00095
00097 size_t BitsReadTotal() const { return elemOfs * 8 + bitOfs; }
00098
00100 const char *CurrentData() const { return data + BytePos(); }
00101
00103 void SkipBits(size_t numBits);
00104
00106 void SkipBytes(size_t numBytes) { SkipBits(numBytes * 8); }
00107
00108 private:
00110 const char *data;
00112 size_t size;
00114 size_t elemOfs;
00116 int bitOfs;
00117
00118 Ptr(SerializedDataIterator) iter;
00119
00120 u32 ReadBitsToU32(int count);
00121
00122 DataDeserializer(const DataDeserializer &);
00123 void operator =(const DataDeserializer &);
00124 };
00125
00126 template<typename T>
00127 T DataDeserializer::Read()
00128 {
00129 assert(!iter || iter->NextElementType() == SerializedDataTypeTraits<T>::type);
00130 T value;
00131 u8 *data = reinterpret_cast<u8*>(&value);
00132
00133 for(int i = 0; i < sizeof(value); ++i)
00134 data[i] = (u8)ReadBitsToU32(8);
00135
00136 if (iter)
00137 iter->ProceedToNextVariable();
00138
00139 return value;
00140 }
00141
00142 template<> std::string DataDeserializer::Read<std::string>();
00143
00144 template<> bool DataDeserializer::Read<bit>();
00145
00146 template<typename VLEType>
00147 u32 DataDeserializer::ReadVLE()
00148 {
00149 const u32 cStreamEndError = 0xFFFFFFFF;
00150
00151 if (BitsLeft() < VLEType::numBits1 + 1)
00152 return cStreamEndError;
00153
00154 u32 sml = ReadBits(VLEType::numBits1 + 1);
00155 if ((sml & (1 << VLEType::numBits1)) == 0)
00156 return sml;
00157 sml &= (1 << VLEType::numBits1) - 1;
00158
00159 const int numBitsMed = VLEType::numBits2 + (VLEType::numBits3 == 0 ? 0 : 1);
00160 if (BitsLeft() < numBitsMed)
00161 return cStreamEndError;
00162
00163 u32 med = ReadBits(numBitsMed);
00164 if ((med & (1 << VLEType::numBits2)) == 0)
00165 return sml | (med << VLEType::numBits1);
00166
00167 if (BitsLeft() < VLEType::numBits3)
00168 return cStreamEndError;
00169
00170 med &= (1 << VLEType::numBits2) - 1;
00171 u32 large = ReadBits(VLEType::numBits3);
00172 return sml | (med << VLEType::numBits1) | (large << (VLEType::numBits1 + VLEType::numBits2));
00173 }
00174
00175 template<typename T>
00176 void DataDeserializer::ReadArray(T *dst, size_t numElems)
00177 {
00178 for(size_t i = 0; i < numElems; ++i)
00179 dst[i] = Read<T>();
00180
00181
00182
00183
00184 if (numElems == 0 && iter)
00185 iter->ProceedToNextVariable();
00186 }
00187
00188 template<>
00189 void DataDeserializer::ReadArray(bit *dst, size_t numElems);
00190
00191 }