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::getDataElementIndex(HLADataElementIndex& dataElementIndex, const std::string& path) const
166 SG_LOG(SG_NETWORK, SG_ALERT, "HLAObjectClass: failed to parse empty element path!");
169 std::string::size_type len = std::min(path.find_first_of("[."), path.size());
171 while (index < getNumParameters()) {
172 if (path.compare(0, len, getParameterName(index)) == 0)
176 if (getNumParameters() <= index) {
177 SG_LOG(SG_NETWORK, SG_ALERT, "HLAObjectClass: faild to parse data element index \"" << path << "\":\n"
178 << "Parameter \"" << path.substr(0, len) << "\" not found in object class \""
179 << getName() << "\"!");
182 if (!getParameterDataType(index)) {
183 SG_LOG(SG_NETWORK, SG_ALERT, "HLAObjectClass: faild to parse data element index \"" << path << "\":\n"
184 << "Undefined parameter data type in variant record data type \""
185 << getParameterName(index) << "\"!");
188 dataElementIndex.push_back(index);
189 return getParameterDataType(index)->getDataElementIndex(dataElementIndex, path, len);
193 HLAInteractionClass::getDataElementIndex(const std::string& path) const
195 HLADataElementIndex dataElementIndex;
196 getDataElementIndex(dataElementIndex, path);
197 return dataElementIndex;
201 HLAInteractionClass::subscribe()
203 if (!_rtiInteractionClass) {
204 SG_LOG(SG_NETWORK, SG_WARN, "HLAInteractionClass::subscribe(): No RTIInteractionClass!");
207 switch (_subscriptionType) {
208 case HLAUnsubscribed:
209 return _rtiInteractionClass->unsubscribe();
210 case HLASubscribedActive:
211 return _rtiInteractionClass->subscribe(true);
212 case HLASubscribedPassive:
213 return _rtiInteractionClass->subscribe(false);
219 HLAInteractionClass::unsubscribe()
221 if (!_rtiInteractionClass) {
222 SG_LOG(SG_NETWORK, SG_WARN, "HLAInteractionClass::unsubscribe(): No RTIInteractionClass!");
225 return _rtiInteractionClass->unsubscribe();
229 HLAInteractionClass::publish()
231 if (!_rtiInteractionClass) {
232 SG_LOG(SG_NETWORK, SG_WARN, "HLAInteractionClass::publish(): No RTIInteractionClass\"!");
235 switch (_publicationType) {
237 return _rtiInteractionClass->unpublish();
239 return _rtiInteractionClass->publish();
245 HLAInteractionClass::unpublish()
247 if (!_rtiInteractionClass) {
248 SG_LOG(SG_NETWORK, SG_WARN, "HLAInteractionClass::unpublish(): No RTIInteractionClass\"!");
251 return _rtiInteractionClass->unpublish();
255 HLAInteractionClass::_setRTIInteractionClass(RTIInteractionClass* interactionClass)
257 if (_rtiInteractionClass) {
258 SG_LOG(SG_NETWORK, SG_ALERT, "HLAInteractionClass: Setting RTIInteractionClass twice for interaction class \"" << getName() << "\"!");
261 _rtiInteractionClass = interactionClass;
262 if (_rtiInteractionClass->_interactionClass != this) {
263 SG_LOG(SG_NETWORK, SG_ALERT, "HLAInteractionClass: backward reference does not match!");
266 for (unsigned i = 0; i < _parameterVector.size(); ++i)
267 _resolveParameterIndex(_parameterVector[i]._name, i);
271 HLAInteractionClass::_resolveParameterIndex(const std::string& name, unsigned index)
273 if (!_rtiInteractionClass)
275 if (!_rtiInteractionClass->resolveParameterIndex(name, index))
276 SG_LOG(SG_NETWORK, SG_ALERT, "HLAInteractionClass: Could not resolve parameter \""
277 << name << "\" for interaction class \"" << getName() << "\"!");
281 HLAInteractionClass::_clearRTIInteractionClass()
283 if (!_rtiInteractionClass)
285 _rtiInteractionClass->_interactionClass = 0;
286 _rtiInteractionClass = 0;
289 } // namespace simgear