File indexing completed on 2024-06-23 05:49:01
0001 /* 0002 This file is part of the Okteta Kasten Framework, made within the KDE community. 0003 0004 SPDX-FileCopyrightText: 2010, 2011, 2012 Alex Richardson <alex.richardson@gmx.de> 0005 0006 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0007 */ 0008 0009 #ifndef KASTEN_OSDPARSER_HPP 0010 #define KASTEN_OSDPARSER_HPP 0011 0012 #include "abstractstructureparser.hpp" 0013 #include "parserutils.hpp" 0014 #include "../datatypes/primitive/enumdefinition.hpp" 0015 0016 #include <QDomElement> 0017 0018 class QDomDocument; 0019 0020 class StringDataInformation; 0021 class ArrayDataInformation; 0022 class AbstractBitfieldDataInformation; 0023 class EnumDataInformation; 0024 class DataInformation; 0025 class StructureDataInformation; 0026 class UnionDataInformation; 0027 class PrimitiveDataInformation; 0028 class ScriptLogger; 0029 0030 struct OsdParserInfo : public ParserInfo 0031 { 0032 inline OsdParserInfo(const QString& name, ScriptLogger* logger, DataInformation* parent, 0033 QScriptEngine* engine, const QVector<EnumDefinition::Ptr>& enums) 0034 : ParserInfo(name, logger, parent, engine) 0035 , enums(enums) 0036 {} 0037 inline OsdParserInfo(const OsdParserInfo& i) = default; 0038 inline ~OsdParserInfo() = default; 0039 0040 OsdParserInfo& operator=(const OsdParserInfo&) = delete; 0041 0042 QVector<EnumDefinition::Ptr> enums; 0043 }; 0044 0045 class OsdParser : public AbstractStructureParser 0046 { 0047 public: 0048 /** construct a parser which opens parses @p absolutePath */ 0049 OsdParser(const QString& pluginName, const QString& absolutePath); 0050 /** construct a parser from an in-memory string */ 0051 explicit OsdParser(const QString& xml); 0052 ~OsdParser() override; 0053 0054 QStringList parseStructureNames() const override; 0055 QVector<TopLevelDataInformation*> parseStructures() const override; 0056 0057 static DataInformation* parseElement(const QDomElement& elem, const OsdParserInfo& oldInfo); 0058 0059 private: 0060 static PrimitiveDataInformation* primitiveFromXML(const QDomElement& xmlElem, const OsdParserInfo& info); 0061 static PointerDataInformation* pointerFromXML(const QDomElement& xmlElem, const OsdParserInfo& info); 0062 static AbstractBitfieldDataInformation* bitfieldFromXML(const QDomElement& xmlElem, const OsdParserInfo& info); 0063 static EnumDataInformation* enumFromXML(const QDomElement& elem, bool isFlags, const OsdParserInfo& info); 0064 static StringDataInformation* stringFromXML(const QDomElement& xmlElem, const OsdParserInfo& info); 0065 static UnionDataInformation* unionFromXML(const QDomElement& xmlElem, const OsdParserInfo& info); 0066 static StructureDataInformation* structFromXML(const QDomElement& xmlElem, const OsdParserInfo& info); 0067 static ArrayDataInformation* arrayFromXML(const QDomElement& xmlElem, const OsdParserInfo& info); 0068 static TaggedUnionDataInformation* taggedUnionFromXML(const QDomElement& xmlElem, const OsdParserInfo& info); 0069 /** Get the child type from the <type> element or type="" attribute. 0070 * This handles both the case where it is passed as an XML element and as a primitive type string 0071 * @param xmlElem the parent XML element 0072 * @param info the parser info 0073 * @return The parsed element or null if not possible. */ 0074 static DataInformation* parseType(const QDomElement& xmlElem, const OsdParserInfo& info, const QString& name); 0075 static DataInformation* parseChildElement(const QDomElement& xmlElem, const OsdParserInfo& info, const QString& name); 0076 0077 static EnumDefinition::Ptr findEnum(const QString& defName, const OsdParserInfo& info); 0078 0079 static QVector<EnumDefinition::Ptr> parseEnums(const QDomElement& rootElem, ScriptLogger* logger); 0080 0081 QDomDocument openDoc(ScriptLogger* logger) const; 0082 QDomDocument openDocFromFile(ScriptLogger* logger) const; 0083 QDomDocument openDocFromString(ScriptLogger* logger) const; 0084 0085 /** Reads an property of the QDomElement. First it is checked whether an attribute exists, if this is not the case 0086 * the inner text of an element with tag equal to @p property is returned*/ 0087 static QString readProperty(const QDomElement& elem, const QString& property, const QString& defaultVal = QString()); 0088 /** if not empty construct the document from this, instead of opening file */ 0089 const QString mXmlString; 0090 }; 0091 0092 class OsdChildrenParser : public ChildrenParser 0093 { 0094 public: 0095 OsdChildrenParser(const OsdParserInfo& info, const QDomElement& firstChild); 0096 OsdChildrenParser(const OsdChildrenParser&) = delete; 0097 0098 ~OsdChildrenParser() override; 0099 0100 OsdChildrenParser& operator=(const OsdChildrenParser&) = delete; 0101 0102 DataInformation* next() override; 0103 bool hasNext() override; 0104 void setParent(DataInformation* newParent) override; 0105 0106 protected: 0107 OsdParserInfo mInfo; 0108 QDomElement mElem; 0109 }; 0110 0111 class SingleElementOsdChildrenParser : public OsdChildrenParser 0112 { 0113 public: 0114 SingleElementOsdChildrenParser(const OsdParserInfo& info, const QDomElement& element); 0115 ~SingleElementOsdChildrenParser() override; 0116 DataInformation* next() override; 0117 bool hasNext() override; 0118 0119 private: 0120 bool mParsed; 0121 }; 0122 0123 #endif /* KASTEN_OSDPARSER_HPP */