1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-04 10:19:33 +02:00

readLanguageAndEncoding => detectLanguageAndEncoding

This commit is contained in:
Nikolay Pultsin 2012-03-17 23:29:08 +00:00
parent bb34807022
commit b17dbd6c7c
7 changed files with 47 additions and 9 deletions

View file

@ -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) {

View file

@ -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);

View file

@ -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;

View file

@ -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 {

View file

@ -56,4 +56,9 @@ public class FB2Plugin extends JavaFormatPlugin {
public EncodingCollection supportedEncodings() {
return new AutoEncodingCollection();
}
@Override
public void detectLanguageAndEncoding(Book book) {
book.setEncoding("auto");
}
}

View file

@ -88,4 +88,9 @@ public class OEBPlugin extends JavaFormatPlugin {
public EncodingCollection supportedEncodings() {
return new AutoEncodingCollection();
}
@Override
public void detectLanguageAndEncoding(Book book) {
book.setEncoding("auto");
}
}

View file

@ -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) {
}
}
}
}
}