1 // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Library General Public
5 // License as published by the Free Software Foundation; either
6 // version 2 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Library General Public License for more details.
13 // You should have received a copy of the GNU General Public License
14 // along with this program; if not, write to the Free Software
15 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 #include "RTI13ObjectClass.hxx"
19 #include "RTI13Ambassador.hxx"
23 RTI13ObjectClass::RTI13ObjectClass(HLAObjectClass* hlaObjectClass, RTI::ObjectClassHandle& handle, RTI13Ambassador* ambassador) :
24 RTIObjectClass(hlaObjectClass),
26 _ambassador(ambassador)
28 if (0 != getOrCreateAttributeIndex("privilegeToDelete") &&
29 0 != getOrCreateAttributeIndex("HLAprivilegeToDeleteObject"))
30 SG_LOG(SG_NETWORK, SG_WARN, "RTI13ObjectClass: Cannot find object root attribute.");
33 RTI13ObjectClass::~RTI13ObjectClass()
38 RTI13ObjectClass::getName() const
40 if (!_ambassador.valid()) {
41 SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
44 return _ambassador->getObjectClassName(_handle);
48 RTI13ObjectClass::getNumAttributes() const
50 return _attributeHandleVector.size();
54 RTI13ObjectClass::getAttributeIndex(const std::string& name) const
56 if (!_ambassador.valid()) {
57 SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
62 RTI::AttributeHandle attributeHandle = _ambassador->getAttributeHandle(name, _handle);
64 AttributeHandleIndexMap::const_iterator i = _attributeHandleIndexMap.find(attributeHandle);
65 if (i != _attributeHandleIndexMap.end())
70 } catch (RTI::ObjectClassNotDefined& e) {
71 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
73 } catch (RTI::NameNotFound& e) {
74 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
76 } catch (RTI::FederateNotExecutionMember& e) {
77 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
79 } catch (RTI::ConcurrentAccessAttempted& e) {
80 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
82 } catch (RTI::RTIinternalError& e) {
83 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
86 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute.");
92 RTI13ObjectClass::getOrCreateAttributeIndex(const std::string& name)
94 if (!_ambassador.valid()) {
95 SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
100 RTI::AttributeHandle attributeHandle = _ambassador->getAttributeHandle(name, _handle);
102 AttributeHandleIndexMap::const_iterator i = _attributeHandleIndexMap.find(attributeHandle);
103 if (i != _attributeHandleIndexMap.end())
106 unsigned index = _attributeHandleVector.size();
107 _attributeHandleIndexMap[attributeHandle] = index;
108 _attributeHandleVector.push_back(attributeHandle);
109 _attributeDataVector.push_back(name);
113 } catch (RTI::ObjectClassNotDefined& e) {
114 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
116 } catch (RTI::NameNotFound& e) {
117 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
119 } catch (RTI::FederateNotExecutionMember& e) {
120 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
122 } catch (RTI::ConcurrentAccessAttempted& e) {
123 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
125 } catch (RTI::RTIinternalError& e) {
126 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
129 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute.");
135 // RTI13ObjectClass::getAttributeName(unsigned index) const
137 // SGSharedPtr<RTI13Ambassador> ambassador = _ambassador.lock();
138 // if (!ambassador.valid()) {
139 // SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
140 // return std::string();
144 // return ambassador->getAttributeName(getAttributeHandle(index), _handle);
145 // } catch (RTI::ObjectClassNotDefined& e) {
146 // SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute name: " << e._name << " " << e._reason);
147 // return std::string();
148 // } catch (RTI::AttributeNotDefined& e) {
149 // SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute name: " << e._name << " " << e._reason);
150 // return std::string();
151 // } catch (RTI::FederateNotExecutionMember& e) {
152 // SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute name: " << e._name << " " << e._reason);
153 // return std::string();
154 // } catch (RTI::ConcurrentAccessAttempted& e) {
155 // SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute name: " << e._name << " " << e._reason);
156 // return std::string();
157 // } catch (RTI::RTIinternalError& e) {
158 // SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute name: " << e._name << " " << e._reason);
159 // return std::string();
161 // SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute name.");
162 // return std::string();
167 RTI13ObjectClass::publish(const std::set<unsigned>& indexSet)
169 if (!_ambassador.valid()) {
170 SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
175 std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(indexSet.size()));
176 for (std::set<unsigned>::const_iterator i = indexSet.begin(); i != indexSet.end(); ++i) {
177 if (_attributeHandleVector.size() <= *i) {
178 SG_LOG(SG_NETWORK, SG_WARN, "RTI13ObjectClass::publish(): Invalid attribute index!");
181 attributeHandleSet->add(_attributeHandleVector[*i]);
184 _ambassador->publishObjectClass(_handle, *attributeHandleSet);
186 for (unsigned i = 0; i < getNumAttributes(); ++i) {
187 _attributeDataVector[i]._published = true;
191 } catch (RTI::ObjectClassNotDefined& e) {
192 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
194 } catch (RTI::AttributeNotDefined& e) {
195 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
197 } catch (RTI::OwnershipAcquisitionPending& e) {
198 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
200 } catch (RTI::FederateNotExecutionMember& e) {
201 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
203 } catch (RTI::ConcurrentAccessAttempted& e) {
204 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
206 } catch (RTI::SaveInProgress& e) {
207 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
209 } catch (RTI::RestoreInProgress& e) {
210 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
212 } catch (RTI::RTIinternalError& e) {
213 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
216 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class.");
222 RTI13ObjectClass::unpublish()
224 if (!_ambassador.valid()) {
225 SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
230 _ambassador->unpublishObjectClass(_handle);
232 for (unsigned i = 0; i < getNumAttributes(); ++i) {
233 _attributeDataVector[i]._published = false;
237 } catch (RTI::ObjectClassNotDefined& e) {
238 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
240 } catch (RTI::ObjectClassNotPublished& e) {
241 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
243 } catch (RTI::OwnershipAcquisitionPending& e) {
244 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
246 } catch (RTI::FederateNotExecutionMember& e) {
247 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
249 } catch (RTI::ConcurrentAccessAttempted& e) {
250 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
252 } catch (RTI::SaveInProgress& e) {
253 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
255 } catch (RTI::RestoreInProgress& e) {
256 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
258 } catch (RTI::RTIinternalError& e) {
259 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
262 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class.");
268 RTI13ObjectClass::subscribe(const std::set<unsigned>& indexSet, bool active)
270 if (!_ambassador.valid()) {
271 SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
276 std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(indexSet.size()));
277 for (std::set<unsigned>::const_iterator i = indexSet.begin();
278 i != indexSet.end(); ++i) {
279 if (_attributeHandleVector.size() <= *i) {
280 SG_LOG(SG_NETWORK, SG_WARN, "RTI13ObjectClass::subscribe(): Invalid attribute index!");
283 attributeHandleSet->add(_attributeHandleVector[*i]);
286 _ambassador->subscribeObjectClassAttributes(_handle, *attributeHandleSet, active);
288 for (unsigned i = 0; i < getNumAttributes(); ++i) {
289 _attributeDataVector[i]._subscribed = true;
293 } catch (RTI::ObjectClassNotDefined& e) {
294 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
296 } catch (RTI::AttributeNotDefined& e) {
297 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
299 } catch (RTI::FederateNotExecutionMember& e) {
300 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
302 } catch (RTI::ConcurrentAccessAttempted& e) {
303 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
305 } catch (RTI::SaveInProgress& e) {
306 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
308 } catch (RTI::RestoreInProgress& e) {
309 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
311 } catch (RTI::RTIinternalError& e) {
312 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
315 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class.");
321 RTI13ObjectClass::unsubscribe()
323 if (!_ambassador.valid()) {
324 SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
329 _ambassador->unsubscribeObjectClass(_handle);
331 for (unsigned i = 0; i < getNumAttributes(); ++i) {
332 _attributeDataVector[i]._subscribed = false;
336 } catch (RTI::ObjectClassNotDefined& e) {
337 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
339 } catch (RTI::ObjectClassNotSubscribed& e) {
340 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
342 } catch (RTI::FederateNotExecutionMember& e) {
343 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
345 } catch (RTI::ConcurrentAccessAttempted& e) {
346 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
348 } catch (RTI::SaveInProgress& e) {
349 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
351 } catch (RTI::RestoreInProgress& e) {
352 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
354 } catch (RTI::RTIinternalError& e) {
355 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
358 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class.");
364 RTI13ObjectClass::registerObjectInstance(HLAObjectInstance* hlaObjectInstance)
366 if (!_ambassador.valid()) {
367 SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
371 SGSharedPtr<RTI13Federate> federate = _ambassador->_federate.lock();
372 if (!federate.valid()) {
373 SG_LOG(SG_NETWORK, SG_WARN, "Error: Federate is zero.");
378 RTI::ObjectHandle objectHandle = _ambassador->registerObjectInstance(getHandle());
379 RTI13ObjectInstance* objectInstance = new RTI13ObjectInstance(objectHandle, hlaObjectInstance, this, _ambassador.get(), true);
380 federate->insertObjectInstance(objectInstance);
381 return objectInstance;
382 } catch (RTI::ObjectClassNotDefined& e) {
383 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
385 } catch (RTI::ObjectClassNotPublished& e) {
386 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
388 } catch (RTI::FederateNotExecutionMember& e) {
389 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
391 } catch (RTI::ConcurrentAccessAttempted& e) {
392 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
394 } catch (RTI::SaveInProgress& e) {
395 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
397 } catch (RTI::RestoreInProgress& e) {
398 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
400 } catch (RTI::RTIinternalError& e) {
401 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);