Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
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
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
00115 bool parseDocument(librevenge::RVNGInputStream *input, unsigned shift);
00116
00117 void parseMetaData();
00118
00119
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 }
00178
00179 #endif // __VSDPARSER_H__
00180