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
RTI13ObjectClass(HLAObjectClass * hlaObjectClass,const RTI::ObjectClassHandle & handle,RTI13Ambassador * ambassador)29 RTI13ObjectClass::RTI13ObjectClass(HLAObjectClass* hlaObjectClass, const RTI::ObjectClassHandle& handle, RTI13Ambassador* ambassador) :
30 RTIObjectClass(hlaObjectClass),
31 _handle(handle),
32 _ambassador(ambassador)
33 {
34 }
35
~RTI13ObjectClass()36 RTI13ObjectClass::~RTI13ObjectClass()
37 {
38 }
39
40 bool
resolveAttributeIndex(const std::string & name,unsigned index)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
getNumAttributes() const89 RTI13ObjectClass::getNumAttributes() const
90 {
91 return _attributeHandleVector.size();
92 }
93
94 bool
publish(const HLAIndexList & indexList)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::unique_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
unpublish()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
subscribe(const HLAIndexList & indexList,bool active)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::unique_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
unsubscribe()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*
registerObjectInstance(HLAObjectInstance * hlaObjectInstance)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 }
320