cmcfixes76: #i112656# osl_setEnvironment/osl_clearEnvironment

This commit is contained in:
Caol?n McNamara
2010-06-24 20:59:17 +01:00
parent 5394e06d44
commit 7add7926ef
7 changed files with 207 additions and 22 deletions

View File

@@ -66,10 +66,6 @@ using com::sun::star::container::XSet;
using com::sun::star::container::XContentEnumerationAccess;
using com::sun::star::container::XEnumeration;
#ifdef SAL_W32
#define putenv _putenv
#endif
namespace {
OUString replacePrefix(OUString const & url, OUString const & prefix) {
@@ -313,14 +309,9 @@ sal_Bool parseOptions(int ac, char* av[], Options& rOptions, sal_Bool bCmdFile)
i++;
if( i < ac )
{
// leak this string as some platforms assume to own
// the pointer
sal_Char * p = (sal_Char *) rtl_allocateMemory( 13+ strlen( av[i] ) );
p[0] = 0;
strcat( p, "CLASSPATH=" ); // #100211# - checked
strcat( p, av[i] ); // #100211# - checked
putenv( p );
rtl::OUString envVar(RTL_CONSTASCII_USTRINGPARAM("CLASSPATH"));
rtl::OUString envValue(av[i], strlen(av[i]), osl_getThreadTextEncoding());
osl_setEnvironment(envVar.pData, envValue.pData);
}
break;
}

View File

@@ -123,8 +123,7 @@ static void setPythonHome ( const OUString & pythonHome )
static void prependPythonPath( const OUString & pythonPathBootstrap )
{
rtl::OStringBuffer bufPYTHONPATH( 256 );
bufPYTHONPATH.append( "PYTHONPATH=");
rtl::OUStringBuffer bufPYTHONPATH( 256 );
sal_Int32 nIndex = 0;
while( 1 )
{
@@ -140,7 +139,7 @@ static void prependPythonPath( const OUString & pythonPathBootstrap )
}
OUString systemPath;
osl_getSystemPathFromFileURL( fileUrl.pData, &(systemPath.pData) );
bufPYTHONPATH.append( rtl::OUStringToOString( systemPath.pData, osl_getThreadTextEncoding() ));
bufPYTHONPATH.append( systemPath );
bufPYTHONPATH.append( SAL_PATHSEPARATOR );
if( nNew == -1 )
break;
@@ -148,13 +147,11 @@ static void prependPythonPath( const OUString & pythonPathBootstrap )
}
const char * oldEnv = getenv( "PYTHONPATH");
if( oldEnv )
bufPYTHONPATH.append( oldEnv );
OString result = bufPYTHONPATH.makeStringAndClear();
rtl_string_acquire( result.pData );
// printf( "Setting %s\n" , result.pData->buffer );
putenv( result.pData->buffer );
bufPYTHONPATH.append( rtl::OUString(oldEnv, strlen(oldEnv), osl_getThreadTextEncoding()) );
rtl::OUString envVar(RTL_CONSTASCII_USTRINGPARAM("PYTHONPATH"));
rtl::OUString envValue(bufPYTHONPATH.makeStringAndClear());
osl_setEnvironment(envVar.pData, envValue.pData);
}
Reference< XInterface > CreateInstance( const Reference< XComponentContext > & ctx )

View File

@@ -388,6 +388,21 @@ void SAL_CALL osl_setCommandArgs (int argc, char **argv);
*/
oslProcessError SAL_CALL osl_getEnvironment(rtl_uString *strVar, rtl_uString **strValue);
/** Set the value of one enviroment variable.
@param strVar [in] denotes the name of the variable to set.
@param strValue [in] string of the new value of environment variable.
@since UDK 3.2.13
*/
oslProcessError SAL_CALL osl_setEnvironment(rtl_uString *strVar, rtl_uString *strValue);
/** Unsets the value of one enviroment variable.
@param strVar [in] denotes the name of the variable to unset.
@since UDK 3.2.13
*/
oslProcessError SAL_CALL osl_clearEnvironment(rtl_uString *strVar);
/** Get the working directory of the current process as a file URL.
The file URL is encoded as common for the OSL file API.

View File

@@ -281,6 +281,70 @@ oslProcessError SAL_CALL osl_getEnvironment(rtl_uString* pustrEnvVar, rtl_uStrin
return (result);
}
/***************************************
osl_setEnvironment().
**************************************/
oslProcessError SAL_CALL osl_setEnvironment(rtl_uString* pustrEnvVar, rtl_uString* pustrValue)
{
oslProcessError result = osl_Process_E_Unknown;
rtl_TextEncoding encoding = osl_getThreadTextEncoding();
rtl_String* pstr_env_var = 0;
rtl_String* pstr_val = 0;
OSL_PRECOND(pustrEnvVar, "osl_setEnvironment(): Invalid parameter");
OSL_PRECOND(pustrValue, "osl_setEnvironment(): Invalid parameter");
rtl_uString2String(
&pstr_env_var,
rtl_uString_getStr(pustrEnvVar), rtl_uString_getLength(pustrEnvVar), encoding,
OUSTRING_TO_OSTRING_CVTFLAGS);
rtl_uString2String(
&pstr_val,
rtl_uString_getStr(pustrValue), rtl_uString_getLength(pustrValue), encoding,
OUSTRING_TO_OSTRING_CVTFLAGS);
if (pstr_env_var != 0 && pstr_val != 0)
{
if (setenv(rtl_string_getStr(pstr_env_var), rtl_string_getStr(pstr_val), 1) == 0)
result = osl_Process_E_None;
}
if (pstr_val != 0)
rtl_string_release(pstr_val);
if (pstr_env_var != 0)
rtl_string_release(pstr_env_var);
return (result);
}
/***************************************
osl_clearEnvironment().
**************************************/
oslProcessError SAL_CALL osl_clearEnvironment(rtl_uString* pustrEnvVar)
{
oslProcessError result = osl_Process_E_Unknown;
rtl_TextEncoding encoding = osl_getThreadTextEncoding();
rtl_String* pstr_env_var = 0;
OSL_PRECOND(pustrEnvVar, "osl_setEnvironment(): Invalid parameter");
rtl_uString2String(
&pstr_env_var,
rtl_uString_getStr(pustrEnvVar), rtl_uString_getLength(pustrEnvVar), encoding,
OUSTRING_TO_OSTRING_CVTFLAGS);
if (pstr_env_var)
{
if (unsetenv(rtl_string_getStr(pstr_env_var)) == 0)
result = osl_Process_E_None;
rtl_string_release(pstr_env_var);
}
return (result);
}
/***************************************
osl_getProcessWorkingDir().
**************************************/

View File

@@ -50,10 +50,11 @@
#define INCLUDED_STRING_H
#endif
#include "osl/diagnose.h"
#include <osl/file.h>
#include "osl/file.h"
#include "osl/module.h"
#include "osl/thread.h"
#include "rtl/ustring.hxx"
#include "rtl/strbuf.h"
#ifndef _OSL_FILE_PATH_HELPER_H_
#include "file_path_helper.h"
@@ -323,6 +324,100 @@ oslProcessError SAL_CALL osl_getEnvironment(rtl_uString* pustrEnvVar, rtl_uStrin
return (result);
}
/***************************************
osl_setEnvironment().
**************************************/
oslProcessError SAL_CALL osl_setEnvironment(rtl_uString* pustrEnvVar, rtl_uString* pustrValue)
{
oslProcessError result = osl_Process_E_Unknown;
rtl_TextEncoding encoding = osl_getThreadTextEncoding();
rtl_String* pstr_env_var = 0;
rtl_String* pstr_val = 0;
OSL_PRECOND(pustrEnvVar, "osl_setEnvironment(): Invalid parameter");
OSL_PRECOND(pustrValue, "osl_setEnvironment(): Invalid parameter");
rtl_uString2String(
&pstr_env_var,
rtl_uString_getStr(pustrEnvVar), rtl_uString_getLength(pustrEnvVar), encoding,
OUSTRING_TO_OSTRING_CVTFLAGS);
rtl_uString2String(
&pstr_val,
rtl_uString_getStr(pustrValue), rtl_uString_getLength(pustrValue), encoding,
OUSTRING_TO_OSTRING_CVTFLAGS);
if (pstr_env_var != 0 && pstr_val != 0)
{
#if defined (SOLARIS)
rtl_String * pBuffer;
sal_Int32 nCapacity = rtl_stringbuffer_newFromStringBuffer( &pBuffer,
rtl_string_getLength(pstr_env_var) + rtl_string_getLength(pstr_val) + 1,
pstr_env_var );
rtl_stringbuffer_insert( &pBuffer, &nCapacity, pBuffer->length, "=", 1);
rtl_stringbuffer_insert( &pBuffer, &nCapacity, pBuffer->length,
rtl_string_getStr(pstr_val), rtl_string_getLength(pstr_val) );
rtl_string_acquire(pBuffer); // argument to putenv must leak
if (putenv(rtl_string_getStr(pBuffer)) == 0)
result = osl_Process_E_None;
#else
if (setenv(rtl_string_getStr(pstr_env_var), rtl_string_getStr(pstr_val), 1) == 0)
result = osl_Process_E_None;
#endif
}
if (pstr_val)
rtl_string_release(pstr_val);
if (pstr_env_var != 0)
rtl_string_release(pstr_env_var);
return (result);
}
/***************************************
osl_clearEnvironment().
**************************************/
oslProcessError SAL_CALL osl_clearEnvironment(rtl_uString* pustrEnvVar)
{
oslProcessError result = osl_Process_E_Unknown;
rtl_TextEncoding encoding = osl_getThreadTextEncoding();
rtl_String* pstr_env_var = 0;
OSL_PRECOND(pustrEnvVar, "osl_setEnvironment(): Invalid parameter");
rtl_uString2String(
&pstr_env_var,
rtl_uString_getStr(pustrEnvVar), rtl_uString_getLength(pustrEnvVar), encoding,
OUSTRING_TO_OSTRING_CVTFLAGS);
if (pstr_env_var)
{
#if defined (SOLARIS)
rtl_String * pBuffer;
sal_Int32 nCapacity = rtl_stringbuffer_newFromStringBuffer( &pBuffer,
rtl_string_getLength(pstr_env_var) + 1, pstr_env_var );
rtl_stringbuffer_insert( &pBuffer, &nCapacity, pBuffer->length, "=", 1);
rtl_string_acquire(pBuffer); // argument to putenv must leak
if (putenv(rtl_string_getStr(pBuffer)) == 0)
result = osl_Process_E_None;
#else
if (unsetenv(rtl_string_getStr(pstr_env_var)) == 0)
result = osl_Process_E_None;
#endif
rtl_string_release(pstr_env_var);
}
return (result);
}
/***************************************
osl_getProcessWorkingDir().
**************************************/

View File

@@ -413,6 +413,22 @@ oslProcessError SAL_CALL osl_getEnvironment(rtl_uString *ustrVar, rtl_uString **
return osl_Process_E_Unknown;
}
oslProcessError SAL_CALL osl_setEnvironment(rtl_uString *ustrVar, rtl_uString *ustrValue)
{
if (SetEnvironmentVariableW(ustrVar->buffer, ustrValue->buffer))
return osl_Process_E_None;
return osl_Process_E_Unknown;
}
oslProcessError SAL_CALL osl_clearEnvironment(rtl_uString *ustrVar)
{
//If the second parameter is NULL, the variable is deleted from the current
//process's environment.
if (SetEnvironmentVariableW(ustrVar->buffer, NULL))
return osl_Process_E_None;
return osl_Process_E_Unknown;
}
/***************************************************************************
* Current Working Directory.
***************************************************************************/

View File

@@ -597,6 +597,13 @@ UDK_3.10 { # OOo 3.2
rtl_math_acosh;
} UDK_3.9;
UDK_3.11 { # OOo 3.4
global:
osl_setEnvironment;
osl_clearEnvironment;
} UDK_3.10;
PRIVATE_1.0 {
global:
osl_detail_ObjectRegistry_storeAddresses;