00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef MSK4_TEXT
00035 # define MSK4_TEXT
00036
00037 #include <vector>
00038
00039 #include "MWAWEntry.hxx"
00040 #include "MWAWDebug.hxx"
00041 #include "MWAWInputStream.hxx"
00042
00043 namespace MSK4TextInternal
00044 {
00045 struct Font;
00046 struct Paragraph;
00047 struct State;
00048 }
00049
00050 class MSK4Zone;
00051
00063 class MSK4Text
00064 {
00065 friend class MSK4Zone;
00066 protected:
00067 struct DataFOD;
00073 typedef bool (MSK4Text::* FDPParser) (MWAWInputStreamPtr &input, long endPos,
00074 int &id, std::string &mess);
00075 public:
00077 MSK4Text(MSK4Zone &parser);
00078
00080 ~MSK4Text();
00081
00083 void setDefault(MWAWFont &font);
00084
00086 int numPages() const;
00087
00089 void flushExtra(MWAWInputStreamPtr ) {}
00090
00091 protected:
00095 bool readStructures(MWAWInputStreamPtr input, bool mainOle);
00096
00098 bool readText(MWAWInputStreamPtr input, MWAWEntry const &entry, bool mainOle);
00099
00101 bool readFootNote(MWAWInputStreamPtr input, int id);
00102
00103
00104
00105
00112 typedef bool (MSK4Text::* DataParser)
00113 (MWAWInputStreamPtr input, long endPos, long bot, long eot, int id, std::string &mess);
00114
00122 bool readPLC(MWAWInputStreamPtr input, MWAWEntry const &entry,
00123 std::vector<long> &textPtrs, std::vector<long> &listValues,
00124 DataParser parser = &MSK4Text::defDataParser);
00132 bool readSimplePLC(MWAWInputStreamPtr &input, MWAWEntry const &entry,
00133 std::vector<long> &textPtrs,
00134 std::vector<long> &listValues) {
00135 return readPLC(input, entry, textPtrs, listValues);
00136 }
00137
00139 bool defDataParser(MWAWInputStreamPtr input, long endPos,
00140 long bot, long eot, int id, std::string &mess);
00141
00143 bool readFontNames(MWAWInputStreamPtr input, MWAWEntry const &entry);
00144
00146 bool readFont (MWAWInputStreamPtr &input, long endPos,
00147 int &id, std::string &mess);
00148
00150 void setProperty(MSK4TextInternal::Paragraph const &tabs);
00152 bool readParagraph (MWAWInputStreamPtr &input, long endPos,
00153 int &id, std::string &mess);
00154
00156 bool ftntDataParser(MWAWInputStreamPtr input, long endPos,
00157 long bot, long eot, int id, std::string &mess);
00158
00160 bool eobjDataParser(MWAWInputStreamPtr input, long endPos,
00161 long bot, long eot, int id, std::string &mess);
00162
00166 bool toknDataParser(MWAWInputStreamPtr input, long endPos,
00167 long bot, long eot, int id, std::string &mess);
00168
00172 bool pgdDataParser(MWAWInputStreamPtr input, long endPos,
00173 long , long, int id, std::string &mess);
00174
00176 void flushNote(int noteId);
00177
00178 protected:
00180 MSK4Zone const *mainParser() const {
00181 return m_mainParser;
00182 }
00184 MSK4Zone *mainParser() {
00185 return m_mainParser;
00186 }
00187
00190 std::vector<DataFOD> mergeSortedLists
00191 (std::vector<DataFOD> const &lst1, std::vector<DataFOD> const &lst2) const;
00192
00195 bool readFDP(MWAWInputStreamPtr &input, MWAWEntry const &entry,
00196 std::vector<DataFOD> &fods, FDPParser parser);
00197
00205 bool findFDPStructures(MWAWInputStreamPtr &input, int which);
00214 bool findFDPStructuresByHand(MWAWInputStreamPtr &input, int which);
00215
00216 protected:
00218 struct DataFOD {
00225 enum Type { ATTR_TEXT, ATTR_PARAG, ATTR_PLC, ATTR_UNKN };
00226
00228 DataFOD() : m_type(ATTR_UNKN), m_pos(-1), m_defPos(0), m_id(-1) {}
00229
00231 Type m_type;
00233 long m_pos;
00235 long m_defPos;
00237 int m_id;
00238 };
00239
00240 private:
00241 MSK4Text(MSK4Text const &orig);
00242 MSK4Text &operator=(MSK4Text const &orig);
00243 protected:
00245 MWAWParserStatePtr m_parserState;
00246
00248 MSK4Zone *m_mainParser;
00249
00251 MWAWEntry m_textPositions;
00252
00254 mutable shared_ptr<MSK4TextInternal::State> m_state;
00255
00257 std::vector<DataFOD> m_FODsList;
00258
00260 std::vector<MWAWEntry const *> m_FDPCs;
00262 std::vector<MWAWEntry const *> m_FDPPs;
00263 };
00264
00265 #endif
00266