LRFParser.h
Go to the documentation of this file.
00001 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
00002 /*
00003  * This file is part of the libe-book project.
00004  *
00005  * This Source Code Form is subject to the terms of the Mozilla Public
00006  * License, v. 2.0. If a copy of the MPL was not distributed with this
00007  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
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   // disable copying
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 } // namespace libebook
00135 
00136 #endif // LRFPARSER_H_INCLUDED
00137 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */