9 #ifndef DtHlaStateDecoder_H_
10 #define DtHlaStateDecoder_H_
39 DtObjClassDesc* classDesc);
42 virtual ~DtHlaStateDecoder();
45 DtHlaStateDecoder(
const DtHlaStateDecoder& orig);
48 DtHlaStateDecoder& operator=(
const DtHlaStateDecoder& orig);
51 typedef void (*DtAttributeDecoder) (
53 const RTI::AttributeHandleValuePairSet& avlist,
54 unsigned long pairSetIndex);
61 DtAttributeDecoder addDecoder(RTI::AttributeHandle h,
62 DtAttributeDecoder func);
63 DtAttributeDecoder removeDecoder(RTI::AttributeHandle h);
71 DtAttributeDecoder addDecoder(
char*
attrName,
72 DtAttributeDecoder func,
bool complain =
true);
73 DtAttributeDecoder removeDecoder(
char*
attrName,
bool complain =
true);
76 virtual DtAttributeDecoder decoder(
const RTI::AttributeHandle &handle)
const;
83 virtual RTI::ObjectClassHandle objectClassHandle()
const;
86 virtual DtHlaStateDecoder* clone()
const;
92 virtual DtHlaStateDecoder* clone(DtObjClassDesc* classDesc)
const;
100 static inline char* decodingBuffer(
int length);
103 static char* attributeData(
const RTI::AttributeHandleValuePairSet& attrs,
104 int index, RTI::ULong& length);
111 static char* attributeData(
112 const RTI::AttributeHandleValuePairSet& attrs,
int index, RTI::ULong& length,
113 unsigned int expectedDataSize,
char*
attrName);
117 static DtNetEventId* eventIdAttributeData(
const RTI::AttributeHandleValuePairSet& attrs,
120 static bool theUseGetValuePointer;
126 virtual void decodeAttribute(
128 const RTI::AttributeHandleValuePairSet& attrs,
129 unsigned long pairSetIndex)
const;
131 virtual void copyDecFuncs(
const DtHlaStateDecoder& orig);
134 typedef std::map<RTI::AttributeHandle, DtAttributeDecoder> AttributeHandleDecoderMap;
135 typedef std::map<RTI::AttributeHandle, bool> AttributeHandleBoolMap;
140 DtObjClassDesc* myClassDesc;
141 RTI::ObjectClassHandle myHandle;
146 AttributeHandleDecoderMap myDecoderList;
153 mutable AttributeHandleBoolMap myMutableReportedWarning;
157 inline RTI::ObjectClassHandle DtHlaStateDecoder::objectClassHandle()
const
162 inline DtHlaStateDecoder::DtAttributeDecoder
163 DtHlaStateDecoder::decoder(
const RTI::AttributeHandle &handle)
const
165 AttributeHandleDecoderMap::const_iterator pos = myDecoderList.find(handle);
166 if (pos != myDecoderList.end())
173 inline char* DtHlaStateDecoder::decodingBuffer(
int length)
178 inline char* DtHlaStateDecoder::attributeData(
179 const RTI::AttributeHandleValuePairSet& attrs,
int index, RTI::ULong& length)
182 if (theUseGetValuePointer)
184 dataPtr = attrs.getValuePointer(index, length);
188 length = attrs.getValueLength(index);
191 dataPtr = decodingBuffer(length);
192 attrs.getValue(index, dataPtr, length);
198 inline char* DtHlaStateDecoder::attributeData(
199 const RTI::AttributeHandleValuePairSet& attrs,
int index, RTI::ULong& length,
200 unsigned int expectedDataSize,
char*
attrName)
202 char* outDataPtr = 0;
203 if (theUseGetValuePointer)
205 outDataPtr = attrs.getValuePointer(index, length);
209 length = attrs.getValueLength(index);
210 if (length > 0 && length >= expectedDataSize)
212 outDataPtr = decodingBuffer(length);
213 attrs.getValue(index, outDataPtr, length);
217 if (length != expectedDataSize)
219 if (length < expectedDataSize)
221 DtWarn(
"Cannot decode attribute %s.\n"
222 "Size of data (%d) is smaller than expected (%d).\n",
223 attrName, length, expectedDataSize);
229 DtVerbose(
"When decoding attribute %s,\n"
230 "found size of data (%d) is larger than expected (%d).\n",
231 attrName, length, expectedDataSize);
238 inline DtNetEventId* DtHlaStateDecoder::eventIdAttributeData(
239 const RTI::AttributeHandleValuePairSet& attrs,
int index)
241 RTI::ULong length = 0;
243 length = attrs.getValueLength(index);
246 dataPtr = decodingBuffer(length+1);
247 attrs.getValue(index, dataPtr, length);
256 #define DtADD_ATTR_DECODER(attrName) \
257 addDecoder((char *)#attrName, (DtAttributeDecoder) decode##attrName);
260 #define DtADD_ATTR_DECODER_QUIET(attrName) \
261 addDecoder((char *)#attrName, (DtAttributeDecoder) decode##attrName, false);
267 #define DtDECLARE_ATTR_DECODER(stateRepClass, attrName) \
268 static void decode##attrName(stateRepClass* stateRep, \
269 const RTI::AttributeHandleValuePairSet& attrs, int pairSetIndex)
279 #define DtDEFINE_SIMPLE_ATTR_DECODER_WITH_CAST( \
280 decClass, stateRepClass, attrName, netType, mutator, castExpr) \
281 void decClass::decode##attrName( \
282 stateRepClass* stateRep, \
283 const RTI::AttributeHandleValuePairSet& attrs, \
286 RTI::ULong length = 0; \
287 netType* netValPtr = (netType*)attributeData(attrs, index, length, sizeof(netType), #attrName); \
290 stateRep->mutator(castExpr *netValPtr); \
301 #define DtDEFINE_SIMPLE_ATTR_DECODER_WITH_CAST_SET( \
302 decClass, stateRepClass, attrName, netType, castExpr) \
303 DtDEFINE_SIMPLE_ATTR_DECODER_WITH_CAST( \
304 decClass, stateRepClass, attrName, netType, set##attrName, castExpr)
312 #define DtDEFINE_SIMPLE_ATTR_DECODER_MUTATOR( \
313 decClass, stateRepClass, attrName, netType, mutator) \
314 void decClass::decode##attrName( \
315 stateRepClass* stateRep, \
316 const RTI::AttributeHandleValuePairSet& attrs, \
319 RTI::ULong length = 0; \
320 netType* netValPtr = (netType*)attributeData(attrs, index, length, sizeof(netType), #attrName); \
323 stateRep->mutator(*netValPtr); \
333 #define DtDEFINE_SIMPLE_ATTR_DECODER_SET( \
334 decClass, stateRepClass, attrName, netType) \
335 DtDEFINE_SIMPLE_ATTR_DECODER_MUTATOR( \
336 decClass, stateRepClass, attrName, netType, set##attrName)
346 #define DtDEFINE_SIMPLE_ATTR_DECODER_WITH_CAST_AND_PARAM( \
347 decClass, stateRepClass, attrName, netType, mutator, param, castExpr) \
348 void decClass::decode##attrName( \
349 stateRepClass* stateRep, \
350 const RTI::AttributeHandleValuePairSet& attrs, \
353 RTI::ULong length = 0; \
354 netType* netValPtr = (netType*)attributeData(attrs, index, length, sizeof(netType), #attrName); \
357 stateRep->mutator(param, castExpr *netValPtr); \
361 #define DtDEFINE_SIMPLE_GLOBAL_OBJECT_DESIGNATOR_ATTR_DECODER( \
362 decClass, stateRepClass, attrName, mutator) \
363 void decClass::decode##attrName( \
364 stateRepClass* stateRep, \
365 const RTI::AttributeHandleValuePairSet& attrs, \
368 RTI::ULong length = 0; \
369 DtGlobalObjectDesignator objName = (char*) attrs.getValuePointer(pairSetIndex, length); \
370 stateRep->mutator(objName); \
377 #define DtDEFINE_SIMPLE_ATTR_DECODER_BUFF(decClass, stateRepClass, \
379 void decClass::decode##attrName( \
380 stateRepClass* stateRep, \
381 const RTI::AttributeHandleValuePairSet& attrs, \
384 RTI::ULong length = 0; \
385 char* buff = attributeData(attrs, index, length); \
388 stateRep->mutator(buff, length); \
393 #define DtDEFINE_SIMPLE_ATTR_DECODER( \
394 decClass, stateRepClass, attrName, netType, mutator) \
395 DtDEFINE_SIMPLE_ATTR_DECODER_MUTATOR(decClass, stateRepClass, \
396 attrName, netType, mutator)
Declares a function for managing decoding buffers.
Instances of DtExerciseConn are used to provide an application's interface or connection to the netwo...
Definition: exerciseConnDIS.h:61
#define DT_DLL_VL
Definition: vlMachineTypes.h:108
DT_DLL_VLPROTIND char * DtDecodingBuffer(unsigned int requestedLength)
DtDecodingBuffer returns a pointer to a chunk of memory requestedLength long which can be used for de...
Functions in vlPrint.h provide an error and print facility for vrlink.
int DtNotifyLevel
DtNotifyLevel is used to control the level of diagnostics output by VR-Link.
DtOutputStream DtVerbose
These DtOutputStream instances are used for all print messaging in VR-Link.
DtStateRepository is an abstract base class for maintaining state for an object.
Definition: stateRepository.h:50
DtOutputStream DtWarn
These DtOutputStream instances are used for all print messaging in VR-Link.
Definition: eventId.h:131
Instances of DtStateMsg are used to represent state data communicated via the network in a DIS (as op...
Definition: stateMsgDIS.h:21
This file contains typedefs for machine dependant types.