Skip to content

Commit

Permalink
Improved fix for empty string array registry types.
Browse files Browse the repository at this point in the history
  • Loading branch information
David A. Solin committed Feb 21, 2012
1 parent 05ed5c6 commit bd5b7fb
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -608,7 +608,7 @@ public static String[] registryGetStringArray(HKEY root, String key, String valu
String s = data.getString(offset, true);
offset += s.length() * Native.WCHAR_SIZE;
offset += Native.WCHAR_SIZE;
if (s.length() == 0 && offset == stringData.size()) {
if (s.length() == 0 && offset == data.size()) {
// skip the final NULL
} else {
result.add(s);
Expand Down Expand Up @@ -1008,18 +1008,22 @@ public static void registrySetStringArray(HKEY hKey, String name, String[] arr)
size += s.length() * Native.WCHAR_SIZE;
size += Native.WCHAR_SIZE;
}

size += Native.WCHAR_SIZE;

int offset = 0;
Memory data = new Memory(size);
for(String s : arr) {
data.setString(offset, s, true);
offset += s.length() * Native.WCHAR_SIZE;
offset += Native.WCHAR_SIZE;
}

for (int i=0; i < Native.WCHAR_SIZE; i++) {
data.setByte(offset++, (byte)0);
}

int rc = Advapi32.INSTANCE.RegSetValueEx(hKey, name, 0, WinNT.REG_MULTI_SZ,
data.getByteArray(0, size), size);

if (rc != W32Errors.ERROR_SUCCESS) {
throw new Win32Exception(rc);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -256,9 +256,13 @@ public void testRegistrySetGetStringArray() {
for(int i = 0; i < dataRead.length; i++) {
assertEquals(dataWritten[i], dataRead[i]);
}
Advapi32Util.registryDeleteKey(WinReg.HKEY_CURRENT_USER, "Software", "JNA");
dataWritten = new String[0];
Advapi32Util.registrySetStringArray(WinReg.HKEY_CURRENT_USER, "Software\\JNA", "EmptyMultiString", dataWritten);
dataRead = Advapi32Util.registryGetStringArray(WinReg.HKEY_CURRENT_USER, "Software\\JNA", "EmptyMultiString");
assertEquals(0, dataRead.length);
Advapi32Util.registryDeleteKey(WinReg.HKEY_CURRENT_USER, "Software", "JNA");
}

public void testRegistrySetGetBinaryValue() {
byte[] data = { 0x00, 0x01, 0x02 };
Advapi32Util.registryCreateKey(WinReg.HKEY_CURRENT_USER, "Software", "JNA");
Expand Down Expand Up @@ -294,9 +298,11 @@ public void testRegistryGetValues() {
byte[] dataWritten = { 0xD, 0xE, 0xA, 0xD, 0xB, 0xE, 0xE, 0xF };
Advapi32Util.registrySetBinaryValue(WinReg.HKEY_CURRENT_USER, "Software\\JNA", "DeadBeef", dataWritten);
String[] stringsWritten = { "Hello", "World", "Hello World", uu };
Advapi32Util.registrySetStringArray(WinReg.HKEY_CURRENT_USER, "Software\\JNA", "StringArray", stringsWritten);
Advapi32Util.registrySetStringArray(WinReg.HKEY_CURRENT_USER, "Software\\JNA", "StringArray", stringsWritten);
String[] emptyArray = new String[0];
Advapi32Util.registrySetStringArray(WinReg.HKEY_CURRENT_USER, "Software\\JNA", "EmptyStringArray", emptyArray);
TreeMap<String, Object> values = Advapi32Util.registryGetValues(WinReg.HKEY_CURRENT_USER, "Software\\JNA");
assertEquals(5, values.keySet().size());
assertEquals(6, values.keySet().size());
assertEquals("FourtyTwo" + uu, values.get("42" + uu));
assertEquals(42, values.get("FourtyTwo" + uu));
assertEquals("%TEMP%", values.get("ExpandableString"));
Expand All @@ -310,6 +316,8 @@ public void testRegistryGetValues() {
for(int i = 0; i < stringsWritten.length; i++) {
assertEquals(stringsWritten[i], stringsRead[i]);
}
stringsRead = (String[]) values.get("EmptyStringArray");
assertEquals(0, stringsRead.length);
Advapi32Util.registryDeleteKey(WinReg.HKEY_CURRENT_USER, "Software", "JNA");
}

Expand Down

0 comments on commit bd5b7fb

Please sign in to comment.