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

View file

@ -18,6 +18,7 @@
*/
#include <ZLFile.h>
#include <FileEncryptionInfo.h>
#include <ZLFileImage.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_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<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) {
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);

View file

@ -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<FileEncryptionInfo> info);
static jobject createJavaImage(JNIEnv *env, const ZLFileImage &image);
static jintArray createJavaIntArray(JNIEnv *env, const std::vector<jint> &data);

View file

@ -22,7 +22,9 @@
#include <vector>
#include <shared_ptr.h>
#include <ZLFile.h>
#include <FileEncryptionInfo.h>
#include "ZLImage.h"
@ -38,12 +40,13 @@ public:
typedef std::vector<Block> 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<FileEncryptionInfo> 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<FileEncryptionInfo> encryptionInfo() const;
const ZLFileImage::Blocks& blocks() const;
protected:
@ -52,12 +55,13 @@ protected:
private:
const ZLFile myFile;
const std::string myEncoding;
shared_ptr<FileEncryptionInfo> 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<FileEncryptionInfo> 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<FileEncryptionInfo> ZLFileImage::encryptionInfo() const { return myEncryptionInfo; }
inline const ZLFileImage::Blocks &ZLFileImage::blocks() const { return myBlocks; }
//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) {
std::size_t len = str.length();
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 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 stripWhiteSpaces(std::string &str);

View file

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