From ae3386243c7a81bab79a04840c689d984fc53b65 Mon Sep 17 00:00:00 2001 From: RĂ¼diger Timm Date: Mon, 9 Jun 2008 11:23:56 +0000 Subject: 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 --- cppuhelper/source/findsofficepath.c | 207 ++++++++++++++++++++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100644 cppuhelper/source/findsofficepath.c (limited to 'cppuhelper') diff --git a/cppuhelper/source/findsofficepath.c b/cppuhelper/source/findsofficepath.c new file mode 100644 index 000000000000..696935310066 --- /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 + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "precompiled_cppuhelper.hxx" +#include "sal/config.h" + +#include +#include + +#if defined WNT + +#define WIN32_LEAN_AND_MEAN +#include + +/* + * 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 + +/* + * Gets the installation path from the PATH environment variable. + * + *

An installation is found, if the executable 'soffice' or a symbolic link + * is in one of the directories listed in the PATH environment variable.

+ * + * @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; +} -- cgit v1.2.3