diff --git a/src/java/org/lwjgl/LWJGLUtil.java b/src/java/org/lwjgl/LWJGLUtil.java index b21141ce..e64a01e8 100644 --- a/src/java/org/lwjgl/LWJGLUtil.java +++ b/src/java/org/lwjgl/LWJGLUtil.java @@ -42,7 +42,6 @@ import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; -import org.lwjgl.applet.LWJGLInstaller; /** *
@@ -280,7 +279,7 @@ public class LWJGLUtil { * @return the current platform type */ public static int getPlatform() { - String osName = System.getProperty("os.name"); + String osName = getPrivilegedProperty("os.name"); if (osName.startsWith("Windows")) { return PLATFORM_WINDOWS; @@ -358,16 +357,13 @@ public class LWJGLUtil { } // add Installer path - if (LWJGLInstaller.installed) { - possible_paths.add(LWJGLInstaller.installDirectory + File.separator + platform_lib_name); + String alternative_path = getPrivilegedProperty("org.lwjgl.librarypath"); + if (alternative_path != null) { + possible_paths.add(alternative_path + File.separator + platform_lib_name); } // Add all possible paths from java.library.path - String java_library_path = (String)AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - return System.getProperty("java.library.path"); - } - }); + String java_library_path = getPrivilegedProperty("java.library.path"); StringTokenizer st = new StringTokenizer(java_library_path, File.pathSeparator); while (st.hasMoreTokens()) { @@ -376,11 +372,7 @@ public class LWJGLUtil { } //add current path - String current_dir = (String)AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - return System.getProperty("user.dir"); - } - }); + String current_dir = getPrivilegedProperty("user.dir"); possible_paths.add(current_dir + File.separator + platform_lib_name); //add pure library (no path, let OS search) @@ -393,6 +385,14 @@ public class LWJGLUtil { return paths; } + private static String getPrivilegedProperty(final String property_name) { + return (String)AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + return System.getProperty(property_name); + } + }); + } + /** * Tries to locate named library from the current ClassLoader * This method exists because native libraries are loaded from native code, and as such @@ -460,7 +460,7 @@ public class LWJGLUtil { * specific code and will not work for any other platform. */ public static boolean isMacOSXEqualsOrBetterThan(int major_required, int minor_required) { - String os_version = System.getProperty("os.version"); + String os_version = getPrivilegedProperty("os.version"); StringTokenizer version_tokenizer = new StringTokenizer(os_version, "."); int major; int minor; diff --git a/src/java/org/lwjgl/Sys.java b/src/java/org/lwjgl/Sys.java index ed75b34b..4a841b7f 100644 --- a/src/java/org/lwjgl/Sys.java +++ b/src/java/org/lwjgl/Sys.java @@ -39,7 +39,6 @@ import java.security.AccessController; import java.security.PrivilegedAction; import java.security.PrivilegedExceptionAction; -import org.lwjgl.applet.LWJGLInstaller; import org.lwjgl.input.Mouse; /** @@ -58,31 +57,28 @@ public final class Sys { /** The implementation instance to delegate platform specific behavior to */ private final static SysImplementation implementation; - /** - * utility loadlibrary to load the native library using elevated priviledges - * @param name Name of library to load, or full path if usingPath is true - * @param usingPath true if using the full path to the native - */ - private static void loadLibrary(final String name, final boolean usingPath) { + private static void loadLibrary(final String lib_name) { AccessController.doPrivileged(new PrivilegedAction() { public Object run() { - if(usingPath) { - System.load(name); + String library_path = System.getProperty("org.lwjgl.librarypath"); + if (library_path != null) { + System.load(library_path + File.separator + + System.mapLibraryName(lib_name)); } else { - System.loadLibrary(name); + System.loadLibrary(lib_name); } return null; } }); - } - + } + static { implementation = createImplementation(); String[] library_names = implementation.getNativeLibraryNames(); UnsatisfiedLinkError last_load_error = null; for (int i = 0; i < library_names.length; i++) { try { - loadLibrary(library_names[i], false); + loadLibrary(library_names[i]); last_load_error = null; break; } catch (UnsatisfiedLinkError e) { @@ -90,19 +86,6 @@ public final class Sys { } } - // failed normal loading - check installer - if (last_load_error != null && LWJGLInstaller.installed) { - for (int i = 0; i < library_names.length; i++) { - try { - loadLibrary(LWJGLInstaller.installDirectory + File.separator + System.mapLibraryName(library_names[i]), true); - last_load_error = null; - break; - } catch (UnsatisfiedLinkError e) { - last_load_error = e; - } - } - } - // check for error if (last_load_error != null) { throw last_load_error; diff --git a/src/java/org/lwjgl/applet/LWJGLInstaller.java b/src/java/org/lwjgl/applet/LWJGLInstaller.java index f42417a4..55cb40a5 100644 --- a/src/java/org/lwjgl/applet/LWJGLInstaller.java +++ b/src/java/org/lwjgl/applet/LWJGLInstaller.java @@ -41,8 +41,8 @@ import java.io.InputStream; import java.io.OutputStream; import java.security.AccessController; import java.security.PrivilegedAction; +import java.security.PrivilegedExceptionAction; -import org.lwjgl.LWJGLException; import org.lwjgl.LWJGLUtil; /** @@ -71,9 +71,6 @@ public class LWJGLInstaller { /** Whether to hook uninstall rutine. Must be called prior to installation */ public static boolean disableUninstall = false; - /** Directory that was installed into */ - public static String installDirectory; - /** Buffer used when copying files */ private static final byte[] COPY_BUFFER = new byte[4096]; @@ -94,53 +91,55 @@ public class LWJGLInstaller { * will always be present in the users temp dir. * * @see java.lang.ClassLoader#getResource(String) - * @return true if the installation was successfull */ - public static boolean tempInstall() throws LWJGLException { + public static void tempInstall() throws Exception { // only need to install once if (installed) { - return true; + return; } - - // libraries to validate and install - String[] libraries = PLATFORM_FILES[LWJGLUtil.getPlatform() - 1]; - - // Validate the certificates of the native files - validateCertificates(); - // install shutdown installer hook - if(!disableUninstall) { + try { + // libraries to validate and install + String[] libraries = PLATFORM_FILES[LWJGLUtil.getPlatform() - 1]; + + // Validate the certificates of the native files + validateCertificates(); + + // install shutdown installer hook + if(!disableUninstall) { + AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + Runtime.getRuntime().addShutdownHook(new Thread() { + public void run() { + uninstall(); + } + }); + return null; + } + }); + } + + // create a temporary dir for the native files + String user_temp_dir = getPriviledgedString("java.io.tmpdir"); + final String path = createTemporaryDir(user_temp_dir); + + // extract natives + for (int i = 0; i < libraries.length; i++) { + String library = System.mapLibraryName(libraries[i]); + extract(library, path); + } + AccessController.doPrivileged(new PrivilegedAction() { public Object run() { - Runtime.getRuntime().addShutdownHook(new Thread() { - public void run() { - LWJGLInstaller.uninstall(); - } - }); + System.setProperty("org.lwjgl.librarypath", path); return null; } }); + } catch (Exception e) { + LWJGLUtil.log("Failed extraction e = " + e.getMessage()); + uninstall(); + throw e; } - - // create a temporary dir for the native files - String user_temp_dir = getPriviledgedString("java.io.tmpdir"); - String path = createTemporaryDir(user_temp_dir); - if(path == null) { - throw new LWJGLException("Failed creation of temporary directory in " + user_temp_dir); - } - - // extract natives - for (int i = 0; i < libraries.length; i++) { - String library = System.mapLibraryName(libraries[i]); - if(!extract(library, path)) { - LWJGLUtil.log("Failed extract of " + library + " to " + path); - uninstall(); - return false; - } - } - - installDirectory = path; - return installed = true; } /** @@ -150,9 +149,9 @@ public class LWJGLInstaller { * before the "real" LWJGL jar, containing native libraries with unwanted code. * By forcing all the native libraries to have the same certificate as the signed * installer, we can also be sure that the native libraries indeed are correct. - * @throws LWJGLException If we encounter a certificate mismatch + * @throws Exception If we encounter a certificate mismatch */ - private static void validateCertificates() throws LWJGLException { + private static void validateCertificates() throws Exception { /* TODO */ } @@ -161,15 +160,14 @@ public class LWJGLInstaller { * * @param file File to extract * @param path Path to extract to - * @return true if the file was extracted successdully */ - private static boolean extract(final String file, final String path) throws LWJGLException { - return (Boolean) AccessController.doPrivileged(new PrivilegedAction() { + private static void extract(final String file, final String path) { + AccessController.doPrivileged(new PrivilegedAction() { public Object run() { // check for existing file, and get out File out = new File(path + File.separator + file); if (out.exists()) { - return false; + return null; } // create the new file and copy it to its destination @@ -183,12 +181,12 @@ public class LWJGLInstaller { // =========================================== if (os == null) { LWJGLUtil.log("Unable to write to outputstream at " + out.getAbsolutePath()); - return false; + return null; } if (is == null) { LWJGLUtil.log("Unable to read classpath inputstream from " + in); - return false; + return null; } // ------------------------------------------- @@ -196,9 +194,9 @@ public class LWJGLInstaller { copyFile(is, os); } catch (IOException ioe) { LWJGLUtil.log("Exception while extracting " + file + ": " + ioe.getMessage()); - return false; + return null; } - return true; + return null; } }); } @@ -225,23 +223,19 @@ public class LWJGLInstaller { * called '.lwjglinstaller' will also be created in the directory. * @return Name of temp directory or null if directory creation failed */ - static String createTemporaryDir(final String user_temp_dir) { - return (String) AccessController.doPrivileged(new PrivilegedAction() { + static String createTemporaryDir(final String user_temp_dir) throws Exception { + return (String) AccessController.doPrivileged(new PrivilegedExceptionAction() { public Object run() { // create the temp directory File tempDir = new File(user_temp_dir + File.separator + "lwjgl-" + System.currentTimeMillis()); if(!tempDir.mkdir()) { - return null; + throw new IOException("Failed to create directory: " + tempDir); } // add the watermark file // TODO: Write some info to the file ? - try { - File watermark = new File(tempDir.getAbsolutePath() + File.separator + ".lwjglinstaller"); - watermark.createNewFile(); - } catch (IOException ioe) { - return null; - } + File watermark = new File(tempDir.getAbsolutePath() + File.separator + ".lwjglinstaller"); + watermark.createNewFile(); return tempDir.getAbsolutePath(); } }); diff --git a/src/java/org/lwjgl/devil/ILNative.java b/src/java/org/lwjgl/devil/ILNative.java index b4526500..e28037d3 100644 --- a/src/java/org/lwjgl/devil/ILNative.java +++ b/src/java/org/lwjgl/devil/ILNative.java @@ -37,7 +37,6 @@ import java.security.PrivilegedAction; import org.lwjgl.LWJGLException; import org.lwjgl.LWJGLUtil; -import org.lwjgl.applet.LWJGLInstaller; /** *
@@ -56,30 +55,23 @@ class ILNative {
/** Version of IL */
public static final String VERSION = "1.0beta2";
- /**
- * utility loadlibrary to load the native library using elevated priviledges
- * @param name Name of library to load, or full path if usingPath is true
- * @param usingPath true if using the full path to the native
- */
- private static void loadLibrary(final String name, final boolean usingPath) {
+ private static void loadLibrary(final String lib_name) {
AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
- if(usingPath) {
- System.load(name);
+ String library_path = System.getProperty("org.lwjgl.librarypath");
+ if (library_path != null) {
+ System.load(library_path + File.separator +
+ System.mapLibraryName(lib_name));
} else {
- System.loadLibrary(name);
+ System.loadLibrary(lib_name);
}
return null;
}
});
- }
-
+ }
+
static {
- if (LWJGLInstaller.installed) {
- loadLibrary(LWJGLInstaller.installDirectory + File.separator + System.mapLibraryName(JNI_LIBRARY_NAME), true);
- } else {
- loadLibrary(JNI_LIBRARY_NAME, false);
- }
+ loadLibrary(JNI_LIBRARY_NAME);
// check for mismatch
String nativeVersion = getNativeLibraryVersion();
diff --git a/src/java/org/lwjgl/fmod3/FMOD.java b/src/java/org/lwjgl/fmod3/FMOD.java
index 1bfb1ced..688b6a6a 100644
--- a/src/java/org/lwjgl/fmod3/FMOD.java
+++ b/src/java/org/lwjgl/fmod3/FMOD.java
@@ -41,7 +41,6 @@ import java.util.HashMap;
import org.lwjgl.LWJGLException;
import org.lwjgl.LWJGLUtil;
-import org.lwjgl.applet.LWJGLInstaller;
/**
*
@@ -209,11 +208,7 @@ public class FMOD {
}
initialized = true;
- if (LWJGLInstaller.installed) {
- loadLibrary(LWJGLInstaller.installDirectory + File.separator + System.mapLibraryName(JNI_LIBRARY_NAME), true);
- } else {
- loadLibrary(JNI_LIBRARY_NAME, false);
- }
+ loadLibrary(JNI_LIBRARY_NAME);
// check for mismatch
String nativeVersion = getNativeLibraryVersion();
@@ -229,13 +224,15 @@ public class FMOD {
}
}
- private static void loadLibrary(final String name, final boolean usingPath) {
+ private static void loadLibrary(final String lib_name) {
AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
- if(usingPath) {
- System.load(name);
+ String library_path = System.getProperty("org.lwjgl.librarypath");
+ if (library_path != null) {
+ System.load(library_path + File.separator +
+ System.mapLibraryName(lib_name));
} else {
- System.loadLibrary(name);
+ System.loadLibrary(lib_name);
}
return null;
}
diff --git a/src/java/org/lwjgl/test/applet/AppletTest.java b/src/java/org/lwjgl/test/applet/AppletTest.java
index 9e658015..dfa4820b 100644
--- a/src/java/org/lwjgl/test/applet/AppletTest.java
+++ b/src/java/org/lwjgl/test/applet/AppletTest.java
@@ -44,19 +44,16 @@ public class AppletTest extends Applet {
Test test = null;
- @Override
public void destroy() {
super.destroy();
System.out.println("*** destroy ***");
}
- @Override
public void start() {
super.start();
System.out.println("*** start ***");
}
- @Override
public void stop() {
super.stop();
System.out.println("*** stop ***");