summaryrefslogtreecommitdiffstats
path: root/odk/source/com/sun/star/lib/loader
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2020-12-03 08:12:23 +0100
committerStephan Bergmann <sbergman@redhat.com>2020-12-03 15:01:00 +0100
commit01241113947fc7bd7f7b765dd897bb023c8ca99c (patch)
treec224f9afa42e961d9b22fd66530276ed7b7ae410 /odk/source/com/sun/star/lib/loader
parentdrop SfxViewFrame::Current() guard (diff)
downloadcore-01241113947fc7bd7f7b765dd897bb023c8ca99c.tar.gz
core-01241113947fc7bd7f7b765dd897bb023c8ca99c.zip
Replace unowinreg.dll with execution of `reg QUERY`
The SDK's <https://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Java/ Transparent_Use_of_Office_UNO_Components> on all platforms included the Windows- specific unowinreg.dll in generated jars (so that those jars, when distributed to a Windows environment, would find a LO installation by inspecting the Windows registry). That unowinreg.dll was originally built as a 32-bit DLL (though when building a 64-bit Windows LO, it happened to be built as a 64-bit DLL). For non-Windows LO builds, it could either be built locally with a MinGW toolchain (--enable-build-unowinreg) or downloaded from dev-www.libreoffice.org. However, that had various issues: For one, unowinreg.dll was not necessarily available in a distributed jar as a 64-bit DLL for use with a 64-bit JRE on Windows. (Theoretically, running such a jar with a 32-bit JRE to access a 64-bit LO installation's URE jars could have worked. But practically, those URE jars in turn require native DLLs, which would then not have been available as 32-bit DLLs for use in the 32-bit JRE.) For another, at least the unowinreg.dll resulting from --enable-build-unowinreg on Fedora 33 would have had a dependency on libgcc_s_dw2-1.dll that would generally not have been available in a target Windows environment. There appears to be no pure Java way to read the Windows registry, but instead of using a native code DLL for that, it appears to work just as well to call out to reg.exe and parse its output. This removes the --enable-build-unowinreg and --with-mingw-cross-compiler configuration options. (The sole use of the MinGW toolchain in LO was for building unowinreg.dll.) Change-Id: I3283ea38c884d3221a205e5ab6ec99a2691ef474 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107140 Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> Reviewed-by: Stephan Bergmann <sbergman@redhat.com> Tested-by: Jenkins
Diffstat (limited to 'odk/source/com/sun/star/lib/loader')
-rw-r--r--odk/source/com/sun/star/lib/loader/InstallationFinder.java10
-rw-r--r--odk/source/com/sun/star/lib/loader/WinRegKey.java199
-rw-r--r--odk/source/com/sun/star/lib/loader/WinRegKeyException.java4
3 files changed, 45 insertions, 168 deletions
diff --git a/odk/source/com/sun/star/lib/loader/InstallationFinder.java b/odk/source/com/sun/star/lib/loader/InstallationFinder.java
index 77c0424f5e4a..8178e0670781 100644
--- a/odk/source/com/sun/star/lib/loader/InstallationFinder.java
+++ b/odk/source/com/sun/star/lib/loader/InstallationFinder.java
@@ -189,20 +189,20 @@ final class InstallationFinder {
*/
private static String getPathFromWindowsRegistry() {
- final String SUBKEYNAME = "Software\\LibreOffice\\UNO\\InstallPath";
+ final String SUBKEYNAME = "\\Software\\LibreOffice\\UNO\\InstallPath";
String path = null;
try {
// read the key's default value from HKEY_CURRENT_USER
- WinRegKey key = new WinRegKey( "HKEY_CURRENT_USER", SUBKEYNAME );
- path = key.getStringValue( "" ); // default
+ WinRegKey key = new WinRegKey( "HKEY_CURRENT_USER" + SUBKEYNAME );
+ path = key.getStringValue();
} catch ( WinRegKeyException e ) {
try {
// read the key's default value from HKEY_LOCAL_MACHINE
- WinRegKey key = new WinRegKey( "HKEY_LOCAL_MACHINE",
+ WinRegKey key = new WinRegKey( "HKEY_LOCAL_MACHINE" +
SUBKEYNAME );
- path = key.getStringValue( "" ); // default
+ path = key.getStringValue();
} catch ( WinRegKeyException we ) {
System.err.println( "com.sun.star.lib.loader." +
"InstallationFinder::getPathFromWindowsRegistry: " +
diff --git a/odk/source/com/sun/star/lib/loader/WinRegKey.java b/odk/source/com/sun/star/lib/loader/WinRegKey.java
index 12cfc45ba293..bdbcced68afa 100644
--- a/odk/source/com/sun/star/lib/loader/WinRegKey.java
+++ b/odk/source/com/sun/star/lib/loader/WinRegKey.java
@@ -19,185 +19,62 @@
package com.sun.star.lib.loader;
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.InputStream;
-
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/**
* This class provides functionality for reading string values from the
- * Windows Registry. It requires the native library unowinreg.dll.
+ * Windows Registry.
*/
final class WinRegKey {
- private final String m_rootKeyName;
- private final String m_subKeyName;
-
- // native methods to access the windows registry
- private static native boolean winreg_RegOpenClassesRoot( long[] hkresult );
- private static native boolean winreg_RegOpenCurrentConfig(
- long[] hkresult );
- private static native boolean winreg_RegOpenCurrentUser( long[] hkresult );
- private static native boolean winreg_RegOpenLocalMachine( long[] hkresult );
- private static native boolean winreg_RegOpenUsers( long[] hkresult );
- private static native boolean winreg_RegOpenKeyEx( long parent, String name,
- long[] hkresult );
- private static native boolean winreg_RegCloseKey( long hkey );
- private static native boolean winreg_RegQueryValueEx(
- long hkey, String value, long[] type,
- byte[] data, long[] size );
- private static native boolean winreg_RegQueryInfoKey(
- long hkey, long[] subkeys, long[] maxSubkeyLen,
- long[] values, long[] maxValueNameLen,
- long[] maxValueLen, long[] secDescriptor );
-
- // load the native library unowinreg.dll
- static {
- try {
- ClassLoader cl = WinRegKey.class.getClassLoader();
- InputStream is = cl.getResourceAsStream( "win/unowinreg.dll" );
- if ( is != null ) {
- // generate a temporary name for lib file and write to temp
- // location
- File libfile;
- BufferedInputStream istream = null;
- BufferedOutputStream ostream = null;
- try {
- istream = new BufferedInputStream( is );
- libfile = File.createTempFile( "unowinreg", ".dll" );
- libfile.deleteOnExit(); // ensure deletion
- ostream = new BufferedOutputStream(
- new FileOutputStream( libfile ) );
- int bsize = 2048; int n = 0;
- byte[] buffer = new byte[bsize];
- while ( ( n = istream.read( buffer, 0, bsize ) ) != -1 ) {
- ostream.write( buffer, 0, n );
- }
- } finally {
- if (istream != null) {
- istream.close();
- }
- if (ostream != null) {
- ostream.close();
- }
- }
- // load library
- System.load( libfile.getPath() );
- } else {
- // If the library cannot be found as a class loader resource,
- // try the global System.loadLibrary(). The JVM will look for
- // it in the java.library.path.
- System.loadLibrary( "unowinreg" );
- }
- } catch ( java.lang.Exception e ) {
- System.err.println( "com.sun.star.lib.loader.WinRegKey: " +
- "loading of native library failed!" + e );
- }
- }
+ private final String m_keyName;
/**
* Constructs a <code>WinRegKey</code>.
*/
- public WinRegKey( String rootKeyName, String subKeyName ) {
- m_rootKeyName = rootKeyName;
- m_subKeyName = subKeyName;
- }
-
- /**
- * Reads a string value for the specified value name.
- */
- public String getStringValue( String valueName ) throws WinRegKeyException {
- byte[] data = getValue( valueName );
- // remove terminating null character
- return new String( data, 0, data.length - 1 );
+ public WinRegKey( String keyName ) {
+ m_keyName = keyName;
}
/**
- * Reads a value for the specified value name.
+ * Reads the default string value.
*/
- private byte[] getValue( String valueName ) throws WinRegKeyException {
-
- byte[] result = null;
- long[] hkey = {0};
-
- // open the specified registry key
- boolean bRet = false;
- long[] hroot = {0};
- if ( m_rootKeyName.equals( "HKEY_CLASSES_ROOT" ) ) {
- bRet = winreg_RegOpenClassesRoot( hroot );
- } else if ( m_rootKeyName.equals( "HKEY_CURRENT_CONFIG" ) ) {
- bRet = winreg_RegOpenCurrentConfig( hroot );
- } else if ( m_rootKeyName.equals( "HKEY_CURRENT_USER" ) ) {
- bRet = winreg_RegOpenCurrentUser( hroot );
- } else if ( m_rootKeyName.equals( "HKEY_LOCAL_MACHINE" ) ) {
- bRet = winreg_RegOpenLocalMachine( hroot );
- } else if ( m_rootKeyName.equals( "HKEY_USERS" ) ) {
- bRet = winreg_RegOpenUsers( hroot );
- } else {
- throw new WinRegKeyException( "unknown root registry key!");
- }
- if ( !bRet ) {
- throw new WinRegKeyException( "opening root registry key " +
- "failed!" );
- }
- if ( !winreg_RegOpenKeyEx( hroot[0], m_subKeyName, hkey ) ) {
- if ( !winreg_RegCloseKey( hroot[0] ) ) {
- throw new WinRegKeyException( "opening registry key and " +
- "releasing root registry key handle failed!" );
+ public String getStringValue() throws WinRegKeyException {
+ try {
+ Process p = Runtime.getRuntime().exec(new String[]{"reg", "QUERY", m_keyName});
+ BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
+ String v = null;
+ Pattern pt = Pattern.compile("\\s+\\(Default\\)\\s+REG_SZ\\s+(.+)");
+ for (;;) {
+ String s = r.readLine();
+ if (s == null) {
+ break;
+ }
+ Matcher m = pt.matcher(s);
+ if (m.matches()) {
+ if (v != null) {
+ throw new WinRegKeyException("reg QUERY did not provided expected output");
+ }
+ v = m.group(1);
+ }
}
- throw new WinRegKeyException( "opening registry key failed!" );
- }
-
- // get the size of the longest data component among the key's values
- long[] subkeys = {0};
- long[] maxSubkeyLen = {0};
- long[] values = {0};
- long[] maxValueNameLen = {0};
- long[] maxValueLen = {0};
- long[] secDescriptor = {0};
- if ( !winreg_RegQueryInfoKey( hkey[0], subkeys, maxSubkeyLen,
- values, maxValueNameLen, maxValueLen, secDescriptor ) ) {
- if ( !winreg_RegCloseKey( hkey[0] ) ||
- !winreg_RegCloseKey( hroot[0] ) ) {
- throw new WinRegKeyException( "retrieving information about " +
- "the registry key and releasing registry key handles " +
- "failed!" );
+ p.waitFor();
+ int e = p.exitValue();
+ if (e != 0) {
+ throw new WinRegKeyException("reg QUERY exited with " + e);
}
- throw new WinRegKeyException( "retrieving information about " +
- "the registry key failed!" );
- }
-
- // get the data for the specified value name
- byte[] buffer = new byte[ (int) maxValueLen[0] ];
- long[] size = new long[1];
- size[0] = buffer.length;
- long[] type = new long[1];
- type[0] = 0;
- if ( !winreg_RegQueryValueEx( hkey[0], valueName, type, buffer,
- size ) ) {
- if ( !winreg_RegCloseKey( hkey[0] ) ||
- !winreg_RegCloseKey( hroot[0] ) ) {
- throw new WinRegKeyException( "retrieving data for the " +
- "specified value name and releasing registry key handles " +
- "failed!" );
+ if (v == null) {
+ throw new WinRegKeyException("reg QUERY did not provided expected output");
}
- throw new WinRegKeyException( "retrieving data for the " +
- "specified value name failed!" );
+ return v;
+ } catch (WinRegKeyException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new WinRegKeyException(e);
}
-
- // release registry key handles
- if ( !winreg_RegCloseKey( hkey[0] ) ||
- !winreg_RegCloseKey( hroot[0] ) ) {
- throw new WinRegKeyException( "releasing registry key handles " +
- "failed!" );
- }
-
- result = new byte[ (int) size[0] ];
- System.arraycopy( buffer, 0, result, 0, (int)size[0] );
-
- return result;
}
}
diff --git a/odk/source/com/sun/star/lib/loader/WinRegKeyException.java b/odk/source/com/sun/star/lib/loader/WinRegKeyException.java
index aee93c06ee85..56abc7536062 100644
--- a/odk/source/com/sun/star/lib/loader/WinRegKeyException.java
+++ b/odk/source/com/sun/star/lib/loader/WinRegKeyException.java
@@ -27,8 +27,8 @@ final class WinRegKeyException extends java.lang.Exception {
/**
* Constructs a <code>WinRegKeyException</code>.
*/
- public WinRegKeyException() {
- super();
+ public WinRegKeyException(Throwable cause) {
+ super(cause);
}
/**