From 84cef01e4612302e984862c5c91d07b8073fbb33 Mon Sep 17 00:00:00 2001 From: Doug Schaefer Date: Mon, 3 Apr 2006 05:41:36 +0000 Subject: Windows registry access utility. --- .../.settings/org.eclipse.cdt.core.prefs | 3 ++ .../eclipse/cdt/core/winreg/tests/WinRegTests.java | 23 +++++++++ core/org.eclipse.cdt.core.win32/library/nmake.mak | 8 ++++ core/org.eclipse.cdt.core.win32/library/winreg.cpp | 53 +++++++++++++++++++++ .../os/win32/x86/.cvsignore | 2 + .../os/win32/x86/winreg.dll | Bin 0 -> 49152 bytes .../org/eclipse/cdt/utils/WindowsRegistry.java | 39 +++++++++++++++ 7 files changed, 128 insertions(+) create mode 100644 core/org.eclipse.cdt.core.tests/.settings/org.eclipse.cdt.core.prefs create mode 100644 core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/winreg/tests/WinRegTests.java create mode 100644 core/org.eclipse.cdt.core.win32/library/nmake.mak create mode 100644 core/org.eclipse.cdt.core.win32/library/winreg.cpp create mode 100644 core/org.eclipse.cdt.core.win32/os/win32/x86/.cvsignore create mode 100644 core/org.eclipse.cdt.core.win32/os/win32/x86/winreg.dll create mode 100644 core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/WindowsRegistry.java (limited to 'core') diff --git a/core/org.eclipse.cdt.core.tests/.settings/org.eclipse.cdt.core.prefs b/core/org.eclipse.cdt.core.tests/.settings/org.eclipse.cdt.core.prefs new file mode 100644 index 00000000000..0e9287b8de5 --- /dev/null +++ b/core/org.eclipse.cdt.core.tests/.settings/org.eclipse.cdt.core.prefs @@ -0,0 +1,3 @@ +#Sun Apr 02 23:10:10 EDT 2006 +eclipse.preferences.version=1 +indexerId=org.eclipse.cdt.core.nullindexer diff --git a/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/winreg/tests/WinRegTests.java b/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/winreg/tests/WinRegTests.java new file mode 100644 index 00000000000..5bef66d737f --- /dev/null +++ b/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/winreg/tests/WinRegTests.java @@ -0,0 +1,23 @@ +package org.eclipse.cdt.core.winreg.tests; + +import org.eclipse.cdt.utils.WindowsRegistry; +import org.eclipse.core.runtime.Platform; + +import junit.framework.TestCase; + +public class WinRegTests extends TestCase { + + public void test1() { + WindowsRegistry registry = WindowsRegistry.getRegistry(); + if (Platform.getOS().equals(Platform.OS_WIN32)) { + assertNotNull(registry); + String value = registry.getLocalMachineValue("SOFTWARE\\Microsoft\\Windows\\CurrentVersion", "ProgramFilesDir"); + // Not sure how you set this to anything else so it seems safe. + assertEquals("C:\\Program Files", value); + } else { + // Should be null on non-Windows platforms + assertNotNull(registry); + } + } + +} diff --git a/core/org.eclipse.cdt.core.win32/library/nmake.mak b/core/org.eclipse.cdt.core.win32/library/nmake.mak new file mode 100644 index 00000000000..a3ce6c74cc8 --- /dev/null +++ b/core/org.eclipse.cdt.core.win32/library/nmake.mak @@ -0,0 +1,8 @@ +TARGET = ..\os\win32\x86\winreg.dll + +OBJS = winreg.obj + +CPPFLAGS = /nologo /I C:\Java\jdk1.5.0_06\include /I C:\Java\jdk1.5.0_06\include\win32 /DUNICODE + +$(TARGET): $(OBJS) + link /nologo /dll /out:$(TARGET) $(OBJS) advapi32.lib user32.lib diff --git a/core/org.eclipse.cdt.core.win32/library/winreg.cpp b/core/org.eclipse.cdt.core.win32/library/winreg.cpp new file mode 100644 index 00000000000..3f892b95fa7 --- /dev/null +++ b/core/org.eclipse.cdt.core.win32/library/winreg.cpp @@ -0,0 +1,53 @@ +#include +#include +#include + +jstring getErrorMsg(JNIEnv * env, wchar_t * name) { + wchar_t msg[256]; + wchar_t * msgBuff; + DWORD err = GetLastError(); + + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + err, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &msgBuff, + 0, NULL ); + + wsprintf(msg, L"%s failed with error %d: %s", name, err, msgBuff); + + LocalFree(msgBuff); + + return env->NewString((jchar *)msg, wcslen(msg)); +} + +extern "C" +JNIEXPORT jstring Java_org_eclipse_cdt_utils_WindowsRegistry_getLocalMachineValue( + JNIEnv * env, jobject obj, jstring subkey, jstring name) +{ + const jchar * csubkey = env->GetStringChars(subkey, NULL); + const jchar * cname = env->GetStringChars(name, NULL); + jstring result; + + HKEY key; + LONG rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (const wchar_t *)csubkey, 0, KEY_READ, &key); + if (rc != ERROR_SUCCESS) { + result = getErrorMsg(env, L"RegOpenKeyEx"); + } else { + DWORD type; + wchar_t buffer[256]; + DWORD len = sizeof(buffer); + rc = RegQueryValueEx(key, (const wchar_t *)cname, NULL, &type, (BYTE *)&buffer, &len); + if (rc != ERROR_SUCCESS) { + result = getErrorMsg(env, L"RegQueryValueEx"); + } else { + result = env->NewString((jchar *)buffer, wcslen(buffer)); + } + } + + env->ReleaseStringChars(subkey, csubkey); + env->ReleaseStringChars(name, cname); + + return result; +} diff --git a/core/org.eclipse.cdt.core.win32/os/win32/x86/.cvsignore b/core/org.eclipse.cdt.core.win32/os/win32/x86/.cvsignore new file mode 100644 index 00000000000..d3879971eec --- /dev/null +++ b/core/org.eclipse.cdt.core.win32/os/win32/x86/.cvsignore @@ -0,0 +1,2 @@ +winreg.lib +winreg.exp diff --git a/core/org.eclipse.cdt.core.win32/os/win32/x86/winreg.dll b/core/org.eclipse.cdt.core.win32/os/win32/x86/winreg.dll new file mode 100644 index 00000000000..2c113d73d3f Binary files /dev/null and b/core/org.eclipse.cdt.core.win32/os/win32/x86/winreg.dll differ diff --git a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/WindowsRegistry.java b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/WindowsRegistry.java new file mode 100644 index 00000000000..bb811dfb7b8 --- /dev/null +++ b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/WindowsRegistry.java @@ -0,0 +1,39 @@ +/** + * + */ +package org.eclipse.cdt.utils; + +import org.eclipse.core.runtime.Platform; + +/** + * @author DSchaefer + * + */ +public class WindowsRegistry { + + private static boolean failed = false; + private static WindowsRegistry registry; + + private WindowsRegistry() { + } + + public static WindowsRegistry getRegistry() { + if (registry == null && !failed) { + if (Platform.getOS().equals(Platform.OS_WIN32)) { + try { + System.loadLibrary("winreg"); + registry = new WindowsRegistry(); + } catch (UnsatisfiedLinkError e) { + failed = true; + return null; + } + } else + failed = true; + } + + return registry; + } + + public native String getLocalMachineValue(String subkey, String name); + +} -- cgit v1.2.3