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