![]() |
MAK RTIspy API Documentation for HLA 1.3
|
00001 /********************************************************************* 00002 ** Copyright (c) 2006 MaK Technologies, Inc. 00003 ** All rights reserved. 00004 *********************************************************************/ 00005 /********************************************************************* 00006 ** $RCSfile: metadata.h,v $ $Revision: 1.8 $ $State: Exp $ 00007 *********************************************************************/ 00008 00009 #ifndef DtRtiMetadata_H_ 00010 #define DtRtiMetadata_H_ 00011 00016 00017 #include <list> 00018 #include <internalTypes.h> 00019 #include "rtiMsg.h" 00020 00021 #define DtMetadataAlignNone 0 00022 #define DtMetadataAlign16Bit 1 00023 #define DtMetadataAlign32Bit 3 00024 #define DtMetadataAlign64Bit 7 00025 00026 typedef enum DtMetadataTypes_e 00027 { 00028 DtMetadataTypeNull = 0, 00029 DtMetadataTypeDestinationList, 00030 DtMetadataTypeTransport, 00031 DtMetadataTypeMcastAddr, 00032 DtMetadataTypeFwderGroupId, 00033 DtMetadataTypeTestId, 00034 DtMetadataTypeTimeStampInitiatorSendInteraction, 00035 DtMetadataTypeTimeStampInitiatorNetSend, 00036 DtMetadataTypeTimeStampRecipientNetRead, 00037 DtMetadataTypeTimeStampRecipientAsynchronousQueue, 00038 DtMetadataTypeTimeStampRecipientReceiveInteraction, 00039 DtMetadataTypeTimeStampRecipientSendInteraction, 00040 DtMetadataTypeTimeStampRecipientNetSend, 00041 DtMetadataTypeTimeStampInitiatorNetRead, 00042 DtMetadataTypeTimeStampInitiatorAsynchronousQueue, 00043 DtMetadataTypeTimeStampInitiatorReceiveInteraction, 00044 DtMetadataTypeFederateStateInfo, 00045 00046 00047 DtMetadataTypeEnd = 8191 00048 00049 } DtMetadataType; 00050 00070 typedef struct DtMetadataHeader_s 00071 { 00072 union DtMetadataHeaderCtl_u 00073 { 00074 DtU16 allFields; 00075 00076 struct DtMetadataHeaderCtl_s 00077 { 00078 #if DT_LITTLE_ENDIAN 00079 DtU16 type : 13; 00080 DtU16 hasPayload : 1; 00081 DtU16 copy : 1; 00082 DtU16 more : 1; 00083 #else 00084 DtU16 more : 1; 00085 DtU16 copy : 1; 00086 DtU16 hasPayload : 1; 00087 DtU16 type : 13; 00088 #endif //! DT_LITTLE_ENDIAN 00089 00090 } field; 00091 00092 } ctl; 00093 00094 union DtMetadataHeaderLenOrVal_u 00095 { 00096 DtU16 val; 00097 00098 struct DtMetadataHeaderPayloadLen_s 00099 { 00100 #if DT_LITTLE_ENDIAN 00101 DtU16 payloadLen : 11; 00102 DtU16 pad : 1; 00103 DtU16 alignPad : 2; 00104 DtU16 payloadAlignment : 2; 00105 #else 00106 DtU16 payloadAlignment : 2; 00107 DtU16 alignPad : 2; 00108 DtU16 pad : 1; 00109 DtU16 payloadLen : 11; 00110 #endif //! DT_LITTLE_ENDIAN 00111 } len; 00112 00113 } lenOrVal; 00114 00115 } DtMetadataNetHeader; 00116 00119 00122 class DT_DLL_LRC DtRtiMetadata 00123 { 00124 protected: 00125 00126 typedef std::list< DtMetadataNetHeader* > DtMetadataHeaderList; 00127 00128 public: 00129 00131 DtRtiMetadata( caddr_t msg, DtMetadataType type ); 00132 DtRtiMetadata( DtRtiMsg* msg, DtMetadataType type ); 00133 00135 virtual ~DtRtiMetadata(); 00136 00137 private: 00138 00140 DtRtiMetadata(const DtRtiMetadata &); 00141 00143 DtRtiMetadata& operator=(const DtRtiMetadata &); 00144 00145 public: 00146 00150 virtual bool locate( void** mdVal, unsigned int& size ) const; 00151 00155 virtual bool nullify(); 00156 00160 virtual unsigned int remove(); 00161 00165 virtual unsigned int purge(); 00166 00168 virtual bool isCopyEnabled(); 00169 virtual void setCopyEnable( bool copyEnable ); 00170 00178 virtual bool setLengthAsValue(unsigned int value); 00179 00182 virtual bool getLengthAsValue(unsigned int &value) const; 00183 00184 public: 00185 00187 static unsigned int metadataMaxSize(); 00188 00189 protected: 00190 00191 virtual DtMetadataNetHeader* getFirstHeader( ) const; 00192 virtual DtMetadataNetHeader* getHeaderByType( ) const; 00193 virtual DtU16 compactMetadata( char* dst, DtMetadataHeaderList& retentionPool, 00194 bool newFinal ); 00195 00196 protected: 00197 00200 // Returns boolean: type was found? 00201 static bool locate( char const* msg, DtMetadataType type, 00202 void** mdVal, unsigned int& size ); 00203 00205 static bool typeIsPresent( char const* msg, DtMetadataType type ); 00206 00207 00208 static DtMetadataNetHeader* getFirstHeader(char const* msg); 00209 static DtMetadataNetHeader* getNextHeader( DtMetadataNetHeader* hdr ); 00210 static DtMetadataNetHeader* getHeaderByType( char const* msg, DtMetadataType type ); 00211 00214 static void transmogrifyHeader( DtMetadataNetHeader& src, DtMetadataNetHeader& dest ); 00215 00218 static void reverseTransmogrifyHeader( DtMetadataNetHeader& src, DtMetadataNetHeader& dest ); 00219 00220 static unsigned int metadataSize( DtMetadataNetHeader& hdr ); 00221 static unsigned int metadataPayloadSize( DtMetadataNetHeader& hdr ); 00222 00223 protected: 00224 00225 DtRtiMsg * myMsg; 00226 caddr_t myMsgAddr; 00227 mutable unsigned int myMsgLen; 00228 char * myStartAddr; 00229 unsigned int mySize; 00230 bool myCopyEnabled; 00231 const DtMetadataType myMetaDataType; 00232 00233 protected: 00234 00235 static unsigned int theMaxMetadataBufferSize; 00236 }; 00237 00238 #endif //! DtRtiMetadata_H_