diff --git a/jni/NativeFormats/util/AndroidUtil.cpp b/jni/NativeFormats/util/AndroidUtil.cpp index e6bb663d3..9235b2ce1 100644 --- a/jni/NativeFormats/util/AndroidUtil.cpp +++ b/jni/NativeFormats/util/AndroidUtil.cpp @@ -62,6 +62,9 @@ shared_ptr AndroidUtil::Method_java_util_Locale_getLanguage; shared_ptr AndroidUtil::Method_java_io_InputStream_close; shared_ptr AndroidUtil::Method_java_io_InputStream_read; shared_ptr AndroidUtil::Method_java_io_InputStream_skip; +shared_ptr AndroidUtil::Method_java_io_InputStream_mark; +shared_ptr AndroidUtil::Method_java_io_InputStream_markSupported; +shared_ptr AndroidUtil::Method_java_io_InputStream_reset; shared_ptr AndroidUtil::StaticMethod_ZLibrary_Instance; shared_ptr AndroidUtil::Method_ZLibrary_getVersionName; @@ -139,6 +142,9 @@ bool AndroidUtil::init(JavaVM* jvm) { Method_java_io_InputStream_close = new VoidMethod(Class_java_io_InputStream, "close", "()"); Method_java_io_InputStream_read = new IntMethod(Class_java_io_InputStream, "read", "([BII)"); Method_java_io_InputStream_skip = new LongMethod(Class_java_io_InputStream, "skip", "(J)"); + Method_java_io_InputStream_mark = new VoidMethod(Class_java_io_InputStream, "mark", "(I)"); + Method_java_io_InputStream_markSupported = new BooleanMethod(Class_java_io_InputStream, "markSupported", "()"); + Method_java_io_InputStream_reset = new VoidMethod(Class_java_io_InputStream, "reset", "()"); StaticMethod_ZLibrary_Instance = new StaticObjectMethod(Class_ZLibrary, "Instance", Class_ZLibrary, "()"); Method_ZLibrary_getVersionName = new StringMethod(Class_ZLibrary, "getVersionName", "()"); diff --git a/jni/NativeFormats/util/AndroidUtil.h b/jni/NativeFormats/util/AndroidUtil.h index 32ae7e513..ae6c9e742 100644 --- a/jni/NativeFormats/util/AndroidUtil.h +++ b/jni/NativeFormats/util/AndroidUtil.h @@ -84,6 +84,9 @@ public: static shared_ptr Method_java_io_InputStream_close; static shared_ptr Method_java_io_InputStream_read; static shared_ptr Method_java_io_InputStream_skip; + static shared_ptr Method_java_io_InputStream_mark; + static shared_ptr Method_java_io_InputStream_markSupported; + static shared_ptr Method_java_io_InputStream_reset; static shared_ptr StaticMethod_ZLibrary_Instance; static shared_ptr Method_ZLibrary_getVersionName; diff --git a/jni/NativeFormats/zlibrary/ui/src/android/filesystem/JavaInputStream.cpp b/jni/NativeFormats/zlibrary/ui/src/android/filesystem/JavaInputStream.cpp index 760ccf368..e8002554b 100644 --- a/jni/NativeFormats/zlibrary/ui/src/android/filesystem/JavaInputStream.cpp +++ b/jni/NativeFormats/zlibrary/ui/src/android/filesystem/JavaInputStream.cpp @@ -22,7 +22,7 @@ #include #include -JavaInputStream::JavaInputStream(const std::string &name) : myName(name), myNeedRepositionToStart(false) { +JavaInputStream::JavaInputStream(const std::string &name, shared_ptr encryptionInfo) : myName(name), myEncryptionInfo(encryptionInfo), myNeedRepositionToStart(false), myMarkSupported(false) { myJavaFile = 0; myJavaInputStream = 0; @@ -45,14 +45,19 @@ JavaInputStream::~JavaInputStream() { void JavaInputStream::initStream(JNIEnv *env) { if (myJavaFile == 0) { jobject javaFile = AndroidUtil::createJavaFile(env, myName); - myJavaFile = env->NewGlobalRef(javaFile); - env->DeleteLocalRef(javaFile); - if (myJavaFile == 0) { + if (javaFile == 0) { return; } + myJavaFile = env->NewGlobalRef(javaFile); + env->DeleteLocalRef(javaFile); } - jobject stream = AndroidUtil::Method_ZLFile_getInputStream->call(myJavaFile); + jobject stream; + if (myEncryptionInfo.isNull()) { + stream = AndroidUtil::Method_ZLFile_getInputStream->call(myJavaFile); + } else { + stream = 0; + } if (env->ExceptionCheck()) { env->ExceptionClear(); } else { @@ -60,6 +65,11 @@ void JavaInputStream::initStream(JNIEnv *env) { myOffset = 0; } env->DeleteLocalRef(stream); + + myMarkSupported = AndroidUtil::Method_java_io_InputStream_markSupported->call(myJavaInputStream); + if (myMarkSupported) { + AndroidUtil::Method_java_io_InputStream_mark->call(myJavaInputStream, sizeOfOpened()); + } } void JavaInputStream::closeStream(JNIEnv *env) { @@ -74,8 +84,14 @@ void JavaInputStream::closeStream(JNIEnv *env) { void JavaInputStream::rewind(JNIEnv *env) { if (myOffset > 0) { - closeStream(env); - initStream(env); + if (myMarkSupported) { + AndroidUtil::Method_java_io_InputStream_reset->call(myJavaInputStream); + AndroidUtil::Method_java_io_InputStream_mark->call(myJavaInputStream, sizeOfOpened()); + myOffset = 0; + } else { + closeStream(env); + initStream(env); + } } } diff --git a/jni/NativeFormats/zlibrary/ui/src/android/filesystem/JavaInputStream.h b/jni/NativeFormats/zlibrary/ui/src/android/filesystem/JavaInputStream.h index 79ac08daa..a8a6af1f7 100644 --- a/jni/NativeFormats/zlibrary/ui/src/android/filesystem/JavaInputStream.h +++ b/jni/NativeFormats/zlibrary/ui/src/android/filesystem/JavaInputStream.h @@ -22,12 +22,14 @@ #include +#include #include +#include class JavaInputStream : public ZLInputStream { public: - JavaInputStream(const std::string &name); + JavaInputStream(const std::string &name, shared_ptr encryptionInfo = 0); ~JavaInputStream(); bool open(); std::size_t read(char *buffer, std::size_t maxSize); @@ -46,8 +48,10 @@ private: std::size_t skip(JNIEnv *env, std::size_t offset); private: - std::string myName; + const std::string myName; + const shared_ptr myEncryptionInfo; bool myNeedRepositionToStart; + bool myMarkSupported; jobject myJavaFile;