18 #include <vl/stateEncoderFactory.h>
20 #define DtALMOST(x, y, e) (((x)<=((y)+(e))) && ((x)>=((y)-(e))))
22 namespace makVrfVrlinkExtToolkit
26 template <
typename StateRepType>
29 std::map<DtString, RTI::AttributeHandle> attrNamesToHandles;
31 const RTI::AttributeHandleSet& ahs = desc->attrHandleSet();
33 DtObjClassDesc* baseClass = desc->baseClass();
38 attrNamesToHandles = StateRepType::attributeNameToHandleMap(baseClass->handle());
45 RTI::AttributeHandleSet::const_iterator itr = ahs.begin();
46 const RTI::AttributeHandleSet::const_iterator end = ahs.end();
47 for (; itr != end; itr++)
49 DtString attrName = desc->attributeNameByHandle(*itr);
50 if(!baseClass->hasAttribute(attrName.c_str()))
52 attrNamesToHandles.insert(std::make_pair(attrName, *itr));
58 for (RTI::ULong i = 0; i < ahs.size(); i++)
60 RTI::AttributeHandle hdl = ahs.getHandle(i);
61 DtString attrName = desc->attributeNameByHandle(hdl);
62 if(!baseClass->hasAttribute(attrName.c_str()))
64 attrNamesToHandles.insert(std::make_pair(attrName, hdl));
77 std::map<DtString, RTI::AttributeHandle> attrNamesToHandles;
79 const RTI::AttributeHandleSet& ahs = desc->attrHandleSet();
84 RTI::AttributeHandleSet::const_iterator itr = ahs.begin();
85 const RTI::AttributeHandleSet::const_iterator end = ahs.end();
86 for (; itr != end; itr++)
88 DtString attrName = desc->attributeNameByHandle(*itr);
89 attrNamesToHandles.insert(std::make_pair(attrName, *itr));
94 for (RTI::ULong i = 0; i < ahs.size(); i++)
96 RTI::AttributeHandle hdl = ahs.getHandle(i);
97 DtString attrName = desc->attributeNameByHandle(hdl);
98 attrNamesToHandles.insert(std::make_pair(attrName, hdl));
108 const DtString hla13RootName(
"ObjectRoot.");
109 const DtString hla1516RootName(
"HLAobjectRoot.");
111 const char* name1Ptr = name1.c_str();
112 const char* name2Ptr = name2.c_str();
114 if (name1.findString(hla13RootName) == 0)
116 name1Ptr += hla13RootName.size();
118 else if (name1.findString(hla1516RootName) == 0)
120 name1Ptr += hla1516RootName.size();
123 if (name2.findString(hla13RootName) == 0)
125 name2Ptr += hla13RootName.size();
127 else if (name2.findString(hla1516RootName) == 0)
129 name2Ptr += hla1516RootName.size();
132 return (strcmp(name1Ptr, name2Ptr) == 0);
150 template <
typename StateRepType,
typename PublisherType,
typename ReflectedObjType>
154 const DtFomMapper::DtObjectClassChooserWithUsrData& classChooser,
155 void* classChooserUsr,
156 DtExerciseConn* exConn)
158 static DtFomMapper::DtObjectClassChooserWithUsrData prevClassChooser = 0;
159 static void* prevClassChooserUsr = 0;
163 thePublisherName = publisherName;
164 theReflListName = reflListName;
168 thePublisherName.size() > 0 &&
169 (prevClassChooser != classChooser ||
170 prevClassChooserUsr != classChooserUsr))
173 exConn->fomMapper()->setObjectClassChooser(thePublisherName.c_str(), classChooser, classChooserUsr);
180 static DtTime prevExConnInitTime = -1.0;
181 DtTime exConnInitTime = exConn->clock()->absRealTime() - exConn->clock()->elapsedRealTime();
182 if (
DtALMOST(prevExConnInitTime, exConnInitTime, 0.0001))
188 static DtString theExtendedAttributesClassName =
"VrfExtendedAttributes";
189 static std::vector<DtString> theFullClassNames;
191 std::set<DtString> objClassNames;
194 DtObjClassDesc* baseEntDesc = exConn->fom()->objClassByName(fullBaseClassName);
195 DtObjClassDesc* classDesc = NULL;
198 for (std::list<DtObjClassDesc*>::const_iterator item = exConn->fom()->objClassList().begin();
199 item != exConn->fom()->objClassList().end();
202 classDesc =
const_cast<DtObjClassDesc*
>(*item);
204 for (classDesc = exConn->fom()->firstObjClass();
206 classDesc = exConn->fom()->nextObjClass(classDesc))
209 if (baseEntDesc && classDesc->isOfClass(baseEntDesc->handle()))
211 theFullClassNames.push_back(classDesc->name());
216 const std::set<DtString>* currObjClassNames = exConn->fomMapper()->objectClassNames(theReflListName.c_str());
217 if(currObjClassNames)
219 objClassNames = *currObjClassNames;
222 for(
int i = 0; i < theFullClassNames.size(); ++i)
224 classDesc = exConn->fom()->objClassByName(theFullClassNames[i].c_str());
229 classDesc->setUnknownAttributeChecker((DtHlaStateEncoder::DtAttributeCheckerWithHandle)
233 classDesc->setUnknownAttributeEncoder((DtHlaStateEncoder::DtAttributeEncoder)
237 classDesc->setUnknownAttributeDecoder((DtHlaStateDecoder::DtAttributeDecoder)
242 bool alreadyPresent =
false;
243 std::set<DtString>::const_iterator objClassIter = objClassNames.begin();
244 for (; objClassIter != objClassNames.end() && !alreadyPresent; ++objClassIter)
248 alreadyPresent =
true;
254 objClassNames.insert(theFullClassNames[i]);
255 exConn->fomMapper()->setObjectClassNames(theReflListName.c_str(), objClassNames);
259 setAttributeNameToHandleMap<StateRepType>(classDesc);
265 PublisherType::setStateRepCreator((
typename PublisherType::DtStateRepCreator)StateRepType::create);
266 ReflectedObjType::setStateRepCreator((
typename ReflectedObjType::DtStateRepCreator)StateRepType::create);
269 exConn->fomMapper()->setObjectClassNames(theReflListName.c_str(), objClassNames);
272 classDesc = exConn->fom()->objClassByName(theExtendedAttributesClassName.c_str());
280 DtWarn <<
"Could not initialize use of extended attributes class: " <<
281 theExtendedAttributesClassName <<
" not found in FOM." << std::endl;
284 prevExConnInitTime = exConnInitTime;