VR-Forces 4.0.4 Class Documentation
include/vrvUtil/DtMessage.h
Go to the documentation of this file.
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

Document ID: Generated on Fri Jun 29 16:33:32 EDT 2012 from SVN revision 116588
Copyright © 2005-2012 VT MÄK Inc. All Rights Reserved (www.mak.com)