Added Windows registry value names enumeration
This commit is contained in:
@@ -553,4 +553,44 @@ Java_net_rubygrapefruit_platform_internal_jni_WindowsRegistryFunctions_getSubkey
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jboolean JNICALL
|
||||||
|
Java_net_rubygrapefruit_platform_internal_jni_WindowsRegistryFunctions_getValueNames(JNIEnv *env, jclass target, jint keyNum, jstring subkey, jobject names, jobject result) {
|
||||||
|
wchar_t* subkeyStr = java_to_wchar(env, subkey, result);
|
||||||
|
jclass subkeys_class = env->GetObjectClass(names);
|
||||||
|
jmethodID method = env->GetMethodID(subkeys_class, "add", "(Ljava/lang/Object;)Z");
|
||||||
|
|
||||||
|
HKEY key;
|
||||||
|
LONG retval = RegOpenKeyExW(get_key_from_ordinal(keyNum), subkeyStr, 0, KEY_READ, &key);
|
||||||
|
if (retval != ERROR_SUCCESS) {
|
||||||
|
free(subkeyStr);
|
||||||
|
if (retval != ERROR_FILE_NOT_FOUND) {
|
||||||
|
mark_failed_with_code(env, "could open registry key", retval, NULL, result);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD valueCount;
|
||||||
|
DWORD maxValueNameLen;
|
||||||
|
retval = RegQueryInfoKeyW(key, NULL, NULL, NULL, NULL, NULL, NULL, &valueCount, &maxValueNameLen, NULL, NULL, NULL);
|
||||||
|
if (retval != ERROR_SUCCESS) {
|
||||||
|
mark_failed_with_code(env, "could query registry key", retval, NULL, result);
|
||||||
|
} else {
|
||||||
|
wchar_t* valueNameStr = (wchar_t*)malloc(sizeof(wchar_t) * (maxValueNameLen+1));
|
||||||
|
for (int i = 0; i < valueCount; i++) {
|
||||||
|
DWORD valueNameLen = maxValueNameLen + 1;
|
||||||
|
retval = RegEnumValueW(key, i, valueNameStr, &valueNameLen, NULL, NULL, NULL, NULL);
|
||||||
|
if (retval != ERROR_SUCCESS) {
|
||||||
|
mark_failed_with_code(env, "could enumerate registry value name", retval, NULL, result);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
env->CallVoidMethod(names, method, wchar_to_java(env, valueNameStr, wcslen(valueNameStr), result));
|
||||||
|
}
|
||||||
|
free(valueNameStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
RegCloseKey(key);
|
||||||
|
free(subkeyStr);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -23,4 +23,13 @@ public interface WindowsRegistry extends NativeIntegration {
|
|||||||
* @throws MissingRegistryEntryException When the requested key does not exist.
|
* @throws MissingRegistryEntryException When the requested key does not exist.
|
||||||
*/
|
*/
|
||||||
List<String> getSubkeys(Key key, String subkey) throws NativeException;
|
List<String> getSubkeys(Key key, String subkey) throws NativeException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lists the value names of a registry key.
|
||||||
|
*
|
||||||
|
* @throws NativeException On failure.
|
||||||
|
* @throws MissingRegistryEntryException When the requested key does not exist.
|
||||||
|
*/
|
||||||
|
List<String> getValueNames(Key key, String subkey) throws NativeException;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,4 +38,20 @@ public class DefaultWindowsRegistry implements WindowsRegistry {
|
|||||||
}
|
}
|
||||||
return subkeys;
|
return subkeys;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<String> getValueNames(Key key, String subkey) throws NativeException {
|
||||||
|
FunctionResult result = new FunctionResult();
|
||||||
|
ArrayList<String> names = new ArrayList<String>();
|
||||||
|
boolean found = WindowsRegistryFunctions.getValueNames(key.ordinal(), subkey, names, result);
|
||||||
|
if (result.isFailed()) {
|
||||||
|
throw new NativeException(String.format("Could not get value names of registry key '%s\\%s': %s", key,
|
||||||
|
subkey, result.getMessage()));
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
throw new MissingRegistryEntryException(String.format(
|
||||||
|
"Could not list the value names of registry key '%s\\%s' as it does not exist.", key, subkey));
|
||||||
|
}
|
||||||
|
return names;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,4 +10,7 @@ public class WindowsRegistryFunctions {
|
|||||||
|
|
||||||
// Returns false for unknown key
|
// Returns false for unknown key
|
||||||
public static native boolean getSubkeys(int key, String subkey, List<String> subkeys, FunctionResult result);
|
public static native boolean getSubkeys(int key, String subkey, List<String> subkeys, FunctionResult result);
|
||||||
|
|
||||||
|
// Returns false for unknown key
|
||||||
|
public static native boolean getValueNames(int key, String subkey, List<String> names, FunctionResult result);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user