mirror of
https://github.com/geometer/FBReaderJ.git
synced 2025-10-04 10:19:33 +02:00
readLanguageAndEncoding => detectLanguageAndEncoding
This commit is contained in:
parent
bb34807022
commit
b17dbd6c7c
7 changed files with 47 additions and 9 deletions
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -56,4 +56,9 @@ public class FB2Plugin extends JavaFormatPlugin {
|
|||
public EncodingCollection supportedEncodings() {
|
||||
return new AutoEncodingCollection();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void detectLanguageAndEncoding(Book book) {
|
||||
book.setEncoding("auto");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -88,4 +88,9 @@ public class OEBPlugin extends JavaFormatPlugin {
|
|||
public EncodingCollection supportedEncodings() {
|
||||
return new AutoEncodingCollection();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void detectLanguageAndEncoding(Book book) {
|
||||
book.setEncoding("auto");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue