This is an automated email from the git hooks/post-receive script. pini pushed a commit to tag upstream/1.1.0_beta1 in repository sikuli.
commit 80bb3095a2ef4c5747bbe8c64c3f3222376abbeb Author: Ireneusz Matysiewicz <[email protected]> Date: Mon Jan 6 16:56:21 2014 +0100 Simplified native library loading on Windows: - $HOME/SikuliX/libs is added to current process's PATH, not to registry PATH, so no relogin is required - class WinUtil loads WinUtil.dll automatically, so no need to do it manually when using Sikuli as a library --- Basics/pom.xml | 9 +- .../java/org/sikuli/basics/ResourceLoader.java | 133 ++++++++------------- Natives/pom.xml | 9 ++ .../src/main/java/org/sikuli/natives/WinUtil.java | 7 ++ 4 files changed, 74 insertions(+), 84 deletions(-) diff --git a/Basics/pom.xml b/Basics/pom.xml index 76ad295..c319e28 100755 --- a/Basics/pom.xml +++ b/Basics/pom.xml @@ -42,7 +42,14 @@ <artifactId>swing-layout</artifactId> <version>1.0.3</version> </dependency> - </dependencies> + + <!-- for changing PATH --> + <dependency> + <groupId>com.nativelibs4java</groupId> + <artifactId>bridj</artifactId> + <version>0.6.2</version> + </dependency> + </dependencies> <build> <plugins> diff --git a/Basics/src/main/java/org/sikuli/basics/ResourceLoader.java b/Basics/src/main/java/org/sikuli/basics/ResourceLoader.java index 0ffb79b..7f18cc0 100755 --- a/Basics/src/main/java/org/sikuli/basics/ResourceLoader.java +++ b/Basics/src/main/java/org/sikuli/basics/ResourceLoader.java @@ -6,6 +6,10 @@ */ package org.sikuli.basics; +import org.bridj.BridJ; +import org.bridj.Pointer; +import org.bridj.ann.Library; + import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; @@ -431,6 +435,49 @@ public class ResourceLoader implements IResourceLoader { } } + /** + * Environment variable access to load native libraries. + * We can't put it into WinUtil.dll as it's not loaded yet, so we use BridJ. + */ + @Library("kernel32") + public static class Kernel32 { + static { + BridJ.register(); + } + + // http://msdn.microsoft.com/en-us/library/windows/desktop/ms683188(v=vs.85).aspx + public static native int GetEnvironmentVariableW( + Pointer<Character> lpName, + Pointer<Character> lpBuffer, + int nSize + ); + + /** + * + * @return specified environment variable; unlike {@link System#getenv(String)} it's the real WinAPI environment, + * not a JVM-local copy + */ + public static String getEnvironmentVariable(String name) { + final int BUFFER_SIZE = 16384; + Pointer<Character> buffer = Pointer.allocateArray(Character.class, BUFFER_SIZE); + int result = GetEnvironmentVariableW(Pointer.pointerToWideCString(name), buffer, BUFFER_SIZE); + if(result == 0) + throw new RuntimeException("Unable to get environment variable " + name); + return buffer.getWideCString(); + } + + // http://msdn.microsoft.com/en-us/library/windows/desktop/ms686206(v=vs.85).aspx + public static native boolean SetEnvironmentVariableW( + Pointer<Character> lpName, + Pointer<Character> lpValue + ); + + public static void setEnvironmentVariable(String name, String value) { + if(!SetEnvironmentVariableW(Pointer.pointerToWideCString(name), Pointer.pointerToWideCString(value))) + throw new RuntimeException("Unable to set environment variable " + name); + } + } + private File checkLibsDir(String path) { String memx = mem; mem = "checkLibsDir"; @@ -439,91 +486,11 @@ public class ResourceLoader implements IResourceLoader { log(lvl, path); if (!Settings.runningSetup && Settings.isWindows()) { // is on system path? - String syspath = System.getenv("PATH"); + String syspath = Kernel32.getEnvironmentVariable("PATH"); path = (new File(path).getAbsolutePath()).replaceAll("/", "\\"); if (!syspath.toUpperCase().contains(path.toUpperCase())) { - String error = "*** error ***"; - log(-1, "libs dir is not on system path: " + path); - if (Debug.getDebugLevel() >= lvl) { - for (String e : syspath.split(";")) { - System.out.println(e); - } - } - log(-2, "Please wait! Trying to add it to user's path"); - if (runcmd(cmdRegCheck).startsWith(error)) { - log(-1, "Fatal Error 104: Not possible to access registry!"); - RunSetup.popError("Trying to add SikuliX libs to user path\n" - + "But registry not accessible - see error log"); - SikuliX.terminate(104); - } - String[] val = regMap.get("EnvPath"); - String envPath = ""; - String newPath; - int step = 0; - String cmdQ = String.format(cmdRegQuery, val[0], val[1]); - String regResult = runcmd(cmdQ); - if (regResult.startsWith(error)) { - log(lvl, "users PATH seems to be empty: " + regResult); - step = 1; - } else { - String[] regResultLines = regResult.split(NL); - for (String line : regResultLines) { - line = line.trim(); - if (step == 0 && line.startsWith(val[0])) { - step = 1; - continue; - } - if (step == 1 && line.startsWith(val[1]) && line.contains(val[2])) { - step = 1; - envPath = line; - continue; - } - if (!line.isEmpty()) { - log(lvl, line); - } - } - } - if (step == 0) { - log(-1, "Fatal Error 105: Not possible to get user's PATH from registry"); - RunSetup.popError("Trying to add SikuliX libs to user path\n" - + "But registry not accessible - see error log"); - SikuliX.terminate(105); - } else { - if (!envPath.isEmpty()) { - envPath = envPath.substring(envPath.indexOf(val[2]) + val[2].length()).trim(); - log(lvl, "current:(%s %s): %s", val[0], val[1], envPath); - if (envPath.toUpperCase().contains(path.toUpperCase())) { - log(-1, "Logout and Login again! (Since libs folder is in user's path, but not activated)"); - RunSetup.popInfo("Please Logout and Login again!\n\n" - + "SikuliX libs path: " + path + "\n" - + "is in System Path environment settings, \n" - + "but not seen in current runtime environment.\n" - + "Logout/Login should fix this problem."); - SikuliX.terminate(0); - } - } - newPath = path.trim() + (envPath.isEmpty() ? "" : ";" + envPath); - String finalPath = newPath.replaceAll(" ", "%20;"); - String cmdA = String.format(cmdRegAdd, val[0], val[1], val[2], finalPath); - regResult = runcmd(cmdA); - log(lvl, regResult); - regResult = runcmd(cmdQ); - log(lvl, "Changed to: " + regResult); - if (!regResult.contains(path)) { - RunSetup.popError("Trying to add SikuliX libs to user path\n" - + "But registry not accessible - see error log"); - log(-1, "Fatal error 106: libs folder could not be added to PATH - giving up!"); - SikuliX.terminate(106); - } - } - log(-1, "Successfully added the libs folder to users PATH!\n" + "" - + "RESTART all processes/IDE's using Sikuli for new PATH to be used!/n" - + "For usages from command line logout/login might be necessary!"); - RunSetup.popInfo("Please Logout and Login again!\n\n" - + "SikuliX libs path: " + path + "\n" - + "was added to user path. \n" - + "Logout/Login should activate this setting."); - SikuliX.terminate(0); + log(-1, "libs dir is not on system path: " + path + "; Adding it to path"); + Kernel32.setEnvironmentVariable("PATH", syspath + ";" + path); } } if (System.getProperty("sikuli.DoNotExport") != null) { diff --git a/Natives/pom.xml b/Natives/pom.xml index 335e78c..aa9e1b0 100644 --- a/Natives/pom.xml +++ b/Natives/pom.xml @@ -22,6 +22,15 @@ <artifactId>SikuliX-Natives</artifactId> <version>1.1.0</version> + <dependencies> + <!-- for FileManager to load native libs --> + <dependency> + <groupId>org.sikuli</groupId> + <artifactId>SikuliX-Basics</artifactId> + <version>1.1.0</version> + </dependency> + </dependencies> + <build> <defaultGoal>clean install</defaultGoal> </build> diff --git a/Natives/src/main/java/org/sikuli/natives/WinUtil.java b/Natives/src/main/java/org/sikuli/natives/WinUtil.java index f50a13e..1b5049c 100644 --- a/Natives/src/main/java/org/sikuli/natives/WinUtil.java +++ b/Natives/src/main/java/org/sikuli/natives/WinUtil.java @@ -6,10 +6,17 @@ */ package org.sikuli.natives; +import org.sikuli.basics.FileManager; + import java.awt.Rectangle; import java.awt.Window; public class WinUtil implements OSUtil { + static { + // load native library on 1st use + // (it's a standard Java pattern to load it once class is loaded) + FileManager.loadLibrary("WinUtil"); + } @Override public int switchApp(String appName) { -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/sikuli.git _______________________________________________ pkg-java-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-java-commits

