VR-Forces 4.3 Class Documentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DtMessage.h
Go to the documentation of this file.
1 /******************************************************************************
2 ** Copyright (c) 2007 MAK Technologies, Inc.
3 ** All rights reserved.
4 ******************************************************************************/
5 /******************************************************************************
6 ** $RCSfile: DtMessage.h,v $ $Revision: 1.28 $ $State: Exp $
7 ******************************************************************************/
8 
11 #ifndef DtMessage_H_
12 #define DtMessage_H_
13 
14 #include <vrvUtil/vrvUtil.h>
15 #include <vector>
16 #include <sstream>
17 #include <ostream>
18 
19 class portable_binary_iarchive;
20 class portable_binary_oarchive;
21 
22 namespace makVrv
23 {
24 
25  class DtUnicode;
26 
32 {
33 public:
34 
35  typedef unsigned char Byte;
36  typedef std::vector<Byte> ByteBuffer;
37 
38  static const int theHeaderSize = (sizeof(unsigned short) + sizeof(char)) * 2;
39 
40  //Helper Macro to pack the size of a type into a unique id.
41  #define packSizeOf(type) ((sizeof(type)-1)<<4)
42 
43  //Helper Macro to unpack the size of a datatype.
44  #define unpackSizeOf(dataType) ((dataType>>4)+1)
45 
46  //Help macro to check to see if a datatype enum is a simple type.
47  #define isSimpleType(dataType) (dataType<128)
48 
49  //Simple data types are encoded as 1 bit 0, 3 bit size, 4 bit id
50  //Complex data types are encoded as 8bit id, w/ MSBit = 1 (ie >= 128)
51  enum DataType
52  {
53  Unknown = 0,
54  Char = 1 | packSizeOf(char),
55  UnsignedChar = 2 | packSizeOf(unsigned char),
56  Short = 3 | packSizeOf(short),
57  UnsignedShort = 4 | packSizeOf(unsigned short),
58  Int = 5 | packSizeOf(int),
59  UnsignedInt = 6 | packSizeOf(unsigned int),
60  Float = 7 | packSizeOf(float),
61  LongLong = 8 | packSizeOf(long long),
62  UnsignedLongLong = 9 | packSizeOf(unsigned long long),
63  Double = 10 | packSizeOf(double),
64  Bool = 11 | packSizeOf(bool),
65  Long = 12 | packSizeOf(long),
66  UnsignedLong = 13 | packSizeOf(unsigned long),
67  String = 128,
68  FixedArray = 129,
69  UnicodeString = 130,
70  User_Start = 150,
71  User_Last = 255
72  };
73 
74  //Data Format:
76  //
79  //
83 
87  DtMessage(unsigned short classId = 0,unsigned short functionId = 0);
88 
93  DtMessage(const Byte* buffer,size_t size);
94 
98  DtMessage(const DtMessage& orig);
99 
101  ~DtMessage();
102 
104  void printDebugMessageContents(std::ostream&);
105 
107  const char* dataTypeName(unsigned char dataType);
108 
110  unsigned short classId() const;
111 
113  unsigned short functionId() const;
114 
116  const Byte* data() const;
117 
119  size_t size() const;
120 
122  void emptyMessage();
123 
126  void resetRead();
127 
131  void serializeHeader(unsigned short classId, unsigned short functionId);
132 
135  bool serializeWriteOut() const;
136 
139  void setSerializeWriteOut(bool writeOut);
140 
142 
143 
144  DtMessage& operator >> (bool& b);
145  DtMessage& operator >> (char& c);
146  DtMessage& operator >> (unsigned char& c);
147  DtMessage& operator >> (short& i);
148  DtMessage& operator >> (unsigned short& i);
149  DtMessage& operator >> (int& i);
150  DtMessage& operator >> (unsigned int& i);
151  DtMessage& operator >> (long long& i);
152  DtMessage& operator >> (unsigned long long& i);
153  DtMessage& operator >> (float& f);
154  DtMessage& operator >> (double& f);
155  DtMessage& operator >> (long& i);
156  DtMessage& operator >> (unsigned long& i);
157  DtMessage& operator >> (std::string& s);
159  DtMessage& operator >> (ByteBuffer& rawData);
160 
162  DtMessage& operator >> (std::pair<void*,int>& rawData);
164 
166 
167  DtMessage& operator << (bool b);
168  DtMessage& operator << (char c);
169  DtMessage& operator << (unsigned char c);
170  DtMessage& operator << (short i);
171  DtMessage& operator << (unsigned short i);
172  DtMessage& operator << (int i);
173  DtMessage& operator << (unsigned int i);
174  DtMessage& operator << (long long i);
175  DtMessage& operator << (unsigned long long i);
176  DtMessage& operator << (float f);
177  DtMessage& operator << (double f);
178  DtMessage& operator << (long i);
179  DtMessage& operator << (unsigned long i);
180  DtMessage& operator << (const std::string& s);
181  DtMessage& operator << (const DtUnicode& s);
182  DtMessage& operator << (const char* str);
183  DtMessage& operator << (const ByteBuffer& rawData);
184  DtMessage& operator << (const std::pair<void*,int>& rawData);
186 
188  void addOnlyData(DtMessage& message);
189 
191  void addData(unsigned int dataType,const void* data,int dataSize);
192 
194  bool canReadData() const;
195 
198  unsigned char nextDataType() const;
199 
204  unsigned int nextDataSize() const;
205 
208  const void* nextDataPointer() const;
209 
211  void skipToNextData();
212 
215  void advanceRead(size_t bytes);
216 
220  void getData(int dataType,void* output);
221 
223 
224 
225  void addMultiple()
226  {
227  }
228 
229  template <typename T1>
230  void addMultiple(T1 t1)
231  {
232  *this << t1;
233  }
234 
235  template <typename T1,typename T2>
236  void addMultiple(T1 t1,T2 t2)
237  {
238  *this << t1 << t2;
239  }
240 
241  template <typename T1,typename T2,typename T3>
242  void addMultiple(T1 t1,T2 t2,T3 t3)
243  {
244  *this << t1 << t2 << t3;
245  }
246 
247  template <typename T1,typename T2,typename T3,typename T4>
248  void addMultiple(T1 t1,T2 t2,T3 t3,T4 t4)
249  {
250  *this << t1 << t2 << t3 << t4;
251  }
252 
253  template <typename T1,typename T2,typename T3,typename T4,typename T5>
254  void addMultiple(T1 t1,T2 t2,T3 t3,T4 t4,T5 t5)
255  {
256  *this << t1 << t2 << t3 << t4 << t5;
257  }
258 
259  template <typename T1,typename T2,typename T3,typename T4,typename T5,
260  typename T6>
261  void addMultiple(T1 t1,T2 t2,T3 t3,T4 t4,T5 t5,T6 t6)
262  {
263  *this << t1 << t2 << t3 << t4 << t5 << t6;
264  }
265 
266  template <typename T1,typename T2,typename T3,typename T4,typename T5,
267  typename T6,typename T7>
268  void addMultiple(T1 t1,T2 t2,T3 t3,T4 t4,T5 t5,T6 t6,T7 t7)
269  {
270  *this << t1 << t2 << t3 << t4 << t5 << t6 << t7;
271  }
272 
273  template <typename T1,typename T2,typename T3,typename T4,typename T5,
274  typename T6,typename T7,typename T8>
275  void addMultiple(T1 t1,T2 t2,T3 t3,T4 t4,T5 t5,T6 t6,T7 t7,T8 t8)
276  {
277  *this << t1 << t2 << t3 << t4 << t5 << t6 << t7 << t8;
278  }
279 
280  void readMultiple()
281  {
282  }
283 
284  template <typename T1>
285  void readMultiple(T1& t1)
286  {
287  *this >> t1;
288  }
289 
290  template <typename T1,typename T2>
291  void readMultiple(T1& t1,T2& t2)
292  {
293  *this >> t1 >> t2;
294  }
295 
296  template <typename T1,typename T2,typename T3>
297  void readMultiple(T1& t1,T2& t2,T3& t3)
298  {
299  *this >> t1 >> t2 >> t3;
300  }
301 
302  template <typename T1,typename T2,typename T3,typename T4>
303  void readMultiple(T1& t1,T2& t2,T3& t3,T4& t4)
304  {
305  *this >> t1 >> t2 >> t3 >> t4;
306  }
307 
308  template <typename T1,typename T2,typename T3,typename T4,typename T5>
309  void readMultiple(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5)
310  {
311  *this >> t1 >> t2 >> t3 >> t4 >> t5;
312  }
313 
314  template <typename T1,typename T2,typename T3,typename T4,typename T5,
315  typename T6>
316  void readMultiple(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5,T6& t6)
317  {
318  *this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6;
319  }
320 
321  template <typename T1,typename T2,typename T3,typename T4,typename T5,
322  typename T6,typename T7>
323  void readMultiple(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5,T6& t6,T7& t7)
324  {
325  *this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6 >> t7;
326  }
327 
328  template <typename T1,typename T2,typename T3,typename T4,typename T5,
329  typename T6,typename T7,typename T8>
330  void readMultiple(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5,T6& t6,T7& t7,T8& t8)
331  {
332  *this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6 >> t7 >> t8;
333  }
334 
335 
336  template <typename T1>
337  void serialize(T1& t1)
338  {
339  if(mySerializeWriteOutFlag)
340  *this >> t1;
341  else
342  *this << t1;
343  }
344 
345  template <typename T1,typename T2>
346  void serialize(T1& t1,T2& t2)
347  {
348  if(mySerializeWriteOutFlag)
349  *this >> t1 >> t2;
350  else
351  *this << t1 << t2;
352  }
353 
354  template <typename T1,typename T2,typename T3>
355  void serialize(T1& t1,T2& t2,T3& t3)
356  {
357  if(mySerializeWriteOutFlag)
358  *this >> t1 >> t2 >> t3;
359  else
360  *this << t1 << t2 << t3;
361  }
362 
363  template <typename T1,typename T2,typename T3,typename T4>
364  void serialize(T1& t1,T2& t2,T3& t3,T4& t4)
365  {
366  if(mySerializeWriteOutFlag)
367  *this >> t1 >> t2 >> t3 >> t4;
368  else
369  *this << t1 << t2 << t3 << t4;
370  }
371 
372  template <typename T1,typename T2,typename T3,typename T4,typename T5>
373  void serialize(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5)
374  {
375  if(mySerializeWriteOutFlag)
376  *this >> t1 >> t2 >> t3 >> t4 >> t5;
377  else
378  *this << t1 << t2 << t3 << t4 << t5;
379  }
380 
381  template <typename T1,typename T2,typename T3,typename T4,typename T5,
382  typename T6>
383  void serialize(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5,T6& t6)
384  {
385  if(mySerializeWriteOutFlag)
386  *this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6;
387  else
388  *this << t1 << t2 << t3 << t4 << t5 << t6;
389  }
390 
391  template <typename T1,typename T2,typename T3,typename T4,typename T5,
392  typename T6,typename T7>
393  void serialize(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5,T6& t6,T7& t7)
394  {
395  if(mySerializeWriteOutFlag)
396  *this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6 >> t7;
397  else
398  *this << t1 << t2 << t3 << t4 << t5 << t6 << t7;
399  }
400 
401  template <typename T1,typename T2,typename T3,typename T4,typename T5,
402  typename T6,typename T7,typename T8>
403  void serialize(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5,T6& t6,T7& t7,T8& t8)
404  {
405  if(mySerializeWriteOutFlag)
406  *this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6 >> t7 >> t8;
407  else
408  *this << t1 << t2 << t3 << t4 << t5 << t6 << t7 << t8;
409  }
410 
411  //Allows serialize any serialize via archive classes.
412  template <typename T>
413  void serializeViaArchive(T& t)
414  {
418  class FastStringBuf : public std::stringbuf
419  {
420  public:
421  const char* c_str() const { return pbase();}
422  size_t outputSize() const
423  {
424  return pptr() - pbase();
425  }
426  };
427 
428  std::pair<void*,int> configMemory;
429  //Are we writing to the configuration.
430  if(serializeWriteOut())
431  {
432  //Yank out a binary chunk from the message.
433  serialize(configMemory);
434  //Create an input string stream.
435  std::istringstream memoryStream;
436  //Set the stream to the message data.
437  memoryStream.str(std::string((char*)configMemory.first,configMemory.second));
438  //Create an archive to read the stream.
439  portable_binary_iarchive ia(memoryStream);
440  //Serialize out from the stream.
441  //t.serialize(ia,0);
442  ia & t;
443  //Clean up the message memory.
444  delete[] (char*)configMemory.first;
445  }
446  else
447  {
448 
449  //Create a fast buffer.
450  FastStringBuf fastBuffer;
451  //Create a output stream for it.
452  std::ostream memoryStream(&fastBuffer);
453  //Create an archive to write to it.
454  portable_binary_oarchive oa(memoryStream);
455  //Write the object to the archive.
456  oa & t;
457  //t.serialize(oa,boost::serialization::version<T>::value);
458  //Grab the written data.
459  configMemory.first = (void*) fastBuffer.c_str();
460  configMemory.second = fastBuffer.outputSize();
461  //Put that data into this message.
462  serialize(configMemory);
463  }
464  }
465 
466 protected:
467 
469  void setClassId(unsigned short classId);
470 
472  void setFunctionId(unsigned short functionId);
473 
475  ByteBuffer::const_iterator myReadIter;
477 
478 };
479 
480 }
481 
482 #endif

Document ID: Generated on Wed Mar 11 21:20:57 EDT 2015 from SVN revision 150940
Copyright © 2005-2014 VT MÄK. All Rights Reserved (www.mak.com)