![]() |
VR-Forces 4.0.4 Class Documentation
|
00001 /****************************************************************************** 00002 ** Copyright (c) 2007 MAK Technologies, Inc. 00003 ** All rights reserved. 00004 ******************************************************************************/ 00005 /****************************************************************************** 00006 ** $RCSfile: DtMessage.h,v $ $Revision: 1.28 $ $State: Exp $ 00007 ******************************************************************************/ 00008 00011 #ifndef DtMessage_H_ 00012 #define DtMessage_H_ 00013 00014 #include <vrvUtil/vrvUtil.h> 00015 #include <vector> 00016 #include <sstream> 00017 #include <ostream> 00018 00019 class portable_binary_iarchive; 00020 class portable_binary_oarchive; 00021 00022 namespace makVrv 00023 { 00024 00025 class DtUnicode; 00026 00031 class DT_DLL_VRVUTIL DtMessage 00032 { 00033 public: 00034 00035 typedef unsigned char Byte; 00036 typedef std::vector<Byte> ByteBuffer; 00037 00038 static const int theHeaderSize = (sizeof(unsigned short) + sizeof(char)) * 2; 00039 00040 //Helper Macro to pack the size of a type into a unique id. 00041 #define packSizeOf(type) ((sizeof(type)-1)<<4) 00042 00043 //Helper Macro to unpack the size of a datatype. 00044 #define unpackSizeOf(dataType) ((dataType>>4)+1) 00045 00046 //Help macro to check to see if a datatype enum is a simple type. 00047 #define isSimpleType(dataType) (dataType<128) 00048 00049 //Simple data types are encoded as 1 bit 0, 3 bit size, 4 bit id 00050 //Complex data types are encoded as 8bit id, w/ MSBit = 1 (ie >= 128) 00051 enum DataType 00052 { 00053 Unknown = 0, 00054 Char = 1 | packSizeOf(char), 00055 UnsignedChar = 2 | packSizeOf(unsigned char), 00056 Short = 3 | packSizeOf(short), 00057 UnsignedShort = 4 | packSizeOf(unsigned short), 00058 Int = 5 | packSizeOf(int), 00059 UnsignedInt = 6 | packSizeOf(unsigned int), 00060 Float = 7 | packSizeOf(float), 00061 LongLong = 8 | packSizeOf(long long), 00062 UnsignedLongLong = 9 | packSizeOf(unsigned long long), 00063 Double = 10 | packSizeOf(double), 00064 Bool = 11 | packSizeOf(bool), 00065 String = 128, 00066 FixedArray = 129, 00067 UnicodeString = 130, 00068 User_Start = 150, 00069 User_Last = 255 00070 }; 00071 00072 //Data Format: 00074 // 00077 // 00081 00085 DtMessage(unsigned short classId = 0,unsigned short functionId = 0); 00086 00091 DtMessage(const Byte* buffer,size_t size); 00092 00096 DtMessage(const DtMessage& orig); 00097 00099 ~DtMessage(); 00100 00102 void printDebugMessageContents(std::ostream&); 00103 00105 const char* dataTypeName(unsigned char dataType); 00106 00108 unsigned short classId() const; 00109 00111 unsigned short functionId() const; 00112 00114 const Byte* data() const; 00115 00117 size_t size() const; 00118 00120 void emptyMessage(); 00121 00124 void resetRead(); 00125 00129 void serializeHeader(unsigned short classId, unsigned short functionId); 00130 00133 bool serializeWriteOut() const; 00134 00137 void setSerializeWriteOut(bool writeOut); 00138 00140 00141 00142 DtMessage& operator >> (bool& b); 00143 DtMessage& operator >> (char& c); 00144 DtMessage& operator >> (unsigned char& c); 00145 DtMessage& operator >> (short& i); 00146 DtMessage& operator >> (unsigned short& i); 00147 DtMessage& operator >> (int& i); 00148 DtMessage& operator >> (unsigned int& i); 00149 DtMessage& operator >> (long long& i); 00150 DtMessage& operator >> (unsigned long long& i); 00151 DtMessage& operator >> (float& f); 00152 DtMessage& operator >> (double& f); 00153 DtMessage& operator >> (std::string& s); 00154 DtMessage& operator >> (DtUnicode& s); 00155 DtMessage& operator >> (ByteBuffer& rawData); 00156 00158 DtMessage& operator >> (std::pair<void*,int>& rawData); 00160 00162 00163 DtMessage& operator << (bool b); 00164 DtMessage& operator << (char c); 00165 DtMessage& operator << (unsigned char c); 00166 DtMessage& operator << (short i); 00167 DtMessage& operator << (unsigned short i); 00168 DtMessage& operator << (int i); 00169 DtMessage& operator << (unsigned int i); 00170 DtMessage& operator << (long long i); 00171 DtMessage& operator << (unsigned long long i); 00172 DtMessage& operator << (float f); 00173 DtMessage& operator << (double f); 00174 DtMessage& operator << (const std::string& s); 00175 DtMessage& operator << (const DtUnicode& s); 00176 DtMessage& operator << (const char* str); 00177 DtMessage& operator << (const ByteBuffer& rawData); 00178 DtMessage& operator << (const std::pair<void*,int>& rawData); 00180 00182 void addOnlyData(DtMessage& message); 00183 00185 void addData(unsigned int dataType,const void* data,int dataSize); 00186 00188 bool canReadData() const; 00189 00192 unsigned char nextDataType() const; 00193 00198 unsigned int nextDataSize() const; 00199 00202 const void* nextDataPointer() const; 00203 00205 void skipToNextData(); 00206 00209 void advanceRead(size_t bytes); 00210 00214 void getData(int dataType,void* output); 00215 00217 00218 00219 void addMultiple() 00220 { 00221 } 00222 00223 template <typename T1> 00224 void addMultiple(T1 t1) 00225 { 00226 *this << t1; 00227 } 00228 00229 template <typename T1,typename T2> 00230 void addMultiple(T1 t1,T2 t2) 00231 { 00232 *this << t1 << t2; 00233 } 00234 00235 template <typename T1,typename T2,typename T3> 00236 void addMultiple(T1 t1,T2 t2,T3 t3) 00237 { 00238 *this << t1 << t2 << t3; 00239 } 00240 00241 template <typename T1,typename T2,typename T3,typename T4> 00242 void addMultiple(T1 t1,T2 t2,T3 t3,T4 t4) 00243 { 00244 *this << t1 << t2 << t3 << t4; 00245 } 00246 00247 template <typename T1,typename T2,typename T3,typename T4,typename T5> 00248 void addMultiple(T1 t1,T2 t2,T3 t3,T4 t4,T5 t5) 00249 { 00250 *this << t1 << t2 << t3 << t4 << t5; 00251 } 00252 00253 template <typename T1,typename T2,typename T3,typename T4,typename T5, 00254 typename T6> 00255 void addMultiple(T1 t1,T2 t2,T3 t3,T4 t4,T5 t5,T6 t6) 00256 { 00257 *this << t1 << t2 << t3 << t4 << t5 << t6; 00258 } 00259 00260 template <typename T1,typename T2,typename T3,typename T4,typename T5, 00261 typename T6,typename T7> 00262 void addMultiple(T1 t1,T2 t2,T3 t3,T4 t4,T5 t5,T6 t6,T7 t7) 00263 { 00264 *this << t1 << t2 << t3 << t4 << t5 << t6 << t7; 00265 } 00266 00267 template <typename T1,typename T2,typename T3,typename T4,typename T5, 00268 typename T6,typename T7,typename T8> 00269 void addMultiple(T1 t1,T2 t2,T3 t3,T4 t4,T5 t5,T6 t6,T7 t7,T8 t8) 00270 { 00271 *this << t1 << t2 << t3 << t4 << t5 << t6 << t7 << t8; 00272 } 00273 00274 void readMultiple() 00275 { 00276 } 00277 00278 template <typename T1> 00279 void readMultiple(T1& t1) 00280 { 00281 *this >> t1; 00282 } 00283 00284 template <typename T1,typename T2> 00285 void readMultiple(T1& t1,T2& t2) 00286 { 00287 *this >> t1 >> t2; 00288 } 00289 00290 template <typename T1,typename T2,typename T3> 00291 void readMultiple(T1& t1,T2& t2,T3& t3) 00292 { 00293 *this >> t1 >> t2 >> t3; 00294 } 00295 00296 template <typename T1,typename T2,typename T3,typename T4> 00297 void readMultiple(T1& t1,T2& t2,T3& t3,T4& t4) 00298 { 00299 *this >> t1 >> t2 >> t3 >> t4; 00300 } 00301 00302 template <typename T1,typename T2,typename T3,typename T4,typename T5> 00303 void readMultiple(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5) 00304 { 00305 *this >> t1 >> t2 >> t3 >> t4 >> t5; 00306 } 00307 00308 template <typename T1,typename T2,typename T3,typename T4,typename T5, 00309 typename T6> 00310 void readMultiple(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5,T6& t6) 00311 { 00312 *this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6; 00313 } 00314 00315 template <typename T1,typename T2,typename T3,typename T4,typename T5, 00316 typename T6,typename T7> 00317 void readMultiple(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5,T6& t6,T7& t7) 00318 { 00319 *this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6 >> t7; 00320 } 00321 00322 template <typename T1,typename T2,typename T3,typename T4,typename T5, 00323 typename T6,typename T7,typename T8> 00324 void readMultiple(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5,T6& t6,T7& t7,T8& t8) 00325 { 00326 *this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6 >> t7 >> t8; 00327 } 00328 00329 00330 template <typename T1> 00331 void serialize(T1& t1) 00332 { 00333 if(mySerializeWriteOutFlag) 00334 *this >> t1; 00335 else 00336 *this << t1; 00337 } 00338 00339 template <typename T1,typename T2> 00340 void serialize(T1& t1,T2& t2) 00341 { 00342 if(mySerializeWriteOutFlag) 00343 *this >> t1 >> t2; 00344 else 00345 *this << t1 << t2; 00346 } 00347 00348 template <typename T1,typename T2,typename T3> 00349 void serialize(T1& t1,T2& t2,T3& t3) 00350 { 00351 if(mySerializeWriteOutFlag) 00352 *this >> t1 >> t2 >> t3; 00353 else 00354 *this << t1 << t2 << t3; 00355 } 00356 00357 template <typename T1,typename T2,typename T3,typename T4> 00358 void serialize(T1& t1,T2& t2,T3& t3,T4& t4) 00359 { 00360 if(mySerializeWriteOutFlag) 00361 *this >> t1 >> t2 >> t3 >> t4; 00362 else 00363 *this << t1 << t2 << t3 << t4; 00364 } 00365 00366 template <typename T1,typename T2,typename T3,typename T4,typename T5> 00367 void serialize(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5) 00368 { 00369 if(mySerializeWriteOutFlag) 00370 *this >> t1 >> t2 >> t3 >> t4 >> t5; 00371 else 00372 *this << t1 << t2 << t3 << t4 << t5; 00373 } 00374 00375 template <typename T1,typename T2,typename T3,typename T4,typename T5, 00376 typename T6> 00377 void serialize(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5,T6& t6) 00378 { 00379 if(mySerializeWriteOutFlag) 00380 *this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6; 00381 else 00382 *this << t1 << t2 << t3 << t4 << t5 << t6; 00383 } 00384 00385 template <typename T1,typename T2,typename T3,typename T4,typename T5, 00386 typename T6,typename T7> 00387 void serialize(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5,T6& t6,T7& t7) 00388 { 00389 if(mySerializeWriteOutFlag) 00390 *this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6 >> t7; 00391 else 00392 *this << t1 << t2 << t3 << t4 << t5 << t6 << t7; 00393 } 00394 00395 template <typename T1,typename T2,typename T3,typename T4,typename T5, 00396 typename T6,typename T7,typename T8> 00397 void serialize(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5,T6& t6,T7& t7,T8& t8) 00398 { 00399 if(mySerializeWriteOutFlag) 00400 *this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6 >> t7 >> t8; 00401 else 00402 *this << t1 << t2 << t3 << t4 << t5 << t6 << t7 << t8; 00403 } 00404 00405 //Allows serialize any serialize via archive classes. 00406 template <typename T> 00407 void serializeViaArchive(T& t) 00408 { 00412 class FastStringBuf : public std::stringbuf 00413 { 00414 public: 00415 const char* c_str() const { return pbase();} 00416 size_t outputSize() const 00417 { 00418 return pptr() - pbase(); 00419 } 00420 }; 00421 00422 std::pair<void*,int> configMemory; 00423 //Are we writing to the configuration. 00424 if(serializeWriteOut()) 00425 { 00426 //Yank out a binary chunk from the message. 00427 serialize(configMemory); 00428 //Create an input string stream. 00429 std::istringstream memoryStream; 00430 //Set the stream to the message data. 00431 memoryStream.str(std::string((char*)configMemory.first,configMemory.second)); 00432 //Create an archive to read the stream. 00433 portable_binary_iarchive ia(memoryStream); 00434 //Serialize out from the stream. 00435 //t.serialize(ia,0); 00436 ia & t; 00437 //Clean up the message memory. 00438 delete[] (char*)configMemory.first; 00439 } 00440 else 00441 { 00442 00443 //Create a fast buffer. 00444 FastStringBuf fastBuffer; 00445 //Create a output stream for it. 00446 std::ostream memoryStream(&fastBuffer); 00447 //Create an archive to write to it. 00448 portable_binary_oarchive oa(memoryStream); 00449 //Write the object to the archive. 00450 oa & t; 00451 //t.serialize(oa,boost::serialization::version<T>::value); 00452 //Grab the written data. 00453 configMemory.first = (void*) fastBuffer.c_str(); 00454 configMemory.second = fastBuffer.outputSize(); 00455 //Put that data into this message. 00456 serialize(configMemory); 00457 } 00458 } 00459 00460 protected: 00461 00463 void setClassId(unsigned short classId); 00464 00466 void setFunctionId(unsigned short functionId); 00467 00468 ByteBuffer myBuffer; 00469 ByteBuffer::const_iterator myReadIter; 00470 bool mySerializeWriteOutFlag; 00471 00472 }; 00473 00474 } 00475 00476 #endif