diff --git a/jni/NativeFormats/JavaNativeFormatPlugin.cpp b/jni/NativeFormats/JavaNativeFormatPlugin.cpp index d452fa917..5c7e3e411 100644 --- a/jni/NativeFormats/JavaNativeFormatPlugin.cpp +++ b/jni/NativeFormats/JavaNativeFormatPlugin.cpp @@ -99,8 +99,8 @@ JNIEXPORT jboolean JNICALL Java_org_geometerplus_fbreader_formats_NativeFormatPl } extern "C" -JNIEXPORT jboolean JNICALL Java_org_geometerplus_fbreader_formats_NativeFormatPlugin_readLanguageAndEncoding(JNIEnv* env, jobject thiz, jobject javaBook) { - return JNI_FALSE; +JNIEXPORT void JNICALL Java_org_geometerplus_fbreader_formats_NativeFormatPlugin_detectLanguageAndEncoding(JNIEnv* env, jobject thiz, jobject javaBook) { + // TODO: implement } static bool initBookModel(JNIEnv *env, jobject javaModel, BookModel &model) { diff --git a/src/org/geometerplus/fbreader/formats/FormatPlugin.java b/src/org/geometerplus/fbreader/formats/FormatPlugin.java index 33b431912..530d430eb 100644 --- a/src/org/geometerplus/fbreader/formats/FormatPlugin.java +++ b/src/org/geometerplus/fbreader/formats/FormatPlugin.java @@ -39,7 +39,7 @@ public abstract class FormatPlugin { public abstract void readMetaInfo(Book book) throws BookReadingException; public abstract void readModel(BookModel model) throws BookReadingException; - public abstract boolean readLanguageAndEncoding(Book book); + public abstract void detectLanguageAndEncoding(Book book) throws BookReadingException; public abstract ZLImage readCover(ZLFile file); public abstract String readAnnotation(ZLFile file); diff --git a/src/org/geometerplus/fbreader/formats/JavaFormatPlugin.java b/src/org/geometerplus/fbreader/formats/JavaFormatPlugin.java index f7f2d4278..cee285b84 100644 --- a/src/org/geometerplus/fbreader/formats/JavaFormatPlugin.java +++ b/src/org/geometerplus/fbreader/formats/JavaFormatPlugin.java @@ -26,11 +26,6 @@ public abstract class JavaFormatPlugin extends FormatPlugin { super(fileType); } - @Override - public boolean readLanguageAndEncoding(Book book) { - return true; - } - @Override public Type type() { return Type.JAVA; diff --git a/src/org/geometerplus/fbreader/formats/NativeFormatPlugin.java b/src/org/geometerplus/fbreader/formats/NativeFormatPlugin.java index 326fb35c5..1aaafa068 100644 --- a/src/org/geometerplus/fbreader/formats/NativeFormatPlugin.java +++ b/src/org/geometerplus/fbreader/formats/NativeFormatPlugin.java @@ -47,7 +47,7 @@ public class NativeFormatPlugin extends FormatPlugin { private native boolean readMetaInfoNative(Book book); @Override - public native boolean readLanguageAndEncoding(Book book); + public native void detectLanguageAndEncoding(Book book); @Override public void readModel(BookModel model) throws BookReadingException { diff --git a/src/org/geometerplus/fbreader/formats/fb2/FB2Plugin.java b/src/org/geometerplus/fbreader/formats/fb2/FB2Plugin.java index c4076a559..440e8f3bc 100644 --- a/src/org/geometerplus/fbreader/formats/fb2/FB2Plugin.java +++ b/src/org/geometerplus/fbreader/formats/fb2/FB2Plugin.java @@ -56,4 +56,9 @@ public class FB2Plugin extends JavaFormatPlugin { public EncodingCollection supportedEncodings() { return new AutoEncodingCollection(); } + + @Override + public void detectLanguageAndEncoding(Book book) { + book.setEncoding("auto"); + } } diff --git a/src/org/geometerplus/fbreader/formats/oeb/OEBPlugin.java b/src/org/geometerplus/fbreader/formats/oeb/OEBPlugin.java index 3fb62ff58..aad6e4c58 100644 --- a/src/org/geometerplus/fbreader/formats/oeb/OEBPlugin.java +++ b/src/org/geometerplus/fbreader/formats/oeb/OEBPlugin.java @@ -88,4 +88,9 @@ public class OEBPlugin extends JavaFormatPlugin { public EncodingCollection supportedEncodings() { return new AutoEncodingCollection(); } + + @Override + public void detectLanguageAndEncoding(Book book) { + book.setEncoding("auto"); + } } diff --git a/src/org/geometerplus/fbreader/formats/pdb/MobipocketPlugin.java b/src/org/geometerplus/fbreader/formats/pdb/MobipocketPlugin.java index b92458f21..bb63708bb 100644 --- a/src/org/geometerplus/fbreader/formats/pdb/MobipocketPlugin.java +++ b/src/org/geometerplus/fbreader/formats/pdb/MobipocketPlugin.java @@ -248,4 +248,37 @@ public class MobipocketPlugin extends JavaFormatPlugin { public EncodingCollection supportedEncodings() { return JavaEncodingCollection.Instance(); } + + @Override + public void detectLanguageAndEncoding(Book book) throws BookReadingException { + InputStream stream = null; + try { + stream = book.File.getInputStream(); + final PdbHeader header = new PdbHeader(stream); + PdbUtil.skip(stream, header.Offsets[0] + 16 - header.length()); + if (PdbUtil.readInt(stream) != 0x4D4F4249) /* "MOBI" */ { + throw new BookReadingException("unsupportedFileFormat", book.File); + } + final int length = (int)PdbUtil.readInt(stream); + PdbUtil.skip(stream, 4); + final int encodingCode = (int)PdbUtil.readInt(stream); + final Encoding encoding = supportedEncodings().getEncoding(encodingCode); + final String encodingName = encoding != null ? encoding.Name : "utf-8"; + book.setEncoding(encodingName); + PdbUtil.skip(stream, 52); + final int fullNameOffset = (int)PdbUtil.readInt(stream); + final int fullNameLength = (int)PdbUtil.readInt(stream); + final int languageCode = (int)PdbUtil.readInt(stream); + book.setLanguage(ZLLanguageUtil.languageByIntCode(languageCode & 0xFF, (languageCode >> 8) & 0xFF)); + } catch (IOException e) { + throw new BookReadingException(e, book.File); + } finally { + if (stream != null) { + try { + stream.close(); + } catch (IOException e) { + } + } + } + } }