diff --git a/jni/NativeFormats/JavaNativeFormatPlugin.cpp b/jni/NativeFormats/JavaNativeFormatPlugin.cpp index ff4ac5720..fb9ab895c 100644 --- a/jni/NativeFormats/JavaNativeFormatPlugin.cpp +++ b/jni/NativeFormats/JavaNativeFormatPlugin.cpp @@ -197,7 +197,7 @@ static bool initInternalHyperlinks(JNIEnv *env, jobject javaModel, BookModel &mo JString linksDirectoryName(env, allocator.directoryName(), false); JString linksFileExtension(env, allocator.fileExtension(), false); jint linksBlocksNumber = allocator.blocksNumber(); - AndroidUtil::Method_NativeBookModel_initInternalHyperlinks->call(javaModel, linksDirectoryName.j(), linksFileExtension.j(), linksBlocksNumber); + AndroidUtil::Method_BookModel_initInternalHyperlinks->call(javaModel, linksDirectoryName.j(), linksFileExtension.j(), linksBlocksNumber); return !env->ExceptionCheck(); } @@ -224,7 +224,7 @@ static jobject createTextModel(JNIEnv *env, jobject javaModel, ZLTextModel &mode jstring fileExtension = env->NewStringUTF(model.allocator().fileExtension().c_str()); jint blocksNumber = (jint) model.allocator().blocksNumber(); - jobject textModel = AndroidUtil::Method_NativeBookModel_createTextModel->call( + jobject textModel = AndroidUtil::Method_BookModel_createTextModel->call( javaModel, id, language, paragraphsNumber, entryIndices, entryOffsets, @@ -243,11 +243,11 @@ static void initTOC(JNIEnv *env, jobject javaModel, const ContentsTree &tree) { for (std::vector >::const_iterator it = children.begin(); it != children.end(); ++it) { const ContentsTree &child = **it; JString text(env, child.text()); - AndroidUtil::Method_NativeBookModel_addTOCItem->call(javaModel, text.j(), child.reference()); + AndroidUtil::Method_BookModel_addTOCItem->call(javaModel, text.j(), child.reference()); initTOC(env, javaModel, child); - AndroidUtil::Method_NativeBookModel_leaveTOCItem->call(javaModel); + AndroidUtil::Method_BookModel_leaveTOCItem->call(javaModel); } } @@ -275,7 +275,7 @@ JNIEXPORT jint JNICALL Java_org_geometerplus_fbreader_formats_NativeFormatPlugin return 1; } - jobject javaBook = AndroidUtil::Field_NativeBookModel_Book->value(javaModel); + jobject javaBook = AndroidUtil::Field_BookModel_Book->value(javaModel); shared_ptr book = Book::loadFromJavaBook(env, javaBook); shared_ptr model = new BookModel(book, javaModel); @@ -297,7 +297,7 @@ JNIEXPORT jint JNICALL Java_org_geometerplus_fbreader_formats_NativeFormatPlugin if (javaTextModel == 0) { return 5; } - AndroidUtil::Method_NativeBookModel_setBookTextModel->call(javaModel, javaTextModel); + AndroidUtil::Method_BookModel_setBookTextModel->call(javaModel, javaTextModel); if (env->ExceptionCheck()) { return 6; } @@ -310,7 +310,7 @@ JNIEXPORT jint JNICALL Java_org_geometerplus_fbreader_formats_NativeFormatPlugin if (javaFootnoteModel == 0) { return 7; } - AndroidUtil::Method_NativeBookModel_setFootnoteModel->call(javaModel, javaFootnoteModel); + AndroidUtil::Method_BookModel_setFootnoteModel->call(javaModel, javaFootnoteModel); if (env->ExceptionCheck()) { return 8; } @@ -325,7 +325,7 @@ JNIEXPORT jint JNICALL Java_org_geometerplus_fbreader_formats_NativeFormatPlugin JString jString(env, lst[i]); env->SetObjectArrayElement(jList, i, jString.j()); } - AndroidUtil::Method_NativeBookModel_registerFontFamilyList->call(javaModel, jList); + AndroidUtil::Method_BookModel_registerFontFamilyList->call(javaModel, jList); env->DeleteLocalRef(jList); } @@ -340,7 +340,7 @@ JNIEXPORT jint JNICALL Java_org_geometerplus_fbreader_formats_NativeFormatPlugin jobject italic = createJavaFileInfo(env, it->second->Italic); jobject boldItalic = createJavaFileInfo(env, it->second->BoldItalic); - AndroidUtil::Method_NativeBookModel_registerFontEntry->call( + AndroidUtil::Method_BookModel_registerFontEntry->call( javaModel, family.j(), normal, bold, italic, boldItalic ); diff --git a/jni/NativeFormats/fbreader/src/bookmodel/BookReader.cpp b/jni/NativeFormats/fbreader/src/bookmodel/BookReader.cpp index 6008ed2fb..92810d4f0 100644 --- a/jni/NativeFormats/fbreader/src/bookmodel/BookReader.cpp +++ b/jni/NativeFormats/fbreader/src/bookmodel/BookReader.cpp @@ -235,7 +235,7 @@ void BookReader::addImage(const std::string &id, shared_ptr image jobject javaImage = AndroidUtil::createJavaImage(env, (const ZLFileImage&)*image); JString javaId(env, id); - AndroidUtil::Method_NativeBookModel_addImage->call(myModel.myJavaModel, javaId.j(), javaImage); + AndroidUtil::Method_BookModel_addImage->call(myModel.myJavaModel, javaId.j(), javaImage); env->DeleteLocalRef(javaImage); } diff --git a/jni/NativeFormats/util/AndroidUtil.cpp b/jni/NativeFormats/util/AndroidUtil.cpp index 8d430d09d..131cbbf16 100644 --- a/jni/NativeFormats/util/AndroidUtil.cpp +++ b/jni/NativeFormats/util/AndroidUtil.cpp @@ -51,7 +51,7 @@ JavaClass AndroidUtil::Class_PluginCollection("org/geometerplus/fbreader/formats JavaClass AndroidUtil::Class_Paths("org/geometerplus/fbreader/Paths"); JavaClass AndroidUtil::Class_Book("org/geometerplus/fbreader/book/Book"); JavaClass AndroidUtil::Class_Tag("org/geometerplus/fbreader/book/Tag"); -JavaClass AndroidUtil::Class_NativeBookModel("org/geometerplus/fbreader/bookmodel/NativeBookModel"); +JavaClass AndroidUtil::Class_BookModel("org/geometerplus/fbreader/bookmodel/BookModel"); shared_ptr AndroidUtil::Method_java_lang_String_toLowerCase; shared_ptr AndroidUtil::Method_java_lang_String_toUpperCase; @@ -117,16 +117,16 @@ shared_ptr AndroidUtil::Method_Book_addUid; shared_ptr AndroidUtil::StaticMethod_Tag_getTag; -shared_ptr AndroidUtil::Field_NativeBookModel_Book; -shared_ptr AndroidUtil::Method_NativeBookModel_initInternalHyperlinks; -shared_ptr AndroidUtil::Method_NativeBookModel_addTOCItem; -shared_ptr AndroidUtil::Method_NativeBookModel_leaveTOCItem; -shared_ptr AndroidUtil::Method_NativeBookModel_createTextModel; -shared_ptr AndroidUtil::Method_NativeBookModel_setBookTextModel; -shared_ptr AndroidUtil::Method_NativeBookModel_setFootnoteModel; -shared_ptr AndroidUtil::Method_NativeBookModel_addImage; -shared_ptr AndroidUtil::Method_NativeBookModel_registerFontFamilyList; -shared_ptr AndroidUtil::Method_NativeBookModel_registerFontEntry; +shared_ptr AndroidUtil::Field_BookModel_Book; +shared_ptr AndroidUtil::Method_BookModel_initInternalHyperlinks; +shared_ptr AndroidUtil::Method_BookModel_addTOCItem; +shared_ptr AndroidUtil::Method_BookModel_leaveTOCItem; +shared_ptr AndroidUtil::Method_BookModel_createTextModel; +shared_ptr AndroidUtil::Method_BookModel_setBookTextModel; +shared_ptr AndroidUtil::Method_BookModel_setFootnoteModel; +shared_ptr AndroidUtil::Method_BookModel_addImage; +shared_ptr AndroidUtil::Method_BookModel_registerFontFamilyList; +shared_ptr AndroidUtil::Method_BookModel_registerFontEntry; JNIEnv *AndroidUtil::getEnv() { JNIEnv *env; @@ -200,16 +200,16 @@ bool AndroidUtil::init(JavaVM* jvm) { StaticMethod_Tag_getTag = new StaticObjectMethod(Class_Tag, "getTag", Class_Tag, "(Lorg/geometerplus/fbreader/book/Tag;Ljava/lang/String;)"); - Field_NativeBookModel_Book = new ObjectField(Class_NativeBookModel, "Book", Class_Book); - Method_NativeBookModel_initInternalHyperlinks = new VoidMethod(Class_NativeBookModel, "initInternalHyperlinks", "(Ljava/lang/String;Ljava/lang/String;I)"); - Method_NativeBookModel_addTOCItem = new VoidMethod(Class_NativeBookModel, "addTOCItem", "(Ljava/lang/String;I)"); - Method_NativeBookModel_leaveTOCItem = new VoidMethod(Class_NativeBookModel, "leaveTOCItem", "()"); - Method_NativeBookModel_createTextModel = new ObjectMethod(Class_NativeBookModel, "createTextModel", Class_ZLTextModel, "(Ljava/lang/String;Ljava/lang/String;I[I[I[I[I[BLjava/lang/String;Ljava/lang/String;I)"); - Method_NativeBookModel_setBookTextModel = new VoidMethod(Class_NativeBookModel, "setBookTextModel", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;)"); - Method_NativeBookModel_setFootnoteModel = new VoidMethod(Class_NativeBookModel, "setFootnoteModel", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;)"); - Method_NativeBookModel_addImage = new VoidMethod(Class_NativeBookModel, "addImage", "(Ljava/lang/String;Lorg/geometerplus/zlibrary/core/image/ZLImage;)"); - Method_NativeBookModel_registerFontFamilyList = new VoidMethod(Class_NativeBookModel, "registerFontFamilyList", "([Ljava/lang/String;)"); - Method_NativeBookModel_registerFontEntry = new VoidMethod(Class_NativeBookModel, "registerFontEntry", "(Ljava/lang/String;Lorg/geometerplus/zlibrary/core/fonts/FileInfo;Lorg/geometerplus/zlibrary/core/fonts/FileInfo;Lorg/geometerplus/zlibrary/core/fonts/FileInfo;Lorg/geometerplus/zlibrary/core/fonts/FileInfo;)"); + Field_BookModel_Book = new ObjectField(Class_BookModel, "Book", Class_Book); + Method_BookModel_initInternalHyperlinks = new VoidMethod(Class_BookModel, "initInternalHyperlinks", "(Ljava/lang/String;Ljava/lang/String;I)"); + Method_BookModel_addTOCItem = new VoidMethod(Class_BookModel, "addTOCItem", "(Ljava/lang/String;I)"); + Method_BookModel_leaveTOCItem = new VoidMethod(Class_BookModel, "leaveTOCItem", "()"); + Method_BookModel_createTextModel = new ObjectMethod(Class_BookModel, "createTextModel", Class_ZLTextModel, "(Ljava/lang/String;Ljava/lang/String;I[I[I[I[I[BLjava/lang/String;Ljava/lang/String;I)"); + Method_BookModel_setBookTextModel = new VoidMethod(Class_BookModel, "setBookTextModel", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;)"); + Method_BookModel_setFootnoteModel = new VoidMethod(Class_BookModel, "setFootnoteModel", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;)"); + Method_BookModel_addImage = new VoidMethod(Class_BookModel, "addImage", "(Ljava/lang/String;Lorg/geometerplus/zlibrary/core/image/ZLImage;)"); + Method_BookModel_registerFontFamilyList = new VoidMethod(Class_BookModel, "registerFontFamilyList", "([Ljava/lang/String;)"); + Method_BookModel_registerFontEntry = new VoidMethod(Class_BookModel, "registerFontEntry", "(Ljava/lang/String;Lorg/geometerplus/zlibrary/core/fonts/FileInfo;Lorg/geometerplus/zlibrary/core/fonts/FileInfo;Lorg/geometerplus/zlibrary/core/fonts/FileInfo;Lorg/geometerplus/zlibrary/core/fonts/FileInfo;)"); return true; } diff --git a/jni/NativeFormats/util/AndroidUtil.h b/jni/NativeFormats/util/AndroidUtil.h index f756dcfdf..efeb0f101 100644 --- a/jni/NativeFormats/util/AndroidUtil.h +++ b/jni/NativeFormats/util/AndroidUtil.h @@ -88,7 +88,7 @@ public: static JavaClass Class_Paths; static JavaClass Class_Book; static JavaClass Class_Tag; - static JavaClass Class_NativeBookModel; + static JavaClass Class_BookModel; //static JavaClass Class_BookReadingException; static shared_ptr Method_java_lang_String_toLowerCase; @@ -155,16 +155,16 @@ public: static shared_ptr StaticMethod_Tag_getTag; - static shared_ptr Field_NativeBookModel_Book; - static shared_ptr Method_NativeBookModel_initInternalHyperlinks; - static shared_ptr Method_NativeBookModel_addTOCItem; - static shared_ptr Method_NativeBookModel_leaveTOCItem; - static shared_ptr Method_NativeBookModel_createTextModel; - static shared_ptr Method_NativeBookModel_setBookTextModel; - static shared_ptr Method_NativeBookModel_setFootnoteModel; - static shared_ptr Method_NativeBookModel_addImage; - static shared_ptr Method_NativeBookModel_registerFontFamilyList; - static shared_ptr Method_NativeBookModel_registerFontEntry; + static shared_ptr Field_BookModel_Book; + static shared_ptr Method_BookModel_initInternalHyperlinks; + static shared_ptr Method_BookModel_addTOCItem; + static shared_ptr Method_BookModel_leaveTOCItem; + static shared_ptr Method_BookModel_createTextModel; + static shared_ptr Method_BookModel_setBookTextModel; + static shared_ptr Method_BookModel_setFootnoteModel; + static shared_ptr Method_BookModel_addImage; + static shared_ptr Method_BookModel_registerFontFamilyList; + static shared_ptr Method_BookModel_registerFontEntry; public: static bool init(JavaVM* jvm); diff --git a/src/org/geometerplus/fbreader/bookmodel/BookModel.java b/src/org/geometerplus/fbreader/bookmodel/BookModel.java index 625873364..4722343b4 100644 --- a/src/org/geometerplus/fbreader/bookmodel/BookModel.java +++ b/src/org/geometerplus/fbreader/bookmodel/BookModel.java @@ -19,22 +19,22 @@ package org.geometerplus.fbreader.bookmodel; -import java.util.Arrays; -import java.util.List; +import java.util.*; import org.geometerplus.zlibrary.core.fonts.*; +import org.geometerplus.zlibrary.core.image.ZLImage; import org.geometerplus.zlibrary.text.model.*; import org.geometerplus.fbreader.book.Book; import org.geometerplus.fbreader.formats.BuiltinFormatPlugin; import org.geometerplus.fbreader.formats.FormatPlugin; -public abstract class BookModel { +public final class BookModel { public static BookModel createModel(Book book) throws BookReadingException { final FormatPlugin plugin = book.getPlugin(); if (plugin instanceof BuiltinFormatPlugin) { - final BookModel model = new NativeBookModel(book); + final BookModel model = new BookModel(book); ((BuiltinFormatPlugin)plugin).readModel(model); return model; } @@ -48,6 +48,11 @@ public abstract class BookModel { public final TOCTree TOCTree = new TOCTree(); public final FontManager FontManager = new FontManager(); + protected CachedCharStorage myInternalHyperlinks; + protected final HashMap myImageMap = new HashMap(); + protected ZLTextModel myBookTextModel; + protected final HashMap myFootnotes = new HashMap(); + public static final class Label { public final String ModelId; public final int ParagraphIndex; @@ -62,10 +67,6 @@ public abstract class BookModel { Book = book; } - public abstract ZLTextModel getTextModel(); - public abstract ZLTextModel getFootnoteModel(String id); - protected abstract Label getLabelInternal(String id); - public interface LabelResolver { List getCandidates(String id); } @@ -100,4 +101,83 @@ public abstract class BookModel { public void registerFontEntry(String family, FileInfo normal, FileInfo bold, FileInfo italic, FileInfo boldItalic) { registerFontEntry(family, new FontEntry(family, normal, bold, italic, boldItalic)); } + + public ZLTextModel createTextModel( + String id, String language, int paragraphsNumber, + int[] entryIndices, int[] entryOffsets, + int[] paragraphLenghts, int[] textSizes, byte[] paragraphKinds, + String directoryName, String fileExtension, int blocksNumber + ) { + return new ZLTextPlainModel( + id, language, paragraphsNumber, + entryIndices, entryOffsets, + paragraphLenghts, textSizes, paragraphKinds, + directoryName, fileExtension, blocksNumber, myImageMap, FontManager + ); + } + + public void setBookTextModel(ZLTextModel model) { + myBookTextModel = model; + } + + public void setFootnoteModel(ZLTextModel model) { + myFootnotes.put(model.getId(), model); + } + + public ZLTextModel getTextModel() { + return myBookTextModel; + } + + public ZLTextModel getFootnoteModel(String id) { + return myFootnotes.get(id); + } + + public void addImage(String id, ZLImage image) { + myImageMap.put(id, image); + } + + public void initInternalHyperlinks(String directoryName, String fileExtension, int blocksNumber) { + myInternalHyperlinks = new CachedCharStorage(directoryName, fileExtension, blocksNumber); + } + + private TOCTree myCurrentTree = TOCTree; + + public void addTOCItem(String text, int reference) { + myCurrentTree = new TOCTree(myCurrentTree); + myCurrentTree.setText(text); + myCurrentTree.setReference(myBookTextModel, reference); + } + + public void leaveTOCItem() { + myCurrentTree = myCurrentTree.Parent; + if (myCurrentTree == null) { + myCurrentTree = TOCTree; + } + } + + private Label getLabelInternal(String id) { + final int len = id.length(); + final int size = myInternalHyperlinks.size(); + + for (int i = 0; i < size; ++i) { + final char[] block = myInternalHyperlinks.block(i); + for (int offset = 0; offset < block.length; ) { + final int labelLength = (int)block[offset++]; + if (labelLength == 0) { + break; + } + final int idLength = (int)block[offset + labelLength]; + if ((labelLength != len) || !id.equals(new String(block, offset, labelLength))) { + offset += labelLength + idLength + 3; + continue; + } + offset += labelLength + 1; + final String modelId = (idLength > 0) ? new String(block, offset, idLength) : null; + offset += idLength; + final int paragraphNumber = (int)block[offset] + (((int)block[offset + 1]) << 16); + return new Label(modelId, paragraphNumber); + } + } + return null; + } } diff --git a/src/org/geometerplus/fbreader/bookmodel/BookModelImpl.java b/src/org/geometerplus/fbreader/bookmodel/BookModelImpl.java deleted file mode 100644 index 00b667f52..000000000 --- a/src/org/geometerplus/fbreader/bookmodel/BookModelImpl.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2007-2015 FBReader.ORG Limited - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -package org.geometerplus.fbreader.bookmodel; - -import java.util.HashMap; - -import org.geometerplus.zlibrary.core.image.*; - -import org.geometerplus.zlibrary.text.model.*; - -import org.geometerplus.fbreader.book.Book; - -abstract class BookModelImpl extends BookModel { - protected CachedCharStorage myInternalHyperlinks; - protected final HashMap myImageMap = new HashMap(); - protected final HashMap myFootnotes = new HashMap(); - - BookModelImpl(Book book) { - super(book); - } - - @Override - protected Label getLabelInternal(String id) { - final int len = id.length(); - final int size = myInternalHyperlinks.size(); - - for (int i = 0; i < size; ++i) { - final char[] block = myInternalHyperlinks.block(i); - for (int offset = 0; offset < block.length; ) { - final int labelLength = (int)block[offset++]; - if (labelLength == 0) { - break; - } - final int idLength = (int)block[offset + labelLength]; - if ((labelLength != len) || !id.equals(new String(block, offset, labelLength))) { - offset += labelLength + idLength + 3; - continue; - } - offset += labelLength + 1; - final String modelId = (idLength > 0) ? new String(block, offset, idLength) : null; - offset += idLength; - final int paragraphNumber = (int)block[offset] + (((int)block[offset + 1]) << 16); - return new Label(modelId, paragraphNumber); - } - } - return null; - } - - public void addImage(String id, ZLImage image) { - myImageMap.put(id, image); - } -} diff --git a/src/org/geometerplus/fbreader/bookmodel/NativeBookModel.java b/src/org/geometerplus/fbreader/bookmodel/NativeBookModel.java deleted file mode 100644 index 287c59231..000000000 --- a/src/org/geometerplus/fbreader/bookmodel/NativeBookModel.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2011-2015 FBReader.ORG Limited - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -package org.geometerplus.fbreader.bookmodel; - -import org.geometerplus.zlibrary.text.model.*; - -import org.geometerplus.fbreader.book.Book; - -public class NativeBookModel extends BookModelImpl { - private ZLTextModel myBookTextModel; - - NativeBookModel(Book book) { - super(book); - } - - public void initInternalHyperlinks(String directoryName, String fileExtension, int blocksNumber) { - myInternalHyperlinks = new CachedCharStorage(directoryName, fileExtension, blocksNumber); - } - - private TOCTree myCurrentTree = TOCTree; - - public void addTOCItem(String text, int reference) { - myCurrentTree = new TOCTree(myCurrentTree); - myCurrentTree.setText(text); - myCurrentTree.setReference(myBookTextModel, reference); - } - - public void leaveTOCItem() { - myCurrentTree = myCurrentTree.Parent; - if (myCurrentTree == null) { - myCurrentTree = TOCTree; - } - } - - public ZLTextModel createTextModel( - String id, String language, int paragraphsNumber, - int[] entryIndices, int[] entryOffsets, - int[] paragraphLenghts, int[] textSizes, byte[] paragraphKinds, - String directoryName, String fileExtension, int blocksNumber - ) { - return new ZLTextPlainModel( - id, language, paragraphsNumber, - entryIndices, entryOffsets, - paragraphLenghts, textSizes, paragraphKinds, - directoryName, fileExtension, blocksNumber, myImageMap, FontManager - ); - } - - public void setBookTextModel(ZLTextModel model) { - myBookTextModel = model; - } - - public void setFootnoteModel(ZLTextModel model) { - myFootnotes.put(model.getId(), model); - } - - @Override - public ZLTextModel getTextModel() { - return myBookTextModel; - } - - @Override - public ZLTextModel getFootnoteModel(String id) { - return myFootnotes.get(id); - } -}