diff --git a/core/org.eclipse.cdt.core.native/build.properties b/core/org.eclipse.cdt.core.native/build.properties index c065e6858b0..2e7a449116e 100644 --- a/core/org.eclipse.cdt.core.native/build.properties +++ b/core/org.eclipse.cdt.core.native/build.properties @@ -19,8 +19,10 @@ bin.includes = plugin.properties,\ about.ini,\ about.mappings,\ cdt_logo_icon32.png,\ - about.properties -src.includes = about.html + about.properties,\ + plugin.xml +src.includes = about.html,\ + schema/ javadoc.packages = org.eclipse.cdt.utils.*,\ org.eclipse.cdt.utils.pty.*,\ org.eclipse.cdt.utils.spawner.* diff --git a/core/org.eclipse.cdt.core.native/plugin.properties b/core/org.eclipse.cdt.core.native/plugin.properties index 40d7fc25cea..1e8e0166d60 100755 --- a/core/org.eclipse.cdt.core.native/plugin.properties +++ b/core/org.eclipse.cdt.core.native/plugin.properties @@ -16,6 +16,8 @@ pluginName=C/C++ Development Tools Core Native Utilities providerName=Eclipse CDT +WindowsRegistry.name=Windows Registry + fragmentName.linux = C/C++ Development Tools Core Native Utilities for Linux fragmentName.linux.ppc64le = C/C++ Development Tools Core Native Utilities for Linux (ppc64le) fragmentName.linux.x86_64 = C/C++ Development Tools Core Native Utilities for Linux (x86_64) diff --git a/core/org.eclipse.cdt.core.native/plugin.xml b/core/org.eclipse.cdt.core.native/plugin.xml new file mode 100644 index 00000000000..174452ec9f4 --- /dev/null +++ b/core/org.eclipse.cdt.core.native/plugin.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<?eclipse version="3.0"?> +<plugin> + <extension-point id="WindowsRegistry" name="%WindowsRegistry.name" schema="schema/WindowsRegistry.exsd"/> +</plugin> diff --git a/core/org.eclipse.cdt.core.native/schema/WindowsRegistry.exsd b/core/org.eclipse.cdt.core.native/schema/WindowsRegistry.exsd new file mode 100644 index 00000000000..eabfd78bfe0 --- /dev/null +++ b/core/org.eclipse.cdt.core.native/schema/WindowsRegistry.exsd @@ -0,0 +1,66 @@ +<?xml version='1.0' encoding='UTF-8'?> +<!-- Schema file written by PDE --> +<schema targetNamespace="org.eclipse.cdt.core" xmlns="http://www.w3.org/2001/XMLSchema"> +<annotation> + <appInfo> + <meta.schema plugin="org.eclipse.cdt.core.native" id="WindowsRegistry" name="Windows Registry Query Exentsion"/> + </appInfo> + <documentation> + + </documentation> + </annotation> + <element name="extension"> + <annotation> + <appInfo> + <meta.element /> + </appInfo> + </annotation> + <complexType> + <sequence> + <element ref="windowsRegistry"/> + </sequence> + <attribute name="point" type="string" use="required"> + <annotation> + <documentation> + + </documentation> + </annotation> + </attribute> + <attribute name="id" type="string"> + <annotation> + <documentation> + + </documentation> + </annotation> + </attribute> + <attribute name="name" type="string"> + <annotation> + <documentation> + + </documentation> + </annotation> + </attribute> + </complexType> + </element> + <element name="windowsRegistry"> + <complexType> + <attribute name="class" type="string" use="required"> + <annotation> + <documentation> + + </documentation> + <appInfo> + <meta.attribute kind="java" basedOn="org.eclipse.cdt.utils.WindowsRegistry"/> + </appInfo> + </annotation> + </attribute> + <attribute name="platform" type="string" use="required"> + <annotation> + <documentation> + + </documentation> + </annotation> + </attribute> + </complexType> + </element> +</schema> diff --git a/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/internal/core/natives/CNativePlugin.java b/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/internal/core/natives/CNativePlugin.java index 976fa95387e..db2a72763b3 100644 --- a/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/internal/core/natives/CNativePlugin.java +++ b/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/internal/core/natives/CNativePlugin.java @@ -14,7 +14,13 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.natives; +import org.eclipse.cdt.utils.WindowsRegistry; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtension; +import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Plugin; import org.eclipse.core.runtime.Status; @@ -92,4 +98,35 @@ public class CNativePlugin extends Plugin { getDefault().getLog().log(status); } + /** + * Get the WindowsRegistry contributed class for the platform. + */ + public WindowsRegistry getWindowsRegistry() throws CoreException { + IExtensionPoint extension = Platform.getExtensionRegistry().getExtensionPoint(PLUGIN_ID, "WindowsRegistry"); //$NON-NLS-1$ + if (extension != null) { + IExtension[] extensions = extension.getExtensions(); + IConfigurationElement defaultContributor = null; + for (IExtension extension2 : extensions) { + IConfigurationElement[] configElements = extension2.getConfigurationElements(); + for (IConfigurationElement configElement : configElements) { + if (configElement.getName().equals("windowsRegistry")) { //$NON-NLS-1$ + String platform = configElement.getAttribute("platform"); //$NON-NLS-1$ + if (platform == null) { // first contributor found with + // not platform will be default. + if (defaultContributor == null) { + defaultContributor = configElement; + } + } else if (platform.equals(Platform.getOS())) { + // found explicit contributor for this platform. + return (WindowsRegistry) configElement.createExecutableExtension("class"); //$NON-NLS-1$ + } + } + } + } + if (defaultContributor != null) { + return (WindowsRegistry) defaultContributor.createExecutableExtension("class"); //$NON-NLS-1$ + } + } + return null; + } } diff --git a/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/utils/WindowsRegistry.java b/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/utils/WindowsRegistry.java index 31d31cd6d93..f2054512232 100644 --- a/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/utils/WindowsRegistry.java +++ b/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/utils/WindowsRegistry.java @@ -11,38 +11,31 @@ * Contributors: * QNX Software Systems - initial API and implementation *******************************************************************************/ -/** - * - */ package org.eclipse.cdt.utils; -import org.eclipse.core.runtime.Platform; +import org.eclipse.cdt.internal.core.natives.CNativePlugin; +import org.eclipse.core.runtime.CoreException; /** * @author DSchaefer * @noextend This class is not intended to be subclassed by clients. - * @noinstantiate This class is not intended to be instantiated by clients. */ -public class WindowsRegistry { +public abstract class WindowsRegistry { - private static boolean failed = false; private static WindowsRegistry registry; - private WindowsRegistry() { + /** + * @since 6.0 + */ + protected WindowsRegistry() { } public static WindowsRegistry getRegistry() { - if (registry == null && !failed) { - if (Platform.getOS().equals(Platform.OS_WIN32)) { - try { - System.loadLibrary("winreg"); //$NON-NLS-1$ - registry = new WindowsRegistry(); - } catch (UnsatisfiedLinkError e) { - failed = true; - return null; - } - } else - failed = true; + if (registry == null) { + try { + registry = CNativePlugin.getDefault().getWindowsRegistry(); + } catch (CoreException e) { + } } return registry; @@ -56,7 +49,7 @@ public class WindowsRegistry { * @param name name of the registry value * @return registry value or null if not found */ - public native String getLocalMachineValue(String subkey, String name); + public abstract String getLocalMachineValue(String subkey, String name); /** * Given a subkey of HKEY_LOCAL_MACHINE, and an index (starting from 0) @@ -68,7 +61,7 @@ public class WindowsRegistry { * @param index index to the subkey's array of values, starting from 0. * @return name of registry value or null if not found */ - public native String getLocalMachineValueName(String subkey, int index); + public abstract String getLocalMachineValueName(String subkey, int index); /** * Given a subkey of HKEY_LOCAL_MACHINE, and an index (starting from 0) @@ -80,7 +73,7 @@ public class WindowsRegistry { * @param index index to the subkey's array of values, starting from 0. * @return name of registry value or null if not found */ - public native String getLocalMachineKeyName(String subkey, int index); + public abstract String getLocalMachineKeyName(String subkey, int index); /** * Gets the registry value for the subkey of HKEY_CURRENT_USER with the @@ -90,7 +83,7 @@ public class WindowsRegistry { * @param name name of the registry value * @return registry value or null if not found */ - public native String getCurrentUserValue(String subkey, String name); + public abstract String getCurrentUserValue(String subkey, String name); /** * Given a subkey of HKEY_CURRENT_USER, and an index (starting from 0) @@ -102,7 +95,7 @@ public class WindowsRegistry { * @param index index to the subkey's array of values, starting from 0. * @return name of registry value or null if not found */ - public native String getCurrentUserValueName(String subkey, int index); + public abstract String getCurrentUserValueName(String subkey, int index); /** * Given a subkey of HKEY_CURRENT_USER, and an index (starting from 0) @@ -114,6 +107,5 @@ public class WindowsRegistry { * @param index index to the subkey's array of values, starting from 0. * @return name of registry value or null if not found */ - public native String getCurrentUserKeyName(String subkey, int index); - + public abstract String getCurrentUserKeyName(String subkey, int index); } diff --git a/core/org.eclipse.cdt.core.win32.x86_64/os/win32/x86_64/winreg.dll b/core/org.eclipse.cdt.core.win32.x86_64/os/win32/x86_64/winreg.dll deleted file mode 100755 index a8e74e65993..00000000000 Binary files a/core/org.eclipse.cdt.core.win32.x86_64/os/win32/x86_64/winreg.dll and /dev/null differ diff --git a/core/org.eclipse.cdt.core.win32/fragment.xml b/core/org.eclipse.cdt.core.win32/fragment.xml index f06998bc1fd..a1807605b60 100644 --- a/core/org.eclipse.cdt.core.win32/fragment.xml +++ b/core/org.eclipse.cdt.core.win32/fragment.xml @@ -9,4 +9,11 @@ class="org.eclipse.cdt.internal.core.win32.ProcessList"> </processList> </extension> + <extension + point="org.eclipse.cdt.core.native.WindowsRegistry"> + <windowsRegistry + class="org.eclipse.cdt.internal.core.win32.WindowsRegistryImpl" + platform="win32"> + </windowsRegistry> + </extension> </fragment> diff --git a/core/org.eclipse.cdt.core.win32/library/Makefile_x86_64.mk b/core/org.eclipse.cdt.core.win32/library/Makefile_x86_64.mk index 1d8d016f8c3..aeb5c889190 100644 --- a/core/org.eclipse.cdt.core.win32/library/Makefile_x86_64.mk +++ b/core/org.eclipse.cdt.core.win32/library/Makefile_x86_64.mk @@ -30,9 +30,6 @@ INSTALL_DIR = ..\..\org.eclipse.cdt.core.$(OS).$(ARCH)\os\$(OS)\$(ARCH) DLL_SPAWNER = spawner.dll OBJS_SPAWNER=StdAfx.obj Win32ProcessEx.obj iostream.obj raise.obj spawner.obj -DLL_WINREG = winreg.dll -OBJS_WINREG=winreg/winreg.obj - EXE_STARTER = starter.exe OBJS_STARTER=starter/starter.obj @@ -45,22 +42,19 @@ OBJS_STARTER=starter/starter.obj spawner: $(OBJS_SPAWNER) link /dll /nologo /out:$(DLL_SPAWNER) $(OBJS_SPAWNER) User32.lib -winreg: $(OBJS_WINREG) - link /dll /nologo /out:$(DLL_WINREG) $(OBJS_WINREG) Advapi32.lib - starter: $(OBJS_STARTER) link /nologo /out:$(EXE_STARTER) $(OBJS_STARTER) Psapi.Lib Shell32.lib - -all: spawner winreg starter + +all: spawner starter clean: - del *.obj *.lib *.exp *.exe *.dll winreg\*.obj starter\*.obj + del *.obj *.lib *.exp *.exe *.dll starter\*.obj rebuild: clean all install: all copy *.dll $(INSTALL_DIR) copy *.exe $(INSTALL_DIR) - + uninstall: del $(INSTALL_DIR)\*.dll $(INSTALL_DIR)\*.exe diff --git a/core/org.eclipse.cdt.core.win32/library/cdt-win32.sln b/core/org.eclipse.cdt.core.win32/library/cdt-win32.sln deleted file mode 100644 index 01d10abe31e..00000000000 --- a/core/org.eclipse.cdt.core.win32/library/cdt-win32.sln +++ /dev/null @@ -1,33 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.31101.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winreg", "winreg\winreg.vcxproj", "{4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Mixed Platforms = Debug|Mixed Platforms - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Mixed Platforms = Release|Mixed Platforms - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}.Debug|Mixed Platforms.Build.0 = Debug|Win32 - {4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}.Debug|Win32.ActiveCfg = Debug|Win32 - {4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}.Debug|Win32.Build.0 = Debug|Win32 - {4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}.Debug|x64.ActiveCfg = Debug|Win32 - {4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}.Release|Mixed Platforms.ActiveCfg = Release|Win32 - {4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}.Release|Mixed Platforms.Build.0 = Release|Win32 - {4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}.Release|Win32.ActiveCfg = Release|Win32 - {4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}.Release|Win32.Build.0 = Release|Win32 - {4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}.Release|x64.ActiveCfg = Release|x64 - {4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/core/org.eclipse.cdt.core.win32/library/winreg/.gitignore b/core/org.eclipse.cdt.core.win32/library/winreg/.gitignore deleted file mode 100644 index 7d9b212a579..00000000000 --- a/core/org.eclipse.cdt.core.win32/library/winreg/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/winreg.tlog/ diff --git a/core/org.eclipse.cdt.core.win32/library/winreg/dllmain.cpp b/core/org.eclipse.cdt.core.win32/library/winreg/dllmain.cpp deleted file mode 100644 index 1464319edac..00000000000 --- a/core/org.eclipse.cdt.core.win32/library/winreg/dllmain.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 QNX Software Systems and others. - * - * This program and the accompanying materials - * are made available under the terms of the Eclipse Public License 2.0 - * which accompanies this distribution, and is available at - * https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * QNX Software Systems - Initial API and implementation - *******************************************************************************/ -#include "stdafx.h" - -BOOL APIENTRY DllMain( HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved - ) -{ - switch (ul_reason_for_call) - { - case DLL_PROCESS_ATTACH: - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - case DLL_PROCESS_DETACH: - break; - } - return TRUE; -} - diff --git a/core/org.eclipse.cdt.core.win32/library/winreg/stdafx.cpp b/core/org.eclipse.cdt.core.win32/library/winreg/stdafx.cpp deleted file mode 100644 index 4033266f9a1..00000000000 --- a/core/org.eclipse.cdt.core.win32/library/winreg/stdafx.cpp +++ /dev/null @@ -1,17 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 QNX Software Systems and others. - * - * This program and the accompanying materials - * are made available under the terms of the Eclipse Public License 2.0 - * which accompanies this distribution, and is available at - * https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * QNX Software Systems - Initial API and implementation - *******************************************************************************/ -#include "stdafx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file diff --git a/core/org.eclipse.cdt.core.win32/library/winreg/stdafx.h b/core/org.eclipse.cdt.core.win32/library/winreg/stdafx.h deleted file mode 100644 index 506fec98540..00000000000 --- a/core/org.eclipse.cdt.core.win32/library/winreg/stdafx.h +++ /dev/null @@ -1,25 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 QNX Software Systems and others. - * - * This program and the accompanying materials - * are made available under the terms of the Eclipse Public License 2.0 - * which accompanies this distribution, and is available at - * https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * QNX Software Systems - Initial API and implementation - *******************************************************************************/ -#pragma once - -#include "targetver.h" - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers -// Windows Header Files: -#include <windows.h> -#include <jni.h> - - - -// TODO: reference additional headers your program requires here diff --git a/core/org.eclipse.cdt.core.win32/library/winreg/targetver.h b/core/org.eclipse.cdt.core.win32/library/winreg/targetver.h deleted file mode 100644 index 080979afe73..00000000000 --- a/core/org.eclipse.cdt.core.win32/library/winreg/targetver.h +++ /dev/null @@ -1,21 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 QNX Software Systems and others. - * - * This program and the accompanying materials - * are made available under the terms of the Eclipse Public License 2.0 - * which accompanies this distribution, and is available at - * https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * QNX Software Systems - Initial API and implementation - *******************************************************************************/ -#pragma once - -// Including SDKDDKVer.h defines the highest available Windows platform. - -// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and -// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. - -#include <SDKDDKVer.h> diff --git a/core/org.eclipse.cdt.core.win32/library/winreg/winreg.cpp b/core/org.eclipse.cdt.core.win32/library/winreg/winreg.cpp deleted file mode 100644 index 25a77124217..00000000000 --- a/core/org.eclipse.cdt.core.win32/library/winreg/winreg.cpp +++ /dev/null @@ -1,154 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 QNX Software Systems and others. - * - * This program and the accompanying materials - * are made available under the terms of the Eclipse Public License 2.0 - * which accompanies this distribution, and is available at - * https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * QNX Software Systems - Initial API and implementation - *******************************************************************************/ -#include "stdafx.h" - -static jstring getValue(JNIEnv * env, HKEY key, jstring subkey, jstring name) { - const jchar * csubkey = env->GetStringChars(subkey, NULL); - const jchar * cname = env->GetStringChars(name, NULL); - jstring result = NULL; - - HKEY skey; - LONG rc = RegOpenKeyEx(key, (const wchar_t *)csubkey, 0, KEY_READ, &skey); - if (rc == ERROR_SUCCESS) { - DWORD type; - wchar_t buffer[256]; - DWORD len = sizeof(buffer); - rc = RegQueryValueEx(skey, (const wchar_t *)cname, NULL, &type, (BYTE *)&buffer, &len); - if (rc == ERROR_SUCCESS) { - result = env->NewString((jchar *) buffer, (jsize) wcslen(buffer)); - } - RegCloseKey(skey); - } - - env->ReleaseStringChars(subkey, csubkey); - env->ReleaseStringChars(name, cname); - - return result; -} - -extern "C" -JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_WindowsRegistry_getLocalMachineValue( -JNIEnv * env, jobject obj, jstring subkey, jstring name) -{ - return getValue(env, HKEY_LOCAL_MACHINE, subkey, name); -} - -extern "C" -JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_WindowsRegistry_getCurrentUserValue( -JNIEnv * env, jobject obj, jstring subkey, jstring name) -{ - return getValue(env, HKEY_CURRENT_USER, subkey, name); -} - -/* -* Given a subkey (string) under HKEY_LOCAL_MACHINE, and an index (starting from 0) -* to the key's array of values, return the name of the indexed value. -* The return value is null on any error or when the index is invalid. -*/ - -static jstring getValueName(JNIEnv * env, HKEY key, jstring subkey, jint index) { - const jchar * csubkey = env->GetStringChars(subkey, NULL); - jstring result = NULL; - - HKEY skey; - LONG rc = RegOpenKeyEx(key, (const wchar_t *)csubkey, 0, KEY_READ, &skey); - if (rc != ERROR_SUCCESS) - return NULL; - - wchar_t valueName[256]; - DWORD nameSize = sizeof(valueName) + 2; - - rc = RegEnumValue(skey, index, - valueName, // UNICODE string - &nameSize, - NULL, NULL, - NULL, // data string - NULL); // size in BYTE of data. - - if (rc == ERROR_SUCCESS) - { - result = env->NewString((jchar *)valueName, nameSize); - } - - RegCloseKey(skey); - - env->ReleaseStringChars(subkey, csubkey); - - return result; -} - -extern "C" -JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_WindowsRegistry_getLocalMachineValueName( -JNIEnv * env, jobject obj, jstring subkey, jint index) -{ - return getValueName(env, HKEY_LOCAL_MACHINE, subkey, index); -} - -extern "C" -JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_WindowsRegistry_getCurrentUserValueName( -JNIEnv * env, jobject obj, jstring subkey, jint index) -{ - return getValueName(env, HKEY_CURRENT_USER, subkey, index); -} - -/* -* Given a subkey (string) under HKEY_LOCAL_MACHINE, and an index (starting from 0) -* to the key's array of keys, return the name of the indexed key. -* The return value is null on any error or when the index is invalid. -*/ - -static jstring getKeyName(JNIEnv * env, HKEY key, jstring subkey, jint index) { - const jchar * csubkey = env->GetStringChars(subkey, NULL); - jstring result = NULL; - - HKEY skey; - LONG rc = RegOpenKeyEx(key, (const wchar_t *)csubkey, 0, KEY_READ, &skey); - if (rc != ERROR_SUCCESS) - return NULL; - - wchar_t keyName[256]; - DWORD nameSize = sizeof(keyName) + 2; - - rc = RegEnumKeyEx(skey, index, - keyName, // UNICODE string - &nameSize, - NULL, NULL, - NULL, - NULL); // size in BYTE of data. - - if (rc == ERROR_SUCCESS) - { - result = env->NewString((jchar *)keyName, nameSize); - } - - RegCloseKey(skey); - - env->ReleaseStringChars(subkey, csubkey); - - return result; -} - -extern "C" -JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_WindowsRegistry_getLocalMachineKeyName( -JNIEnv * env, jobject obj, jstring subkey, jint index) -{ - return getKeyName(env, HKEY_LOCAL_MACHINE, subkey, index); -} - -extern "C" -JNIEXPORT jstring JNICALL Java_org_eclipse_cdt_utils_WindowsRegistry_getCurrentUserKeyName( -JNIEnv * env, jobject obj, jstring subkey, jint index) -{ - return getKeyName(env, HKEY_CURRENT_USER, subkey, index); -} diff --git a/core/org.eclipse.cdt.core.win32/library/winreg/winreg.vcxproj b/core/org.eclipse.cdt.core.win32/library/winreg/winreg.vcxproj deleted file mode 100644 index 0c82aec90f9..00000000000 --- a/core/org.eclipse.cdt.core.win32/library/winreg/winreg.vcxproj +++ /dev/null @@ -1,175 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <ItemGroup Label="ProjectConfigurations"> - <ProjectConfiguration Include="Debug|Win32"> - <Configuration>Debug</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Debug|x64"> - <Configuration>Debug</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|Win32"> - <Configuration>Release</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|x64"> - <Configuration>Release</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - </ItemGroup> - <PropertyGroup Label="Globals"> - <ProjectGuid>{4CA57EA3-42F2-4CC1-8E95-5C707A8E7363}</ProjectGuid> - <Keyword>Win32Proj</Keyword> - <RootNamespace>winreg</RootNamespace> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> - <ConfigurationType>DynamicLibrary</ConfigurationType> - <UseDebugLibraries>true</UseDebugLibraries> - <PlatformToolset>v120</PlatformToolset> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> - <ConfigurationType>DynamicLibrary</ConfigurationType> - <UseDebugLibraries>true</UseDebugLibraries> - <PlatformToolset>v120</PlatformToolset> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> - <ConfigurationType>DynamicLibrary</ConfigurationType> - <UseDebugLibraries>false</UseDebugLibraries> - <PlatformToolset>v120</PlatformToolset> - <WholeProgramOptimization>true</WholeProgramOptimization> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> - <ConfigurationType>DynamicLibrary</ConfigurationType> - <UseDebugLibraries>false</UseDebugLibraries> - <PlatformToolset>v120</PlatformToolset> - <WholeProgramOptimization>true</WholeProgramOptimization> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> - <ImportGroup Label="ExtensionSettings"> - </ImportGroup> - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <PropertyGroup Label="UserMacros" /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <LinkIncremental>true</LinkIncremental> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <LinkIncremental>true</LinkIncremental> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <LinkIncremental>false</LinkIncremental> - <OutDir>$(SolutionDir)..\..\org.eclipse.cdt.core.win32.x86\os\win32\x86\</OutDir> - <IntDir /> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <LinkIncremental>false</LinkIncremental> - <OutDir>$(SolutionDir)..\..\org.eclipse.cdt.core.win32.x86_64\os\win32\x86_64\</OutDir> - <IntDir /> - </PropertyGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <ClCompile> - <PrecompiledHeader>Use</PrecompiledHeader> - <WarningLevel>Level3</WarningLevel> - <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;WINREG_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <ClCompile> - <PrecompiledHeader>Use</PrecompiledHeader> - <WarningLevel>Level3</WarningLevel> - <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;WINREG_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <ClCompile> - <WarningLevel>Level3</WarningLevel> - <PrecompiledHeader>Use</PrecompiledHeader> - <Optimization>MaxSpeed</Optimization> - <FunctionLevelLinking>true</FunctionLevelLinking> - <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;WINREG_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>C:\Program Files\Java\jdk1.8.0_31\include;C:\Program Files\Java\jdk1.8.0_31\include\win32</AdditionalIncludeDirectories> - <RuntimeLibrary>MultiThreaded</RuntimeLibrary> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> - <EnableCOMDATFolding>true</EnableCOMDATFolding> - <OptimizeReferences>true</OptimizeReferences> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <ClCompile> - <WarningLevel>Level3</WarningLevel> - <PrecompiledHeader>Use</PrecompiledHeader> - <Optimization>MaxSpeed</Optimization> - <FunctionLevelLinking>true</FunctionLevelLinking> - <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;WINREG_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>C:\Program Files\Java\jdk1.8.0_31\include;C:\Program Files\Java\jdk1.8.0_31\include\win32</AdditionalIncludeDirectories> - <RuntimeLibrary>MultiThreaded</RuntimeLibrary> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> - <EnableCOMDATFolding>true</EnableCOMDATFolding> - <OptimizeReferences>true</OptimizeReferences> - </Link> - </ItemDefinitionGroup> - <ItemGroup> - <ClInclude Include="stdafx.h" /> - <ClInclude Include="targetver.h" /> - </ItemGroup> - <ItemGroup> - <ClCompile Include="dllmain.cpp"> - <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsManaged> - <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</CompileAsManaged> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - </PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - </PrecompiledHeader> - <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</CompileAsManaged> - <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</CompileAsManaged> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - </PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - </PrecompiledHeader> - </ClCompile> - <ClCompile Include="stdafx.cpp"> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader> - </ClCompile> - <ClCompile Include="winreg.cpp" /> - </ItemGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> - <ImportGroup Label="ExtensionTargets"> - </ImportGroup> -</Project> \ No newline at end of file diff --git a/core/org.eclipse.cdt.core.win32/library/winreg/winreg.vcxproj.filters b/core/org.eclipse.cdt.core.win32/library/winreg/winreg.vcxproj.filters deleted file mode 100644 index afa4a0f572f..00000000000 --- a/core/org.eclipse.cdt.core.win32/library/winreg/winreg.vcxproj.filters +++ /dev/null @@ -1,36 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <ItemGroup> - <Filter Include="Source Files"> - <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> - <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> - </Filter> - <Filter Include="Header Files"> - <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> - <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions> - </Filter> - <Filter Include="Resource Files"> - <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> - <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> - </Filter> - </ItemGroup> - <ItemGroup> - <ClInclude Include="stdafx.h"> - <Filter>Header Files</Filter> - </ClInclude> - <ClInclude Include="targetver.h"> - <Filter>Header Files</Filter> - </ClInclude> - </ItemGroup> - <ItemGroup> - <ClCompile Include="stdafx.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="winreg.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - <ClCompile Include="dllmain.cpp"> - <Filter>Source Files</Filter> - </ClCompile> - </ItemGroup> -</Project> \ No newline at end of file diff --git a/core/org.eclipse.cdt.core.win32/src/org/eclipse/cdt/internal/core/win32/WindowsRegistryImpl.java b/core/org.eclipse.cdt.core.win32/src/org/eclipse/cdt/internal/core/win32/WindowsRegistryImpl.java new file mode 100644 index 00000000000..dcb48a8fc7b --- /dev/null +++ b/core/org.eclipse.cdt.core.win32/src/org/eclipse/cdt/internal/core/win32/WindowsRegistryImpl.java @@ -0,0 +1,112 @@ +/******************************************************************************* + * Copyright (c) 2020 Torbjörn Svensson + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Torbjörn Svensson - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.win32; + +import org.eclipse.cdt.internal.core.natives.CNativePlugin; +import org.eclipse.cdt.utils.WindowsRegistry; + +import com.sun.jna.Native; +import com.sun.jna.platform.win32.Advapi32; +import com.sun.jna.platform.win32.Advapi32Util; +import com.sun.jna.platform.win32.Advapi32Util.EnumKey; +import com.sun.jna.platform.win32.W32Errors; +import com.sun.jna.platform.win32.Win32Exception; +import com.sun.jna.platform.win32.WinNT; +import com.sun.jna.platform.win32.WinReg; +import com.sun.jna.platform.win32.WinReg.HKEY; +import com.sun.jna.platform.win32.WinReg.HKEYByReference; +import com.sun.jna.ptr.IntByReference; + +/** + * @author Torbjörn Svensson + */ +public class WindowsRegistryImpl extends WindowsRegistry { + + @Override + public String getLocalMachineValue(String subkey, String name) { + return getValue(WinReg.HKEY_LOCAL_MACHINE, subkey, name); + } + + @Override + public String getLocalMachineValueName(String subkey, int index) { + return getValueName(WinReg.HKEY_LOCAL_MACHINE, subkey, index); + } + + @Override + public String getLocalMachineKeyName(String subkey, int index) { + return getKeyName(WinReg.HKEY_LOCAL_MACHINE, subkey, index); + } + + @Override + public String getCurrentUserValue(String subkey, String name) { + return getValue(WinReg.HKEY_CURRENT_USER, subkey, name); + } + + @Override + public String getCurrentUserValueName(String subkey, int index) { + return getValueName(WinReg.HKEY_CURRENT_USER, subkey, index); + } + + @Override + public String getCurrentUserKeyName(String subkey, int index) { + return getKeyName(WinReg.HKEY_CURRENT_USER, subkey, index); + } + + private String getValue(HKEY key, String subkey, String name) { + try { + return Advapi32Util.registryGetStringValue(key, subkey, name); + } catch (Win32Exception e) { + CNativePlugin.log(String.format("Unable to get value for %s in %s", name, subkey), e); //$NON-NLS-1$ + return null; + } + } + + private String getKeyName(HKEY key, String subkey, int index) { + try { + HKEYByReference phkKey = Advapi32Util.registryGetKey(key, subkey, WinNT.KEY_READ); + try { + EnumKey enumKey = Advapi32Util.registryRegEnumKey(phkKey.getValue(), index); + return Native.toString(enumKey.lpName); + } finally { + Advapi32Util.registryCloseKey(phkKey.getValue()); + } + } catch (Win32Exception e) { + CNativePlugin.log(String.format("Unable to get keyname for %s at index %d", subkey, index), e); //$NON-NLS-1$ + return null; + } + } + + private String getValueName(HKEY key, String subkey, int index) { + try { + HKEYByReference phkKey = Advapi32Util.registryGetKey(key, subkey, WinNT.KEY_READ); + try { + char[] lpValueName = new char[Advapi32.MAX_KEY_LENGTH]; + IntByReference lpcchValueName = new IntByReference(Advapi32.MAX_KEY_LENGTH); + int rc = Advapi32.INSTANCE.RegEnumValue(phkKey.getValue(), index, lpValueName, lpcchValueName, null, + null, null, null); + + if (rc != W32Errors.ERROR_SUCCESS) { + throw new Win32Exception(rc); + } + + return Native.toString(lpValueName); + } finally { + Advapi32Util.registryCloseKey(phkKey.getValue()); + } + } catch (Win32Exception e) { + CNativePlugin.log(String.format("Unable to get valuename for %s at index %d", subkey, index), e); //$NON-NLS-1$ + return null; + } + } +}