MSPUBParser.h
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /*
3  * This file is part of the libmspub 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 __MSPUBPARSER_H__
11 #define __MSPUBPARSER_H__
12 
13 #include <map>
14 #include <set>
15 #include <vector>
16 #include <memory>
17 
18 #include <boost/shared_ptr.hpp>
19 #include <boost/optional.hpp>
20 
21 #include <librevenge/librevenge.h>
22 #include <librevenge/librevenge.h>
23 
24 #include "MSPUBTypes.h"
25 #include "Fill.h"
26 #include "Coordinate.h"
27 #include "PolygonUtils.h"
28 
29 namespace libmspub
30 {
31 class MSPUBCollector;
33 {
34  unsigned seqNum;
35 public:
36  FindBySeqNum(unsigned sn) : seqNum(sn) { }
38  {
39  return ref.seqNum == seqNum;
40  }
41 };
42 
44 {
45  unsigned seqNum;
46 public:
47  FindByParentSeqNum(unsigned sn) : seqNum(sn) { }
49  {
50  return ref.parentSeqNum == seqNum;
51  }
52 };
53 
54 struct FOPTValues
55 {
56  std::map<unsigned short, unsigned> m_scalarValues;
57  std::map<unsigned short, std::vector<unsigned char> > m_complexValues;
58  FOPTValues() : m_scalarValues(), m_complexValues()
59  {
60  }
61 };
62 
64 {
65 public:
66  explicit MSPUBParser(librevenge::RVNGInputStream *input, MSPUBCollector *collector);
67  virtual ~MSPUBParser();
68  virtual bool parse();
69 protected:
70  virtual unsigned getColorIndexByQuillEntry(unsigned entry);
71 
73  {
74  TextSpanReference(unsigned short f, unsigned short l, const CharacterStyle &cs) : first(f), last(l), charStyle(cs) { }
75  unsigned short first;
76  unsigned short last;
78  };
79 
81  {
82  TextParagraphReference(unsigned short f, unsigned short l, const ParagraphStyle &ps) : first(f), last(l), paraStyle(ps) { }
83  unsigned short first;
84  unsigned short last;
86  };
87 
88  typedef std::vector<ContentChunkReference>::const_iterator ccr_iterator_t;
89 
90  MSPUBParser();
91  MSPUBParser(const MSPUBParser &);
93  virtual bool parseContents(librevenge::RVNGInputStream *input);
94  bool parseMetaData(librevenge::RVNGInputStream *input);
95  bool parseQuill(librevenge::RVNGInputStream *input);
96  bool parseEscher(librevenge::RVNGInputStream *input);
97  bool parseEscherDelay(librevenge::RVNGInputStream *input);
98 
99  MSPUBBlockInfo parseBlock(librevenge::RVNGInputStream *input, bool skipHierarchicalData = false);
100  EscherContainerInfo parseEscherContainer(librevenge::RVNGInputStream *input);
101 
102  bool parseContentChunkReference(librevenge::RVNGInputStream *input, MSPUBBlockInfo block);
103  QuillChunkReference parseQuillChunkReference(librevenge::RVNGInputStream *input);
104  bool parseDocumentChunk(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk);
105  bool parsePageChunk(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk);
106  bool parsePaletteChunk(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk);
107  bool parsePageShapeList(librevenge::RVNGInputStream *input, MSPUBBlockInfo block, unsigned pageSeqNum);
108  bool parseShape(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk);
109  bool parseBorderArtChunk(librevenge::RVNGInputStream *input,
110  const ContentChunkReference &chunk);
111  bool parseFontChunk(librevenge::RVNGInputStream *input,
112  const ContentChunkReference &chunk);
113  void parsePaletteEntry(librevenge::RVNGInputStream *input, MSPUBBlockInfo block);
114  void parseColors(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk);
115  void parseFonts(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk);
116  void parseDefaultStyle(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk);
117  void parseShapeGroup(librevenge::RVNGInputStream *input, const EscherContainerInfo &spgr, Coordinate parentCoordinateSystem, Coordinate parentGroupAbsoluteCoord);
118  void skipBlock(librevenge::RVNGInputStream *input, MSPUBBlockInfo block);
119  void parseEscherShape(librevenge::RVNGInputStream *input, const EscherContainerInfo &sp, Coordinate &parentCoordinateSystem, Coordinate &parentGroupAbsoluteCoord);
120  bool findEscherContainer(librevenge::RVNGInputStream *input, const EscherContainerInfo &parent, EscherContainerInfo &out, unsigned short type);
121  bool findEscherContainerWithTypeInSet(librevenge::RVNGInputStream *input, const EscherContainerInfo &parent, EscherContainerInfo &out, std::set<unsigned short> types);
122  std::map<unsigned short, unsigned> extractEscherValues(librevenge::RVNGInputStream *input, const EscherContainerInfo &record);
123  FOPTValues extractFOPTValues(librevenge::RVNGInputStream *input,
124  const libmspub::EscherContainerInfo &record);
125  std::vector<TextSpanReference> parseCharacterStyles(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk);
126  std::vector<TextParagraphReference> parseParagraphStyles(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk);
127  std::vector<Calculation> parseGuides(const std::vector<unsigned char>
128  &guideData);
129  std::vector<Vertex> parseVertices(const std::vector<unsigned char>
130  &vertexData);
131  std::vector<unsigned> parseTableCellDefinitions(librevenge::RVNGInputStream *input,
132  const QuillChunkReference &chunk);
133  std::vector<unsigned short> parseSegments(
134  const std::vector<unsigned char> &segmentData);
136  const std::vector<unsigned char> &vertexData,
137  const std::vector<unsigned char> &segmentData,
138  const std::vector<unsigned char> &guideData,
139  unsigned geoWidth, unsigned geoHeight);
140  int getColorIndex(librevenge::RVNGInputStream *input, const MSPUBBlockInfo &info);
141  unsigned getFontIndex(librevenge::RVNGInputStream *input, const MSPUBBlockInfo &info);
142  CharacterStyle getCharacterStyle(librevenge::RVNGInputStream *input);
143  ParagraphStyle getParagraphStyle(librevenge::RVNGInputStream *input);
144  boost::shared_ptr<Fill> getNewFill(const std::map<unsigned short, unsigned> &foptValues, bool &skipIfNotBg, std::map<unsigned short, std::vector<unsigned char> > &foptVal);
145 
146  librevenge::RVNGInputStream *m_input;
148  std::vector<MSPUBBlockInfo> m_blockInfo;
149  std::vector<ContentChunkReference> m_contentChunks;
150  std::vector<unsigned> m_cellsChunkIndices;
151  std::vector<unsigned> m_pageChunkIndices;
152  std::vector<unsigned> m_shapeChunkIndices;
153  std::vector<unsigned> m_paletteChunkIndices;
154  std::vector<unsigned> m_borderArtChunkIndices;
155  std::vector<unsigned> m_fontChunkIndices;
156  std::vector<unsigned> m_unknownChunkIndices;
157  boost::optional<unsigned> m_documentChunkIndex;
160  std::vector<int> m_alternateShapeSeqNums;
161  std::vector<int> m_escherDelayIndices;
162 
163  static short getBlockDataLength(unsigned type);
164  static bool isBlockDataString(unsigned type);
165  static PageType getPageTypeBySeqNum(unsigned seqNum);
166  static unsigned getEscherElementTailLength(unsigned short type);
167  static unsigned getEscherElementAdditionalHeaderLength(unsigned short type);
168  static ImgType imgTypeByBlipType(unsigned short type);
169  static int getStartOffset(ImgType type, unsigned short initial);
170  static bool lineExistsByFlagPointer(unsigned *flags,
171  unsigned *geomFlags = NULL);
172 };
173 
174 } // namespace libmspub
175 
176 #endif // __MSPUBRAPHICS_H__
177 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
virtual unsigned getColorIndexByQuillEntry(unsigned entry)
Definition: MSPUBParser.cpp:68
static int getStartOffset(ImgType type, unsigned short initial)
Definition: MSPUBParser.cpp:199
std::map< unsigned short, unsigned > extractEscherValues(librevenge::RVNGInputStream *input, const EscherContainerInfo &record)
Definition: MSPUBParser.cpp:2307
bool parseContentChunkReference(librevenge::RVNGInputStream *input, MSPUBBlockInfo block)
Definition: MSPUBParser.cpp:2327
bool findEscherContainerWithTypeInSet(librevenge::RVNGInputStream *input, const EscherContainerInfo &parent, EscherContainerInfo &out, std::set< unsigned short > types)
Definition: MSPUBParser.cpp:2230
bool parseQuill(librevenge::RVNGInputStream *input)
Definition: MSPUBParser.cpp:949
unsigned seqNum
Definition: MSPUBTypes.h:74
std::vector< int > m_escherDelayIndices
Definition: MSPUBParser.h:161
EscherContainerInfo parseEscherContainer(librevenge::RVNGInputStream *input)
Definition: MSPUBParser.cpp:2427
static bool isBlockDataString(unsigned type)
Definition: MSPUBParser.cpp:2418
void parseFonts(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk)
Definition: MSPUBParser.cpp:1126
std::vector< unsigned > parseTableCellDefinitions(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk)
Definition: MSPUBParser.cpp:931
MSPUBBlockInfo parseBlock(librevenge::RVNGInputStream *input, bool skipHierarchicalData=false)
Definition: MSPUBParser.cpp:2438
Definition: PolygonUtils.h:91
bool operator()(const libmspub::ContentChunkReference &ref)
Definition: MSPUBParser.h:48
std::vector< unsigned > m_borderArtChunkIndices
Definition: MSPUBParser.h:154
boost::shared_ptr< Fill > getNewFill(const std::map< unsigned short, unsigned > &foptValues, bool &skipIfNotBg, std::map< unsigned short, std::vector< unsigned char > > &foptVal)
Definition: MSPUBParser.cpp:1937
static ImgType imgTypeByBlipType(unsigned short type)
Definition: MSPUBParser.cpp:175
Definition: MSPUBTypes.h:54
bool parseMetaData(librevenge::RVNGInputStream *input)
Definition: MSPUBParser.cpp:2542
void skipBlock(librevenge::RVNGInputStream *input, MSPUBBlockInfo block)
Definition: MSPUBParser.cpp:2422
DynamicCustomShape getDynamicCustomShape(const std::vector< unsigned char > &vertexData, const std::vector< unsigned char > &segmentData, const std::vector< unsigned char > &guideData, unsigned geoWidth, unsigned geoHeight)
Definition: MSPUBParser.cpp:2106
FOPTValues extractFOPTValues(librevenge::RVNGInputStream *input, const libmspub::EscherContainerInfo &record)
Definition: MSPUBParser.cpp:2261
std::vector< TextSpanReference > parseCharacterStyles(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk)
Definition: MSPUBParser.cpp:1219
FOPTValues()
Definition: MSPUBParser.h:58
std::vector< unsigned short > parseSegments(const std::vector< unsigned char > &segmentData)
Definition: MSPUBParser.cpp:2118
void parseColors(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk)
Definition: MSPUBParser.cpp:1172
unsigned short first
Definition: MSPUBParser.h:83
MSPUBCollector * m_collector
Definition: MSPUBParser.h:147
void parsePaletteEntry(librevenge::RVNGInputStream *input, MSPUBBlockInfo block)
Definition: MSPUBParser.cpp:2530
bool parseDocumentChunk(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk)
Definition: MSPUBParser.cpp:426
std::vector< unsigned > m_fontChunkIndices
Definition: MSPUBParser.h:155
std::vector< int > m_alternateShapeSeqNums
Definition: MSPUBParser.h:160
unsigned m_lastAddedImage
Definition: MSPUBParser.h:159
std::vector< Vertex > parseVertices(const std::vector< unsigned char > &vertexData)
Definition: MSPUBParser.cpp:2151
ParagraphStyle paraStyle
Definition: MSPUBParser.h:85
static PageType getPageTypeBySeqNum(unsigned seqNum)
Definition: MSPUBParser.cpp:2489
Definition: MSPUBTypes.h:66
bool parsePaletteChunk(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk)
Definition: MSPUBParser.cpp:2503
std::vector< ContentChunkReference >::const_iterator ccr_iterator_t
Definition: MSPUBParser.h:88
TextParagraphReference(unsigned short f, unsigned short l, const ParagraphStyle &ps)
Definition: MSPUBParser.h:82
bool parseEscherDelay(librevenge::RVNGInputStream *input)
Definition: MSPUBParser.cpp:240
static unsigned getEscherElementAdditionalHeaderLength(unsigned short type)
Definition: MSPUBParser.cpp:2219
CharacterStyle charStyle
Definition: MSPUBParser.h:77
Definition: Coordinate.h:15
std::vector< unsigned > m_shapeChunkIndices
Definition: MSPUBParser.h:152
CharacterStyle getCharacterStyle(librevenge::RVNGInputStream *input)
Definition: MSPUBParser.cpp:1376
std::vector< Calculation > parseGuides(const std::vector< unsigned char > &guideData)
Definition: MSPUBParser.cpp:2141
bool parseFontChunk(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk)
Definition: MSPUBParser.cpp:470
static bool lineExistsByFlagPointer(unsigned *flags, unsigned *geomFlags=NULL)
Definition: MSPUBParser.cpp:58
unsigned parentSeqNum
Definition: MSPUBTypes.h:75
virtual bool parse()
Definition: MSPUBParser.cpp:116
unsigned short last
Definition: MSPUBParser.h:76
PageType
Definition: MSPUBTypes.h:172
static short getBlockDataLength(unsigned type)
Definition: MSPUBParser.cpp:73
unsigned short first
Definition: MSPUBParser.h:75
ImgType
Definition: MSPUBTypes.h:179
Definition: MSPUBParser.h:32
void parseDefaultStyle(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk)
Definition: MSPUBParser.cpp:1144
FindBySeqNum(unsigned sn)
Definition: MSPUBParser.h:36
static unsigned getEscherElementTailLength(unsigned short type)
Definition: MSPUBParser.cpp:2207
unsigned short last
Definition: MSPUBParser.h:84
Definition: MSPUBTypes.h:46
void parseEscherShape(librevenge::RVNGInputStream *input, const EscherContainerInfo &sp, Coordinate &parentCoordinateSystem, Coordinate &parentGroupAbsoluteCoord)
Definition: MSPUBParser.cpp:1543
std::map< unsigned short, unsigned > m_scalarValues
Definition: MSPUBParser.h:56
std::map< unsigned short, std::vector< unsigned char > > m_complexValues
Definition: MSPUBParser.h:57
Definition: MSPUBTypes.h:129
bool findEscherContainer(librevenge::RVNGInputStream *input, const EscherContainerInfo &parent, EscherContainerInfo &out, unsigned short type)
Definition: MSPUBParser.cpp:2245
Definition: Arrow.h:13
bool parseEscher(librevenge::RVNGInputStream *input)
Definition: MSPUBParser.cpp:1474
librevenge::RVNGInputStream * m_input
Definition: MSPUBParser.h:146
virtual bool parseContents(librevenge::RVNGInputStream *input)
Definition: MSPUBParser.cpp:320
Definition: MSPUBParser.h:54
bool operator()(const libmspub::ContentChunkReference &ref)
Definition: MSPUBParser.h:37
Definition: MSPUBTypes.h:78
unsigned getFontIndex(librevenge::RVNGInputStream *input, const MSPUBBlockInfo &info)
Definition: MSPUBParser.cpp:1436
TextSpanReference(unsigned short f, unsigned short l, const CharacterStyle &cs)
Definition: MSPUBParser.h:74
int getColorIndex(librevenge::RVNGInputStream *input, const MSPUBBlockInfo &info)
Definition: MSPUBParser.cpp:1457
FindByParentSeqNum(unsigned sn)
Definition: MSPUBParser.h:47
std::vector< unsigned > m_cellsChunkIndices
Definition: MSPUBParser.h:150
unsigned seqNum
Definition: MSPUBParser.h:45
Definition: MSPUBTypes.h:88
boost::optional< unsigned > m_documentChunkIndex
Definition: MSPUBParser.h:157
Definition: MSPUBCollector.h:46
Definition: MSPUBParser.h:63
std::vector< ContentChunkReference > m_contentChunks
Definition: MSPUBParser.h:149
std::vector< TextParagraphReference > parseParagraphStyles(librevenge::RVNGInputStream *input, const QuillChunkReference &chunk)
Definition: MSPUBParser.cpp:1191
std::vector< unsigned > m_pageChunkIndices
Definition: MSPUBParser.h:151
void parseShapeGroup(librevenge::RVNGInputStream *input, const EscherContainerInfo &spgr, Coordinate parentCoordinateSystem, Coordinate parentGroupAbsoluteCoord)
Definition: MSPUBParser.cpp:1520
std::vector< unsigned > m_paletteChunkIndices
Definition: MSPUBParser.h:153
QuillChunkReference parseQuillChunkReference(librevenge::RVNGInputStream *input)
Definition: MSPUBParser.cpp:906
bool parseBorderArtChunk(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk)
Definition: MSPUBParser.cpp:535
virtual ~MSPUBParser()
Definition: MSPUBParser.cpp:54
Definition: MSPUBParser.h:72
bool parsePageShapeList(librevenge::RVNGInputStream *input, MSPUBBlockInfo block, unsigned pageSeqNum)
Definition: MSPUBParser.cpp:641
int m_lastSeenSeqNum
Definition: MSPUBParser.h:158
MSPUBParser & operator=(const MSPUBParser &)
bool parsePageChunk(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk)
Definition: MSPUBParser.cpp:599
ParagraphStyle getParagraphStyle(librevenge::RVNGInputStream *input)
Definition: MSPUBParser.cpp:1246
std::vector< MSPUBBlockInfo > m_blockInfo
Definition: MSPUBParser.h:148
std::vector< unsigned > m_unknownChunkIndices
Definition: MSPUBParser.h:156
unsigned seqNum
Definition: MSPUBParser.h:34
bool parseShape(librevenge::RVNGInputStream *input, const ContentChunkReference &chunk)
Definition: MSPUBParser.cpp:655
Definition: MSPUBParser.h:43

Generated for libmspub by doxygen 1.8.9.1