VSDXMLParserBase.h
Go to the documentation of this file.
00001 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
00002 /*
00003  * This file is part of the libvisio project.
00004  *
00005  * This Source Code Form is subject to the terms of the Mozilla Public
00006  * License, v. 2.0. If a copy of the MPL was not distributed with this
00007  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
00008  */
00009 
00010 #ifndef __VSDXMLPARSERBASE_H__
00011 #define __VSDXMLPARSERBASE_H__
00012 
00013 #include <map>
00014 #include <stack>
00015 #include <string>
00016 #include <boost/optional.hpp>
00017 #include "VSDXMLHelper.h"
00018 #include "VSDCharacterList.h"
00019 #include "VSDParagraphList.h"
00020 #include "VSDShapeList.h"
00021 #include "VSDStencils.h"
00022 
00023 namespace libvisio
00024 {
00025 
00026 class VSDCollector;
00027 class XMLErrorWatcher;
00028 
00029 class VSDXMLParserBase
00030 {
00031 public:
00032   explicit VSDXMLParserBase();
00033   virtual ~VSDXMLParserBase();
00034   virtual bool parseMain() = 0;
00035   virtual bool extractStencils() = 0;
00036 
00037 protected:
00038   // Protected data
00039   VSDCollector *m_collector;
00040   VSDStencils m_stencils;
00041   VSDStencil *m_currentStencil;
00042   VSDShape m_shape;
00043   bool m_isStencilStarted;
00044   unsigned m_currentStencilID;
00045 
00046   bool m_extractStencils;
00047   bool m_isInStyles;
00048   unsigned m_currentLevel;
00049   unsigned m_currentShapeLevel;
00050   std::map<unsigned, Colour> m_colours;
00051   VSDFieldList m_fieldList;
00052   VSDShapeList m_shapeList;
00053   librevenge::RVNGBinaryData m_currentBinaryData;
00054   std::stack<VSDShape> m_shapeStack;
00055   std::stack<unsigned> m_shapeLevelStack;
00056   bool m_isShapeStarted;
00057   bool m_isPageStarted;
00058   VSDGeometryList *m_currentGeometryList;
00059   unsigned m_currentGeometryListIndex;
00060 
00061   std::map<unsigned, VSDName> m_fonts;
00062 
00063   XMLErrorWatcher *m_watcher;
00064 
00065   // Helper functions
00066 
00067   int readByteData(unsigned char &value, xmlTextReaderPtr reader);
00068   int readByteData(boost::optional<unsigned char> &value, xmlTextReaderPtr reader);
00069   int readUnsignedData(boost::optional<unsigned> &value, xmlTextReaderPtr reader);
00070   int readLongData(boost::optional<long> &value, xmlTextReaderPtr reader);
00071   int readLongData(long &value, xmlTextReaderPtr reader);
00072   int readDoubleData(boost::optional<double> &value, xmlTextReaderPtr reader);
00073   int readDoubleData(double &value, xmlTextReaderPtr reader);
00074   int readBoolData(boost::optional<bool> &value, xmlTextReaderPtr reader);
00075   int readBoolData(bool &value, xmlTextReaderPtr reader);
00076   int readExtendedColourData(Colour &value, long &idx, xmlTextReaderPtr reader);
00077   int readExtendedColourData(Colour &value, xmlTextReaderPtr reader);
00078   int readExtendedColourData(boost::optional<Colour> &value, xmlTextReaderPtr reader);
00079   int readNURBSData(boost::optional<NURBSData> &data, xmlTextReaderPtr reader);
00080   int readPolylineData(boost::optional<PolylineData> &data, xmlTextReaderPtr reader);
00081 
00082   virtual xmlChar *readStringData(xmlTextReaderPtr reader) = 0;
00083   unsigned getIX(xmlTextReaderPtr reader);
00084   virtual void _handleLevelChange(unsigned level);
00085   void _flushShape();
00086 
00087   virtual int getElementToken(xmlTextReaderPtr reader) = 0;
00088   virtual int getElementDepth(xmlTextReaderPtr reader) = 0;
00089 
00090   // Functions reading the DiagramML document content
00091 
00092   void readEllipticalArcTo(xmlTextReaderPtr reader);
00093   void readEllipse(xmlTextReaderPtr reader);
00094   void readGeometry(xmlTextReaderPtr reader);
00095   void readMoveTo(xmlTextReaderPtr reader);
00096   void readLineTo(xmlTextReaderPtr reader);
00097   void readArcTo(xmlTextReaderPtr reader);
00098   void readNURBSTo(xmlTextReaderPtr reader);
00099   void readPolylineTo(xmlTextReaderPtr reader);
00100   void readInfiniteLine(xmlTextReaderPtr reader);
00101   void readRelCubBezTo(xmlTextReaderPtr reader);
00102   void readRelEllipticalArcTo(xmlTextReaderPtr reader);
00103   void readRelLineTo(xmlTextReaderPtr reader);
00104   void readRelMoveTo(xmlTextReaderPtr reader);
00105   void readRelQuadBezTo(xmlTextReaderPtr reader);
00106   void readForeignData(xmlTextReaderPtr reader);
00107   virtual void getBinaryData(xmlTextReaderPtr reader) = 0;
00108   void readShape(xmlTextReaderPtr reader);
00109   void readColours(xmlTextReaderPtr reader);
00110   void readPage(xmlTextReaderPtr reader);
00111   void readText(xmlTextReaderPtr reader);
00112   void readCharIX(xmlTextReaderPtr reader);
00113   void readParaIX(xmlTextReaderPtr reader);
00114 
00115   void readStyleSheet(xmlTextReaderPtr reader);
00116   void readPageSheet(xmlTextReaderPtr reader);
00117 
00118   void readSplineStart(xmlTextReaderPtr reader);
00119   void readSplineKnot(xmlTextReaderPtr reader);
00120 
00121   void readStencil(xmlTextReaderPtr reader);
00122 
00123   void handlePagesStart(xmlTextReaderPtr reader);
00124   void handlePagesEnd(xmlTextReaderPtr reader);
00125   void handlePageStart(xmlTextReaderPtr reader);
00126   void handlePageEnd(xmlTextReaderPtr reader);
00127   void handleMastersStart(xmlTextReaderPtr reader);
00128   void handleMastersEnd(xmlTextReaderPtr reader);
00129   void handleMasterStart(xmlTextReaderPtr reader);
00130   void handleMasterEnd(xmlTextReaderPtr reader);
00131   void skipPages(xmlTextReaderPtr reader);
00132   void skipMasters(xmlTextReaderPtr reader);
00133 
00134 private:
00135   VSDXMLParserBase(const VSDXMLParserBase &);
00136   VSDXMLParserBase &operator=(const VSDXMLParserBase &);
00137 
00138   void initColours();
00139 };
00140 
00141 } // namespace libvisio
00142 
00143 #endif // __VSDXMLPARSERBASE_H__
00144 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */