1 // Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
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.
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.
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.
19 # include <simgear_config.h>
22 #include <simgear/compiler.h>
24 #include "RTI13InteractionClass.hxx"
26 #include "RTI13Ambassador.hxx"
30 RTI13InteractionClass::RTI13InteractionClass(HLAInteractionClass* interactionClass, const RTI::InteractionClassHandle& handle, RTI13Ambassador* ambassador) :
31 RTIInteractionClass(interactionClass),
33 _ambassador(ambassador)
37 RTI13InteractionClass::~RTI13InteractionClass()
42 RTI13InteractionClass::resolveParameterIndex(const std::string& name, unsigned index)
44 if (!_ambassador.valid()) {
45 SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
49 if (index != _parameterHandleVector.size()) {
50 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Resolving needs to happen in growing index order!");
55 RTI::ParameterHandle parameterHandle = _ambassador->getParameterHandle(name, _handle);
57 ParameterHandleIndexMap::const_iterator i = _parameterHandleIndexMap.find(parameterHandle);
58 if (i != _parameterHandleIndexMap.end()) {
59 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Resolving parameterIndex for parameter \"" << name << "\" twice!");
63 _parameterHandleIndexMap[parameterHandle] = index;
64 _parameterHandleVector.push_back(parameterHandle);
68 } catch (RTI::NameNotFound& e) {
69 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get interaction class parameter: " << e._name << " " << e._reason);
71 } catch (RTI::FederateNotExecutionMember& e) {
72 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get interaction class parameter: " << e._name << " " << e._reason);
74 } catch (RTI::ConcurrentAccessAttempted& e) {
75 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get interaction class parameter: " << e._name << " " << e._reason);
77 } catch (RTI::RTIinternalError& e) {
78 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get interaction class parameter: " << e._name << " " << e._reason);
81 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get interaction class parameter.");
89 RTI13InteractionClass::publish()
91 if (!_ambassador.valid()) {
92 SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
97 _ambassador->publishInteractionClass(_handle);
99 } catch (RTI::InteractionClassNotDefined& e) {
100 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish interaction class: " << e._name << " " << e._reason);
102 } catch (RTI::FederateNotExecutionMember& e) {
103 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish interaction class: " << e._name << " " << e._reason);
105 } catch (RTI::ConcurrentAccessAttempted& e) {
106 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish interaction class: " << e._name << " " << e._reason);
108 } catch (RTI::SaveInProgress& e) {
109 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish interaction class: " << e._name << " " << e._reason);
111 } catch (RTI::RestoreInProgress& e) {
112 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish interaction class: " << e._name << " " << e._reason);
114 } catch (RTI::RTIinternalError& e) {
115 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish interaction class: " << e._name << " " << e._reason);
118 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish interaction class.");
126 RTI13InteractionClass::unpublish()
128 if (!_ambassador.valid()) {
129 SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
134 _ambassador->unpublishInteractionClass(_handle);
136 } catch (RTI::InteractionClassNotDefined& e) {
137 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class: " << e._name << " " << e._reason);
139 } catch (RTI::InteractionClassNotPublished& e) {
140 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class: " << e._name << " " << e._reason);
142 } catch (RTI::FederateNotExecutionMember& e) {
143 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class: " << e._name << " " << e._reason);
145 } catch (RTI::ConcurrentAccessAttempted& e) {
146 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class: " << e._name << " " << e._reason);
148 } catch (RTI::SaveInProgress& e) {
149 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class: " << e._name << " " << e._reason);
151 } catch (RTI::RestoreInProgress& e) {
152 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class: " << e._name << " " << e._reason);
154 } catch (RTI::RTIinternalError& e) {
155 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class: " << e._name << " " << e._reason);
158 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class.");
166 RTI13InteractionClass::subscribe(bool active)
168 if (!_ambassador.valid()) {
169 SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
174 _ambassador->subscribeInteractionClass(_handle, active);
176 } catch (RTI::InteractionClassNotDefined& e) {
177 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class: " << e._name << " " << e._reason);
179 } catch (RTI::FederateNotExecutionMember& e) {
180 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class: " << e._name << " " << e._reason);
182 } catch (RTI::ConcurrentAccessAttempted& e) {
183 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class: " << e._name << " " << e._reason);
185 } catch (RTI::FederateLoggingServiceCalls& e) {
186 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class: " << e._name << " " << e._reason);
188 } catch (RTI::SaveInProgress& e) {
189 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class: " << e._name << " " << e._reason);
191 } catch (RTI::RestoreInProgress& e) {
192 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class: " << e._name << " " << e._reason);
194 } catch (RTI::RTIinternalError& e) {
195 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class: " << e._name << " " << e._reason);
198 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class.");
206 RTI13InteractionClass::unsubscribe()
208 if (!_ambassador.valid()) {
209 SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
214 _ambassador->unsubscribeInteractionClass(_handle);
216 } catch (RTI::InteractionClassNotDefined& e) {
217 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class: " << e._name << " " << e._reason);
219 } catch (RTI::InteractionClassNotSubscribed& e) {
220 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class: " << e._name << " " << e._reason);
222 } catch (RTI::FederateNotExecutionMember& e) {
223 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class: " << e._name << " " << e._reason);
225 } catch (RTI::ConcurrentAccessAttempted& e) {
226 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class: " << e._name << " " << e._reason);
228 } catch (RTI::SaveInProgress& e) {
229 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class: " << e._name << " " << e._reason);
231 } catch (RTI::RestoreInProgress& e) {
232 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class: " << e._name << " " << e._reason);
234 } catch (RTI::RTIinternalError& e) {
235 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class: " << e._name << " " << e._reason);
238 SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class.");