1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /*
3  * This file is part of the libvisio project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  */
9 
10 #ifndef __VSDXMLPARSERBASE_H__
11 #define __VSDXMLPARSERBASE_H__
12 
13 #include <map>
14 #include <memory>
15 #include <stack>
16 #include <string>
17 #include <boost/optional.hpp>
18 #include "VSDXMLHelper.h"
19 #include "VSDCharacterList.h"
20 #include "VSDParagraphList.h"
21 #include "VSDShapeList.h"
22 #include "VSDStencils.h"
23 
24 namespace libvisio
25 {
26 
27 class VSDCollector;
28 class XMLErrorWatcher;
29 
30 class VSDXMLParserBase
31 {
32 public:
33   explicit VSDXMLParserBase();
34   virtual ~VSDXMLParserBase();
35   virtual bool parseMain() = 0;
36   virtual bool extractStencils() = 0;
37 
38 protected:
39   // Protected data
40   VSDCollector *m_collector;
41   VSDStencils m_stencils;
42   std::unique_ptr<VSDStencil> m_currentStencil;
43   VSDShape m_shape;
44   bool m_isStencilStarted;
45   unsigned m_currentStencilID;
46 
47   bool m_extractStencils;
48   bool m_isInStyles;
49   unsigned m_currentLevel;
50   unsigned m_currentShapeLevel;
51   std::map<unsigned, Colour> m_colours;
52   VSDFieldList m_fieldList;
53   VSDShapeList m_shapeList;
54   librevenge::RVNGBinaryData m_currentBinaryData;
55   std::stack<VSDShape> m_shapeStack;
56   std::stack<unsigned> m_shapeLevelStack;
57   bool m_isShapeStarted;
58   bool m_isPageStarted;
59   VSDGeometryList *m_currentGeometryList;
60   unsigned m_currentGeometryListIndex;
61 
62   std::map<unsigned, VSDName> m_fonts;
63 
64   std::map<unsigned, VSDTabStop> *m_currentTabSet;
65 
66   XMLErrorWatcher *m_watcher;
67 
68   // Helper functions
69 
70   int readByteData(unsigned char &value, xmlTextReaderPtr reader);
71   int readByteData(boost::optional<unsigned char> &value, xmlTextReaderPtr reader);
72   int readUnsignedData(boost::optional<unsigned> &value, xmlTextReaderPtr reader);
73   int readLongData(boost::optional<long> &value, xmlTextReaderPtr reader);
74   int readLongData(long &value, xmlTextReaderPtr reader);
75   int readDoubleData(boost::optional<double> &value, xmlTextReaderPtr reader);
76   int readDoubleData(double &value, xmlTextReaderPtr reader);
77   int readBoolData(boost::optional<bool> &value, xmlTextReaderPtr reader);
78   int readBoolData(bool &value, xmlTextReaderPtr reader);
79   int readExtendedColourData(Colour &value, long &idx, xmlTextReaderPtr reader);
80   int readExtendedColourData(Colour &value, xmlTextReaderPtr reader);
81   int readExtendedColourData(boost::optional<Colour> &value, xmlTextReaderPtr reader);
82   int readNURBSData(boost::optional<NURBSData> &data, xmlTextReaderPtr reader);
83   int readPolylineData(boost::optional<PolylineData> &data, xmlTextReaderPtr reader);
84   int readStringData(VSDName &text, xmlTextReaderPtr reader);
85   void readTriggerId(unsigned &id, xmlTextReaderPtr reader);
86 
87   virtual xmlChar *readStringData(xmlTextReaderPtr reader) = 0;
88   unsigned getIX(xmlTextReaderPtr reader);
89   virtual void _handleLevelChange(unsigned level);
90   void _flushShape();
91 
92   virtual int getElementToken(xmlTextReaderPtr reader) = 0;
93   virtual int getElementDepth(xmlTextReaderPtr reader) = 0;
94 
95   // Functions reading the DiagramML document content
96 
97   void readEllipticalArcTo(xmlTextReaderPtr reader);
98   void readEllipse(xmlTextReaderPtr reader);
99   void readGeometry(xmlTextReaderPtr reader);
100   void readMoveTo(xmlTextReaderPtr reader);
101   void readLineTo(xmlTextReaderPtr reader);
102   void readArcTo(xmlTextReaderPtr reader);
103   void readNURBSTo(xmlTextReaderPtr reader);
104   void readPolylineTo(xmlTextReaderPtr reader);
105   void readInfiniteLine(xmlTextReaderPtr reader);
106   void readRelCubBezTo(xmlTextReaderPtr reader);
107   void readRelEllipticalArcTo(xmlTextReaderPtr reader);
108   void readRelLineTo(xmlTextReaderPtr reader);
109   void readRelMoveTo(xmlTextReaderPtr reader);
110   void readRelQuadBezTo(xmlTextReaderPtr reader);
111   void readForeignData(xmlTextReaderPtr reader);
112   virtual void getBinaryData(xmlTextReaderPtr reader) = 0;
113   void readShape(xmlTextReaderPtr reader);
114   void readColours(xmlTextReaderPtr reader);
115   void readPage(xmlTextReaderPtr reader);
116   void readText(xmlTextReaderPtr reader);
117   void readCharIX(xmlTextReaderPtr reader);
118   void readParaIX(xmlTextReaderPtr reader);
119   void readLayerIX(xmlTextReaderPtr reader);
120   void readLayerMember(xmlTextReaderPtr reader);
121 
122   void readStyleSheet(xmlTextReaderPtr reader);
123   void readPageSheet(xmlTextReaderPtr reader);
124 
125   void readSplineStart(xmlTextReaderPtr reader);
126   void readSplineKnot(xmlTextReaderPtr reader);
127 
128   void readStencil(xmlTextReaderPtr reader);
129 
130   void handlePagesStart(xmlTextReaderPtr reader);
131   void handlePagesEnd(xmlTextReaderPtr reader);
132   void handlePageStart(xmlTextReaderPtr reader);
133   void handlePageEnd(xmlTextReaderPtr reader);
134   void handleMastersStart(xmlTextReaderPtr reader);
135   void handleMastersEnd(xmlTextReaderPtr reader);
136   void handleMasterStart(xmlTextReaderPtr reader);
137   void handleMasterEnd(xmlTextReaderPtr reader);
138   void skipPages(xmlTextReaderPtr reader);
139   void skipMasters(xmlTextReaderPtr reader);
140 
141 private:
142   VSDXMLParserBase(const VSDXMLParserBase &);
143   VSDXMLParserBase &operator=(const VSDXMLParserBase &);
144 
145   void initColours();
146 };
147 
148 } // namespace libvisio
149 
150 #endif // __VSDXMLPARSERBASE_H__
151 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
152