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