summaryrefslogtreecommitdiff
path: root/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/autostart/WinRegistry.java
diff options
context:
space:
mode:
Diffstat (limited to 'BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/autostart/WinRegistry.java')
-rw-r--r--BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/autostart/WinRegistry.java386
1 files changed, 386 insertions, 0 deletions
diff --git a/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/autostart/WinRegistry.java b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/autostart/WinRegistry.java
new file mode 100644
index 00000000..8a79d227
--- /dev/null
+++ b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/autostart/WinRegistry.java
@@ -0,0 +1,386 @@
+/*
+ * Copyright 2011 by Graz University of Technology, Austria
+ * MOCCA has been developed by the E-Government Innovation Center EGIZ, a joint
+ * initiative of the Federal Chancellery Austria and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "Licence");
+ * You may not use this work except in compliance with the Licence.
+ * You may obtain a copy of the Licence at:
+ * http://www.osor.eu/eupl/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the Licence is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the Licence for the specific language governing permissions and
+ * limitations under the Licence.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.gv.egiz.bku.webstart.autostart;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.prefs.Preferences;
+
+public class WinRegistry {
+ public static final int HKEY_CURRENT_USER = 0x80000001;
+ public static final int HKEY_LOCAL_MACHINE = 0x80000002;
+ public static final int REG_SUCCESS = 0;
+ public static final int REG_NOTFOUND = 2;
+ public static final int REG_ACCESSDENIED = 5;
+
+// private static final int KEY_ALL_ACCESS = 0xf003f;
+ private static final int KEY_READ = 0x20019;
+ private static Preferences userRoot = Preferences.userRoot();
+ private static Preferences systemRoot = Preferences.systemRoot();
+ private static Class<? extends Preferences> userClass = userRoot.getClass();
+ private static Method regOpenKey = null;
+ private static Method regCloseKey = null;
+ private static Method regQueryValueEx = null;
+ private static Method regEnumValue = null;
+ private static Method regQueryInfoKey = null;
+ private static Method regEnumKeyEx = null;
+// private static Method regCreateKeyEx = null;
+// private static Method regSetValueEx = null;
+// private static Method regDeleteKey = null;
+// private static Method regDeleteValue = null;
+
+ static {
+ try {
+ regOpenKey = userClass.getDeclaredMethod("WindowsRegOpenKey",
+ new Class[] { int.class, byte[].class, int.class });
+ regOpenKey.setAccessible(true);
+ regCloseKey = userClass.getDeclaredMethod("WindowsRegCloseKey",
+ new Class[] { int.class });
+ regCloseKey.setAccessible(true);
+ regQueryValueEx = userClass.getDeclaredMethod(
+ "WindowsRegQueryValueEx", new Class[] { int.class,
+ byte[].class });
+ regQueryValueEx.setAccessible(true);
+ regEnumValue = userClass.getDeclaredMethod("WindowsRegEnumValue",
+ new Class[] { int.class, int.class, int.class });
+ regEnumValue.setAccessible(true);
+ regQueryInfoKey = userClass.getDeclaredMethod(
+ "WindowsRegQueryInfoKey1", new Class[] { int.class });
+ regQueryInfoKey.setAccessible(true);
+ regEnumKeyEx = userClass.getDeclaredMethod("WindowsRegEnumKeyEx",
+ new Class[] { int.class, int.class, int.class });
+ regEnumKeyEx.setAccessible(true);
+// regCreateKeyEx = userClass.getDeclaredMethod(
+// "WindowsRegCreateKeyEx", new Class[] { int.class,
+// byte[].class });
+// regCreateKeyEx.setAccessible(true);
+// regSetValueEx = userClass.getDeclaredMethod("WindowsRegSetValueEx",
+// new Class[] { int.class, byte[].class, byte[].class });
+// regSetValueEx.setAccessible(true);
+// regDeleteValue = userClass.getDeclaredMethod(
+// "WindowsRegDeleteValue", new Class[] { int.class,
+// byte[].class });
+// regDeleteValue.setAccessible(true);
+// regDeleteKey = userClass.getDeclaredMethod("WindowsRegDeleteKey",
+// new Class[] { int.class, byte[].class });
+// regDeleteKey.setAccessible(true);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private WinRegistry() {
+ }
+
+ /**
+ * Read a value from key and value name
+ *
+ * @param hkey
+ * HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE
+ * @param key
+ * @param valueName
+ * @return the value
+ * @throws IllegalArgumentException
+ * @throws IllegalAccessException
+ * @throws InvocationTargetException
+ */
+ public static String readString(int hkey, String key, String valueName)
+ throws IllegalArgumentException, IllegalAccessException,
+ InvocationTargetException {
+ if (hkey == HKEY_LOCAL_MACHINE) {
+ return readString(systemRoot, hkey, key, valueName);
+ } else if (hkey == HKEY_CURRENT_USER) {
+ return readString(userRoot, hkey, key, valueName);
+ } else {
+ throw new IllegalArgumentException("hkey=" + hkey);
+ }
+ }
+
+ /**
+ * Read value(s) and value name(s) form given key
+ *
+ * @param hkey
+ * HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE
+ * @param key
+ * @return the value name(s) plus the value(s)
+ * @throws IllegalArgumentException
+ * @throws IllegalAccessException
+ * @throws InvocationTargetException
+ */
+ public static Map<String, String> readStringValues(int hkey, String key)
+ throws IllegalArgumentException, IllegalAccessException,
+ InvocationTargetException {
+ if (hkey == HKEY_LOCAL_MACHINE) {
+ return readStringValues(systemRoot, hkey, key);
+ } else if (hkey == HKEY_CURRENT_USER) {
+ return readStringValues(userRoot, hkey, key);
+ } else {
+ throw new IllegalArgumentException("hkey=" + hkey);
+ }
+ }
+
+ /**
+ * Read the value name(s) from a given key
+ *
+ * @param hkey
+ * HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE
+ * @param key
+ * @return the value name(s)
+ * @throws IllegalArgumentException
+ * @throws IllegalAccessException
+ * @throws InvocationTargetException
+ */
+ public static List<String> readStringSubKeys(int hkey, String key)
+ throws IllegalArgumentException, IllegalAccessException,
+ InvocationTargetException {
+ if (hkey == HKEY_LOCAL_MACHINE) {
+ return readStringSubKeys(systemRoot, hkey, key);
+ } else if (hkey == HKEY_CURRENT_USER) {
+ return readStringSubKeys(userRoot, hkey, key);
+ } else {
+ throw new IllegalArgumentException("hkey=" + hkey);
+ }
+ }
+
+// /**
+// * Create a key
+// *
+// * @param hkey
+// * HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE
+// * @param key
+// * @throws IllegalArgumentException
+// * @throws IllegalAccessException
+// * @throws InvocationTargetException
+// */
+// public static void createKey(int hkey, String key)
+// throws IllegalArgumentException, IllegalAccessException,
+// InvocationTargetException {
+// int[] ret;
+// if (hkey == HKEY_LOCAL_MACHINE) {
+// ret = createKey(systemRoot, hkey, key);
+// regCloseKey
+// .invoke(systemRoot, new Object[] { new Integer(ret[0]) });
+// } else if (hkey == HKEY_CURRENT_USER) {
+// ret = createKey(userRoot, hkey, key);
+// regCloseKey.invoke(userRoot, new Object[] { new Integer(ret[0]) });
+// } else {
+// throw new IllegalArgumentException("hkey=" + hkey);
+// }
+// if (ret[1] != REG_SUCCESS) {
+// throw new IllegalArgumentException("rc=" + ret[1] + " key=" + key);
+// }
+// }
+
+// /**
+// * Write a value in a given key/value name
+// *
+// * @param hkey
+// * @param key
+// * @param valueName
+// * @param value
+// * @throws IllegalArgumentException
+// * @throws IllegalAccessException
+// * @throws InvocationTargetException
+// */
+// public static void writeStringValue(int hkey, String key, String valueName,
+// String value) throws IllegalArgumentException,
+// IllegalAccessException, InvocationTargetException {
+// if (hkey == HKEY_LOCAL_MACHINE) {
+// writeStringValue(systemRoot, hkey, key, valueName, value);
+// } else if (hkey == HKEY_CURRENT_USER) {
+// writeStringValue(userRoot, hkey, key, valueName, value);
+// } else {
+// throw new IllegalArgumentException("hkey=" + hkey);
+// }
+// }
+
+// /**
+// * Delete a given key
+// *
+// * @param hkey
+// * @param key
+// * @throws IllegalArgumentException
+// * @throws IllegalAccessException
+// * @throws InvocationTargetException
+// */
+// public static void deleteKey(int hkey, String key)
+// throws IllegalArgumentException, IllegalAccessException,
+// InvocationTargetException {
+// int rc = -1;
+// if (hkey == HKEY_LOCAL_MACHINE) {
+// rc = deleteKey(systemRoot, hkey, key);
+// } else if (hkey == HKEY_CURRENT_USER) {
+// rc = deleteKey(userRoot, hkey, key);
+// }
+// if (rc != REG_SUCCESS) {
+// throw new IllegalArgumentException("rc=" + rc + " key=" + key);
+// }
+// }
+
+// /**
+// * delete a value from a given key/value name
+// *
+// * @param hkey
+// * @param key
+// * @param value
+// * @throws IllegalArgumentException
+// * @throws IllegalAccessException
+// * @throws InvocationTargetException
+// */
+// public static void deleteValue(int hkey, String key, String value)
+// throws IllegalArgumentException, IllegalAccessException,
+// InvocationTargetException {
+// int rc = -1;
+// if (hkey == HKEY_LOCAL_MACHINE) {
+// rc = deleteValue(systemRoot, hkey, key, value);
+// } else if (hkey == HKEY_CURRENT_USER) {
+// rc = deleteValue(userRoot, hkey, key, value);
+// }
+// if (rc != REG_SUCCESS) {
+// throw new IllegalArgumentException("rc=" + rc + " key=" + key
+// + " value=" + value);
+// }
+// }
+
+ // =====================
+
+// private static int deleteValue(Preferences root, int hkey, String key,
+// String value) throws IllegalArgumentException,
+// IllegalAccessException, InvocationTargetException {
+// int[] handles = (int[]) regOpenKey.invoke(root, new Object[] {
+// new Integer(hkey), toCstr(key), new Integer(KEY_ALL_ACCESS) });
+// if (handles[1] != REG_SUCCESS) {
+// return handles[1]; // can be REG_NOTFOUND, REG_ACCESSDENIED
+// }
+// int rc = ((Integer) regDeleteValue.invoke(root, new Object[] {
+// new Integer(handles[0]), toCstr(value) })).intValue();
+// regCloseKey.invoke(root, new Object[] { new Integer(handles[0]) });
+// return rc;
+// }
+
+// private static int deleteKey(Preferences root, int hkey, String key)
+// throws IllegalArgumentException, IllegalAccessException,
+// InvocationTargetException {
+// int rc = ((Integer) regDeleteKey.invoke(root, new Object[] {
+// new Integer(hkey), toCstr(key) })).intValue();
+// return rc; // can REG_NOTFOUND, REG_ACCESSDENIED, REG_SUCCESS
+// }
+
+ private static String readString(Preferences root, int hkey, String key,
+ String value) throws IllegalArgumentException,
+ IllegalAccessException, InvocationTargetException {
+ int[] handles = (int[]) regOpenKey.invoke(root, new Object[] {
+ new Integer(hkey), toCstr(key), new Integer(KEY_READ) });
+ if (handles[1] != REG_SUCCESS) {
+ return null;
+ }
+ byte[] valb = (byte[]) regQueryValueEx.invoke(root, new Object[] {
+ new Integer(handles[0]), toCstr(value) });
+ regCloseKey.invoke(root, new Object[] { new Integer(handles[0]) });
+ return (valb != null ? new String(valb).trim() : null);
+ }
+
+ private static Map<String, String> readStringValues(Preferences root,
+ int hkey, String key) throws IllegalArgumentException,
+ IllegalAccessException, InvocationTargetException {
+ HashMap<String, String> results = new HashMap<String, String>();
+ int[] handles = (int[]) regOpenKey.invoke(root, new Object[] {
+ new Integer(hkey), toCstr(key), new Integer(KEY_READ) });
+ if (handles[1] != REG_SUCCESS) {
+ return null;
+ }
+ int[] info = (int[]) regQueryInfoKey.invoke(root,
+ new Object[] { new Integer(handles[0]) });
+
+ int count = info[2]; // count
+ int maxlen = info[3]; // value length max
+ for (int index = 0; index < count; index++) {
+ byte[] name = (byte[]) regEnumValue.invoke(root, new Object[] {
+ new Integer(handles[0]), new Integer(index),
+ new Integer(maxlen + 1) });
+ String value = readString(hkey, key, new String(name));
+ results.put(new String(name).trim(), value);
+ }
+ regCloseKey.invoke(root, new Object[] { new Integer(handles[0]) });
+ return results;
+ }
+
+ private static List<String> readStringSubKeys(Preferences root, int hkey,
+ String key) throws IllegalArgumentException,
+ IllegalAccessException, InvocationTargetException {
+ List<String> results = new ArrayList<String>();
+ int[] handles = (int[]) regOpenKey.invoke(root, new Object[] {
+ new Integer(hkey), toCstr(key), new Integer(KEY_READ) });
+ if (handles[1] != REG_SUCCESS) {
+ return null;
+ }
+ int[] info = (int[]) regQueryInfoKey.invoke(root,
+ new Object[] { new Integer(handles[0]) });
+
+ int count = info[2]; // count
+ int maxlen = info[3]; // value length max
+ for (int index = 0; index < count; index++) {
+ byte[] name = (byte[]) regEnumKeyEx.invoke(root, new Object[] {
+ new Integer(handles[0]), new Integer(index),
+ new Integer(maxlen + 1) });
+ results.add(new String(name).trim());
+ }
+ regCloseKey.invoke(root, new Object[] { new Integer(handles[0]) });
+ return results;
+ }
+
+// private static int[] createKey(Preferences root, int hkey, String key)
+// throws IllegalArgumentException, IllegalAccessException,
+// InvocationTargetException {
+// return (int[]) regCreateKeyEx.invoke(root, new Object[] {
+// new Integer(hkey), toCstr(key) });
+// }
+
+// private static void writeStringValue(Preferences root, int hkey,
+// String key, String valueName, String value)
+// throws IllegalArgumentException, IllegalAccessException,
+// InvocationTargetException {
+// int[] handles = (int[]) regOpenKey.invoke(root, new Object[] {
+// new Integer(hkey), toCstr(key), new Integer(KEY_ALL_ACCESS) });
+//
+// regSetValueEx.invoke(root, new Object[] { new Integer(handles[0]),
+// toCstr(valueName), toCstr(value) });
+// regCloseKey.invoke(root, new Object[] { new Integer(handles[0]) });
+// }
+
+ // utility
+ private static byte[] toCstr(String str) {
+ byte[] result = new byte[str.length() + 1];
+
+ for (int i = 0; i < str.length(); i++) {
+ result[i] = (byte) str.charAt(i);
+ }
+ result[str.length()] = 0;
+ return result;
+ }
+}