00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef WPS8_H
00023 #define WPS8_H
00024
00025 #include <vector>
00026 #include <list>
00027 #include <map>
00028 #include <libwpd/WPXString.h>
00029
00030 #include "libwps_internal.h"
00031 #include "WPS.h"
00032 #include "WPSContentListener.h"
00033 #include "WPSStream.h"
00034 #include "WPSParser.h"
00035
00041 class HeaderIndexEntries
00042 {
00043 public:
00044 uint32_t offset;
00045 uint32_t length;
00046 };
00047
00048 class WPS8Listener;
00049
00050
00051 class WPS8PrefixDataPacket
00052 {
00053 public:
00054 WPS8PrefixDataPacket(WPSInputStream * input);
00055 virtual ~WPS8PrefixDataPacket() {}
00056 virtual void parse(WPS8Listener *listener) const {}
00057
00058 protected:
00059 virtual void _readContents(WPSInputStream *input) = 0;
00060 void _read(WPSInputStream *input, uint32_t dataOffset, uint32_t dataSize);
00061 };
00062
00063 class WPS8Listener
00064 {
00065 public:
00066 WPS8Listener();
00067 virtual ~WPS8Listener() {}
00068
00069 virtual void startDocument() = 0;
00070 virtual void insertCharacter(const uint16_t character) = 0;
00071 virtual void insertTab(const uint8_t tabType, float tabPosition) = 0;
00072 virtual void insertBreak(const uint8_t breakType) = 0;
00073 virtual void insertEOL() = 0;
00074 virtual void lineSpacingChange(const float lineSpacing) = 0;
00075 virtual void attributeChange(const bool isOn, const uint8_t attribute) = 0;
00076 virtual void pageMarginChange(const uint8_t side, const uint16_t margin) = 0;
00077 virtual void pageFormChange(const uint16_t length, const uint16_t width, const WPSFormOrientation orientation, const bool isPersistent) = 0;
00078 virtual void marginChange(const uint8_t side, const uint16_t margin) = 0;
00079 virtual void indentFirstLineChange(const int16_t offset) = 0;
00080 virtual void columnChange(const WPSTextColumnType columnType, const uint8_t numColumns, const std::vector<float> &columnWidth,
00081 const std::vector<bool> &isFixedWidth) = 0;
00082 virtual void endDocument() = 0;
00083
00084 virtual void undoChange(const uint8_t undoType, const uint16_t undoLevel) = 0;
00085 virtual void justificationChange(const uint8_t justification) = 0;
00086 virtual void setTextColor(const RGBSColor * fontColor) = 0;
00087 virtual void setTextFont(const WPXString fontName) = 0;
00088 virtual void setFontSize(const uint16_t fontSize) = 0;
00089 virtual void insertPageNumber(const WPXString &pageNumber) = 0;
00090 virtual void insertNoteReference(const WPXString ¬eReference) = 0;
00091 virtual void suppressPage(const uint16_t suppressCode) = 0;
00092 };
00093
00094 typedef std::multimap <std::string, HeaderIndexEntries> HeaderIndexMultiMap;
00095
00096 class WPS8Parser : public WPSParser
00097 {
00098 public:
00099 WPS8Parser(WPSInputStream *input, WPSHeader * header);
00100 ~WPS8Parser();
00101
00102 void parse(WPXHLListenerImpl *listenerImpl);
00103 private:
00104 void readFontsTable(WPSInputStream * input);
00105 void appendUTF16LE(WPSInputStream *input, WPS8Listener *listener);
00106 void readText(WPSInputStream * input, WPS8Listener *listener);
00107 bool readFODPage(WPSInputStream * input, std::vector<FOD> * FODs, uint16_t page_size);
00108 void parseHeaderIndexEntry(WPSInputStream * input);
00109 void parseHeaderIndex(WPSInputStream * input);
00110 void parsePages(std::list<WPSPageSpan> &pageList, WPSInputStream *input);
00111 void parse(WPSInputStream *stream, WPS8Listener *listener);
00112 void propertyChangeTextAttribute(const uint32_t newTextAttributeBits, const uint8_t attribute, const uint32_t bit, WPS8Listener *listener);
00113 void propertyChangeDelta(uint32_t newTextAttributeBits, WPS8Listener *listener);
00114 void propertyChange(std::string rgchProp, WPS8Listener *listener);
00115 uint32_t offset_eot;
00116 uint32_t oldTextAttributeBits;
00117 HeaderIndexMultiMap headerIndexTable;
00118 std::vector<FOD> CHFODs;
00119 std::vector<std::string> fonts;
00120 };
00121
00122
00123 typedef struct _WPS8ContentParsingState WPS8ContentParsingState;
00124 struct _WPS8ContentParsingState
00125 {
00126 _WPS8ContentParsingState();
00127 ~_WPS8ContentParsingState();
00128 WPXString m_textBuffer;
00129 };
00130
00131
00132 class WPS8ContentListener : public WPS8Listener, protected WPSContentListener
00133 {
00134 public:
00135 WPS8ContentListener(std::list<WPSPageSpan> &pageList, WPXHLListenerImpl *listenerImpl);
00136 ~WPS8ContentListener();
00137
00138 void startDocument() { WPSContentListener::startDocument(); };
00139 void insertCharacter(const uint16_t character);
00140 void insertTab(const uint8_t tabType, float tabPosition);
00141 void insertBreak(const uint8_t breakType) { WPSContentListener::insertBreak(breakType); };
00142 void insertEOL();
00143 void attributeChange(const bool isOn, const uint8_t attribute);
00144 void lineSpacingChange(const float lineSpacing) { WPSContentListener::lineSpacingChange(lineSpacing); };
00145 void pageMarginChange(const uint8_t side, const uint16_t margin) {};
00146 void pageFormChange(const uint16_t length, const uint16_t width, const WPSFormOrientation orientation, const bool isPersistent) {};
00147 void marginChange(const uint8_t side, const uint16_t margin);
00148 void indentFirstLineChange(const int16_t offset);
00149 void columnChange(const WPSTextColumnType columnType, const uint8_t numColumns, const std::vector<float> &columnWidth,
00150 const std::vector<bool> &isFixedWidth);
00151 void endDocument() { WPSContentListener::endDocument(); };
00152
00153 void undoChange(const uint8_t undoType, const uint16_t undoLevel);
00154 void justificationChange(const uint8_t justification);
00155 void setTextColor(const RGBSColor * fontColor);
00156 void setTextFont(const WPXString fontName);
00157 void setFontSize(const uint16_t fontSize);
00158 void insertPageNumber(const WPXString &pageNumber);
00159 void insertNoteReference(const WPXString ¬eReference);
00160 void insertNote(const WPSNoteType noteType);
00161 void suppressPage(const uint16_t suppressCode);
00162
00163 protected:
00164 void _openParagraph();
00165
00166 void _flushText();
00167 void _changeList() {};
00168
00169 private:
00170 WPS8ContentParsingState *m_parseState;
00171 };
00172
00173 #endif