Marble

GeoParser.h
1 /*
2  SPDX-FileCopyrightText: 2008 Nikolas Zimmermann <[email protected]>
3  SPDX-License-Identifier: LGPL-2.0-or-later
4 */
5 
6 #ifndef MARBLE_GEOPARSER_H
7 #define MARBLE_GEOPARSER_H
8 
9 #include <QPair>
10 #include <QStack>
11 #include <QXmlStreamReader>
12 
13 #include "geodata_export.h"
14 
15 namespace Marble
16 {
17 
18 using GeoDataGenericSourceType = int;
19 
20 class GeoDocument;
21 class GeoNode;
22 class GeoStackItem;
23 
24 class GEODATA_EXPORT GeoParser : public QXmlStreamReader
25 {
26  public:
27  typedef QPair<QString, QString> QualifiedName; // Tag Name & Namespace pair
28 
29  explicit GeoParser( GeoDataGenericSourceType sourceType );
30  virtual ~GeoParser();
31 
32  /**
33  * @brief Main API for reading the XML document.
34  * This is the only method that is necessary to call to start the GeoParser.
35  * To retrieve the resulting data see @see releaseDocument() and
36  * @see releaseModel()
37  */
38  bool read( QIODevice* );
39 
40  /**
41  * @brief retrieve the parsed document and reset the parser
42  * If parsing was successful, retrieve the resulting document
43  * and set the contained m_document pointer to 0.
44  */
45  GeoDocument* releaseDocument();
46  GeoDocument* activeDocument() { return m_document; }
47 
48  // Used by tag handlers, to be overridden by GeoDataParser/GeoSceneParser
49  virtual bool isValidElement( const QString& tagName ) const;
50 
51  // Used by tag handlers, to access a parent element's associated GeoStackItem
52  GeoStackItem parentElement( unsigned int depth = 0 ) const;
53 
54  // Used by tag handlers, to emit a warning while parsing
55  void raiseWarning( const QString& );
56 
57  // Used by tag handlers, to retrieve the value for an attribute of the currently parsed element
58  QString attribute( const char* attributeName ) const;
59 
60 protected:
61  /**
62  * This method is intended to check if the current element being served by
63  * the GeoParser is a valid Document Root element. This method is to be
64  * implemented by GeoDataParser/GeoSceneParser and must check based on the
65  * current XML Document type, e.g. KML, GPX etc.
66  * @return @c true if the element is a valid document root.
67  */
68  virtual bool isValidRootElement() = 0;
69 
70  virtual GeoDocument* createDocument() const = 0;
71 
72 protected:
73  GeoDocument* m_document;
74  GeoDataGenericSourceType m_source;
75 
76 private:
77  void parseDocument();
78  QStack<GeoStackItem> m_nodeStack;
79 };
80 
81 class GeoStackItem
82 {
83  public:
84  GeoStackItem()
85  : m_qualifiedName(),
86  m_node( nullptr )
87  {
88  }
89 
90  GeoStackItem( const GeoParser::QualifiedName& qualifiedName, GeoNode* node )
91  : m_qualifiedName( qualifiedName ),
92  m_node( node )
93  {
94  }
95 
96  // Fast path for tag handlers
97  bool represents( const char* tagName ) const
98  {
99  return m_node && tagName == m_qualifiedName.first;
100  }
101 
102  // Helper for tag handlers. Does NOT guard against miscasting. Use with care.
103  template<class T>
104  T* nodeAs()
105  {
106  Q_ASSERT( dynamic_cast<T*>( m_node ) != nullptr );
107  return static_cast<T*>(m_node);
108  }
109 
110  template<class T>
111  bool is() const
112  {
113  return nullptr != dynamic_cast<T*>(m_node);
114  }
115 
116  GeoParser::QualifiedName qualifiedName() const { return m_qualifiedName; }
117  GeoNode* associatedNode() const { return m_node; }
118 
119 private:
120  friend class GeoParser;
121  void assignNode( GeoNode* node ) { m_node = node; }
122  GeoParser::QualifiedName m_qualifiedName;
123  GeoNode* m_node;
124 };
125 
126 }
127 
128 #endif
Binds a QML item to a specific geodetic location in screen coordinates.
QVariant read(const QByteArray &data, int versionOverride=0)
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Thu Sep 21 2023 04:12:26 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.