1 // Copyright (C) 2009 - 2010 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.
18 #ifndef HLAPropertyDataElement_hxx
19 #define HLAPropertyDataElement_hxx
22 #include <simgear/props/props.hxx>
23 #include "HLADataElement.hxx"
27 class HLAPropertyReference : public SGReferenced {
29 HLAPropertyReference()
31 HLAPropertyReference(const std::string& relativePath) :
32 _relativePath(relativePath)
35 SGPropertyNode* getPropertyNode()
36 { return _propertyNode.get(); }
38 void setRootNode(SGPropertyNode* rootNode)
41 _propertyNode.clear();
43 _propertyNode = rootNode->getNode(_relativePath, true);
47 std::string _relativePath;
48 SGSharedPtr<SGPropertyNode> _propertyNode;
51 class HLAPropertyReferenceSet : public SGReferenced {
53 void insert(const SGSharedPtr<HLAPropertyReference>& propertyReference)
55 _propertyReferenceSet.insert(propertyReference);
56 propertyReference->setRootNode(_rootNode.get());
58 void remove(const SGSharedPtr<HLAPropertyReference>& propertyReference)
60 PropertyReferenceSet::iterator i = _propertyReferenceSet.find(propertyReference);
61 if (i == _propertyReferenceSet.end())
63 _propertyReferenceSet.erase(i);
64 propertyReference->setRootNode(0);
67 void setRootNode(SGPropertyNode* rootNode)
70 for (PropertyReferenceSet::iterator i = _propertyReferenceSet.begin();
71 i != _propertyReferenceSet.end(); ++i) {
72 (*i)->setRootNode(_rootNode.get());
75 SGPropertyNode* getRootNode()
76 { return _rootNode.get(); }
79 SGSharedPtr<SGPropertyNode> _rootNode;
81 typedef std::set<SGSharedPtr<HLAPropertyReference> > PropertyReferenceSet;
82 PropertyReferenceSet _propertyReferenceSet;
85 class HLAPropertyDataElement : public HLADataElement {
87 HLAPropertyDataElement(HLAPropertyReference* propertyReference);
88 HLAPropertyDataElement(const HLADataType* dataType, HLAPropertyReference* propertyReference);
89 HLAPropertyDataElement();
90 HLAPropertyDataElement(SGPropertyNode* propertyNode);
91 HLAPropertyDataElement(const HLADataType* dataType, SGPropertyNode* propertyNode);
92 virtual ~HLAPropertyDataElement();
94 virtual bool encode(HLAEncodeStream& stream) const;
95 virtual bool decode(HLADecodeStream& stream);
97 virtual const HLADataType* getDataType() const;
98 virtual bool setDataType(const HLADataType* dataType);
100 void setPropertyNode(SGPropertyNode* propertyNode);
101 SGPropertyNode* getPropertyNode();
102 const SGPropertyNode* getPropertyNode() const;
108 SGSharedPtr<const HLADataType> _dataType;
109 SGSharedPtr<HLAPropertyReference> _propertyReference;
112 } // namespace simgear