Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions lib/src/main/cpp/libzim/item.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,15 @@ GETTER(jlong, getSize)

METHOD0(jobject, getDirectAccessInformation) {
jobject directObjInfo = newObject("org/kiwix/libzim/DirectAccessInfo", env);
setDaiObjValue("", 0, directObjInfo, env);
setDaiObjValue("", 0, -1, directObjInfo, env);

#ifndef _WIN32
// getDirectAccessFd(): owned dup()'d fd + offset in one call. See #1119.
auto directAccessFd = THIS->getDirectAccessFd();
setDaiObjValue("", directAccessFd.offset, directAccessFd.fd, directObjInfo, env);
#else
auto cDirectObjInfo = THIS->getDirectAccessInformation();
setDaiObjValue(cDirectObjInfo.filename, cDirectObjInfo.offset, directObjInfo, env);
setDaiObjValue(cDirectObjInfo.filename, cDirectObjInfo.offset, -1, directObjInfo, env);
#endif
return directObjInfo;
} CATCH_EXCEPTION(nullptr)
4 changes: 3 additions & 1 deletion lib/src/main/cpp/utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -400,13 +400,15 @@ inline void setBoolObjValue(const bool value, const jobject obj, JNIEnv* env)
}

inline void setDaiObjValue(const std::string& filename, const long offset,
const jobject obj, JNIEnv* env)
const int fd, const jobject obj, JNIEnv* env)
{
jclass objClass = env->GetObjectClass(obj);
jfieldID filenameFid = env->GetFieldID(objClass, "filename", "Ljava/lang/String;");
env->SetObjectField(obj, filenameFid, c2jni(filename, env));
jfieldID offsetFid = env->GetFieldID(objClass, "offset", "J");
env->SetLongField(obj, offsetFid, offset);
jfieldID fdFid = env->GetFieldID(objClass, "fd", "I");
env->SetIntField(obj, fdFid, fd);
}

inline void setMigrationResultValue(long nbMigrated, long nbTotalInvalid, const jobject obj, JNIEnv* env)
Expand Down
6 changes: 6 additions & 0 deletions lib/src/main/java/org/kiwix/libzim/DirectAccessInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,10 @@ public class DirectAccessInfo
{
public String filename;
public long offset;

/**
* Owned fd, or -1 if unavailable. `filename` is only set on Windows;
* elsewhere prefer ParcelFileDescriptor.adoptFd(fd). Caller must close it.
*/
public int fd = -1;
}
3 changes: 3 additions & 0 deletions lib/src/test/test.java
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,9 @@ private void testArchive(TestArchive archive)
assertNotEquals("", dai.filename);
byte[] readData = getFileContentPartial(dai.filename, (int) dai.offset, (int) item.getSize());
assertTrue(Arrays.equals(faviconData, readData));
// JNI dup()s an already-open native descriptor for this archive regardless of
// whether it was opened by path or by fd - see openzim/libzim#852.
assertTrue(dai.fd >= 0);

// Checking all metadata
assertTrue(archive.hasNewNamespaceScheme());
Expand Down