diff --git a/jni/NativeFormats/fbreader/src/formats/pdb/MobipocketPlugin.cpp b/jni/NativeFormats/fbreader/src/formats/pdb/MobipocketPlugin.cpp index eba047a82..8c272ea9c 100644 --- a/jni/NativeFormats/fbreader/src/formats/pdb/MobipocketPlugin.cpp +++ b/jni/NativeFormats/fbreader/src/formats/pdb/MobipocketPlugin.cpp @@ -24,12 +24,15 @@ #include #include #include +#include #include "PdbPlugin.h" #include "PalmDocStream.h" #include "MobipocketHtmlBookReader.h" +#include "../txt/PlainTextFormat.h" #include "../../library/Book.h" +#include "../../bookmodel/BookModel.h" const std::string MobipocketPlugin::supportedFileType() const { return "Mobipocket"; @@ -42,6 +45,32 @@ void MobipocketPlugin::readDocumentInternal(const ZLFile &file, BookModel &model MobipocketHtmlBookReader(file, model, format, encoding).readDocument(stream); } +bool MobipocketPlugin::readModel(BookModel &model) const { + const Book &book = *model.book(); + const ZLFile &file = book.file(); + + ZLLogger::Instance().registerClass("MobiCSS"); + shared_ptr cssStream = new PalmDocCssStream(file); + if (cssStream->open()) { + char *buffer = new char[1024]; + while (true) { + const int len = cssStream->read(buffer, 1024); + if (len <= 0) { + break; + } + ZLLogger::Instance().println("MobiCSS", std::string(buffer, len)); + } + delete[] buffer; + cssStream->close(); + } + + shared_ptr stream = createStream(file); + + PlainTextFormat format(file); + readDocumentInternal(file, model, format, book.encoding(), *stream); + return true; +} + bool MobipocketPlugin::readMetainfo(Book &book) const { shared_ptr stream = book.file().inputStream(); if (stream.isNull() || ! stream->open()) { @@ -204,7 +233,7 @@ shared_ptr MobipocketPlugin::coverImage(const ZLFile &file) const coverIndex = thumbIndex; } - PalmDocStream pbStream(file); + PalmDocContentStream pbStream(file); if (!pbStream.open()) { return 0; } diff --git a/jni/NativeFormats/fbreader/src/formats/pdb/PalmDocLikePlugin.cpp b/jni/NativeFormats/fbreader/src/formats/pdb/PalmDocLikePlugin.cpp index 412684a78..755b501a9 100644 --- a/jni/NativeFormats/fbreader/src/formats/pdb/PalmDocLikePlugin.cpp +++ b/jni/NativeFormats/fbreader/src/formats/pdb/PalmDocLikePlugin.cpp @@ -30,7 +30,7 @@ bool PalmDocLikePlugin::providesMetainfo() const { } shared_ptr PalmDocLikePlugin::createStream(const ZLFile &file) const { - return new PalmDocStream(file); + return new PalmDocContentStream(file); } /* diff --git a/jni/NativeFormats/fbreader/src/formats/pdb/PalmDocStream.cpp b/jni/NativeFormats/fbreader/src/formats/pdb/PalmDocStream.cpp index ce7787dfb..d9f71d7e2 100644 --- a/jni/NativeFormats/fbreader/src/formats/pdb/PalmDocStream.cpp +++ b/jni/NativeFormats/fbreader/src/formats/pdb/PalmDocStream.cpp @@ -173,6 +173,33 @@ std::pair PalmDocStream::imageLocation(const PdbHeader &header, int ind } } -size_t PalmDocStream::sizeOfOpened() { +PalmDocContentStream::PalmDocContentStream(const ZLFile &file) : PalmDocStream(file) { +} + +size_t PalmDocContentStream::sizeOfOpened() { return myTextLength; } + +PalmDocCssStream::PalmDocCssStream(const ZLFile &file) : PalmDocStream(file) { +} + +bool PalmDocCssStream::open() { + if (!PalmDocStream::open()) { + return false; + } + seek(myTextLength, false); + if (PalmDocStream::offset() < myTextLength) { + close(); + return false; + } + return true; +} + +size_t PalmDocCssStream::offset() const { + const size_t o = PalmDocStream::offset(); + return o <= myTextLength ? 0 : o - myTextLength; +} + +size_t PalmDocCssStream::sizeOfOpened() { + return (size_t)((1 << 31) - 1); +} diff --git a/jni/NativeFormats/fbreader/src/formats/pdb/PalmDocStream.h b/jni/NativeFormats/fbreader/src/formats/pdb/PalmDocStream.h index ca7d9a22b..d8dee5113 100644 --- a/jni/NativeFormats/fbreader/src/formats/pdb/PalmDocStream.h +++ b/jni/NativeFormats/fbreader/src/formats/pdb/PalmDocStream.h @@ -27,8 +27,10 @@ class HuffDecompressor; class PalmDocStream : public PalmDocLikeStream { -public: +protected: PalmDocStream(const ZLFile &file); + +public: ~PalmDocStream(); std::pair imageLocation(const PdbHeader &header, int index) const; @@ -37,15 +39,36 @@ public: private: bool processRecord(); bool processZeroRecord(); - size_t sizeOfOpened(); + +protected: + unsigned long myTextLength; private: unsigned short myCompressionVersion; - unsigned long myTextLength; //TODO: Warning: isn't used unsigned short myTextRecordNumber; unsigned short myImageStartIndex; shared_ptr myHuffDecompressorPtr; }; +class PalmDocContentStream : public PalmDocStream { + +public: + PalmDocContentStream(const ZLFile &file); + +private: + size_t sizeOfOpened(); +}; + +class PalmDocCssStream : public PalmDocStream { + +public: + PalmDocCssStream(const ZLFile &file); + +private: + bool open(); + size_t sizeOfOpened(); + size_t offset() const; +}; + #endif /* __PALMDOCSTREAM_H__ */ diff --git a/jni/NativeFormats/fbreader/src/formats/pdb/PdbPlugin.h b/jni/NativeFormats/fbreader/src/formats/pdb/PdbPlugin.h index 167a9870d..cc88be7af 100644 --- a/jni/NativeFormats/fbreader/src/formats/pdb/PdbPlugin.h +++ b/jni/NativeFormats/fbreader/src/formats/pdb/PdbPlugin.h @@ -51,7 +51,7 @@ class SimplePdbPlugin : public PdbPlugin { public: bool readMetainfo(Book &book) const; - bool readModel(BookModel &model) const; + //bool readModel(BookModel &model) const; protected: virtual shared_ptr createStream(const ZLFile &file) const = 0; @@ -90,6 +90,7 @@ private: bool readUids(Book &book) const; bool readLanguageAndEncoding(Book &book) const; bool readMetainfo(Book &book) const; + bool readModel(BookModel &model) const; void readDocumentInternal(const ZLFile &file, BookModel &model, const class PlainTextFormat &format, const std::string &encoding, ZLInputStream &stream) const; shared_ptr coverImage(const ZLFile &file) const; diff --git a/jni/NativeFormats/fbreader/src/formats/pdb/PdbStream.h b/jni/NativeFormats/fbreader/src/formats/pdb/PdbStream.h index d6a6cea34..dfc279156 100644 --- a/jni/NativeFormats/fbreader/src/formats/pdb/PdbStream.h +++ b/jni/NativeFormats/fbreader/src/formats/pdb/PdbStream.h @@ -35,13 +35,12 @@ public: protected: virtual bool open(); virtual void close(); + void seek(int offset, bool absoluteOffset); + size_t offset() const; private: size_t read(char *buffer, size_t maxSize); - void seek(int offset, bool absoluteOffset); - size_t offset() const; - protected: virtual bool fillBuffer() = 0; diff --git a/jni/NativeFormats/fbreader/src/formats/pdb/SimplePdbPlugin.cpp b/jni/NativeFormats/fbreader/src/formats/pdb/SimplePdbPlugin.cpp index 61d68b7a7..39db1727c 100644 --- a/jni/NativeFormats/fbreader/src/formats/pdb/SimplePdbPlugin.cpp +++ b/jni/NativeFormats/fbreader/src/formats/pdb/SimplePdbPlugin.cpp @@ -53,21 +53,21 @@ bool SimplePdbPlugin::readMetainfo(Book &book) const { return true; } +/* bool SimplePdbPlugin::readModel(BookModel &model) const { const Book &book = *model.book(); const ZLFile &file = book.file(); shared_ptr stream = createStream(file); PlainTextFormat format(file); - /* if (!format.initialized()) { PlainTextFormatDetector detector; detector.detect(*stream, format); } - */ readDocumentInternal(file, model, format, book.encoding(), *stream); return true; } +*/ void SimplePdbPlugin::readDocumentInternal(const ZLFile&, BookModel &model, const PlainTextFormat &format, const std::string &encoding, ZLInputStream &stream) const { //if (TextFormatDetector().isHtml(stream)) {