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 "HLAInteractionClass.hxx"
26 #include <simgear/debug/logstream.hxx>
28 #include "HLADataElement.hxx"
29 #include "HLAFederate.hxx"
31 #include "RTIInteractionClass.hxx"
35 HLAInteractionClass::HLAInteractionClass(const std::string& name, HLAFederate* federate) :
37 _rtiInteractionClass(0),
39 _subscriptionType(HLAUnsubscribed),
40 _publicationType(HLAUnpublished)
43 SG_LOG(SG_NETWORK, SG_ALERT, "HLAInteractionClass::HLAInteractionClass(): "
44 "No parent federate given for interaction class \"" << getName() << "\"!");
47 federate->_insertInteractionClass(this);
50 HLAInteractionClass::~HLAInteractionClass()
52 // HLAInteractionClass objects only get deleted when the parent federate
53 // dies. So we do not need to deregister there.
55 _clearRTIInteractionClass();
59 HLAInteractionClass::getName() const
64 const SGWeakPtr<HLAFederate>&
65 HLAInteractionClass::getFederate() const
71 HLAInteractionClass::getSubscriptionType() const
73 return _subscriptionType;
77 HLAInteractionClass::setSubscriptionType(HLASubscriptionType subscriptionType)
79 _subscriptionType = subscriptionType;
83 HLAInteractionClass::getPublicationType() const
85 return _publicationType;
89 HLAInteractionClass::setPublicationType(HLAPublicationType publicationType)
91 _publicationType = publicationType;
95 HLAInteractionClass::getNumParameters() const
97 return _parameterVector.size();
101 HLAInteractionClass::addParameter(const std::string& name)
103 unsigned index = _parameterVector.size();
104 _nameIndexMap[name] = index;
105 _parameterVector.push_back(Parameter(name));
106 _resolveParameterIndex(name, index);
111 HLAInteractionClass::getParameterIndex(const std::string& name) const
113 NameIndexMap::const_iterator i = _nameIndexMap.find(name);
114 if (i == _nameIndexMap.end())
120 HLAInteractionClass::getParameterName(unsigned index) const
122 if (_parameterVector.size() <= index)
123 return std::string();
124 return _parameterVector[index]._name;
128 HLAInteractionClass::getParameterDataType(unsigned index) const
130 if (_parameterVector.size() <= index)
132 return _parameterVector[index]._dataType.get();
136 HLAInteractionClass::setParameterDataType(unsigned index, const SGSharedPtr<const HLADataType>& dataType)
138 if (_parameterVector.size() <= index)
140 _parameterVector[index]._dataType = dataType;
143 HLADataElement::IndexPathPair
144 HLAInteractionClass::getIndexPathPair(const HLADataElement::StringPathPair& stringPathPair) const
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() << "\"!");
153 return HLADataElement::IndexPathPair(index, stringPathPair.second);
156 HLADataElement::IndexPathPair
157 HLAInteractionClass::getIndexPathPair(const std::string& path) const
159 return getIndexPathPair(HLADataElement::toStringPathPair(path));
163 HLAInteractionClass::subscribe()
165 if (!_rtiInteractionClass) {
166 SG_LOG(SG_NETWORK, SG_WARN, "HLAInteractionClass::subscribe(): No RTIInteractionClass!");
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);
181 HLAInteractionClass::unsubscribe()
183 if (!_rtiInteractionClass) {
184 SG_LOG(SG_NETWORK, SG_WARN, "HLAInteractionClass::unsubscribe(): No RTIInteractionClass!");
187 return _rtiInteractionClass->unsubscribe();
191 HLAInteractionClass::publish()
193 if (!_rtiInteractionClass) {
194 SG_LOG(SG_NETWORK, SG_WARN, "HLAInteractionClass::publish(): No RTIInteractionClass\"!");
197 switch (_publicationType) {
199 return _rtiInteractionClass->unpublish();
201 return _rtiInteractionClass->publish();
207 HLAInteractionClass::unpublish()
209 if (!_rtiInteractionClass) {
210 SG_LOG(SG_NETWORK, SG_WARN, "HLAInteractionClass::unpublish(): No RTIInteractionClass\"!");
213 return _rtiInteractionClass->unpublish();
217 HLAInteractionClass::_setRTIInteractionClass(RTIInteractionClass* interactionClass)
219 if (_rtiInteractionClass) {
220 SG_LOG(SG_NETWORK, SG_ALERT, "HLAInteractionClass: Setting RTIInteractionClass twice for interaction class \"" << getName() << "\"!");
223 _rtiInteractionClass = interactionClass;
224 if (_rtiInteractionClass->_interactionClass != this) {
225 SG_LOG(SG_NETWORK, SG_ALERT, "HLAInteractionClass: backward reference does not match!");
228 for (unsigned i = 0; i < _parameterVector.size(); ++i)
229 _resolveParameterIndex(_parameterVector[i]._name, i);
233 HLAInteractionClass::_resolveParameterIndex(const std::string& name, unsigned index)
235 if (!_rtiInteractionClass)
237 if (!_rtiInteractionClass->resolveParameterIndex(name, index))
238 SG_LOG(SG_NETWORK, SG_ALERT, "HLAInteractionClass: Could not resolve parameter \""
239 << name << "\" for interaction class \"" << getName() << "\"!");
243 HLAInteractionClass::_clearRTIInteractionClass()
245 if (!_rtiInteractionClass)
247 _rtiInteractionClass->_interactionClass = 0;
248 _rtiInteractionClass = 0;
251 } // namespace simgear