+ virtual void apply(const HLAFixedArrayDataType& dataType)
+ {
+ unsigned numElements = dataType.getNumElements();
+ std::string value = _propertyNode.getStringValue();
+ for (unsigned i = 0; i < numElements; ++i) {
+ if (i < value.size()) {
+ HLATemplateEncodeVisitor<char> visitor(_stream, value[i]);
+ dataType.getElementDataType()->accept(visitor);
+ } else {
+ HLADataTypeEncodeVisitor visitor(_stream);
+ dataType.getElementDataType()->accept(visitor);
+ }
+ }
+ }
+
+ virtual void apply(const HLAVariableArrayDataType& dataType)
+ {
+ std::string value = _propertyNode.getStringValue();
+ HLATemplateEncodeVisitor<std::string::size_type> numElementsVisitor(_stream, value.size());
+ dataType.getSizeDataType()->accept(numElementsVisitor);
+ for (unsigned i = 0; i < value.size(); ++i) {
+ HLATemplateEncodeVisitor<char> visitor(_stream, value[i]);
+ dataType.getElementDataType()->accept(visitor);
+ }
+ }
+
+protected:
+ const SGPropertyNode& _propertyNode;
+};
+
+class HLAPropertyDataElement::StringDataElement : public HLADataElement {
+public:
+ StringDataElement(const HLAArrayDataType* dataType, SGPropertyNode* propertyNode);
+ virtual ~StringDataElement();
+
+ virtual bool encode(HLAEncodeStream& stream) const;
+ virtual bool decode(HLADecodeStream& stream);
+
+ virtual const HLADataType* getDataType() const;
+ virtual bool setDataType(const HLADataType* dataType);
+
+private:
+ SGSharedPtr<const HLAArrayDataType> _dataType;
+ SGSharedPtr<SGPropertyNode> _propertyNode;
+};
+
+HLAPropertyDataElement::StringDataElement::StringDataElement(const HLAArrayDataType* dataType, SGPropertyNode* propertyNode) :
+ _dataType(dataType),
+ _propertyNode(propertyNode)
+{
+}
+
+HLAPropertyDataElement::StringDataElement::~StringDataElement()
+{
+}
+
+bool
+HLAPropertyDataElement::StringDataElement::encode(HLAEncodeStream& stream) const
+{
+ StringEncodeVisitor visitor(stream, *_propertyNode);
+ _dataType->accept(visitor);
+ return true;
+}
+
+bool
+HLAPropertyDataElement::StringDataElement::decode(HLADecodeStream& stream)
+{
+ StringDecodeVisitor visitor(stream, *_propertyNode);
+ _dataType->accept(visitor);
+ return true;
+}
+
+const HLADataType*
+HLAPropertyDataElement::StringDataElement::getDataType() const
+{
+ return _dataType.get();
+}
+
+bool
+HLAPropertyDataElement::StringDataElement::setDataType(const HLADataType* dataType)
+{
+ if (!dataType)
+ return false;
+ const HLAArrayDataType* arrayDataType = dataType->toArrayDataType();
+ if (!arrayDataType)
+ return false;
+ const HLADataType* elementDataType = arrayDataType->getElementDataType();
+ if (!elementDataType)
+ return false;
+ if (!elementDataType->toBasicDataType())
+ return false;
+ _dataType = arrayDataType;
+ return true;
+}
+
+class HLAPropertyDataElement::DataElementFactoryVisitor : public HLADataTypeVisitor {
+public:
+ DataElementFactoryVisitor(SGPropertyNode* propertyNode) :
+ _propertyNode(propertyNode)
+ { }
+ virtual ~DataElementFactoryVisitor()
+ { }
+
+ virtual void apply(const HLADataType& dataType)
+ {
+ SG_LOG(SG_NETWORK, SG_ALERT, "HLA: Can not find a suitable data element for data type \""
+ << dataType.getName() << "\"");
+ }
+