summaryrefslogtreecommitdiff
path: root/cppuhelper
diff options
context:
space:
mode:
authorRĂ¼diger Timm <rt@openoffice.org>2008-06-09 11:23:56 +0000
committerRĂ¼diger Timm <rt@openoffice.org>2008-06-09 11:23:56 +0000
commitf3e0fce63ca8e5fac5ff2996cd09dda2064a2f77 (patch)
treeb234f7e9ec2e82764ecf4286c04c322b8ed3f634 /cppuhelper
parent2b780279bae727affa69337e3ccf390565f90d77 (diff)
INTEGRATION: CWS sb87 (1.1.2); FILE ADDED
2008/04/24 11:52:15 sb 1.1.2.1: #i88687# extracted cppuhelper_detail_findSofficePath from odk/source/unoapploader
Diffstat (limited to 'cppuhelper')
-rw-r--r--cppuhelper/source/findsofficepath.c207
1 files changed, 207 insertions, 0 deletions
diff --git a/cppuhelper/source/findsofficepath.c b/cppuhelper/source/findsofficepath.c
new file mode 100644
index 000000000..abc35d172
--- /dev/null
+++ b/cppuhelper/source/findsofficepath.c
@@ -0,0 +1,207 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: findsofficepath.c,v $
+ * $Revision: 1.2 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "precompiled_cppuhelper.hxx"
+#include "sal/config.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#if defined WNT
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+/*
+ * Gets the installation path from the Windows Registry for the specified
+ * registry key.
+ *
+ * @param hroot open handle to predefined root registry key
+ * @param subKeyName name of the subkey to open
+ *
+ * @return the installation path or NULL, if no installation was found or
+ * if an error occured
+ */
+static char* getPathFromRegistryKey( HKEY hroot, const char* subKeyName )
+{
+ HKEY hkey;
+ DWORD type;
+ char* data = NULL;
+ DWORD size;
+
+ /* open the specified registry key */
+ if ( RegOpenKeyEx( hroot, subKeyName, 0, KEY_READ, &hkey ) != ERROR_SUCCESS )
+ {
+ return NULL;
+ }
+
+ /* find the type and size of the default value */
+ if ( RegQueryValueEx( hkey, NULL, NULL, &type, NULL, &size) != ERROR_SUCCESS )
+ {
+ RegCloseKey( hkey );
+ return NULL;
+ }
+
+ /* get memory to hold the default value */
+ data = (char*) malloc( size );
+
+ /* read the default value */
+ if ( RegQueryValueEx( hkey, NULL, NULL, &type, (LPBYTE) data, &size ) != ERROR_SUCCESS )
+ {
+ RegCloseKey( hkey );
+ return NULL;
+ }
+
+ /* release registry key handle */
+ RegCloseKey( hkey );
+
+ return data;
+}
+
+/*
+ * Gets the installation path from the Windows Registry.
+ *
+ * @return the installation path or NULL, if no installation was found or
+ * if an error occured
+ */
+static char* platformSpecific()
+{
+ const char* SUBKEYNAME = "Software\\OpenOffice.org\\UNO\\InstallPath";
+
+ char* path = NULL;
+
+ /* read the key's default value from HKEY_CURRENT_USER */
+ path = getPathFromRegistryKey( HKEY_CURRENT_USER, SUBKEYNAME );
+
+ if ( path == NULL )
+ {
+ /* read the key's default value from HKEY_LOCAL_MACHINE */
+ path = getPathFromRegistryKey( HKEY_LOCAL_MACHINE, SUBKEYNAME );
+ }
+
+ return path;
+}
+
+#else
+
+#include <unistd.h>
+
+/*
+ * Gets the installation path from the PATH environment variable.
+ *
+ * <p>An installation is found, if the executable 'soffice' or a symbolic link
+ * is in one of the directories listed in the PATH environment variable.</p>
+ *
+ * @return the installation path or NULL, if no installation was found or
+ * if an error occured
+ */
+static char* platformSpecific()
+{
+ const int SEPARATOR = '/';
+ const char* PATHSEPARATOR = ":";
+ const char* PATHVARNAME = "PATH";
+ const char* APPENDIX = "/soffice";
+
+ char* path = NULL;
+ char* env = NULL;
+ char* str = NULL;
+ char* dir = NULL;
+ char* file = NULL;
+ char* resolved = NULL;
+ char* sep = NULL;
+
+ char buffer[1024];
+ int pos;
+
+ /* get the value of the PATH environment variable */
+ env = getenv( PATHVARNAME );
+ str = (char*) malloc( strlen( env ) + 1 );
+ strcpy( str, env );
+
+ /* get the tokens separated by ':' */
+ dir = strtok( str, PATHSEPARATOR );
+
+ while ( dir )
+ {
+ /* construct soffice file path */
+ file = (char*) malloc( strlen( dir ) + strlen( APPENDIX ) + 1 );
+ strcpy( file, dir );
+ strcat( file, APPENDIX );
+
+ /* check existence of soffice file */
+ if ( !access( file, F_OK ) )
+ {
+ /* resolve symbolic link */
+ resolved = realpath( file, buffer );
+
+ if ( resolved != NULL )
+ {
+ /* get path to program directory */
+ sep = strrchr( resolved, SEPARATOR );
+
+ if ( sep != NULL )
+ {
+ pos = sep - resolved;
+ path = (char*) malloc( pos + 1 );
+ strncpy( path, resolved, pos );
+ path[ pos ] = '\0';
+ free( file );
+ break;
+ }
+ }
+ }
+
+ dir = strtok( NULL, PATHSEPARATOR );
+ free( file );
+ }
+
+ free( str );
+
+ return path;
+}
+
+#endif
+
+char const* cppuhelper_detail_findSofficePath()
+{
+ const char* UNOPATHVARNAME = "UNO_PATH";
+
+ char* path = NULL;
+
+ /* get the installation path from the UNO_PATH environment variable */
+ path = getenv( UNOPATHVARNAME );
+
+ if ( path == NULL || strlen( path ) == 0 )
+ {
+ path = platformSpecific();
+ }
+
+ return path;
+}