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