VR-Forces 4.1.1 Class Documentation
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  String = 128,
66  FixedArray = 129,
67  UnicodeString = 130,
68  User_Start = 150,
69  User_Last = 255
70  };
71 
72  //Data Format:
74  //
77  //
81 
85  DtMessage(unsigned short classId = 0,unsigned short functionId = 0);
86 
91  DtMessage(const Byte* buffer,size_t size);
92 
96  DtMessage(const DtMessage& orig);
97 
99  ~DtMessage();
100 
102  void printDebugMessageContents(std::ostream&);
103 
105  const char* dataTypeName(unsigned char dataType);
106 
108  unsigned short classId() const;
109 
111  unsigned short functionId() const;
112 
114  const Byte* data() const;
115 
117  size_t size() const;
118 
120  void emptyMessage();
121 
124  void resetRead();
125 
129  void serializeHeader(unsigned short classId, unsigned short functionId);
130 
133  bool serializeWriteOut() const;
134 
137  void setSerializeWriteOut(bool writeOut);
138 
140 
141 
142  DtMessage& operator >> (bool& b);
143  DtMessage& operator >> (char& c);
144  DtMessage& operator >> (unsigned char& c);
145  DtMessage& operator >> (short& i);
146  DtMessage& operator >> (unsigned short& i);
147  DtMessage& operator >> (int& i);
148  DtMessage& operator >> (unsigned int& i);
149  DtMessage& operator >> (long long& i);
150  DtMessage& operator >> (unsigned long long& i);
151  DtMessage& operator >> (float& f);
152  DtMessage& operator >> (double& f);
153  DtMessage& operator >> (std::string& s);
155  DtMessage& operator >> (ByteBuffer& rawData);
156 
158  DtMessage& operator >> (std::pair<void*,int>& rawData);
160 
162 
163  DtMessage& operator << (bool b);
164  DtMessage& operator << (char c);
165  DtMessage& operator << (unsigned char c);
166  DtMessage& operator << (short i);
167  DtMessage& operator << (unsigned short i);
168  DtMessage& operator << (int i);
169  DtMessage& operator << (unsigned int i);
170  DtMessage& operator << (long long i);
171  DtMessage& operator << (unsigned long long i);
172  DtMessage& operator << (float f);
173  DtMessage& operator << (double f);
174  DtMessage& operator << (const std::string& s);
175  DtMessage& operator << (const DtUnicode& s);
176  DtMessage& operator << (const char* str);
177  DtMessage& operator << (const ByteBuffer& rawData);
178  DtMessage& operator << (const std::pair<void*,int>& rawData);
180 
182  void addOnlyData(DtMessage& message);
183 
185  void addData(unsigned int dataType,const void* data,int dataSize);
186 
188  bool canReadData() const;
189 
192  unsigned char nextDataType() const;
193 
198  unsigned int nextDataSize() const;
199 
202  const void* nextDataPointer() const;
203 
205  void skipToNextData();
206 
209  void advanceRead(size_t bytes);
210 
214  void getData(int dataType,void* output);
215 
217 
218 
219  void addMultiple()
220  {
221  }
222 
223  template <typename T1>
224  void addMultiple(T1 t1)
225  {
226  *this << t1;
227  }
228 
229  template <typename T1,typename T2>
230  void addMultiple(T1 t1,T2 t2)
231  {
232  *this << t1 << t2;
233  }
234 
235  template <typename T1,typename T2,typename T3>
236  void addMultiple(T1 t1,T2 t2,T3 t3)
237  {
238  *this << t1 << t2 << t3;
239  }
240 
241  template <typename T1,typename T2,typename T3,typename T4>
242  void addMultiple(T1 t1,T2 t2,T3 t3,T4 t4)
243  {
244  *this << t1 << t2 << t3 << t4;
245  }
246 
247  template <typename T1,typename T2,typename T3,typename T4,typename T5>
248  void addMultiple(T1 t1,T2 t2,T3 t3,T4 t4,T5 t5)
249  {
250  *this << t1 << t2 << t3 << t4 << t5;
251  }
252 
253  template <typename T1,typename T2,typename T3,typename T4,typename T5,
254  typename T6>
255  void addMultiple(T1 t1,T2 t2,T3 t3,T4 t4,T5 t5,T6 t6)
256  {
257  *this << t1 << t2 << t3 << t4 << t5 << t6;
258  }
259 
260  template <typename T1,typename T2,typename T3,typename T4,typename T5,
261  typename T6,typename T7>
262  void addMultiple(T1 t1,T2 t2,T3 t3,T4 t4,T5 t5,T6 t6,T7 t7)
263  {
264  *this << t1 << t2 << t3 << t4 << t5 << t6 << t7;
265  }
266 
267  template <typename T1,typename T2,typename T3,typename T4,typename T5,
268  typename T6,typename T7,typename T8>
269  void addMultiple(T1 t1,T2 t2,T3 t3,T4 t4,T5 t5,T6 t6,T7 t7,T8 t8)
270  {
271  *this << t1 << t2 << t3 << t4 << t5 << t6 << t7 << t8;
272  }
273 
274  void readMultiple()
275  {
276  }
277 
278  template <typename T1>
279  void readMultiple(T1& t1)
280  {
281  *this >> t1;
282  }
283 
284  template <typename T1,typename T2>
285  void readMultiple(T1& t1,T2& t2)
286  {
287  *this >> t1 >> t2;
288  }
289 
290  template <typename T1,typename T2,typename T3>
291  void readMultiple(T1& t1,T2& t2,T3& t3)
292  {
293  *this >> t1 >> t2 >> t3;
294  }
295 
296  template <typename T1,typename T2,typename T3,typename T4>
297  void readMultiple(T1& t1,T2& t2,T3& t3,T4& t4)
298  {
299  *this >> t1 >> t2 >> t3 >> t4;
300  }
301 
302  template <typename T1,typename T2,typename T3,typename T4,typename T5>
303  void readMultiple(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5)
304  {
305  *this >> t1 >> t2 >> t3 >> t4 >> t5;
306  }
307 
308  template <typename T1,typename T2,typename T3,typename T4,typename T5,
309  typename T6>
310  void readMultiple(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5,T6& t6)
311  {
312  *this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6;
313  }
314 
315  template <typename T1,typename T2,typename T3,typename T4,typename T5,
316  typename T6,typename T7>
317  void readMultiple(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5,T6& t6,T7& t7)
318  {
319  *this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6 >> t7;
320  }
321 
322  template <typename T1,typename T2,typename T3,typename T4,typename T5,
323  typename T6,typename T7,typename T8>
324  void readMultiple(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5,T6& t6,T7& t7,T8& t8)
325  {
326  *this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6 >> t7 >> t8;
327  }
328 
329 
330  template <typename T1>
331  void serialize(T1& t1)
332  {
333  if(mySerializeWriteOutFlag)
334  *this >> t1;
335  else
336  *this << t1;
337  }
338 
339  template <typename T1,typename T2>
340  void serialize(T1& t1,T2& t2)
341  {
342  if(mySerializeWriteOutFlag)
343  *this >> t1 >> t2;
344  else
345  *this << t1 << t2;
346  }
347 
348  template <typename T1,typename T2,typename T3>
349  void serialize(T1& t1,T2& t2,T3& t3)
350  {
351  if(mySerializeWriteOutFlag)
352  *this >> t1 >> t2 >> t3;
353  else
354  *this << t1 << t2 << t3;
355  }
356 
357  template <typename T1,typename T2,typename T3,typename T4>
358  void serialize(T1& t1,T2& t2,T3& t3,T4& t4)
359  {
360  if(mySerializeWriteOutFlag)
361  *this >> t1 >> t2 >> t3 >> t4;
362  else
363  *this << t1 << t2 << t3 << t4;
364  }
365 
366  template <typename T1,typename T2,typename T3,typename T4,typename T5>
367  void serialize(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5)
368  {
369  if(mySerializeWriteOutFlag)
370  *this >> t1 >> t2 >> t3 >> t4 >> t5;
371  else
372  *this << t1 << t2 << t3 << t4 << t5;
373  }
374 
375  template <typename T1,typename T2,typename T3,typename T4,typename T5,
376  typename T6>
377  void serialize(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5,T6& t6)
378  {
379  if(mySerializeWriteOutFlag)
380  *this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6;
381  else
382  *this << t1 << t2 << t3 << t4 << t5 << t6;
383  }
384 
385  template <typename T1,typename T2,typename T3,typename T4,typename T5,
386  typename T6,typename T7>
387  void serialize(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5,T6& t6,T7& t7)
388  {
389  if(mySerializeWriteOutFlag)
390  *this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6 >> t7;
391  else
392  *this << t1 << t2 << t3 << t4 << t5 << t6 << t7;
393  }
394 
395  template <typename T1,typename T2,typename T3,typename T4,typename T5,
396  typename T6,typename T7,typename T8>
397  void serialize(T1& t1,T2& t2,T3& t3,T4& t4,T5& t5,T6& t6,T7& t7,T8& t8)
398  {
399  if(mySerializeWriteOutFlag)
400  *this >> t1 >> t2 >> t3 >> t4 >> t5 >> t6 >> t7 >> t8;
401  else
402  *this << t1 << t2 << t3 << t4 << t5 << t6 << t7 << t8;
403  }
404 
405  //Allows serialize any serialize via archive classes.
406  template <typename T>
407  void serializeViaArchive(T& t)
408  {
412  class FastStringBuf : public std::stringbuf
413  {
414  public:
415  const char* c_str() const { return pbase();}
416  size_t outputSize() const
417  {
418  return pptr() - pbase();
419  }
420  };
421 
422  std::pair<void*,int> configMemory;
423  //Are we writing to the configuration.
424  if(serializeWriteOut())
425  {
426  //Yank out a binary chunk from the message.
427  serialize(configMemory);
428  //Create an input string stream.
429  std::istringstream memoryStream;
430  //Set the stream to the message data.
431  memoryStream.str(std::string((char*)configMemory.first,configMemory.second));
432  //Create an archive to read the stream.
433  portable_binary_iarchive ia(memoryStream);
434  //Serialize out from the stream.
435  //t.serialize(ia,0);
436  ia & t;
437  //Clean up the message memory.
438  delete[] (char*)configMemory.first;
439  }
440  else
441  {
442 
443  //Create a fast buffer.
444  FastStringBuf fastBuffer;
445  //Create a output stream for it.
446  std::ostream memoryStream(&fastBuffer);
447  //Create an archive to write to it.
448  portable_binary_oarchive oa(memoryStream);
449  //Write the object to the archive.
450  oa & t;
451  //t.serialize(oa,boost::serialization::version<T>::value);
452  //Grab the written data.
453  configMemory.first = (void*) fastBuffer.c_str();
454  configMemory.second = fastBuffer.outputSize();
455  //Put that data into this message.
456  serialize(configMemory);
457  }
458  }
459 
460 protected:
461 
463  void setClassId(unsigned short classId);
464 
466  void setFunctionId(unsigned short functionId);
467 
469  ByteBuffer::const_iterator myReadIter;
471 
472 };
473 
474 }
475 
476 #endif

Document ID: Generated on Mon Apr 8 19:24:01 EDT 2013 from SVN revision 125877
Copyright © 2005-2013 VT MÄK. All Rights Reserved (www.mak.com)