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