Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef LRFPARSER_H_INCLUDED
00011 #define LRFPARSER_H_INCLUDED
00012
00013 #include <vector>
00014 #include <map>
00015
00016 #include "LRFCollector.h"
00017
00018
00019 namespace libebook
00020 {
00021
00022 struct LRFHeader;
00023
00024 class LRFParser
00025 {
00026
00027 LRFParser(const LRFParser &other);
00028 LRFParser &operator=(const LRFParser &other);
00029
00030 enum ObjectType
00031 {
00032 OBJECT_TYPE_UNSPECIFIED = 0x0,
00033 OBJECT_TYPE_PAGE_TREE = 0x1,
00034 OBJECT_TYPE_PAGE = 0x2,
00035 OBJECT_TYPE_HEADER = 0x3,
00036 OBJECT_TYPE_FOOTER = 0x4,
00037 OBJECT_TYPE_PAGE_ATR = 0x5,
00038 OBJECT_TYPE_BLOCK = 0x6,
00039 OBJECT_TYPE_BLOCK_ATR = 0x7,
00040 OBJECT_TYPE_MINI_PAGE = 0x8,
00041 OBJECT_TYPE_BLOCK_LIST = 0x9,
00042 OBJECT_TYPE_TEXT = 0xa,
00043 OBJECT_TYPE_TEXT_ATR = 0xb,
00044 OBJECT_TYPE_IMAGE = 0xc,
00045 OBJECT_TYPE_CANVAS = 0xd,
00046 OBJECT_TYPE_PARAGRAPH_ATR = 0xe,
00047 OBJECT_TYPE_IMAGE_STREAM = 0x11,
00048 OBJECT_TYPE_IMPORT = 0x12,
00049 OBJECT_TYPE_BUTTON = 0x13,
00050 OBJECT_TYPE_WINDOW = 0x14,
00051 OBJECT_TYPE_POP_UP_WIN = 0x15,
00052 OBJECT_TYPE_SOUND = 0x16,
00053 OBJECT_TYPE_PLANE_STREAM = 0x17,
00054 OBJECT_TYPE_FONT = 0x19,
00055 OBJECT_TYPE_OBJECT_INFO = 0x1a,
00056 OBJECT_TYPE_BOOK_ATR = 0x1c,
00057 OBJECT_TYPE_SIMPLE_TEXT = 0x1d,
00058 OBJECT_TYPE_TOC = 0x1e
00059 };
00060
00061 struct LRFIndexEntry
00062 {
00063 unsigned offset;
00064 unsigned size;
00065 bool reading;
00066 bool read;
00067 };
00068
00069 typedef std::map<unsigned, LRFIndexEntry> ObjectIndex_t;
00070 typedef std::vector<unsigned> ToC_t;
00071
00072 public:
00073 LRFParser(librevenge::RVNGInputStream *input, librevenge::RVNGTextInterface *document);
00074 ~LRFParser();
00075
00076 bool parse();
00077
00078 static bool isSupported(librevenge::RVNGInputStream *input);
00079
00080 private:
00081 void readHeader();
00082 void readMetadata();
00083 void readThumbnail();
00084 void readObjectIndex();
00085
00086 void readObject(unsigned id, unsigned type = OBJECT_TYPE_UNSPECIFIED);
00087
00088 void readPageTreeObject(librevenge::RVNGInputStream *object);
00089 void readPageObject(librevenge::RVNGInputStream *object);
00090 void readFooterObject(librevenge::RVNGInputStream *object);
00091 void readHeaderObject(librevenge::RVNGInputStream *object);
00092 void readPageAtrObject(librevenge::RVNGInputStream *object, unsigned id);
00093 void readBlockObject(librevenge::RVNGInputStream *object, unsigned id);
00094 void readBlockAtrObject(librevenge::RVNGInputStream *object, unsigned id);
00095 void readMiniPageObject(librevenge::RVNGInputStream *object);
00096 void readBlockListObject(librevenge::RVNGInputStream *object);
00097 void readTextObject(librevenge::RVNGInputStream *object);
00098 void readTextAtrObject(librevenge::RVNGInputStream *object, unsigned id);
00099 void readImageObject(librevenge::RVNGInputStream *object, unsigned id);
00100 void readCanvasObject(librevenge::RVNGInputStream *object);
00101 void readParagraphAtrObject(librevenge::RVNGInputStream *object, unsigned id);
00102 void readImageStreamObject(librevenge::RVNGInputStream *object, unsigned id);
00103 void readImportObject(librevenge::RVNGInputStream *object);
00104 void readButtonObject(librevenge::RVNGInputStream *object);
00105 void readWindowObject(librevenge::RVNGInputStream *object);
00106 void readPopUpWinObject(librevenge::RVNGInputStream *object);
00107 void readSoundObject(librevenge::RVNGInputStream *object);
00108 void readPlaneStreamObject(librevenge::RVNGInputStream *object);
00109 void readFontObject(librevenge::RVNGInputStream *object);
00110 void readObjectInfoObject(librevenge::RVNGInputStream *object);
00111 void readBookAtrObject(librevenge::RVNGInputStream *object);
00112 void readSimpleTextObject(librevenge::RVNGInputStream *object);
00113 void readTOCObject(librevenge::RVNGInputStream *object);
00114
00115 void readToCStream(librevenge::RVNGInputStream *input);
00116
00117 bool readAttribute(unsigned tag, librevenge::RVNGInputStream *input, LRFAttributes &attributes);
00118
00119 void skipUnhandledTag(unsigned tag, librevenge::RVNGInputStream *input, const char *objectType);
00120
00121 bool isObjectRead(unsigned id) const;
00122
00123 double toInches(unsigned px) const;
00124
00125 private:
00126 LRFCollector m_collector;
00127 librevenge::RVNGInputStream *m_input;
00128 LRFHeader *m_header;
00129 ObjectIndex_t m_objectIndex;
00130 unsigned m_pageTree;
00131 ToC_t m_toc;
00132 };
00133
00134 }
00135
00136 #endif // LRFPARSER_H_INCLUDED
00137