libbluray | branch: master | hpi1 <[email protected]> | Sun Mar 1 14:29:30 2015 +0200| [6fd56c1a486e32c392546f0ef27485f0b722e8db] | committer: hpi1
Create cache paths in native code > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=6fd56c1a486e32c392546f0ef27485f0b722e8db --- src/file/dirs.h | 1 - src/file/dirs_win32.c | 8 ---- src/file/file.c | 51 ++++++++++++++++++++- src/file/file.h | 4 +- src/file/file_posix.c | 14 ++++++ src/file/file_win32.c | 23 ++++++++++ src/libbluray/bdj/java/org/videolan/CacheDir.java | 2 + src/libbluray/bdj/java/org/videolan/VFSCache.java | 31 +------------ src/libbluray/disc/disc.c | 3 ++ 9 files changed, 97 insertions(+), 40 deletions(-) diff --git a/src/file/dirs.h b/src/file/dirs.h index 4ca71f3..820917f 100644 --- a/src/file/dirs.h +++ b/src/file/dirs.h @@ -23,7 +23,6 @@ #include "util/attributes.h" #ifdef _WIN32 -BD_PRIVATE int win32_mkdir(const char *dir); BD_PRIVATE char *win32_get_font_dir(const char *font_file); #endif diff --git a/src/file/dirs_win32.c b/src/file/dirs_win32.c index 4d1e51d..3fe97f5 100644 --- a/src/file/dirs_win32.c +++ b/src/file/dirs_win32.c @@ -35,14 +35,6 @@ #include <direct.h> -int win32_mkdir(const char *dir) -{ - wchar_t wdir[MAX_PATH]; - - MultiByteToWideChar(CP_UTF8, 0, dir, -1, wdir, MAX_PATH); - return _wmkdir(wdir); -} - char *win32_get_font_dir(const char *font_file) { wchar_t wdir[MAX_PATH]; diff --git a/src/file/file.c b/src/file/file.c index 7b0f2c4..15edfe0 100644 --- a/src/file/file.c +++ b/src/file/file.c @@ -23,7 +23,13 @@ #include "file.h" -#include <stdio.h> +#include "util/logging.h" +#include "util/macro.h" +#include "util/strutl.h" + +#include <stdio.h> // SEEK_* +#include <string.h> // strchr + int64_t file_size(BD_FILE_H *fp) { @@ -38,3 +44,46 @@ int64_t file_size(BD_FILE_H *fp) return length; } + +int file_mkdirs(const char *path) +{ + int result = 0; + char *dir = str_dup(path); + char *end = dir; + char *p; + + /* strip file name */ + if (!(end = strrchr(end, DIR_SEP_CHAR))) { + X_FREE(dir); + return -1; + } + *end = 0; + + /* tokenize, stop to first existing dir */ + while ((p = strrchr(dir, DIR_SEP_CHAR))) { + if (!file_path_exists(dir)) { + break; + } + *p = 0; + } + + /* create missing dirs */ + p = dir; + while (p < end) { + + /* concatenate next non-existing dir */ + while (*p) p++; + if (p >= end) break; + *p = DIR_SEP_CHAR; + + result = file_mkdir(dir); + if (result < 0) { + BD_DEBUG(DBG_FILE | DBG_CRIT, "Error creating directory %s\n", dir); + break; + } + BD_DEBUG(DBG_FILE, " created directory %s\n", dir); + } + + X_FREE(dir); + return result; +} diff --git a/src/file/file.h b/src/file/file.h index 49a73de..2990d36 100644 --- a/src/file/file.h +++ b/src/file/file.h @@ -66,6 +66,8 @@ BD_PRIVATE BD_DIR_OPEN dir_open_default(void); */ BD_PRIVATE int file_unlink(const char *file); - +BD_PRIVATE int file_path_exists(const char *path); +BD_PRIVATE int file_mkdir(const char *dir); +BD_PRIVATE int file_mkdirs(const char *path); #endif /* FILE_H_ */ diff --git a/src/file/file_posix.c b/src/file/file_posix.c index 14b5b3e..739b718 100644 --- a/src/file/file_posix.c +++ b/src/file/file_posix.c @@ -115,3 +115,17 @@ int file_unlink(const char *file) { return remove(file); } + +#include <sys/stat.h> +#include <sys/types.h> + +int file_path_exists(const char *path) +{ + struct stat s; + return stat(path, &s); +} + +int file_mkdir(const char *dir) +{ + return mkdir(dir, S_IRWXU); +} diff --git a/src/file/file_win32.c b/src/file/file_win32.c index 2e200ba..ca81ccd 100644 --- a/src/file/file_win32.c +++ b/src/file/file_win32.c @@ -133,3 +133,26 @@ int file_unlink(const char *file) MultiByteToWideChar(CP_UTF8, 0, file, -1, wfile, MAX_PATH); return _wremove(wfile); } + +int file_path_exists(const char *path) +{ + wchar_t wpath[MAX_PATH]; + + MultiByteToWideChar(CP_UTF8, 0, path, -1, wpath, MAX_PATH); + + DWORD dwAttrib = GetFileAttributesW(wpath); + if (dwAttrib != INVALID_FILE_ATTRIBUTES) { + return 0; + } + return -1; +} + +int file_mkdir(const char *dir) +{ + wchar_t wdir[MAX_PATH]; + + MultiByteToWideChar(CP_UTF8, 0, dir, -1, wdir, MAX_PATH); + if (!CreateDirectoryW(wdir, NULL)) + return -1; + return 0; +} diff --git a/src/libbluray/bdj/java/org/videolan/CacheDir.java b/src/libbluray/bdj/java/org/videolan/CacheDir.java index e2fdd68..30b4cd2 100644 --- a/src/libbluray/bdj/java/org/videolan/CacheDir.java +++ b/src/libbluray/bdj/java/org/videolan/CacheDir.java @@ -55,6 +55,8 @@ class CacheDir { SecurityManager sm = System.getSecurityManager(); if (sm != null && sm instanceof BDJSecurityManager) { + ((BDJSecurityManager)sm).setCacheRoot(System.getProperty("java.io.tmpdir")); + new File(baseDir).mkdirs(); ((BDJSecurityManager)sm).setCacheRoot(baseDir); } diff --git a/src/libbluray/bdj/java/org/videolan/VFSCache.java b/src/libbluray/bdj/java/org/videolan/VFSCache.java index f076abc..47b2184 100644 --- a/src/libbluray/bdj/java/org/videolan/VFSCache.java +++ b/src/libbluray/bdj/java/org/videolan/VFSCache.java @@ -68,8 +68,6 @@ class VFSCache { vfsRoot = vfsRoot + File.separator; } vfsRootLength = vfsRoot.length(); - - new File(cacheRoot + jarDir).mkdirs(); } /* @@ -164,8 +162,6 @@ class VFSCache { private void copyJarDir(String name) { /* copy directory from BDMV/JAR/ */ - new File(cacheRoot + jarDir + name).mkdirs(); - File[] files = new File(vfsRoot + jarDir + name).listFiles(); for (int i = 0; i < files.length; i++) { File file = files[i]; @@ -198,8 +194,6 @@ class VFSCache { protected synchronized File addFont(String fontFile) { - new File(fontRoot + fontDir).mkdirs(); - String relPath = fontDir + fontFile; String dstPath = fontRoot + relPath; File dstFile = new File(dstPath); @@ -279,17 +273,6 @@ class VFSCache { inAccessFile = false; } - private void mkdirs_xletCode(String path) { - final File file = new File(path); - AccessController.doPrivileged( - new PrivilegedAction() { - public Object run() { - file.mkdirs(); - return null; - } - }); - } - private void accessFileImp(String absPath) { if (BDFileSystem.nativeFileExists(absPath)) { @@ -299,11 +282,8 @@ class VFSCache { String relPath = absPath.substring(vfsRootLength); String[] names = org.videolan.Libbluray.listBdFiles(relPath, true); - if (names == null) { - /* this is regular file */ - } else { - /* this is directory, make sure it exists */ - mkdirs_xletCode(absPath); + if (names != null) { + /* this is directory */ return; } @@ -312,13 +292,6 @@ class VFSCache { return; } - /* create the directory */ - int sepPos = relPath.lastIndexOf(File.separatorChar); - if (sepPos > 0) { - String absDir = cacheRoot + relPath.substring(0, sepPos); - mkdirs_xletCode(absDir); - } - /* finally, copy the file to cache */ Libbluray.cacheBdRomFile(relPath, cacheRoot + relPath); } diff --git a/src/libbluray/disc/disc.c b/src/libbluray/disc/disc.c index c8aa934..7ac7e40 100644 --- a/src/libbluray/disc/disc.c +++ b/src/libbluray/disc/disc.c @@ -419,6 +419,9 @@ int disc_cache_bdrom_file(BD_DISC *p, const char *rel_path, const char *cache_pa return -1; } + /* make sure path exists */ + file_mkdirs(cache_path); + /* output file in local filesystem */ fp_out = file_open_default()(cache_path, "wb"); if (!fp_out) { _______________________________________________ libbluray-devel mailing list [email protected] https://mailman.videolan.org/listinfo/libbluray-devel
