]> git.mxchange.org Git - simgear.git/blob - simgear/hla/HLAVariantRecordDataElement.cxx
hla: Fix buffer overrun in SGMath vector types.
[simgear.git] / simgear / hla / HLAVariantRecordDataElement.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 "HLAVariantRecordDataElement.hxx"
19
20 #include <simgear/debug/logstream.hxx>
21
22 #include "HLADataElementVisitor.hxx"
23
24 namespace simgear {
25
26 HLAAbstractVariantRecordDataElement::HLAAbstractVariantRecordDataElement(const HLAVariantRecordDataType* dataType) :
27     _dataType(dataType)
28 {
29 }
30
31 HLAAbstractVariantRecordDataElement::~HLAAbstractVariantRecordDataElement()
32 {
33 }
34
35 void
36 HLAAbstractVariantRecordDataElement::accept(HLADataElementVisitor& visitor)
37 {
38     visitor.apply(*this);
39 }
40
41 void
42 HLAAbstractVariantRecordDataElement::accept(HLAConstDataElementVisitor& visitor) const
43 {
44     visitor.apply(*this);
45 }
46
47 bool
48 HLAAbstractVariantRecordDataElement::decode(HLADecodeStream& stream)
49 {
50     if (!_dataType.valid())
51         return false;
52     return _dataType->decode(stream, *this);
53 }
54
55 bool
56 HLAAbstractVariantRecordDataElement::encode(HLAEncodeStream& stream) const
57 {
58     if (!_dataType.valid())
59         return false;
60     return _dataType->encode(stream, *this);
61 }
62
63 const HLAVariantRecordDataType*
64 HLAAbstractVariantRecordDataElement::getDataType() const
65 {
66     return _dataType.get();
67 }
68
69 bool
70 HLAAbstractVariantRecordDataElement::setDataType(const HLADataType* dataType)
71 {
72     const HLAVariantRecordDataType* variantRecordDataType = dataType->toVariantRecordDataType();
73     if (!variantRecordDataType) {
74         SG_LOG(SG_NETWORK, SG_WARN, "HLAVariantRecordDataType: unable to set data type!");
75         return false;
76     }
77     setDataType(variantRecordDataType);
78     return true;
79 }
80
81 void
82 HLAAbstractVariantRecordDataElement::setDataType(const HLAVariantRecordDataType* dataType)
83 {
84     _dataType = dataType;
85 }
86
87 std::string
88 HLAAbstractVariantRecordDataElement::getAlternativeName() const
89 {
90     if (!_dataType.valid())
91         return std::string();
92     return _dataType->getAlternativeName(getAlternativeIndex());
93 }
94
95 const HLADataType*
96 HLAAbstractVariantRecordDataElement::getAlternativeDataType() const
97 {
98     if (!_dataType.valid())
99         return 0;
100     return _dataType->getAlternativeDataType(getAlternativeIndex());
101 }
102
103
104 HLAVariantRecordDataElement::DataElementFactory::~DataElementFactory()
105 {
106 }
107
108 HLAVariantRecordDataElement::HLAVariantRecordDataElement(const HLAVariantRecordDataType* dataType) :
109     HLAAbstractVariantRecordDataElement(dataType),
110     _alternativeIndex(~0u)
111 {
112 }
113
114 HLAVariantRecordDataElement::~HLAVariantRecordDataElement()
115 {
116 }
117
118 bool
119 HLAVariantRecordDataElement::setAlternativeIndex(unsigned index)
120 {
121     if (_alternativeIndex == index)
122         return true;
123     SGSharedPtr<HLADataElement> dataElement = newElement(index);
124     if (!dataElement.valid())
125         return false;
126     _dataElement.swap(dataElement);
127     _alternativeIndex = index;
128     return true;
129 }
130
131 bool
132 HLAVariantRecordDataElement::decodeAlternative(HLADecodeStream& stream)
133 {
134     return _dataElement->decode(stream);
135 }
136
137 unsigned
138 HLAVariantRecordDataElement::getAlternativeIndex() const
139 {
140     return _alternativeIndex;
141 }
142
143 bool
144 HLAVariantRecordDataElement::encodeAlternative(HLAEncodeStream& stream) const
145 {
146     return _dataElement->encode(stream);
147 }
148
149 void
150 HLAVariantRecordDataElement::setDataElementFactory(HLAVariantRecordDataElement::DataElementFactory* dataElementFactory)
151 {
152     _dataElementFactory = dataElementFactory;
153 }
154
155 HLAVariantRecordDataElement::DataElementFactory*
156 HLAVariantRecordDataElement::getDataElementFactory()
157 {
158     return _dataElementFactory;
159 }
160
161 HLADataElement*
162 HLAVariantRecordDataElement::newElement(unsigned index)
163 {
164     if (!_dataElementFactory.valid())
165         return 0;
166     return _dataElementFactory->createElement(*this, index);
167 }
168
169 }