]> git.mxchange.org Git - simgear.git/blob - simgear/hla/HLAInteractionClass.cxx
hla: Remove deprecated methods from HLAObjectClass
[simgear.git] / simgear / hla / HLAInteractionClass.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 "HLAInteractionClass.hxx"
25
26 #include <simgear/debug/logstream.hxx>
27
28 #include "HLADataElement.hxx"
29 #include "HLAFederate.hxx"
30
31 #include "RTIInteractionClass.hxx"
32
33 namespace simgear {
34
35 HLAInteractionClass::HLAInteractionClass(const std::string& name, HLAFederate* federate) :
36     _federate(federate),
37     _rtiInteractionClass(0),
38     _name(name),
39     _subscriptionType(HLAUnsubscribed),
40     _publicationType(HLAUnpublished)
41 {
42     if (!federate) {
43         SG_LOG(SG_NETWORK, SG_ALERT, "HLAInteractionClass::HLAInteractionClass(): "
44                "No parent federate given for interaction class \"" << getName() << "\"!");
45         return;
46     }
47     federate->_insertInteractionClass(this);
48 }
49
50 HLAInteractionClass::~HLAInteractionClass()
51 {
52     // HLAInteractionClass objects only get deleted when the parent federate
53     // dies. So we do not need to deregister there.
54
55     _clearRTIInteractionClass();
56 }
57
58 const std::string&
59 HLAInteractionClass::getName() const
60 {
61     return _name;
62 }
63
64 const SGWeakPtr<HLAFederate>&
65 HLAInteractionClass::getFederate() const
66 {
67     return _federate;
68 }
69
70 HLASubscriptionType
71 HLAInteractionClass::getSubscriptionType() const
72 {
73     return _subscriptionType;
74 }
75
76 void
77 HLAInteractionClass::setSubscriptionType(HLASubscriptionType subscriptionType)
78 {
79     _subscriptionType = subscriptionType;
80 }
81
82 HLAPublicationType
83 HLAInteractionClass::getPublicationType() const
84 {
85     return _publicationType;
86 }
87
88 void
89 HLAInteractionClass::setPublicationType(HLAPublicationType publicationType)
90 {
91     _publicationType = publicationType;
92 }
93
94 unsigned
95 HLAInteractionClass::getNumParameters() const
96 {
97     return _parameterVector.size();
98 }
99
100 unsigned
101 HLAInteractionClass::addParameter(const std::string& name)
102 {
103     unsigned index = _parameterVector.size();
104     _nameIndexMap[name] = index;
105     _parameterVector.push_back(Parameter(name));
106     _resolveParameterIndex(name, index);
107     return index;
108 }
109
110 unsigned
111 HLAInteractionClass::getParameterIndex(const std::string& name) const
112 {
113     NameIndexMap::const_iterator i = _nameIndexMap.find(name);
114     if (i == _nameIndexMap.end())
115         return ~0u;
116     return i->second;
117 }
118
119 std::string
120 HLAInteractionClass::getParameterName(unsigned index) const
121 {
122     if (_parameterVector.size() <= index)
123         return std::string();
124     return _parameterVector[index]._name;
125 }
126
127 const HLADataType*
128 HLAInteractionClass::getParameterDataType(unsigned index) const
129 {
130     if (_parameterVector.size() <= index)
131         return 0;
132     return _parameterVector[index]._dataType.get();
133 }
134
135 void
136 HLAInteractionClass::setParameterDataType(unsigned index, const SGSharedPtr<const HLADataType>& dataType)
137 {
138     if (_parameterVector.size() <= index)
139         return;
140     _parameterVector[index]._dataType = dataType;
141 }
142
143 HLADataElement::IndexPathPair
144 HLAInteractionClass::getIndexPathPair(const HLADataElement::StringPathPair& stringPathPair) const
145 {
146     unsigned index = getParameterIndex(stringPathPair.first);
147     if (getNumParameters() <= index) {
148         SG_LOG(SG_NETWORK, SG_ALERT, "HLAInteractionClass::getIndexPathPair(\""
149                << HLADataElement::toString(stringPathPair)
150                << "\"): Could not resolve attribute \"" << stringPathPair.first
151                << "\" for interaction class \"" << getName() << "\"!");
152     }
153     return HLADataElement::IndexPathPair(index, stringPathPair.second);
154 }
155
156 HLADataElement::IndexPathPair
157 HLAInteractionClass::getIndexPathPair(const std::string& path) const
158 {
159     return getIndexPathPair(HLADataElement::toStringPathPair(path));
160 }
161
162 bool
163 HLAInteractionClass::subscribe()
164 {
165     if (!_rtiInteractionClass) {
166         SG_LOG(SG_NETWORK, SG_WARN, "HLAInteractionClass::subscribe(): No RTIInteractionClass!");
167         return false;
168     }
169     switch (_subscriptionType) {
170     case HLAUnsubscribed:
171         return _rtiInteractionClass->unsubscribe();
172     case HLASubscribedActive:
173         return _rtiInteractionClass->subscribe(true);
174     case HLASubscribedPassive:
175         return _rtiInteractionClass->subscribe(false);
176     }
177     return false;
178 }
179
180 bool
181 HLAInteractionClass::unsubscribe()
182 {
183     if (!_rtiInteractionClass) {
184         SG_LOG(SG_NETWORK, SG_WARN, "HLAInteractionClass::unsubscribe(): No RTIInteractionClass!");
185         return false;
186     }
187     return _rtiInteractionClass->unsubscribe();
188 }
189
190 bool
191 HLAInteractionClass::publish()
192 {
193     if (!_rtiInteractionClass) {
194         SG_LOG(SG_NETWORK, SG_WARN, "HLAInteractionClass::publish(): No RTIInteractionClass\"!");
195         return false;
196     }
197     switch (_publicationType) {
198     case HLAUnpublished:
199         return _rtiInteractionClass->unpublish();
200     case HLAPublished:
201         return _rtiInteractionClass->publish();
202     }
203     return false;
204 }
205
206 bool
207 HLAInteractionClass::unpublish()
208 {
209     if (!_rtiInteractionClass) {
210         SG_LOG(SG_NETWORK, SG_WARN, "HLAInteractionClass::unpublish(): No RTIInteractionClass\"!");
211         return false;
212     }
213     return _rtiInteractionClass->unpublish();
214 }
215
216 void
217 HLAInteractionClass::_setRTIInteractionClass(RTIInteractionClass* interactionClass)
218 {
219     if (_rtiInteractionClass) {
220         SG_LOG(SG_NETWORK, SG_ALERT, "HLAInteractionClass: Setting RTIInteractionClass twice for interaction class \"" << getName() << "\"!");
221         return;
222     }
223     _rtiInteractionClass = interactionClass;
224     if (_rtiInteractionClass->_interactionClass != this) {
225         SG_LOG(SG_NETWORK, SG_ALERT, "HLAInteractionClass: backward reference does not match!");
226         return;
227     }
228     for (unsigned i = 0; i < _parameterVector.size(); ++i)
229         _resolveParameterIndex(_parameterVector[i]._name, i);
230 }
231
232 void
233 HLAInteractionClass::_resolveParameterIndex(const std::string& name, unsigned index)
234 {
235     if (!_rtiInteractionClass)
236         return;
237     if (!_rtiInteractionClass->resolveParameterIndex(name, index))
238         SG_LOG(SG_NETWORK, SG_ALERT, "HLAInteractionClass: Could not resolve parameter \""
239                << name << "\" for interaction class \"" << getName() << "\"!");
240 }
241
242 void
243 HLAInteractionClass::_clearRTIInteractionClass()
244 {
245     if (!_rtiInteractionClass)
246         return;
247     _rtiInteractionClass->_interactionClass = 0;
248     _rtiInteractionClass = 0;
249 }
250
251 } // namespace simgear