[libbluray-devel] Added CacheDir class
hpi1
git at videolan.org
Wed Oct 22 13:55:43 CEST 2014
libbluray | branch: master | hpi1 <hpi1 at anonymous.org> | Wed Oct 22 13:25:27 2014 +0300| [b55058f3d6dddc35f5d0872c9b501c3fcfec4e2a] | committer: hpi1
Added CacheDir class
> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=b55058f3d6dddc35f5d0872c9b501c3fcfec4e2a
---
src/libbluray/bdj/java/org/videolan/CacheDir.java | 106 ++++++++++++++++++++
src/libbluray/bdj/java/org/videolan/Libbluray.java | 1 +
.../bdj/java/org/videolan/MountManager.java | 28 +-----
3 files changed, 112 insertions(+), 23 deletions(-)
diff --git a/src/libbluray/bdj/java/org/videolan/CacheDir.java b/src/libbluray/bdj/java/org/videolan/CacheDir.java
new file mode 100644
index 0000000..a903ed8
--- /dev/null
+++ b/src/libbluray/bdj/java/org/videolan/CacheDir.java
@@ -0,0 +1,106 @@
+/*
+ * This file is part of libbluray
+ * Copyright (C) 2014 Petri Hintukainen <phintuka at users.sourceforge.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+package org.videolan;
+
+import java.io.File;
+import java.io.IOException;
+
+class CacheDir {
+
+ private static synchronized File getCacheRoot() throws IOException {
+
+ if (cacheRoot != null) {
+ return cacheRoot;
+ }
+
+ String base = System.getProperty("java.io.tmpdir") + File.separator +
+ "libbluray-bdj-cache" + File.separator;
+
+ for (int i = 0; i < 100; i++) {
+ File tmpDir = new File(base + System.nanoTime());
+ tmpDir = new File(tmpDir.getCanonicalPath());
+ if (tmpDir.mkdirs()) {
+ cacheRoot = tmpDir;
+ logger.info("Created cache in " + tmpDir.getPath());
+ return cacheRoot;
+ }
+ logger.error("error creating " + tmpDir.getPath());
+ }
+
+ logger.error("failed to create temporary cache directory");
+ throw new IOException();
+ }
+
+ public static synchronized File create(String domain) throws IOException {
+
+ File tmpDir = new File(getCacheRoot().getPath() + File.separator + domain);
+ if (!tmpDir.exists() && !tmpDir.mkdirs()) {
+ logger.error("Error creating " + tmpDir.getPath());
+ throw new IOException();
+ }
+
+ return tmpDir;
+ }
+
+ public static File create(String domain, String name) throws IOException {
+ return create(domain + File.separator + name);
+ }
+
+ private static void removeImpl(File dir) {
+ File[] files = dir.listFiles();
+ for (int i = 0; i < files.length; i++) {
+ File file = files[i];
+ if (file.isDirectory()) {
+ remove(file);
+ } else {
+ if (!file.delete()) {
+ logger.error("Error removing " + file.getPath());
+ }
+ }
+ }
+
+ if (!dir.delete()) {
+ logger.error("Error removing " + dir.getPath());
+ }
+ }
+
+ public static synchronized void remove(File dir) {
+ String path = dir.getPath();
+ if (path.indexOf(cacheRoot.getPath()) != 0) {
+ logger.error("Error removing " + dir.getPath() + ": not inside cache !");
+ return;
+ }
+ if (path.indexOf("..") >= 0) {
+ logger.error("Error removing " + dir.getPath() + ": not canonical path !");
+ return;
+ }
+
+ removeImpl(dir);
+ }
+
+ public static synchronized void remove() {
+ if (cacheRoot != null) {
+ remove(cacheRoot);
+ }
+ }
+
+ private static File cacheRoot = null;
+ private static final Logger logger = Logger.getLogger(MountManager.class.getName());
+}
diff --git a/src/libbluray/bdj/java/org/videolan/Libbluray.java b/src/libbluray/bdj/java/org/videolan/Libbluray.java
index 07088b7..a7c1cb7 100644
--- a/src/libbluray/bdj/java/org/videolan/Libbluray.java
+++ b/src/libbluray/bdj/java/org/videolan/Libbluray.java
@@ -145,6 +145,7 @@ public class Libbluray {
EventManager.shutdown();
Status.shutdown();
ServiceContextFactoryImpl.shutdown();
+ CacheDir.remove();
} catch (Throwable e) {
e.printStackTrace();
}
diff --git a/src/libbluray/bdj/java/org/videolan/MountManager.java b/src/libbluray/bdj/java/org/videolan/MountManager.java
index ed91f6b..14efc21 100644
--- a/src/libbluray/bdj/java/org/videolan/MountManager.java
+++ b/src/libbluray/bdj/java/org/videolan/MountManager.java
@@ -1,6 +1,7 @@
/*
* This file is part of libbluray
* Copyright (C) 2010 William Hahne
+ * Copyright (C) 2014 Petri Hintukainen
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -31,7 +32,6 @@ import java.util.Iterator;
import java.util.Map;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
-import org.videolan.Logger;
/**
* This class handle mounting jar files so that their contents can be accessed.
@@ -61,16 +61,12 @@ public class MountManager {
File tmpDir = null;
try {
jar = new JarFile(path);
- tmpDir = File.createTempFile("bdj-", "");
+ tmpDir = CacheDir.create("mount", jarStr);
} catch (IOException e) {
e.printStackTrace();
throw new MountException();
}
- // create temporary directory
- tmpDir.delete();
- tmpDir.mkdir();
-
try {
byte[] buffer = new byte[32*1024];
Enumeration entries = jar.entries();
@@ -100,7 +96,7 @@ public class MountManager {
}
} catch (IOException e) {
e.printStackTrace();
- recursiveDelete(tmpDir);
+ CacheDir.remove(tmpDir);
throw new MountException();
}
@@ -121,7 +117,7 @@ public class MountManager {
mountPoint = (File)mountPoints.remove(id);
}
if (mountPoint != null) {
- recursiveDelete(mountPoint);
+ CacheDir.remove(mountPoint);
} else {
logger.info("JAR " + jarId + " not mounted");
}
@@ -138,7 +134,7 @@ public class MountManager {
}
if (dirs != null) {
for (int i = 0; i < dirs.length; i++) {
- recursiveDelete((File)dirs[i]);
+ CacheDir.remove((File)dirs[i]);
}
}
}
@@ -164,20 +160,6 @@ public class MountManager {
return BDJUtil.makeFiveDigitStr(jarId);
}
- private static void recursiveDelete(File dir) {
- File[] files = dir.listFiles();
- for (int i = 0; i < files.length; i++) {
- File file = files[i];
- if (file.isDirectory()) {
- recursiveDelete(file);
- } else {
- file.delete();
- }
- }
-
- dir.delete();
- }
-
private static Map mountPoints = new HashMap();
private static final Logger logger = Logger.getLogger(MountManager.class.getName());
}
More information about the libbluray-devel
mailing list