mirror of
https://github.com/geometer/FBReaderJ.git
synced 2025-10-03 17:59:33 +02:00
FileEncryptionInfo usages
This commit is contained in:
parent
38b5aa56f6
commit
b13d73fa2f
7 changed files with 60 additions and 11 deletions
|
@ -398,7 +398,7 @@ void XHTMLTagImageAction::doAtStart(XHTMLReader &reader, const char **xmlattribu
|
||||||
}
|
}
|
||||||
const std::string imageName = imageFile.name(false);
|
const std::string imageName = imageFile.name(false);
|
||||||
bookReader(reader).addImageReference(imageName, 0, reader.myMarkNextImageAsCover);
|
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;
|
reader.myMarkNextImageAsCover = false;
|
||||||
if (flagParagraphIsOpen && reader.myCurrentParagraphIsEmpty) {
|
if (flagParagraphIsOpen && reader.myCurrentParagraphIsEmpty) {
|
||||||
bookReader(reader).addControl(IMAGE, false);
|
bookReader(reader).addControl(IMAGE, false);
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <ZLFile.h>
|
#include <ZLFile.h>
|
||||||
|
#include <FileEncryptionInfo.h>
|
||||||
#include <ZLFileImage.h>
|
#include <ZLFileImage.h>
|
||||||
|
|
||||||
#include "AndroidUtil.h"
|
#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_ZLibrary("org/geometerplus/zlibrary/core/library/ZLibrary");
|
||||||
JavaClass AndroidUtil::Class_ZLFile("org/geometerplus/zlibrary/core/filesystem/ZLFile");
|
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_ZLFileImage("org/geometerplus/zlibrary/core/image/ZLFileImage");
|
||||||
JavaClass AndroidUtil::Class_ZLTextModel("org/geometerplus/zlibrary/text/model/ZLTextModel");
|
JavaClass AndroidUtil::Class_ZLTextModel("org/geometerplus/zlibrary/text/model/ZLTextModel");
|
||||||
JavaClass AndroidUtil::Class_CachedCharStorageException("org/geometerplus/zlibrary/text/model/CachedCharStorageException");
|
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_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, "()");
|
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;
|
return javaFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jobject AndroidUtil::createJavaEncryptionInfo(JNIEnv *env, shared_ptr<FileEncryptionInfo> 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) {
|
jobject AndroidUtil::createJavaImage(JNIEnv *env, const ZLFileImage &image) {
|
||||||
jstring javaMimeType = createJavaString(env, image.mimeType());
|
jstring javaMimeType = createJavaString(env, image.mimeType());
|
||||||
jobject javaFile = createJavaFile(env, image.file().path());
|
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 javaOffsets = createJavaIntArray(env, offsets);
|
||||||
jintArray javaSizes = createJavaIntArray(env, sizes);
|
jintArray javaSizes = createJavaIntArray(env, sizes);
|
||||||
|
|
||||||
|
jobject javaEncryptionInfo = createJavaEncryptionInfo(env, image.encryptionInfo());
|
||||||
|
|
||||||
jobject javaImage = Constructor_ZLFileImage->call(
|
jobject javaImage = Constructor_ZLFileImage->call(
|
||||||
javaMimeType, javaFile, javaEncoding,
|
javaMimeType, javaFile, javaEncoding,
|
||||||
javaOffsets, javaSizes
|
javaOffsets, javaSizes, javaEncryptionInfo
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (javaEncryptionInfo != 0) {
|
||||||
|
env->DeleteLocalRef(javaEncryptionInfo);
|
||||||
|
}
|
||||||
|
|
||||||
env->DeleteLocalRef(javaEncoding);
|
env->DeleteLocalRef(javaEncoding);
|
||||||
env->DeleteLocalRef(javaFile);
|
env->DeleteLocalRef(javaFile);
|
||||||
env->DeleteLocalRef(javaMimeType);
|
env->DeleteLocalRef(javaMimeType);
|
||||||
|
|
|
@ -41,6 +41,7 @@ class ObjectArrayMethod;
|
||||||
class StaticObjectMethod;
|
class StaticObjectMethod;
|
||||||
|
|
||||||
class ZLFile;
|
class ZLFile;
|
||||||
|
class FileEncryptionInfo;
|
||||||
class ZLFileImage;
|
class ZLFileImage;
|
||||||
|
|
||||||
class AndroidUtil {
|
class AndroidUtil {
|
||||||
|
@ -156,6 +157,7 @@ public:
|
||||||
static std::string convertNonUtfString(const std::string &str);
|
static std::string convertNonUtfString(const std::string &str);
|
||||||
|
|
||||||
static jobject createJavaFile(JNIEnv *env, const std::string &path);
|
static jobject createJavaFile(JNIEnv *env, const std::string &path);
|
||||||
|
static jobject createJavaEncryptionInfo(JNIEnv *env, shared_ptr<FileEncryptionInfo> info);
|
||||||
static jobject createJavaImage(JNIEnv *env, const ZLFileImage &image);
|
static jobject createJavaImage(JNIEnv *env, const ZLFileImage &image);
|
||||||
|
|
||||||
static jintArray createJavaIntArray(JNIEnv *env, const std::vector<jint> &data);
|
static jintArray createJavaIntArray(JNIEnv *env, const std::vector<jint> &data);
|
||||||
|
|
|
@ -22,7 +22,9 @@
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include <shared_ptr.h>
|
||||||
#include <ZLFile.h>
|
#include <ZLFile.h>
|
||||||
|
#include <FileEncryptionInfo.h>
|
||||||
|
|
||||||
#include "ZLImage.h"
|
#include "ZLImage.h"
|
||||||
|
|
||||||
|
@ -38,12 +40,13 @@ public:
|
||||||
typedef std::vector<Block> Blocks;
|
typedef std::vector<Block> Blocks;
|
||||||
|
|
||||||
public:
|
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<FileEncryptionInfo> encryptionInfo = 0);
|
||||||
ZLFileImage(const ZLFile &file, const std::string &encoding, const Blocks &blocks);
|
ZLFileImage(const ZLFile &file, const std::string &encoding, const Blocks &blocks);
|
||||||
|
|
||||||
//Kind kind() const;
|
//Kind kind() const;
|
||||||
const ZLFile &file() const;
|
const ZLFile &file() const;
|
||||||
const std::string &encoding() const;
|
const std::string &encoding() const;
|
||||||
|
shared_ptr<FileEncryptionInfo> encryptionInfo() const;
|
||||||
const ZLFileImage::Blocks& blocks() const;
|
const ZLFileImage::Blocks& blocks() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -52,12 +55,13 @@ protected:
|
||||||
private:
|
private:
|
||||||
const ZLFile myFile;
|
const ZLFile myFile;
|
||||||
const std::string myEncoding;
|
const std::string myEncoding;
|
||||||
|
shared_ptr<FileEncryptionInfo> myEncryptionInfo;
|
||||||
Blocks myBlocks;
|
Blocks myBlocks;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline ZLFileImage::Block::Block(unsigned int off, unsigned int s) : offset(off), size(s) {}
|
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<FileEncryptionInfo> encryptionInfo) : ZLSingleImage(file.mimeType()), myFile(file), myEncoding(encoding), myEncryptionInfo(encryptionInfo) {
|
||||||
myBlocks.push_back(Block(offset, size));
|
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 ZLSingleImage::Kind ZLFileImage::kind() const { return FILE_IMAGE; }
|
||||||
inline const ZLFile &ZLFileImage::file() const { return myFile; }
|
inline const ZLFile &ZLFileImage::file() const { return myFile; }
|
||||||
inline const std::string &ZLFileImage::encoding() const { return myEncoding; }
|
inline const std::string &ZLFileImage::encoding() const { return myEncoding; }
|
||||||
|
inline shared_ptr<FileEncryptionInfo> ZLFileImage::encryptionInfo() const { return myEncryptionInfo; }
|
||||||
inline const ZLFileImage::Blocks &ZLFileImage::blocks() const { return myBlocks; }
|
inline const ZLFileImage::Blocks &ZLFileImage::blocks() const { return myBlocks; }
|
||||||
//inline shared_ptr<ZLInputStream> ZLFileImage::inputStream() const { return myFile.inputStream(); }
|
//inline shared_ptr<ZLInputStream> ZLFileImage::inputStream() const { return myFile.inputStream(); }
|
||||||
|
|
||||||
|
|
|
@ -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<std::string> &text) {
|
void ZLStringUtil::append(std::string &str, const std::vector<std::string> &text) {
|
||||||
std::size_t len = str.length();
|
std::size_t len = str.length();
|
||||||
for (std::vector<std::string>::const_iterator it = text.begin(); it != text.end(); ++it) {
|
for (std::vector<std::string>::const_iterator it = text.begin(); it != text.end(); ++it) {
|
||||||
|
|
|
@ -33,6 +33,7 @@ public:
|
||||||
static bool stringEndsWith(const std::string &str, const std::string &end);
|
static bool stringEndsWith(const std::string &str, const std::string &end);
|
||||||
|
|
||||||
static void appendNumber(std::string &str, unsigned int n);
|
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<std::string> &buffer);
|
static void append(std::string &str, const std::vector<std::string> &buffer);
|
||||||
static void stripWhiteSpaces(std::string &str);
|
static void stripWhiteSpaces(std::string &str);
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ package org.geometerplus.zlibrary.core.image;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
|
||||||
|
import org.geometerplus.zlibrary.core.drm.FileEncryptionInfo;
|
||||||
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
|
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
|
||||||
import org.geometerplus.zlibrary.core.util.*;
|
import org.geometerplus.zlibrary.core.util.*;
|
||||||
|
|
||||||
|
@ -46,7 +47,8 @@ public class ZLFileImage extends ZLSingleImage {
|
||||||
ZLFile.createFileByPath(data[0]),
|
ZLFile.createFileByPath(data[0]),
|
||||||
data[1],
|
data[1],
|
||||||
offsets,
|
offsets,
|
||||||
lengths
|
lengths,
|
||||||
|
null
|
||||||
);
|
);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
@ -58,17 +60,19 @@ public class ZLFileImage extends ZLSingleImage {
|
||||||
private final String myEncoding;
|
private final String myEncoding;
|
||||||
private final int[] myOffsets;
|
private final int[] myOffsets;
|
||||||
private final int[] myLengths;
|
private final int[] myLengths;
|
||||||
|
private final FileEncryptionInfo myEncryptionInfo;
|
||||||
|
|
||||||
public ZLFileImage(String mimeType, ZLFile file, String encoding, int[] offsets, int[] lengths) {
|
public ZLFileImage(String mimeType, ZLFile file, String encoding, int[] offsets, int[] lengths, FileEncryptionInfo encryptionInfo) {
|
||||||
this(MimeType.get(mimeType), file, encoding, offsets, lengths);
|
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);
|
super(mimeType);
|
||||||
myFile = file;
|
myFile = file;
|
||||||
myEncoding = encoding != null ? encoding : ENCODING_NONE;
|
myEncoding = encoding != null ? encoding : ENCODING_NONE;
|
||||||
myOffsets = offsets;
|
myOffsets = offsets;
|
||||||
myLengths = lengths;
|
myLengths = lengths;
|
||||||
|
myEncryptionInfo = encryptionInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ZLFileImage(String mimeType, ZLFile file, String encoding, int offset, int length) {
|
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) {
|
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) {
|
public ZLFileImage(MimeType mimeType, ZLFile file) {
|
||||||
|
@ -97,6 +101,10 @@ public class ZLFileImage extends ZLSingleImage {
|
||||||
@Override
|
@Override
|
||||||
public InputStream inputStream() {
|
public InputStream inputStream() {
|
||||||
try {
|
try {
|
||||||
|
if (myEncryptionInfo != null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
final InputStream stream;
|
final InputStream stream;
|
||||||
if (myOffsets.length == 1) {
|
if (myOffsets.length == 1) {
|
||||||
final int offset = myOffsets[0];
|
final int offset = myOffsets[0];
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue