]> git.mxchange.org Git - simgear.git/blob - simgear/hla/RTI13ObjectClass.cxx
hla: for rti13 queue all callbacks.
[simgear.git] / simgear / hla / RTI13ObjectClass.cxx
1 // Copyright (C) 2009 - 2010  Mathias Froehlich - Mathias.Froehlich@web.de
2 //
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.
7 //
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.
12 //
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.
16 //
17
18 #include "RTI13ObjectClass.hxx"
19 #include "RTI13Ambassador.hxx"
20
21 namespace simgear {
22
23 RTI13ObjectClass::RTI13ObjectClass(HLAObjectClass* hlaObjectClass, RTI::ObjectClassHandle& handle, RTI13Ambassador* ambassador) :
24     RTIObjectClass(hlaObjectClass),
25     _handle(handle),
26     _ambassador(ambassador)
27 {
28     if (0 != getOrCreateAttributeIndex("privilegeToDelete") &&
29         0 != getOrCreateAttributeIndex("HLAprivilegeToDeleteObject"))
30         SG_LOG(SG_NETWORK, SG_WARN, "RTI13ObjectClass: Cannot find object root attribute.");
31 }
32
33 RTI13ObjectClass::~RTI13ObjectClass()
34 {
35 }
36
37 std::string
38 RTI13ObjectClass::getName() const
39 {
40     if (!_ambassador.valid()) {
41         SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
42         return std::string();
43     }
44     return _ambassador->getObjectClassName(_handle);
45 }
46
47 unsigned
48 RTI13ObjectClass::getNumAttributes() const
49 {
50     return _attributeHandleVector.size();
51 }
52
53 unsigned
54 RTI13ObjectClass::getAttributeIndex(const std::string& name) const
55 {
56     if (!_ambassador.valid()) {
57         SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
58         return ~0u;
59     }
60
61     try {
62         RTI::AttributeHandle attributeHandle = _ambassador->getAttributeHandle(name, _handle);
63
64         AttributeHandleIndexMap::const_iterator i = _attributeHandleIndexMap.find(attributeHandle);
65         if (i !=  _attributeHandleIndexMap.end())
66             return i->second;
67
68         return ~0u;
69
70     } catch (RTI::ObjectClassNotDefined& e) {
71         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
72         return ~0u;
73     } catch (RTI::NameNotFound& e) {
74         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
75         return ~0u;
76     } catch (RTI::FederateNotExecutionMember& e) {
77         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
78         return ~0u;
79     } catch (RTI::ConcurrentAccessAttempted& e) {
80         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
81         return ~0u;
82     } catch (RTI::RTIinternalError& e) {
83         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
84         return ~0u;
85     } catch (...) {
86         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute.");
87         return ~0u;
88     }
89 }
90
91 unsigned
92 RTI13ObjectClass::getOrCreateAttributeIndex(const std::string& name)
93 {
94     if (!_ambassador.valid()) {
95         SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
96         return ~0u;
97     }
98
99     try {
100         RTI::AttributeHandle attributeHandle = _ambassador->getAttributeHandle(name, _handle);
101
102         AttributeHandleIndexMap::const_iterator i = _attributeHandleIndexMap.find(attributeHandle);
103         if (i !=  _attributeHandleIndexMap.end())
104             return i->second;
105
106         unsigned index = _attributeHandleVector.size();
107         _attributeHandleIndexMap[attributeHandle] = index;
108         _attributeHandleVector.push_back(attributeHandle);
109         _attributeDataVector.push_back(name);
110
111         return index;
112
113     } catch (RTI::ObjectClassNotDefined& e) {
114         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
115         return ~0u;
116     } catch (RTI::NameNotFound& e) {
117         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
118         return ~0u;
119     } catch (RTI::FederateNotExecutionMember& e) {
120         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
121         return ~0u;
122     } catch (RTI::ConcurrentAccessAttempted& e) {
123         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
124         return ~0u;
125     } catch (RTI::RTIinternalError& e) {
126         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
127         return ~0u;
128     } catch (...) {
129         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute.");
130         return ~0u;
131     }
132 }
133
134 // std::string
135 // RTI13ObjectClass::getAttributeName(unsigned index) const
136 // {
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();
141 //     }
142
143 //     try {
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();
160 //     } catch (...) {
161 //         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute name.");
162 //         return std::string();
163 //     }
164 // }
165
166 bool
167 RTI13ObjectClass::publish(const std::set<unsigned>& indexSet)
168 {
169     if (!_ambassador.valid()) {
170         SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
171         return false;
172     }
173
174     try {
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!");
179                 continue;
180             }
181             attributeHandleSet->add(_attributeHandleVector[*i]);
182         }
183
184         _ambassador->publishObjectClass(_handle, *attributeHandleSet);
185
186         for (unsigned i = 0; i < getNumAttributes(); ++i) {
187             _attributeDataVector[i]._published = true;
188         }
189
190         return true;
191     } catch (RTI::ObjectClassNotDefined& e) {
192         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
193         return false;
194     } catch (RTI::AttributeNotDefined& e) {
195         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
196         return false;
197     } catch (RTI::OwnershipAcquisitionPending& e) {
198         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
199         return false;
200     } catch (RTI::FederateNotExecutionMember& e) {
201         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
202         return false;
203     } catch (RTI::ConcurrentAccessAttempted& e) {
204         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
205         return false;
206     } catch (RTI::SaveInProgress& e) {
207         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
208         return false;
209     } catch (RTI::RestoreInProgress& e) {
210         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
211         return false;
212     } catch (RTI::RTIinternalError& e) {
213         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
214         return false;
215     } catch (...) {
216         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class.");
217         return false;
218     }
219 }
220
221 bool
222 RTI13ObjectClass::unpublish()
223 {
224     if (!_ambassador.valid()) {
225         SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
226         return false;
227     }
228
229     try {
230         _ambassador->unpublishObjectClass(_handle);
231
232         for (unsigned i = 0; i < getNumAttributes(); ++i) {
233             _attributeDataVector[i]._published = false;
234         }
235
236         return true;
237     } catch (RTI::ObjectClassNotDefined& e) {
238         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
239         return false;
240     } catch (RTI::ObjectClassNotPublished& e) {
241         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
242         return false;
243     } catch (RTI::OwnershipAcquisitionPending& e) {
244         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
245         return false;
246     } catch (RTI::FederateNotExecutionMember& e) {
247         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
248         return false;
249     } catch (RTI::ConcurrentAccessAttempted& e) {
250         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
251         return false;
252     } catch (RTI::SaveInProgress& e) {
253         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
254         return false;
255     } catch (RTI::RestoreInProgress& e) {
256         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
257         return false;
258     } catch (RTI::RTIinternalError& e) {
259         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
260         return false;
261     } catch (...) {
262         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class.");
263         return false;
264     }
265 }
266
267 bool
268 RTI13ObjectClass::subscribe(const std::set<unsigned>& indexSet, bool active)
269 {
270     if (!_ambassador.valid()) {
271         SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
272         return false;
273     }
274
275     try {
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!");
281                 continue;
282             }
283             attributeHandleSet->add(_attributeHandleVector[*i]);
284         }
285
286         _ambassador->subscribeObjectClassAttributes(_handle, *attributeHandleSet, active);
287
288         for (unsigned i = 0; i < getNumAttributes(); ++i) {
289             _attributeDataVector[i]._subscribed = true;
290         }
291
292         return true;
293     } catch (RTI::ObjectClassNotDefined& e) {
294         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
295         return false;
296     } catch (RTI::AttributeNotDefined& e) {
297         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
298         return false;
299     } catch (RTI::FederateNotExecutionMember& e) {
300         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
301         return false;
302     } catch (RTI::ConcurrentAccessAttempted& e) {
303         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
304         return false;
305     } catch (RTI::SaveInProgress& e) {
306         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
307         return false;
308     } catch (RTI::RestoreInProgress& e) {
309         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
310         return false;
311     } catch (RTI::RTIinternalError& e) {
312         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
313         return false;
314     } catch (...) {
315         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class.");
316         return false;
317     }
318 }
319
320 bool
321 RTI13ObjectClass::unsubscribe()
322 {
323     if (!_ambassador.valid()) {
324         SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
325         return 0;
326     }
327
328     try {
329         _ambassador->unsubscribeObjectClass(_handle);
330
331         for (unsigned i = 0; i < getNumAttributes(); ++i) {
332             _attributeDataVector[i]._subscribed = false;
333         }
334
335         return true;
336     } catch (RTI::ObjectClassNotDefined& e) {
337         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
338         return false;
339     } catch (RTI::ObjectClassNotSubscribed& e) {
340         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
341         return false;
342     } catch (RTI::FederateNotExecutionMember& e) {
343         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
344         return false;
345     } catch (RTI::ConcurrentAccessAttempted& e) {
346         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
347         return false;
348     } catch (RTI::SaveInProgress& e) {
349         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
350         return false;
351     } catch (RTI::RestoreInProgress& e) {
352         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
353         return false;
354     } catch (RTI::RTIinternalError& e) {
355         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
356         return false;
357     } catch (...) {
358         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class.");
359         return false;
360     }
361 }
362
363 RTIObjectInstance*
364 RTI13ObjectClass::registerObjectInstance(HLAObjectInstance* hlaObjectInstance)
365 {
366     if (!_ambassador.valid()) {
367         SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
368         return 0;
369     }
370
371     SGSharedPtr<RTI13Federate> federate = _ambassador->_federate.lock();
372     if (!federate.valid()) {
373         SG_LOG(SG_NETWORK, SG_WARN, "Error: Federate is zero.");
374         return 0;
375     }
376
377     try {
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);
384         return 0;
385     } catch (RTI::ObjectClassNotPublished& e) {
386         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
387         return 0;
388     } catch (RTI::FederateNotExecutionMember& e) {
389         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
390         return 0;
391     } catch (RTI::ConcurrentAccessAttempted& e) {
392         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
393         return 0;
394     } catch (RTI::SaveInProgress& e) {
395         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
396         return 0;
397     } catch (RTI::RestoreInProgress& e) {
398         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
399         return 0;
400     } catch (RTI::RTIinternalError& e) {
401         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
402         return 0;
403     }
404 }
405
406 }