1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-03 17:59:33 +02:00

FileEncryptionInfo usages

This commit is contained in:
Nikolay Pultsin 2014-03-25 15:02:25 +02:00
parent 38b5aa56f6
commit b13d73fa2f
7 changed files with 60 additions and 11 deletions

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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(); }

View file

@ -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) {

View file

@ -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);

View file

@ -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];