diff --git a/jni/NativeFormats/fbreader/src/formats/xhtml/XHTMLReader.cpp b/jni/NativeFormats/fbreader/src/formats/xhtml/XHTMLReader.cpp index 0efae586d..0b19a4181 100644 --- a/jni/NativeFormats/fbreader/src/formats/xhtml/XHTMLReader.cpp +++ b/jni/NativeFormats/fbreader/src/formats/xhtml/XHTMLReader.cpp @@ -398,7 +398,7 @@ void XHTMLTagImageAction::doAtStart(XHTMLReader &reader, const char **xmlattribu } const std::string imageName = imageFile.name(false); bookReader(reader).addImageReference(imageName, 0, reader.myMarkNextImageAsCover); - bookReader(reader).addImage(imageName, new ZLFileImage(imageFile, "", 0)); + bookReader(reader).addImage(imageName, new ZLFileImage(imageFile, "", 0, 0, reader.myEncryptionMap->info(imageFile.path()))); reader.myMarkNextImageAsCover = false; if (flagParagraphIsOpen && reader.myCurrentParagraphIsEmpty) { bookReader(reader).addControl(IMAGE, false); diff --git a/jni/NativeFormats/util/AndroidUtil.cpp b/jni/NativeFormats/util/AndroidUtil.cpp index a1bc25965..57b7f016d 100644 --- a/jni/NativeFormats/util/AndroidUtil.cpp +++ b/jni/NativeFormats/util/AndroidUtil.cpp @@ -18,6 +18,7 @@ */ #include +#include #include #include "AndroidUtil.h" @@ -36,7 +37,7 @@ JavaClass AndroidUtil::Class_java_io_InputStream("java/io/InputStream"); JavaClass AndroidUtil::Class_ZLibrary("org/geometerplus/zlibrary/core/library/ZLibrary"); JavaClass AndroidUtil::Class_ZLFile("org/geometerplus/zlibrary/core/filesystem/ZLFile"); -JavaClass AndroidUtil::Class_FileEncryptionInfo("org/geometerplus/zlibrary/core/enryption/FileEncryptionInfo"); +JavaClass AndroidUtil::Class_FileEncryptionInfo("org/geometerplus/zlibrary/core/drm/FileEncryptionInfo"); JavaClass AndroidUtil::Class_ZLFileImage("org/geometerplus/zlibrary/core/image/ZLFileImage"); JavaClass AndroidUtil::Class_ZLTextModel("org/geometerplus/zlibrary/text/model/ZLTextModel"); JavaClass AndroidUtil::Class_CachedCharStorageException("org/geometerplus/zlibrary/text/model/CachedCharStorageException"); @@ -177,7 +178,7 @@ bool AndroidUtil::init(JavaVM* jvm) { Constructor_FileEncryptionInfo = new Constructor(Class_FileEncryptionInfo, "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); - Constructor_ZLFileImage = new Constructor(Class_ZLFileImage, "(Ljava/lang/String;Lorg/geometerplus/zlibrary/core/filesystem/ZLFile;Ljava/lang/String;[I[I)V"); + Constructor_ZLFileImage = new Constructor(Class_ZLFileImage, "(Ljava/lang/String;Lorg/geometerplus/zlibrary/core/filesystem/ZLFile;Ljava/lang/String;[I[ILorg/geometerplus/zlibrary/core/drm/FileEncryptionInfo;)V"); StaticMethod_Paths_cacheDirectory = new StaticObjectMethod(Class_Paths, "cacheDirectory", Class_java_lang_String, "()"); @@ -219,6 +220,26 @@ jobject AndroidUtil::createJavaFile(JNIEnv *env, const std::string &path) { return javaFile; } +jobject AndroidUtil::createJavaEncryptionInfo(JNIEnv *env, shared_ptr info) { + if (info.isNull()) { + return 0; + } + + jstring uri = createJavaString(env, info->Uri); + jstring method = createJavaString(env, info->Method); + jstring algorithm = createJavaString(env, info->Algorithm); + jstring contentId = createJavaString(env, info->ContentId); + + jobject javaInfo = Constructor_FileEncryptionInfo->call(uri, method, algorithm, contentId); + + env->DeleteLocalRef(contentId); + env->DeleteLocalRef(algorithm); + env->DeleteLocalRef(method); + env->DeleteLocalRef(uri); + + return javaInfo; +} + jobject AndroidUtil::createJavaImage(JNIEnv *env, const ZLFileImage &image) { jstring javaMimeType = createJavaString(env, image.mimeType()); jobject javaFile = createJavaFile(env, image.file().path()); @@ -233,11 +254,17 @@ jobject AndroidUtil::createJavaImage(JNIEnv *env, const ZLFileImage &image) { jintArray javaOffsets = createJavaIntArray(env, offsets); jintArray javaSizes = createJavaIntArray(env, sizes); + jobject javaEncryptionInfo = createJavaEncryptionInfo(env, image.encryptionInfo()); + jobject javaImage = Constructor_ZLFileImage->call( javaMimeType, javaFile, javaEncoding, - javaOffsets, javaSizes + javaOffsets, javaSizes, javaEncryptionInfo ); + if (javaEncryptionInfo != 0) { + env->DeleteLocalRef(javaEncryptionInfo); + } + env->DeleteLocalRef(javaEncoding); env->DeleteLocalRef(javaFile); env->DeleteLocalRef(javaMimeType); diff --git a/jni/NativeFormats/util/AndroidUtil.h b/jni/NativeFormats/util/AndroidUtil.h index 773b4a8e7..791b80960 100644 --- a/jni/NativeFormats/util/AndroidUtil.h +++ b/jni/NativeFormats/util/AndroidUtil.h @@ -41,6 +41,7 @@ class ObjectArrayMethod; class StaticObjectMethod; class ZLFile; +class FileEncryptionInfo; class ZLFileImage; class AndroidUtil { @@ -156,6 +157,7 @@ public: static std::string convertNonUtfString(const std::string &str); static jobject createJavaFile(JNIEnv *env, const std::string &path); + static jobject createJavaEncryptionInfo(JNIEnv *env, shared_ptr info); static jobject createJavaImage(JNIEnv *env, const ZLFileImage &image); static jintArray createJavaIntArray(JNIEnv *env, const std::vector &data); diff --git a/jni/NativeFormats/zlibrary/core/src/image/ZLFileImage.h b/jni/NativeFormats/zlibrary/core/src/image/ZLFileImage.h index 8e907ff0e..509a219e9 100644 --- a/jni/NativeFormats/zlibrary/core/src/image/ZLFileImage.h +++ b/jni/NativeFormats/zlibrary/core/src/image/ZLFileImage.h @@ -22,7 +22,9 @@ #include +#include #include +#include #include "ZLImage.h" @@ -38,12 +40,13 @@ public: typedef std::vector Blocks; public: - ZLFileImage(const ZLFile &file, const std::string &encoding, std::size_t offset, std::size_t size = 0); + ZLFileImage(const ZLFile &file, const std::string &encoding, std::size_t offset, std::size_t size = 0, shared_ptr encryptionInfo = 0); ZLFileImage(const ZLFile &file, const std::string &encoding, const Blocks &blocks); //Kind kind() const; const ZLFile &file() const; const std::string &encoding() const; + shared_ptr encryptionInfo() const; const ZLFileImage::Blocks& blocks() const; protected: @@ -52,12 +55,13 @@ protected: private: const ZLFile myFile; const std::string myEncoding; + shared_ptr myEncryptionInfo; Blocks myBlocks; }; inline ZLFileImage::Block::Block(unsigned int off, unsigned int s) : offset(off), size(s) {} -inline ZLFileImage::ZLFileImage(const ZLFile &file, const std::string &encoding, std::size_t offset, std::size_t size) : ZLSingleImage(file.mimeType()), myFile(file), myEncoding(encoding) { +inline ZLFileImage::ZLFileImage(const ZLFile &file, const std::string &encoding, std::size_t offset, std::size_t size, shared_ptr encryptionInfo) : ZLSingleImage(file.mimeType()), myFile(file), myEncoding(encoding), myEncryptionInfo(encryptionInfo) { myBlocks.push_back(Block(offset, size)); } @@ -66,6 +70,7 @@ inline ZLFileImage::ZLFileImage(const ZLFile &file, const std::string &encoding, //inline ZLSingleImage::Kind ZLFileImage::kind() const { return FILE_IMAGE; } inline const ZLFile &ZLFileImage::file() const { return myFile; } inline const std::string &ZLFileImage::encoding() const { return myEncoding; } +inline shared_ptr ZLFileImage::encryptionInfo() const { return myEncryptionInfo; } inline const ZLFileImage::Blocks &ZLFileImage::blocks() const { return myBlocks; } //inline shared_ptr ZLFileImage::inputStream() const { return myFile.inputStream(); } diff --git a/jni/NativeFormats/zlibrary/core/src/util/ZLStringUtil.cpp b/jni/NativeFormats/zlibrary/core/src/util/ZLStringUtil.cpp index a90f55f51..a5c4d5475 100644 --- a/jni/NativeFormats/zlibrary/core/src/util/ZLStringUtil.cpp +++ b/jni/NativeFormats/zlibrary/core/src/util/ZLStringUtil.cpp @@ -63,6 +63,12 @@ void ZLStringUtil::appendNumber(std::string &str, unsigned int n) { } } +std::string ZLStringUtil::numberToString(unsigned int n) { + std::string str; + appendNumber(str, n); + return str; +} + void ZLStringUtil::append(std::string &str, const std::vector &text) { std::size_t len = str.length(); for (std::vector::const_iterator it = text.begin(); it != text.end(); ++it) { diff --git a/jni/NativeFormats/zlibrary/core/src/util/ZLStringUtil.h b/jni/NativeFormats/zlibrary/core/src/util/ZLStringUtil.h index 59c254ca9..d8a809e80 100644 --- a/jni/NativeFormats/zlibrary/core/src/util/ZLStringUtil.h +++ b/jni/NativeFormats/zlibrary/core/src/util/ZLStringUtil.h @@ -33,6 +33,7 @@ public: static bool stringEndsWith(const std::string &str, const std::string &end); static void appendNumber(std::string &str, unsigned int n); + static std::string numberToString(unsigned int n); static void append(std::string &str, const std::vector &buffer); static void stripWhiteSpaces(std::string &str); diff --git a/src/org/geometerplus/zlibrary/core/image/ZLFileImage.java b/src/org/geometerplus/zlibrary/core/image/ZLFileImage.java index a5d1dd40f..530a4fbf6 100644 --- a/src/org/geometerplus/zlibrary/core/image/ZLFileImage.java +++ b/src/org/geometerplus/zlibrary/core/image/ZLFileImage.java @@ -21,6 +21,7 @@ package org.geometerplus.zlibrary.core.image; import java.io.*; +import org.geometerplus.zlibrary.core.drm.FileEncryptionInfo; import org.geometerplus.zlibrary.core.filesystem.ZLFile; import org.geometerplus.zlibrary.core.util.*; @@ -46,7 +47,8 @@ public class ZLFileImage extends ZLSingleImage { ZLFile.createFileByPath(data[0]), data[1], offsets, - lengths + lengths, + null ); } catch (Exception e) { e.printStackTrace(); @@ -58,17 +60,19 @@ public class ZLFileImage extends ZLSingleImage { private final String myEncoding; private final int[] myOffsets; private final int[] myLengths; + private final FileEncryptionInfo myEncryptionInfo; - public ZLFileImage(String mimeType, ZLFile file, String encoding, int[] offsets, int[] lengths) { - this(MimeType.get(mimeType), file, encoding, offsets, lengths); + public ZLFileImage(String mimeType, ZLFile file, String encoding, int[] offsets, int[] lengths, FileEncryptionInfo encryptionInfo) { + this(MimeType.get(mimeType), file, encoding, offsets, lengths, encryptionInfo); } - public ZLFileImage(MimeType mimeType, ZLFile file, String encoding, int[] offsets, int[] lengths) { + public ZLFileImage(MimeType mimeType, ZLFile file, String encoding, int[] offsets, int[] lengths, FileEncryptionInfo encryptionInfo) { super(mimeType); myFile = file; myEncoding = encoding != null ? encoding : ENCODING_NONE; myOffsets = offsets; myLengths = lengths; + myEncryptionInfo = encryptionInfo; } public ZLFileImage(String mimeType, ZLFile file, String encoding, int offset, int length) { @@ -76,7 +80,7 @@ public class ZLFileImage extends ZLSingleImage { } public ZLFileImage(MimeType mimeType, ZLFile file, String encoding, int offset, int length) { - this(mimeType, file, encoding, new int[] { offset }, new int[] { length }); + this(mimeType, file, encoding, new int[] { offset }, new int[] { length }, null); } public ZLFileImage(MimeType mimeType, ZLFile file) { @@ -97,6 +101,10 @@ public class ZLFileImage extends ZLSingleImage { @Override public InputStream inputStream() { try { + if (myEncryptionInfo != null) { + return null; + } + final InputStream stream; if (myOffsets.length == 1) { final int offset = myOffsets[0];