]> git.mxchange.org Git - simgear.git/blob - simgear/hla/RTI13InteractionClass.cxx
math: Move lerp function into SGMisc.
[simgear.git] / simgear / hla / RTI13InteractionClass.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 "RTI13InteractionClass.hxx"
19
20 #include "RTI13Ambassador.hxx"
21
22 namespace simgear {
23
24 RTI13InteractionClass::RTI13InteractionClass(HLAInteractionClass* interactionClass, const RTI::InteractionClassHandle& handle, RTI13Ambassador* ambassador) :
25     RTIInteractionClass(interactionClass),
26     _handle(handle),
27     _ambassador(ambassador)
28 {
29 }
30
31 RTI13InteractionClass::~RTI13InteractionClass()
32 {
33 }
34
35 bool
36 RTI13InteractionClass::resolveParameterIndex(const std::string& name, unsigned index)
37 {
38     if (!_ambassador.valid()) {
39         SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
40         return false;
41     }
42
43     if (index != _parameterHandleVector.size()) {
44         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Resolving needs to happen in growing index order!");
45         return false;
46     }
47
48     try {
49         RTI::ParameterHandle parameterHandle = _ambassador->getParameterHandle(name, _handle);
50
51         ParameterHandleIndexMap::const_iterator i = _parameterHandleIndexMap.find(parameterHandle);
52         if (i != _parameterHandleIndexMap.end()) {
53             SG_LOG(SG_NETWORK, SG_WARN, "RTI: Resolving parameterIndex for parameter \"" << name << "\" twice!");
54             return false;
55         }
56
57         _parameterHandleIndexMap[parameterHandle] = index;
58         _parameterHandleVector.push_back(parameterHandle);
59
60         return true;
61
62     } catch (RTI::NameNotFound& e) {
63         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get interaction class parameter: " << e._name << " " << e._reason);
64         return false;
65     } catch (RTI::FederateNotExecutionMember& e) {
66         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get interaction class parameter: " << e._name << " " << e._reason);
67         return false;
68     } catch (RTI::ConcurrentAccessAttempted& e) {
69         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get interaction class parameter: " << e._name << " " << e._reason);
70         return false;
71     } catch (RTI::RTIinternalError& e) {
72         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get interaction class parameter: " << e._name << " " << e._reason);
73         return false;
74     } catch (...) {
75         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not get interaction class parameter.");
76         return false;
77     }
78
79     return false;
80 }
81
82 bool
83 RTI13InteractionClass::publish()
84 {
85     if (!_ambassador.valid()) {
86         SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
87         return false;
88     }
89
90     try {
91         _ambassador->publishInteractionClass(_handle);
92         return true;
93     } catch (RTI::InteractionClassNotDefined& e) {
94         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish interaction class: " << e._name << " " << e._reason);
95         return false;
96     } catch (RTI::FederateNotExecutionMember& e) {
97         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish interaction class: " << e._name << " " << e._reason);
98         return false;
99     } catch (RTI::ConcurrentAccessAttempted& e) {
100         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish interaction class: " << e._name << " " << e._reason);
101         return false;
102     } catch (RTI::SaveInProgress& e) {
103         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish interaction class: " << e._name << " " << e._reason);
104         return false;
105     } catch (RTI::RestoreInProgress& e) {
106         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish interaction class: " << e._name << " " << e._reason);
107         return false;
108     } catch (RTI::RTIinternalError& e) {
109         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish interaction class: " << e._name << " " << e._reason);
110         return false;
111     } catch (...) {
112         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not publish interaction class.");
113         return false;
114     }
115
116     return false;
117 }
118
119 bool
120 RTI13InteractionClass::unpublish()
121 {
122     if (!_ambassador.valid()) {
123         SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
124         return false;
125     }
126
127     try {
128         _ambassador->unpublishInteractionClass(_handle);
129         return true;
130     } catch (RTI::InteractionClassNotDefined& e) {
131         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class: " << e._name << " " << e._reason);
132         return false;
133     } catch (RTI::InteractionClassNotPublished& e) {
134         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class: " << e._name << " " << e._reason);
135         return false;
136     } catch (RTI::FederateNotExecutionMember& e) {
137         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class: " << e._name << " " << e._reason);
138         return false;
139     } catch (RTI::ConcurrentAccessAttempted& e) {
140         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class: " << e._name << " " << e._reason);
141         return false;
142     } catch (RTI::SaveInProgress& e) {
143         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class: " << e._name << " " << e._reason);
144         return false;
145     } catch (RTI::RestoreInProgress& e) {
146         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class: " << e._name << " " << e._reason);
147         return false;
148     } catch (RTI::RTIinternalError& e) {
149         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class: " << e._name << " " << e._reason);
150         return false;
151     } catch (...) {
152         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unpublish interaction class.");
153         return false;
154     }
155
156     return false;
157 }
158
159 bool
160 RTI13InteractionClass::subscribe(bool active)
161 {
162     if (!_ambassador.valid()) {
163         SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
164         return false;
165     }
166
167     try {
168         _ambassador->subscribeInteractionClass(_handle, active);
169         return true;
170     } catch (RTI::InteractionClassNotDefined& e) {
171         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class: " << e._name << " " << e._reason);
172         return false;
173     } catch (RTI::FederateNotExecutionMember& e) {
174         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class: " << e._name << " " << e._reason);
175         return false;
176     } catch (RTI::ConcurrentAccessAttempted& e) {
177         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class: " << e._name << " " << e._reason);
178         return false;
179     } catch (RTI::FederateLoggingServiceCalls& e) {
180         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class: " << e._name << " " << e._reason);
181         return false;
182     } catch (RTI::SaveInProgress& e) {
183         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class: " << e._name << " " << e._reason);
184         return false;
185     } catch (RTI::RestoreInProgress& e) {
186         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class: " << e._name << " " << e._reason);
187         return false;
188     } catch (RTI::RTIinternalError& e) {
189         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class: " << e._name << " " << e._reason);
190         return false;
191     } catch (...) {
192         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not subscribe interaction class.");
193         return false;
194     }
195
196     return false;
197 }
198
199 bool
200 RTI13InteractionClass::unsubscribe()
201 {
202     if (!_ambassador.valid()) {
203         SG_LOG(SG_NETWORK, SG_WARN, "Error: Ambassador is zero.");
204         return false;
205     }
206
207     try {
208         _ambassador->unsubscribeInteractionClass(_handle);
209         return true;
210     } catch (RTI::InteractionClassNotDefined& e) {
211         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class: " << e._name << " " << e._reason);
212         return false;
213     } catch (RTI::InteractionClassNotSubscribed& e) {
214         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class: " << e._name << " " << e._reason);
215         return false;
216     } catch (RTI::FederateNotExecutionMember& e) {
217         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class: " << e._name << " " << e._reason);
218         return false;
219     } catch (RTI::ConcurrentAccessAttempted& e) {
220         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class: " << e._name << " " << e._reason);
221         return false;
222     } catch (RTI::SaveInProgress& e) {
223         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class: " << e._name << " " << e._reason);
224         return false;
225     } catch (RTI::RestoreInProgress& e) {
226         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class: " << e._name << " " << e._reason);
227         return false;
228     } catch (RTI::RTIinternalError& e) {
229         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class: " << e._name << " " << e._reason);
230         return false;
231     } catch (...) {
232         SG_LOG(SG_NETWORK, SG_WARN, "RTI: Could not unsubscribe interaction class.");
233         return false;
234     }
235
236     return false;
237 }
238
239 }