VSDParser.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 __VSDPARSER_H__
00011 #define __VSDPARSER_H__
00012 
00013 #include <stdio.h>
00014 #include <iostream>
00015 #include <vector>
00016 #include <stack>
00017 #include <map>
00018 #include <librevenge/librevenge.h>
00019 #include "VSDTypes.h"
00020 #include "VSDGeometryList.h"
00021 #include "VSDFieldList.h"
00022 #include "VSDCharacterList.h"
00023 #include "VSDParagraphList.h"
00024 #include "VSDShapeList.h"
00025 #include "VSDStencils.h"
00026 
00027 namespace libvisio
00028 {
00029 
00030 class VSDCollector;
00031 
00032 struct Pointer
00033 {
00034   Pointer()
00035     : Type(0), Offset(0), Length(0), Format(0), ListSize(0) {}
00036   Pointer(const Pointer &ptr)
00037     : Type(ptr.Type), Offset(ptr.Offset), Length(ptr.Length), Format(ptr.Format), ListSize(ptr.ListSize) {}
00038   unsigned Type;
00039   unsigned Offset;
00040   unsigned Length;
00041   unsigned short Format;
00042   unsigned ListSize;
00043 };
00044 
00045 class VSDParser
00046 {
00047 public:
00048   explicit VSDParser(librevenge::RVNGInputStream *input, librevenge::RVNGDrawingInterface *painter, librevenge::RVNGInputStream *container = 0);
00049   virtual ~VSDParser();
00050   bool parseMain();
00051   bool extractStencils();
00052 
00053 protected:
00054   // reader functions
00055   void readEllipticalArcTo(librevenge::RVNGInputStream *input);
00056   void readForeignData(librevenge::RVNGInputStream *input);
00057   void readEllipse(librevenge::RVNGInputStream *input);
00058   virtual void readLine(librevenge::RVNGInputStream *input);
00059   virtual void readFillAndShadow(librevenge::RVNGInputStream *input);
00060   virtual void readGeomList(librevenge::RVNGInputStream *input);
00061   void readGeometry(librevenge::RVNGInputStream *input);
00062   void readMoveTo(librevenge::RVNGInputStream *input);
00063   void readLineTo(librevenge::RVNGInputStream *input);
00064   void readArcTo(librevenge::RVNGInputStream *input);
00065   void readNURBSTo(librevenge::RVNGInputStream *input);
00066   void readPolylineTo(librevenge::RVNGInputStream *input);
00067   void readInfiniteLine(librevenge::RVNGInputStream *input);
00068   void readShapeData(librevenge::RVNGInputStream *input);
00069   void readXFormData(librevenge::RVNGInputStream *input);
00070   void readXForm1D(librevenge::RVNGInputStream *input);
00071   void readTxtXForm(librevenge::RVNGInputStream *input);
00072   void readShapeId(librevenge::RVNGInputStream *input);
00073   virtual void readShapeList(librevenge::RVNGInputStream *input);
00074   void readForeignDataType(librevenge::RVNGInputStream *input);
00075   void readPageProps(librevenge::RVNGInputStream *input);
00076   virtual void readShape(librevenge::RVNGInputStream *input);
00077   void readColours(librevenge::RVNGInputStream *input);
00078   void readFont(librevenge::RVNGInputStream *input);
00079   void readFontIX(librevenge::RVNGInputStream *input);
00080   virtual void readCharList(librevenge::RVNGInputStream *input);
00081   virtual void readParaList(librevenge::RVNGInputStream *input);
00082   virtual void readPropList(librevenge::RVNGInputStream *input);
00083   virtual void readPage(librevenge::RVNGInputStream *input);
00084   virtual void readText(librevenge::RVNGInputStream *input);
00085   virtual void readCharIX(librevenge::RVNGInputStream *input);
00086   virtual void readParaIX(librevenge::RVNGInputStream *input);
00087   virtual void readTextBlock(librevenge::RVNGInputStream *input);
00088 
00089   void readNameList(librevenge::RVNGInputStream *input);
00090   virtual void readName(librevenge::RVNGInputStream *input);
00091 
00092   virtual void readNameList2(librevenge::RVNGInputStream *input);
00093   virtual void readName2(librevenge::RVNGInputStream *input);
00094 
00095   virtual void readFieldList(librevenge::RVNGInputStream *input);
00096   virtual void readTextField(librevenge::RVNGInputStream *input);
00097 
00098   virtual void readStyleSheet(librevenge::RVNGInputStream *input);
00099   void readPageSheet(librevenge::RVNGInputStream *input);
00100 
00101   void readSplineStart(librevenge::RVNGInputStream *input);
00102   void readSplineKnot(librevenge::RVNGInputStream *input);
00103 
00104   void readStencilShape(librevenge::RVNGInputStream *input);
00105 
00106   void readOLEList(librevenge::RVNGInputStream *input);
00107   void readOLEData(librevenge::RVNGInputStream *input);
00108 
00109   virtual void readNameIDX(librevenge::RVNGInputStream *input);
00110   virtual void readNameIDX123(librevenge::RVNGInputStream *input);
00111 
00112   void readMisc(librevenge::RVNGInputStream *input);
00113 
00114   // parser of one pass
00115   bool parseDocument(librevenge::RVNGInputStream *input, unsigned shift);
00116 
00117   void parseMetaData();
00118 
00119   // Stream handlers
00120   void handleStreams(librevenge::RVNGInputStream *input, unsigned ptrType, unsigned shift, unsigned level);
00121   void handleStream(const Pointer &ptr, unsigned idx, unsigned level);
00122   void handleChunks(librevenge::RVNGInputStream *input, unsigned level);
00123   void handleChunk(librevenge::RVNGInputStream *input);
00124   void handleBlob(librevenge::RVNGInputStream *input, unsigned shift, unsigned level);
00125 
00126   virtual void readPointer(librevenge::RVNGInputStream *input, Pointer &ptr);
00127   virtual void readPointerInfo(librevenge::RVNGInputStream *input, unsigned ptrType, unsigned shift, unsigned &listSize, int &pointerCount);
00128   virtual bool getChunkHeader(librevenge::RVNGInputStream *input);
00129   void _handleLevelChange(unsigned level);
00130   Colour _colourFromIndex(unsigned idx);
00131   void _flushShape();
00132   void _nameFromId(VSDName &name, unsigned id, unsigned level);
00133 
00134   virtual unsigned getUInt(librevenge::RVNGInputStream *input);
00135   virtual int getInt(librevenge::RVNGInputStream *input);
00136 
00137   librevenge::RVNGInputStream *m_input;
00138   librevenge::RVNGDrawingInterface *m_painter;
00139   librevenge::RVNGInputStream *m_container;
00140   ChunkHeader m_header;
00141   VSDCollector *m_collector;
00142   VSDShapeList m_shapeList;
00143   unsigned m_currentLevel;
00144 
00145   VSDStencils m_stencils;
00146   VSDStencil *m_currentStencil;
00147   VSDShape m_shape;
00148   bool m_isStencilStarted;
00149   bool m_isInStyles;
00150   unsigned m_currentShapeLevel;
00151   unsigned m_currentShapeID;
00152 
00153   bool m_extractStencils;
00154   std::vector<Colour> m_colours;
00155 
00156   bool m_isBackgroundPage;
00157   bool m_isShapeStarted;
00158 
00159   double m_shadowOffsetX;
00160   double m_shadowOffsetY;
00161 
00162   VSDGeometryList *m_currentGeometryList;
00163   unsigned m_currentGeomListCount;
00164 
00165   std::map<unsigned, VSDName> m_fonts;
00166   std::map<unsigned, VSDName> m_names;
00167   std::map<unsigned, std::map<unsigned, VSDName> > m_namesMapMap;
00168   VSDName m_currentPageName;
00169 
00170 private:
00171   VSDParser();
00172   VSDParser(const VSDParser &);
00173   VSDParser &operator=(const VSDParser &);
00174 
00175 };
00176 
00177 } // namespace libvisio
00178 
00179 #endif // __VSDPARSER_H__
00180 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */