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

Document ID: Generated on Thu Apr 12 03:15:37 EDT 2018 from SVN revision 187986
Copyright © 2005-2018 VT MÄK. All Rights Reserved (www.mak.com)