libbluray | branch: master | hpi1 <[email protected]> | Thu Feb 19 11:54:41 2015 +0200| [4b7c1b81e9708ff579b52c213186a21e1fcd0db8] | committer: hpi1
Add native method for listing files in BD-ROM directory > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=4b7c1b81e9708ff579b52c213186a21e1fcd0db8 --- src/libbluray/bdj/java/java/io/BDFileSystem.java | 16 ++++- src/libbluray/bdj/java/org/videolan/Libbluray.java | 5 ++ src/libbluray/bdj/native/org_videolan_Libbluray.c | 75 ++++++++++++++++++++ src/libbluray/bdj/native/org_videolan_Libbluray.h | 9 +++ src/libbluray/disc/disc.c | 5 ++ src/libbluray/disc/disc.h | 3 + 6 files changed, 112 insertions(+), 1 deletion(-) diff --git a/src/libbluray/bdj/java/java/io/BDFileSystem.java b/src/libbluray/bdj/java/java/io/BDFileSystem.java index 6bb7987..3107330 100644 --- a/src/libbluray/bdj/java/java/io/BDFileSystem.java +++ b/src/libbluray/bdj/java/java/io/BDFileSystem.java @@ -244,7 +244,21 @@ public abstract class BDFileSystem extends FileSystem { } public String[] list(File f) { - return fs.list(f); + + String path = f.getPath(); + String root = System.getProperty("bluray.vfs.root"); + if (root == null || !path.startsWith(root)) { + /* not inside VFS */ + return fs.list(f); + } + + /* path is inside VFS */ + /* EX. HOSTEL_2 lists files in BD-ROM */ + int rootLength = root.length(); + path = path.substring(rootLength); + + String[] names = org.videolan.Libbluray.listBdFiles(path, false); + return names; } public boolean createDirectory(File f) { diff --git a/src/libbluray/bdj/java/org/videolan/Libbluray.java b/src/libbluray/bdj/java/org/videolan/Libbluray.java index 119a02b..a46d192 100644 --- a/src/libbluray/bdj/java/org/videolan/Libbluray.java +++ b/src/libbluray/bdj/java/org/videolan/Libbluray.java @@ -327,6 +327,10 @@ public class Libbluray { return cacheBdRomFileN(nativePointer, path, cachePath) == 0; } + public static String[] listBdFiles(String path, boolean onlyBdRom) { + return listBdFilesN(nativePointer, path, onlyBdRom); + } + public static void updateGraphic(int width, int height, int[] rgbArray) { updateGraphicN(nativePointer, width, height, rgbArray, 0, 0, width - 1, height - 1); @@ -544,6 +548,7 @@ public class Libbluray { private static native int setVirtualPackageN(long np, String vpPath, boolean psrBackup); private static native int readPSRN(long np, int num); private static native int cacheBdRomFileN(long np, String path, String cachePath); + private static native String[] listBdFilesN(long np, String path, boolean onlyBdRom); private static native Bdjo getBdjoN(long np, String name); private static native void updateGraphicN(long np, int width, int height, int[] rgbArray, int x0, int y0, int x1, int y1); diff --git a/src/libbluray/bdj/native/org_videolan_Libbluray.c b/src/libbluray/bdj/native/org_videolan_Libbluray.c index b5c62df..dcfdd8e 100644 --- a/src/libbluray/bdj/native/org_videolan_Libbluray.c +++ b/src/libbluray/bdj/native/org_videolan_Libbluray.c @@ -34,7 +34,9 @@ #include "file/file.h" #include "util/logging.h" +#include "util/macro.h" +#include <stdlib.h> #include <string.h> #include <inttypes.h> @@ -358,6 +360,74 @@ JNIEXPORT jint JNICALL Java_org_videolan_Libbluray_cacheBdRomFileN(JNIEnv * env, return result; } +JNIEXPORT jobjectArray JNICALL Java_org_videolan_Libbluray_listBdFilesN(JNIEnv * env, + jclass cls, jlong np, jstring jpath, + jboolean onlyBdRom) { + + BLURAY *bd = (BLURAY*)(intptr_t)np; + BD_DISC *disc = bd_get_disc(bd); + + const char *path = (*env)->GetStringUTFChars(env, jpath, NULL); + if (!path) { + BD_DEBUG(DBG_JNI | DBG_CRIT, "listBdFilesN() failed: no path\n"); + return NULL; + } + BD_DEBUG(DBG_JNI, "listBdFilesN(%s)\n", path); + + /* open directory stream */ + BD_DIR_H *dp; + if (onlyBdRom) { + dp = disc_open_bdrom_dir(disc, path); + } else { + dp = disc_open_dir(disc, path); + } + if (!dp) { + BD_DEBUG(DBG_JNI | DBG_CRIT, "failed opening directory %s\n", path); + (*env)->ReleaseStringUTFChars(env, jpath, path); + return NULL; + } + (*env)->ReleaseStringUTFChars(env, jpath, path); + + /* count files and create java strings (java array size must be known when it is created) */ + jstring *files = NULL; + unsigned count = 0; + unsigned allocated = 0; + BD_DIRENT ent; + while (!dir_read(dp, &ent)) { + if (strcmp(ent.d_name, ".") && strcmp(ent.d_name, "..")) { + if (allocated <= count) { + allocated += 512; + jstring *tmp = realloc(files, sizeof(*files) * allocated); + if (!tmp) { + BD_DEBUG(DBG_JNI | DBG_CRIT, "failed allocating memory for %u directory entries\n", allocated); + break; + } + files = tmp; + } + files[count] = (*env)->NewStringUTF(env, ent.d_name); + count++; + } + } + dir_close(dp); + + /* allocate java array */ + jobjectArray arr = bdj_make_array(env, "java/lang/String", count); + if (!arr) { + BD_DEBUG(DBG_JNI | DBG_CRIT, "failed creating array [%d]\n", count); + } else { + /* populate files to array */ + unsigned ii; + for (ii = 0; ii < count; ii++) { + (*env)->SetObjectArrayElement(env, arr, ii, files[ii]); + } + } + + X_FREE(files); + + return arr; +} + + JNIEXPORT jobject JNICALL Java_org_videolan_Libbluray_getBdjoN(JNIEnv * env, jclass cls, jlong np, jstring jfile) { @@ -609,6 +679,11 @@ Java_org_videolan_Libbluray_methods[] = VC(Java_org_videolan_Libbluray_cacheBdRomFileN), }, { + CC("listBdFilesN"), + CC("(JLjava/lang/String;Z)[Ljava/lang/String;"), + VC(Java_org_videolan_Libbluray_listBdFilesN), + }, + { CC("getBdjoN"), CC("(JLjava/lang/String;)Lorg/videolan/bdjo/Bdjo;"), VC(Java_org_videolan_Libbluray_getBdjoN), diff --git a/src/libbluray/bdj/native/org_videolan_Libbluray.h b/src/libbluray/bdj/native/org_videolan_Libbluray.h index 1c5f234..7c7d3d0 100644 --- a/src/libbluray/bdj/native/org_videolan_Libbluray.h +++ b/src/libbluray/bdj/native/org_videolan_Libbluray.h @@ -230,6 +230,15 @@ JNIEXPORT jint JNICALL Java_org_videolan_Libbluray_cacheBdRomFileN /* * Class: org_videolan_Libbluray + * Method: listBdFilesN + * Signature: (JLjava/lang/String;Z)[Ljava/lang/String; + */ +JNIEXPORT jobjectArray JNICALL Java_org_videolan_Libbluray_listBdFilesN(JNIEnv * env, + jclass cls, jlong np, jstring jpath, + jboolean onlyBdRom); + +/* + * Class: org_videolan_Libbluray * Method: getBdjoN * Signature: (JLjava/lang/String;)Lorg/videolan/bdjo/Bdjo; */ diff --git a/src/libbluray/disc/disc.c b/src/libbluray/disc/disc.c index 1de00b1..c8aa934 100644 --- a/src/libbluray/disc/disc.c +++ b/src/libbluray/disc/disc.c @@ -294,6 +294,11 @@ const char *disc_volume_id(BD_DISC *p) return p ? p->udf_volid : NULL; } +BD_DIR_H *disc_open_bdrom_dir(BD_DISC *p, const char *rel_path) +{ + return p->pf_dir_open_bdrom(p->fs_handle, rel_path); +} + /* * VFS */ diff --git a/src/libbluray/disc/disc.h b/src/libbluray/disc/disc.h index 408e9af..d1a0162 100644 --- a/src/libbluray/disc/disc.h +++ b/src/libbluray/disc/disc.h @@ -66,6 +66,9 @@ BD_PRIVATE void disc_update(BD_DISC *disc, const char *overlay_root); BD_PRIVATE int disc_cache_bdrom_file(BD_DISC *p, const char *rel_path, const char *cache_path); +/* open BD-ROM directory (relative to disc root) */ +BD_PRIVATE struct bd_dir_s *disc_open_bdrom_dir(BD_DISC *disc, const char *path); + /* * m2ts stream interface */ _______________________________________________ libbluray-devel mailing list [email protected] https://mailman.videolan.org/listinfo/libbluray-devel
