mirror of
https://github.com/geometer/FBReaderJ.git
synced 2025-10-03 17:59:33 +02:00
ZLUnicodeUtil is now based on java String methods
This commit is contained in:
parent
15f3e8e3c1
commit
9d2cea64ec
7 changed files with 69 additions and 11143 deletions
File diff suppressed because it is too large
Load diff
|
@ -30,8 +30,8 @@
|
||||||
|
|
||||||
static shared_ptr<FormatPlugin> findCppPlugin(JNIEnv *env, jobject base) {
|
static shared_ptr<FormatPlugin> findCppPlugin(JNIEnv *env, jobject base) {
|
||||||
jstring fileTypeJava = (jstring)env->CallObjectMethod(base, AndroidUtil::MID_NativeFormatPlugin_supportedFileType);
|
jstring fileTypeJava = (jstring)env->CallObjectMethod(base, AndroidUtil::MID_NativeFormatPlugin_supportedFileType);
|
||||||
std::string fileTypeCpp;
|
const std::string fileTypeCpp = AndroidUtil::fromJavaString(env, fileTypeJava);
|
||||||
AndroidUtil::extractJavaString(env, fileTypeJava, fileTypeCpp);
|
env->DeleteLocalRef(fileTypeJava);
|
||||||
shared_ptr<FormatPlugin> plugin = PluginCollection::Instance().pluginByType(fileTypeCpp);
|
shared_ptr<FormatPlugin> plugin = PluginCollection::Instance().pluginByType(fileTypeCpp);
|
||||||
if (plugin.isNull()) {
|
if (plugin.isNull()) {
|
||||||
AndroidUtil::throwRuntimeException(env, "Native FormatPlugin instance is NULL for type " + fileTypeCpp);
|
AndroidUtil::throwRuntimeException(env, "Native FormatPlugin instance is NULL for type " + fileTypeCpp);
|
||||||
|
|
|
@ -86,26 +86,22 @@ shared_ptr<Book> Book::loadFromFile(const ZLFile &file) {
|
||||||
shared_ptr<Book> Book::loadFromJavaBook(JNIEnv *env, jobject javaBook) {
|
shared_ptr<Book> Book::loadFromJavaBook(JNIEnv *env, jobject javaBook) {
|
||||||
jstring javaString;
|
jstring javaString;
|
||||||
|
|
||||||
std::string path;
|
|
||||||
jobject javaFile = env->GetObjectField(javaBook, AndroidUtil::FID_Book_File);
|
jobject javaFile = env->GetObjectField(javaBook, AndroidUtil::FID_Book_File);
|
||||||
javaString = (jstring) env->CallObjectMethod(javaFile, AndroidUtil::MID_ZLFile_getPath);
|
javaString = (jstring) env->CallObjectMethod(javaFile, AndroidUtil::MID_ZLFile_getPath);
|
||||||
AndroidUtil::extractJavaString(env, javaString, path);
|
const std::string path = AndroidUtil::fromJavaString(env, javaString);
|
||||||
env->DeleteLocalRef(javaString);
|
env->DeleteLocalRef(javaString);
|
||||||
env->DeleteLocalRef(javaFile);
|
env->DeleteLocalRef(javaFile);
|
||||||
|
|
||||||
std::string title;
|
|
||||||
javaString = (jstring) env->CallObjectMethod(javaBook, AndroidUtil::MID_Book_getTitle);
|
javaString = (jstring) env->CallObjectMethod(javaBook, AndroidUtil::MID_Book_getTitle);
|
||||||
AndroidUtil::extractJavaString(env, javaString, title);
|
const std::string title = AndroidUtil::fromJavaString(env, javaString);
|
||||||
env->DeleteLocalRef(javaString);
|
env->DeleteLocalRef(javaString);
|
||||||
|
|
||||||
std::string language;
|
|
||||||
javaString = (jstring) env->CallObjectMethod(javaBook, AndroidUtil::MID_Book_getLanguage);
|
javaString = (jstring) env->CallObjectMethod(javaBook, AndroidUtil::MID_Book_getLanguage);
|
||||||
AndroidUtil::extractJavaString(env, javaString, language);
|
const std::string language = AndroidUtil::fromJavaString(env, javaString);
|
||||||
env->DeleteLocalRef(javaString);
|
env->DeleteLocalRef(javaString);
|
||||||
|
|
||||||
std::string encoding;
|
|
||||||
javaString = (jstring) env->CallObjectMethod(javaBook, AndroidUtil::MID_Book_getEncoding);
|
javaString = (jstring) env->CallObjectMethod(javaBook, AndroidUtil::MID_Book_getEncoding);
|
||||||
AndroidUtil::extractJavaString(env, javaString, encoding);
|
const std::string encoding = AndroidUtil::fromJavaString(env, javaString);
|
||||||
env->DeleteLocalRef(javaString);
|
env->DeleteLocalRef(javaString);
|
||||||
|
|
||||||
return createBook(ZLFile(path), 0, encoding, language, title);
|
return createBook(ZLFile(path), 0, encoding, language, title);
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
JavaVM *AndroidUtil::ourJavaVM = 0;
|
JavaVM *AndroidUtil::ourJavaVM = 0;
|
||||||
|
|
||||||
const char * const AndroidUtil::Class_java_lang_System = "java/lang/System";
|
const char * const AndroidUtil::Class_java_lang_System = "java/lang/System";
|
||||||
|
const char * const AndroidUtil::Class_java_lang_String = "java/lang/String";
|
||||||
const char * const AndroidUtil::Class_java_util_Collection = "java/util/Collection";
|
const char * const AndroidUtil::Class_java_util_Collection = "java/util/Collection";
|
||||||
const char * const AndroidUtil::Class_java_util_Locale = "java/util/Locale";
|
const char * const AndroidUtil::Class_java_util_Locale = "java/util/Locale";
|
||||||
const char * const AndroidUtil::Class_java_io_InputStream = "java/io/InputStream";
|
const char * const AndroidUtil::Class_java_io_InputStream = "java/io/InputStream";
|
||||||
|
@ -37,6 +38,9 @@ const char * const AndroidUtil::Class_NativeBookModel = "org/geometerplus/fbread
|
||||||
|
|
||||||
jobject AndroidUtil::OBJECT_java_lang_System_err;
|
jobject AndroidUtil::OBJECT_java_lang_System_err;
|
||||||
|
|
||||||
|
jmethodID AndroidUtil::MID_java_lang_String_toLowerCase;
|
||||||
|
jmethodID AndroidUtil::MID_java_lang_String_toUpperCase;
|
||||||
|
|
||||||
jmethodID AndroidUtil::MID_java_util_Collection_toArray;
|
jmethodID AndroidUtil::MID_java_util_Collection_toArray;
|
||||||
|
|
||||||
jmethodID AndroidUtil::SMID_java_util_Locale_getDefault;
|
jmethodID AndroidUtil::SMID_java_util_Locale_getDefault;
|
||||||
|
@ -107,6 +111,11 @@ bool AndroidUtil::init(JavaVM* jvm) {
|
||||||
CHECK_NULL( OBJECT_java_lang_System_err = env->GetStaticObjectField(cls, field) );
|
CHECK_NULL( OBJECT_java_lang_System_err = env->GetStaticObjectField(cls, field) );
|
||||||
env->DeleteLocalRef(cls);
|
env->DeleteLocalRef(cls);
|
||||||
|
|
||||||
|
CHECK_NULL( cls = env->FindClass(Class_java_lang_String) );
|
||||||
|
CHECK_NULL( MID_java_lang_String_toLowerCase = env->GetMethodID(cls, "toLowerCase", "()Ljava/lang/String;") );
|
||||||
|
CHECK_NULL( MID_java_lang_String_toUpperCase = env->GetMethodID(cls, "toUpperCase", "()Ljava/lang/String;") );
|
||||||
|
env->DeleteLocalRef(cls);
|
||||||
|
|
||||||
CHECK_NULL( cls = env->FindClass(Class_java_util_Collection) );
|
CHECK_NULL( cls = env->FindClass(Class_java_util_Collection) );
|
||||||
CHECK_NULL( MID_java_util_Collection_toArray = env->GetMethodID(cls, "toArray", "()[Ljava/lang/Object;") );
|
CHECK_NULL( MID_java_util_Collection_toArray = env->GetMethodID(cls, "toArray", "()[Ljava/lang/Object;") );
|
||||||
//CHECK_NULL( MID_java_util_Collection_add = env->GetMethodID(cls, "add", "(Ljava/lang/Object;)Z") );
|
//CHECK_NULL( MID_java_util_Collection_add = env->GetMethodID(cls, "add", "(Ljava/lang/Object;)Z") );
|
||||||
|
@ -195,14 +204,11 @@ jobject AndroidUtil::createZLFile(JNIEnv *env, const std::string &path) {
|
||||||
return javaFile;
|
return javaFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AndroidUtil::extractJavaString(JNIEnv *env, jstring from, std::string &to) {
|
std::string AndroidUtil::fromJavaString(JNIEnv *env, jstring from) {
|
||||||
if (from == 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
const char *data = env->GetStringUTFChars(from, 0);
|
const char *data = env->GetStringUTFChars(from, 0);
|
||||||
to.assign(data);
|
const std::string result(data);
|
||||||
env->ReleaseStringUTFChars(from, data);
|
env->ReleaseStringUTFChars(from, data);
|
||||||
return true;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
jstring AndroidUtil::createJavaString(JNIEnv* env, const std::string &str) {
|
jstring AndroidUtil::createJavaString(JNIEnv* env, const std::string &str) {
|
||||||
|
@ -220,13 +226,12 @@ std::string AndroidUtil::convertNonUtfString(const std::string &str) {
|
||||||
|
|
||||||
JNIEnv *env = getEnv();
|
JNIEnv *env = getEnv();
|
||||||
|
|
||||||
std::string result;
|
|
||||||
jchar *chars = new jchar[len];
|
jchar *chars = new jchar[len];
|
||||||
for (int i = 0; i < len; ++i) {
|
for (int i = 0; i < len; ++i) {
|
||||||
chars[i] = str[i];
|
chars[i] = str[i];
|
||||||
}
|
}
|
||||||
jstring javaString = env->NewString(chars, len);
|
jstring javaString = env->NewString(chars, len);
|
||||||
extractJavaString(env, javaString, result);
|
const std::string result = fromJavaString(env, javaString);
|
||||||
env->DeleteLocalRef(javaString);
|
env->DeleteLocalRef(javaString);
|
||||||
delete[] chars;
|
delete[] chars;
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@ private:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static const char * const Class_java_lang_System;
|
static const char * const Class_java_lang_System;
|
||||||
|
static const char * const Class_java_lang_String;
|
||||||
static const char * const Class_java_util_Collection;
|
static const char * const Class_java_util_Collection;
|
||||||
static const char * const Class_java_util_Locale;
|
static const char * const Class_java_util_Locale;
|
||||||
static const char * const Class_java_io_InputStream;
|
static const char * const Class_java_io_InputStream;
|
||||||
|
@ -47,6 +48,9 @@ public:
|
||||||
|
|
||||||
static jobject OBJECT_java_lang_System_err;
|
static jobject OBJECT_java_lang_System_err;
|
||||||
|
|
||||||
|
static jmethodID MID_java_lang_String_toLowerCase;
|
||||||
|
static jmethodID MID_java_lang_String_toUpperCase;
|
||||||
|
|
||||||
static jmethodID MID_java_util_Collection_toArray;
|
static jmethodID MID_java_util_Collection_toArray;
|
||||||
|
|
||||||
static jmethodID SMID_java_util_Locale_getDefault;
|
static jmethodID SMID_java_util_Locale_getDefault;
|
||||||
|
@ -102,7 +106,7 @@ public:
|
||||||
static JNIEnv *getEnv();
|
static JNIEnv *getEnv();
|
||||||
|
|
||||||
static jobject createZLFile(JNIEnv *env, const std::string &path);
|
static jobject createZLFile(JNIEnv *env, const std::string &path);
|
||||||
static bool extractJavaString(JNIEnv *env, jstring from, std::string &to);
|
static std::string fromJavaString(JNIEnv *env, jstring from);
|
||||||
static jstring createJavaString(JNIEnv* env, const std::string &str);
|
static jstring createJavaString(JNIEnv* env, const std::string &str);
|
||||||
static std::string convertNonUtfString(const std::string &str);
|
static std::string convertNonUtfString(const std::string &str);
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,8 @@
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
|
#include <AndroidUtil.h>
|
||||||
|
|
||||||
#include <ZLibrary.h>
|
#include <ZLibrary.h>
|
||||||
#include <ZLFile.h>
|
#include <ZLFile.h>
|
||||||
#include <ZLXMLReader.h>
|
#include <ZLXMLReader.h>
|
||||||
|
@ -44,7 +46,7 @@ struct ZLUnicodeData {
|
||||||
ZLUnicodeData::ZLUnicodeData(const SymbolType type, ZLUnicodeUtil::Ucs4Char lowerCase, ZLUnicodeUtil::Ucs4Char upperCase) : Type(type), LowerCase(lowerCase), UpperCase(upperCase) {
|
ZLUnicodeData::ZLUnicodeData(const SymbolType type, ZLUnicodeUtil::Ucs4Char lowerCase, ZLUnicodeUtil::Ucs4Char upperCase) : Type(type), LowerCase(lowerCase), UpperCase(upperCase) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::map<ZLUnicodeUtil::Ucs4Char,ZLUnicodeData> UNICODE_TABLE;
|
/*static std::map<ZLUnicodeUtil::Ucs4Char,ZLUnicodeData> UNICODE_TABLE;
|
||||||
|
|
||||||
class ZLUnicodeTableReader : public ZLXMLReader {
|
class ZLUnicodeTableReader : public ZLXMLReader {
|
||||||
|
|
||||||
|
@ -86,6 +88,7 @@ static void initUnicodeTable() {
|
||||||
inProgress = false;
|
inProgress = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
bool ZLUnicodeUtil::isUtf8String(const char *str, int len) {
|
bool ZLUnicodeUtil::isUtf8String(const char *str, int len) {
|
||||||
const char *last = str + len;
|
const char *last = str + len;
|
||||||
|
@ -351,6 +354,7 @@ void ZLUnicodeUtil::ucs2ToUtf8(std::string &to, const Ucs2String &from, int toLe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
bool ZLUnicodeUtil::isLetter(Ucs4Char ch) {
|
bool ZLUnicodeUtil::isLetter(Ucs4Char ch) {
|
||||||
initUnicodeTable();
|
initUnicodeTable();
|
||||||
std::map<ZLUnicodeUtil::Ucs4Char,ZLUnicodeData>::const_iterator it = UNICODE_TABLE.find(ch);
|
std::map<ZLUnicodeUtil::Ucs4Char,ZLUnicodeData>::const_iterator it = UNICODE_TABLE.find(ch);
|
||||||
|
@ -366,6 +370,7 @@ bool ZLUnicodeUtil::isLetter(Ucs4Char ch) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
bool ZLUnicodeUtil::isSpace(Ucs4Char ch) {
|
bool ZLUnicodeUtil::isSpace(Ucs4Char ch) {
|
||||||
return
|
return
|
||||||
|
@ -437,6 +442,7 @@ ZLUnicodeUtil::Breakable ZLUnicodeUtil::isBreakable(Ucs4Char c) {
|
||||||
return BREAKABLE_AFTER;
|
return BREAKABLE_AFTER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
ZLUnicodeUtil::Ucs4Char ZLUnicodeUtil::toLower(Ucs4Char ch) {
|
ZLUnicodeUtil::Ucs4Char ZLUnicodeUtil::toLower(Ucs4Char ch) {
|
||||||
initUnicodeTable();
|
initUnicodeTable();
|
||||||
std::map<ZLUnicodeUtil::Ucs4Char,ZLUnicodeData>::const_iterator it = UNICODE_TABLE.find(ch);
|
std::map<ZLUnicodeUtil::Ucs4Char,ZLUnicodeData>::const_iterator it = UNICODE_TABLE.find(ch);
|
||||||
|
@ -448,8 +454,10 @@ void ZLUnicodeUtil::toLower(Ucs4String &str) {
|
||||||
*it = toLower(*it);
|
*it = toLower(*it);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
std::string ZLUnicodeUtil::toLower(const std::string &utf8String) {
|
std::string ZLUnicodeUtil::toLower(const std::string &utf8String) {
|
||||||
|
/*
|
||||||
Ucs4String ucs4String;
|
Ucs4String ucs4String;
|
||||||
utf8ToUcs4(ucs4String, utf8String);
|
utf8ToUcs4(ucs4String, utf8String);
|
||||||
|
|
||||||
|
@ -458,8 +466,23 @@ std::string ZLUnicodeUtil::toLower(const std::string &utf8String) {
|
||||||
std::string result;
|
std::string result;
|
||||||
ucs4ToUtf8(result, ucs4String, utf8String.length());
|
ucs4ToUtf8(result, ucs4String, utf8String.length());
|
||||||
return result;
|
return result;
|
||||||
|
*/
|
||||||
|
JNIEnv *env = AndroidUtil::getEnv();
|
||||||
|
jstring javaString = AndroidUtil::createJavaString(env, utf8String);
|
||||||
|
jstring lowerCased = (jstring)env->CallObjectMethod(javaString, AndroidUtil::MID_java_lang_String_toLowerCase);
|
||||||
|
if (javaString == lowerCased) {
|
||||||
|
env->DeleteLocalRef(lowerCased);
|
||||||
|
env->DeleteLocalRef(javaString);
|
||||||
|
return utf8String;
|
||||||
|
} else {
|
||||||
|
const std::string result = AndroidUtil::fromJavaString(env, lowerCased);
|
||||||
|
env->DeleteLocalRef(lowerCased);
|
||||||
|
env->DeleteLocalRef(javaString);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
ZLUnicodeUtil::Ucs4Char ZLUnicodeUtil::toUpper(Ucs4Char ch) {
|
ZLUnicodeUtil::Ucs4Char ZLUnicodeUtil::toUpper(Ucs4Char ch) {
|
||||||
initUnicodeTable();
|
initUnicodeTable();
|
||||||
std::map<ZLUnicodeUtil::Ucs4Char,ZLUnicodeData>::const_iterator it = UNICODE_TABLE.find(ch);
|
std::map<ZLUnicodeUtil::Ucs4Char,ZLUnicodeData>::const_iterator it = UNICODE_TABLE.find(ch);
|
||||||
|
@ -471,8 +494,10 @@ void ZLUnicodeUtil::toUpper(Ucs4String &str) {
|
||||||
*it = toUpper(*it);
|
*it = toUpper(*it);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
std::string ZLUnicodeUtil::toUpper(const std::string &utf8String) {
|
std::string ZLUnicodeUtil::toUpper(const std::string &utf8String) {
|
||||||
|
/*
|
||||||
Ucs4String ucs4String;
|
Ucs4String ucs4String;
|
||||||
utf8ToUcs4(ucs4String, utf8String);
|
utf8ToUcs4(ucs4String, utf8String);
|
||||||
|
|
||||||
|
@ -481,4 +506,18 @@ std::string ZLUnicodeUtil::toUpper(const std::string &utf8String) {
|
||||||
std::string result;
|
std::string result;
|
||||||
ucs4ToUtf8(result, ucs4String, utf8String.length());
|
ucs4ToUtf8(result, ucs4String, utf8String.length());
|
||||||
return result;
|
return result;
|
||||||
|
*/
|
||||||
|
JNIEnv *env = AndroidUtil::getEnv();
|
||||||
|
jstring javaString = AndroidUtil::createJavaString(env, utf8String);
|
||||||
|
jstring upperCased = (jstring)env->CallObjectMethod(javaString, AndroidUtil::MID_java_lang_String_toUpperCase);
|
||||||
|
if (javaString == upperCased) {
|
||||||
|
env->DeleteLocalRef(upperCased);
|
||||||
|
env->DeleteLocalRef(javaString);
|
||||||
|
return utf8String;
|
||||||
|
} else {
|
||||||
|
const std::string result = AndroidUtil::fromJavaString(env, upperCased);
|
||||||
|
env->DeleteLocalRef(upperCased);
|
||||||
|
env->DeleteLocalRef(javaString);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,17 +58,17 @@ public:
|
||||||
static int ucs4ToUtf8(char *to, Ucs4Char ch);
|
static int ucs4ToUtf8(char *to, Ucs4Char ch);
|
||||||
static void ucs2ToUtf8(std::string &to, const Ucs2String &from, int toLength = -1);
|
static void ucs2ToUtf8(std::string &to, const Ucs2String &from, int toLength = -1);
|
||||||
static int ucs2ToUtf8(char *to, Ucs2Char ch);
|
static int ucs2ToUtf8(char *to, Ucs2Char ch);
|
||||||
static bool isLetter(Ucs4Char ch);
|
//static bool isLetter(Ucs4Char ch);
|
||||||
static bool isSpace(Ucs4Char ch);
|
static bool isSpace(Ucs4Char ch);
|
||||||
static bool isNBSpace(Ucs4Char ch);
|
static bool isNBSpace(Ucs4Char ch);
|
||||||
static Breakable isBreakable(Ucs4Char ch);
|
static Breakable isBreakable(Ucs4Char ch);
|
||||||
|
|
||||||
static Ucs4Char toLower(Ucs4Char ch);
|
//static Ucs4Char toLower(Ucs4Char ch);
|
||||||
static void toLower(Ucs4String &str);
|
//static void toLower(Ucs4String &str);
|
||||||
static std::string toLower(const std::string &utf8String);
|
static std::string toLower(const std::string &utf8String);
|
||||||
|
|
||||||
static Ucs4Char toUpper(Ucs4Char ch);
|
//static Ucs4Char toUpper(Ucs4Char ch);
|
||||||
static void toUpper(Ucs4String &str);
|
//static void toUpper(Ucs4String &str);
|
||||||
static std::string toUpper(const std::string &utf8String);
|
static std::string toUpper(const std::string &utf8String);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue