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 */