1 // Copyright (C) 2009 - 2012 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, const RTI::ObjectClassHandle& handle, RTI13Ambassador* ambassador) :
24 RTIObjectClass(hlaObjectClass),
26 _ambassador(ambassador)
30 RTI13ObjectClass::~RTI13ObjectClass()
35 RTI13ObjectClass::resolveAttributeIndex(const std::string& name, unsigned index)
37 if (!_ambassador.valid()) {
38 SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
42 if (index != _attributeHandleVector.size()) {
43 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Resolving needs to happen in growing index order!");
48 RTI::AttributeHandle attributeHandle = _ambassador->getAttributeHandle(name, _handle);
50 AttributeHandleIndexMap::const_iterator i = _attributeHandleIndexMap.find(attributeHandle);
51 if (i != _attributeHandleIndexMap.end()) {
52 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Resolving attributeIndex for attribute \"" << name << "\" twice!");
56 _attributeHandleIndexMap[attributeHandle] = index;
57 _attributeHandleVector.push_back(attributeHandle);
61 } catch (RTI::ObjectClassNotDefined& e) {
62 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
64 } catch (RTI::NameNotFound& e) {
65 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
67 } catch (RTI::FederateNotExecutionMember& e) {
68 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
70 } catch (RTI::ConcurrentAccessAttempted& e) {
71 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
73 } catch (RTI::RTIinternalError& e) {
74 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
77 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute.");
83 RTI13ObjectClass::getNumAttributes() const
85 return _attributeHandleVector.size();
89 RTI13ObjectClass::publish(const HLAIndexList& indexList)
91 if (!_ambassador.valid()) {
92 SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
97 unsigned numAttributes = getNumAttributes();
98 std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(numAttributes));
99 for (HLAIndexList::const_iterator i = indexList.begin(); i != indexList.end(); ++i) {
100 if (_attributeHandleVector.size() <= *i) {
101 SG_LOG(SG_NETWORK, SG_WARN, "RTI13ObjectClass::publish(): Invalid attribute index!");
104 attributeHandleSet->add(_attributeHandleVector[*i]);
107 _ambassador->publishObjectClass(_handle, *attributeHandleSet);
110 } catch (RTI::ObjectClassNotDefined& e) {
111 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
113 } catch (RTI::AttributeNotDefined& e) {
114 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
116 } catch (RTI::OwnershipAcquisitionPending& e) {
117 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
119 } catch (RTI::FederateNotExecutionMember& e) {
120 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
122 } catch (RTI::ConcurrentAccessAttempted& e) {
123 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
125 } catch (RTI::SaveInProgress& e) {
126 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
128 } catch (RTI::RestoreInProgress& e) {
129 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
131 } catch (RTI::RTIinternalError& e) {
132 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
135 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class.");
141 RTI13ObjectClass::unpublish()
143 if (!_ambassador.valid()) {
144 SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
149 _ambassador->unpublishObjectClass(_handle);
152 } catch (RTI::ObjectClassNotDefined& e) {
153 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
155 } catch (RTI::ObjectClassNotPublished& e) {
156 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
158 } catch (RTI::OwnershipAcquisitionPending& e) {
159 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
161 } catch (RTI::FederateNotExecutionMember& e) {
162 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
164 } catch (RTI::ConcurrentAccessAttempted& e) {
165 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
167 } catch (RTI::SaveInProgress& e) {
168 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
170 } catch (RTI::RestoreInProgress& e) {
171 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
173 } catch (RTI::RTIinternalError& e) {
174 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
177 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class.");
183 RTI13ObjectClass::subscribe(const HLAIndexList& indexList, bool active)
185 if (!_ambassador.valid()) {
186 SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
191 unsigned numAttributes = getNumAttributes();
192 std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(numAttributes));
193 for (HLAIndexList::const_iterator i = indexList.begin(); i != indexList.end(); ++i) {
194 if (_attributeHandleVector.size() <= *i) {
195 SG_LOG(SG_NETWORK, SG_WARN, "RTI13ObjectClass::subscribe(): Invalid attribute index!");
198 attributeHandleSet->add(_attributeHandleVector[*i]);
201 _ambassador->subscribeObjectClassAttributes(_handle, *attributeHandleSet, active);
204 } catch (RTI::ObjectClassNotDefined& e) {
205 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
207 } catch (RTI::AttributeNotDefined& e) {
208 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
210 } catch (RTI::FederateNotExecutionMember& e) {
211 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
213 } catch (RTI::ConcurrentAccessAttempted& e) {
214 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
216 } catch (RTI::SaveInProgress& e) {
217 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
219 } catch (RTI::RestoreInProgress& e) {
220 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
222 } catch (RTI::RTIinternalError& e) {
223 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
226 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class.");
232 RTI13ObjectClass::unsubscribe()
234 if (!_ambassador.valid()) {
235 SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
240 _ambassador->unsubscribeObjectClass(_handle);
243 } catch (RTI::ObjectClassNotDefined& e) {
244 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
246 } catch (RTI::ObjectClassNotSubscribed& e) {
247 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
249 } catch (RTI::FederateNotExecutionMember& e) {
250 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
252 } catch (RTI::ConcurrentAccessAttempted& e) {
253 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
255 } catch (RTI::SaveInProgress& e) {
256 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
258 } catch (RTI::RestoreInProgress& e) {
259 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
261 } catch (RTI::RTIinternalError& e) {
262 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
265 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class.");
271 RTI13ObjectClass::registerObjectInstance(HLAObjectInstance* hlaObjectInstance)
273 if (!_ambassador.valid()) {
274 SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
278 SGSharedPtr<RTI13Federate> federate = _ambassador->_federate.lock();
279 if (!federate.valid()) {
280 SG_LOG(SG_NETWORK, SG_WARN, "Error: Federate is zero.");
285 RTI::ObjectHandle objectHandle = _ambassador->registerObjectInstance(getHandle());
286 RTI13ObjectInstance* objectInstance = new RTI13ObjectInstance(objectHandle, hlaObjectInstance, this, _ambassador.get());
287 federate->insertObjectInstance(objectInstance);
288 return objectInstance;
289 } catch (RTI::ObjectClassNotDefined& e) {
290 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
292 } catch (RTI::ObjectClassNotPublished& e) {
293 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
295 } catch (RTI::FederateNotExecutionMember& e) {
296 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
298 } catch (RTI::ConcurrentAccessAttempted& e) {
299 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
301 } catch (RTI::SaveInProgress& e) {
302 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
304 } catch (RTI::RestoreInProgress& e) {
305 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
307 } catch (RTI::RTIinternalError& e) {
308 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);