]> git.mxchange.org Git - simgear.git/blob - simgear/hla/RTI13ObjectClass.cxx
hla: Fixes for the data element index implementation.
[simgear.git] / simgear / hla / RTI13ObjectClass.cxx
1 // Copyright (C) 2009 - 2012  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 #ifdef HAVE_CONFIG_H
19 #  include <simgear_config.h>
20 #endif
21
22 #include <simgear/compiler.h>
23
24 #include "RTI13ObjectClass.hxx"
25 #include "RTI13Ambassador.hxx"
26
27 namespace simgear {
28
29 RTI13ObjectClass::RTI13ObjectClass(HLAObjectClass* hlaObjectClass, const RTI::ObjectClassHandle& handle, RTI13Ambassador* ambassador) :
30     RTIObjectClass(hlaObjectClass),
31     _handle(handle),
32     _ambassador(ambassador)
33 {
34 }
35
36 RTI13ObjectClass::~RTI13ObjectClass()
37 {
38 }
39
40 bool
41 RTI13ObjectClass::resolveAttributeIndex(const std::string& name, unsigned index)
42 {
43     if (!_ambassador.valid()) {
44         SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
45         return false;
46     }
47
48     if (index != _attributeHandleVector.size()) {
49         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Resolving needs to happen in growing index order!");
50         return false;
51     }
52
53     try {
54         RTI::AttributeHandle attributeHandle = _ambassador->getAttributeHandle(name, _handle);
55
56         AttributeHandleIndexMap::const_iterator i = _attributeHandleIndexMap.find(attributeHandle);
57         if (i != _attributeHandleIndexMap.end()) {
58             SG_LOG(SG_NETWORK, SG_WARN, "RTI: Resolving attributeIndex for attribute \"" << name << "\" twice!");
59             return false;
60         }
61
62         _attributeHandleIndexMap[attributeHandle] = index;
63         _attributeHandleVector.push_back(attributeHandle);
64
65         return true;
66
67     } catch (RTI::ObjectClassNotDefined& e) {
68         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
69         return false;
70     } catch (RTI::NameNotFound& e) {
71         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
72         return false;
73     } catch (RTI::FederateNotExecutionMember& e) {
74         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
75         return false;
76     } catch (RTI::ConcurrentAccessAttempted& e) {
77         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
78         return false;
79     } catch (RTI::RTIinternalError& e) {
80         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute: " << e._name << " " << e._reason);
81         return false;
82     } catch (...) {
83         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get object class attribute.");
84         return false;
85     }
86 }
87
88 unsigned
89 RTI13ObjectClass::getNumAttributes() const
90 {
91     return _attributeHandleVector.size();
92 }
93
94 bool
95 RTI13ObjectClass::publish(const HLAIndexList& indexList)
96 {
97     if (!_ambassador.valid()) {
98         SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
99         return false;
100     }
101
102     try {
103         unsigned numAttributes = getNumAttributes();
104         std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(numAttributes));
105         for (HLAIndexList::const_iterator i = indexList.begin(); i != indexList.end(); ++i) {
106             if (_attributeHandleVector.size() <= *i) {
107                 SG_LOG(SG_NETWORK, SG_WARN, "RTI13ObjectClass::publish(): Invalid attribute index!");
108                 continue;
109             }
110             attributeHandleSet->add(_attributeHandleVector[*i]);
111         }
112
113         _ambassador->publishObjectClass(_handle, *attributeHandleSet);
114
115         return true;
116     } catch (RTI::ObjectClassNotDefined& e) {
117         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
118         return false;
119     } catch (RTI::AttributeNotDefined& e) {
120         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
121         return false;
122     } catch (RTI::OwnershipAcquisitionPending& e) {
123         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
124         return false;
125     } catch (RTI::FederateNotExecutionMember& e) {
126         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
127         return false;
128     } catch (RTI::ConcurrentAccessAttempted& e) {
129         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
130         return false;
131     } catch (RTI::SaveInProgress& e) {
132         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
133         return false;
134     } catch (RTI::RestoreInProgress& e) {
135         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
136         return false;
137     } catch (RTI::RTIinternalError& e) {
138         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class: " << e._name << " " << e._reason);
139         return false;
140     } catch (...) {
141         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish object class.");
142         return false;
143     }
144 }
145
146 bool
147 RTI13ObjectClass::unpublish()
148 {
149     if (!_ambassador.valid()) {
150         SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
151         return false;
152     }
153
154     try {
155         _ambassador->unpublishObjectClass(_handle);
156
157         return true;
158     } catch (RTI::ObjectClassNotDefined& e) {
159         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
160         return false;
161     } catch (RTI::ObjectClassNotPublished& e) {
162         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
163         return false;
164     } catch (RTI::OwnershipAcquisitionPending& e) {
165         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
166         return false;
167     } catch (RTI::FederateNotExecutionMember& e) {
168         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
169         return false;
170     } catch (RTI::ConcurrentAccessAttempted& e) {
171         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
172         return false;
173     } catch (RTI::SaveInProgress& e) {
174         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
175         return false;
176     } catch (RTI::RestoreInProgress& e) {
177         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
178         return false;
179     } catch (RTI::RTIinternalError& e) {
180         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class: " << e._name << " " << e._reason);
181         return false;
182     } catch (...) {
183         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish object class.");
184         return false;
185     }
186 }
187
188 bool
189 RTI13ObjectClass::subscribe(const HLAIndexList& indexList, bool active)
190 {
191     if (!_ambassador.valid()) {
192         SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
193         return false;
194     }
195
196     try {
197         unsigned numAttributes = getNumAttributes();
198         std::auto_ptr<RTI::AttributeHandleSet> attributeHandleSet(RTI::AttributeHandleSetFactory::create(numAttributes));
199         for (HLAIndexList::const_iterator i = indexList.begin(); i != indexList.end(); ++i) {
200             if (_attributeHandleVector.size() <= *i) {
201                 SG_LOG(SG_NETWORK, SG_WARN, "RTI13ObjectClass::subscribe(): Invalid attribute index!");
202                 continue;
203             }
204             attributeHandleSet->add(_attributeHandleVector[*i]);
205         }
206
207         _ambassador->subscribeObjectClassAttributes(_handle, *attributeHandleSet, active);
208
209         return true;
210     } catch (RTI::ObjectClassNotDefined& e) {
211         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
212         return false;
213     } catch (RTI::AttributeNotDefined& e) {
214         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
215         return false;
216     } catch (RTI::FederateNotExecutionMember& e) {
217         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
218         return false;
219     } catch (RTI::ConcurrentAccessAttempted& e) {
220         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
221         return false;
222     } catch (RTI::SaveInProgress& e) {
223         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
224         return false;
225     } catch (RTI::RestoreInProgress& e) {
226         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
227         return false;
228     } catch (RTI::RTIinternalError& e) {
229         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class: " << e._name << " " << e._reason);
230         return false;
231     } catch (...) {
232         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe object class.");
233         return false;
234     }
235 }
236
237 bool
238 RTI13ObjectClass::unsubscribe()
239 {
240     if (!_ambassador.valid()) {
241         SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
242         return 0;
243     }
244
245     try {
246         _ambassador->unsubscribeObjectClass(_handle);
247
248         return true;
249     } catch (RTI::ObjectClassNotDefined& e) {
250         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
251         return false;
252     } catch (RTI::ObjectClassNotSubscribed& e) {
253         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
254         return false;
255     } catch (RTI::FederateNotExecutionMember& e) {
256         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
257         return false;
258     } catch (RTI::ConcurrentAccessAttempted& e) {
259         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
260         return false;
261     } catch (RTI::SaveInProgress& e) {
262         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
263         return false;
264     } catch (RTI::RestoreInProgress& e) {
265         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
266         return false;
267     } catch (RTI::RTIinternalError& e) {
268         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class: " << e._name << " " << e._reason);
269         return false;
270     } catch (...) {
271         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe object class.");
272         return false;
273     }
274 }
275
276 RTIObjectInstance*
277 RTI13ObjectClass::registerObjectInstance(HLAObjectInstance* hlaObjectInstance)
278 {
279     if (!_ambassador.valid()) {
280         SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
281         return 0;
282     }
283
284     SGSharedPtr<RTI13Federate> federate = _ambassador->_federate.lock();
285     if (!federate.valid()) {
286         SG_LOG(SG_NETWORK, SG_WARN, "Error: Federate is zero.");
287         return 0;
288     }
289
290     try {
291         RTI::ObjectHandle objectHandle = _ambassador->registerObjectInstance(getHandle());
292         RTI13ObjectInstance* objectInstance = new RTI13ObjectInstance(objectHandle, hlaObjectInstance, this, _ambassador.get());
293         federate->insertObjectInstance(objectInstance);
294         return objectInstance;
295     } catch (RTI::ObjectClassNotDefined& e) {
296         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
297         return 0;
298     } catch (RTI::ObjectClassNotPublished& e) {
299         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
300         return 0;
301     } catch (RTI::FederateNotExecutionMember& e) {
302         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
303         return 0;
304     } catch (RTI::ConcurrentAccessAttempted& e) {
305         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
306         return 0;
307     } catch (RTI::SaveInProgress& e) {
308         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
309         return 0;
310     } catch (RTI::RestoreInProgress& e) {
311         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
312         return 0;
313     } catch (RTI::RTIinternalError& e) {
314         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not register object instance: " << e._name << " " << e._reason);
315         return 0;
316     }
317 }
318
319 }