diff options
Diffstat (limited to 'framework/source/services/substitutepathvars.cxx')
-rw-r--r-- | framework/source/services/substitutepathvars.cxx | 1249 |
1 files changed, 1249 insertions, 0 deletions
diff --git a/framework/source/services/substitutepathvars.cxx b/framework/source/services/substitutepathvars.cxx new file mode 100644 index 000000000000..90c460b74298 --- /dev/null +++ b/framework/source/services/substitutepathvars.cxx @@ -0,0 +1,1249 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * 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. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_framework.hxx" + +//_________________________________________________________________________________________________________________ +// my own includes +//_________________________________________________________________________________________________________________ +#include "services/substitutepathvars.hxx" +#include <threadhelp/resetableguard.hxx> +#include <helper/networkdomain.hxx> +#include "services.h" + +//_________________________________________________________________________________________________________________ +// interface includes +//_________________________________________________________________________________________________________________ +#include <com/sun/star/beans/XPropertySet.hpp> + +//_________________________________________________________________________________________________________________ +// includes of other projects +//_________________________________________________________________________________________________________________ +#include <unotools/configitem.hxx> +#include <unotools/localfilehelper.hxx> +#include <unotools/configmgr.hxx> + +#ifndef _UTL_BOOTSTRAP_HXX_ +#include <unotools/bootstrap.hxx> +#endif +#include <osl/mutex.hxx> +#include <osl/file.hxx> +#include <osl/security.hxx> +#include <osl/socket.hxx> +#include <vos/process.hxx> +#include <i18npool/mslangid.hxx> +#include <tools/urlobj.hxx> +#include <tools/resmgr.hxx> +#include <tools/debug.hxx> +#include <tools/wldcrd.hxx> +#include <rtl/ustrbuf.hxx> +#include <rtl/bootstrap.hxx> + +#include <comphelper/configurationhelper.hxx> + +#include <string.h> + +//_________________________________________________________________________________________________________________ +// Defines +//_________________________________________________________________________________________________________________ +// + +#define STRPOS_NOTFOUND (sal_Int32)-1 + +#define ASCII_STR( val ) rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( val )) + +#define SEARCHPATH_DELIMITER ';' + +// Variable start/end characters +#define SIGN_STARTVARIABLE ASCII_STR("$(") +#define SIGN_ENDVARIABLE ASCII_STR(")") + +// Length of SUBSTITUTE_... to replace it with real values. +#define REPLACELENGTH_INST 7 +#define REPLACELENGTH_PROG 7 +#define REPLACELENGTH_USER 7 +#define REPLACELENGTH_WORK 7 +#define REPLACELENGTH_HOME 7 +#define REPLACELENGTH_TEMP 7 +#define REPLACELENGTH_PATH 7 +#define REPLACELENGTH_INSTPATH 11 +#define REPLACELENGTH_PROGPATH 11 +#define REPLACELENGTH_USERPATH 11 +#define REPLACELENGTH_INSTURL 10 +#define REPLACELENGTH_PROGURL 10 +#define REPLACELENGTH_USERURL 10 +#define REPLACELENGTH_PATH 7 +#define REPLACELENGTH_LANG 7 +#define REPLACELENGTH_LANGID 9 +#define REPLACELENGTH_VLANG 8 +#define REPLACELENGTH_WORKDIRURL 13 +// --> PB 2004-10-27 #i32656# - new variable of hierachy service +#define REPLACELENGTH_BASEINSTURL 14 +#define REPLACELENGTH_USERDATAURL 14 +// <-- + +// Name of the pre defined path variables +#define VARIABLE_INST "$(inst)" +#define VARIABLE_PROG "$(prog)" +#define VARIABLE_USER "$(user)" +#define VARIABLE_WORK "$(work)" +#define VARIABLE_HOME "$(home)" +#define VARIABLE_TEMP "$(temp)" +#define VARIABLE_PATH "$(path)" +#define VARIABLE_LANG "$(lang)" +#define VARIABLE_LANGID "$(langid)" +#define VARIABLE_VLANG "$(vlang)" +#define VARIABLE_INSTPATH "$(instpath)" +#define VARIABLE_PROGPATH "$(progpath)" +#define VARIABLE_USERPATH "$(userpath)" +#define VARIABLE_INSTURL "$(insturl)" +#define VARIABLE_PROGURL "$(progurl)" +#define VARIABLE_USERURL "$(userurl)" +#define VARIABLE_WORKDIRURL "$(workdirurl)" +// --> PB 2004-10-27 #i32656# - new variable of hierachy service +#define VARIABLE_BASEINSTURL "$(baseinsturl)" +#define VARIABLE_USERDATAURL "$(userdataurl)" +// <-- + +using namespace com::sun::star::uno; +using namespace com::sun::star::beans; +using namespace com::sun::star::util; +using namespace com::sun::star::lang; +using namespace com::sun::star::container; + +//_________________________________________________________________________________________________________________ +// Namespace +//_________________________________________________________________________________________________________________ +// + +namespace framework +{ + +struct FixedVariable +{ + const char* pVarName; + PreDefVariable nEnumValue; + int nStrLen; +}; + +struct TableEntry +{ + const char* pOSString; + int nStrLen; +}; + +// Table with valid operating system strings +// Name of the os as char* and the length +// of the string +static TableEntry aOSTable[OS_COUNT] = +{ + { "WINDOWS" , 7 }, + { "UNIX" , 4 }, + { "SOLARIS" , 7 }, + { "LINUX" , 5 }, + { "" , 0 } // unknown +}; + +// Table with valid environment variables +// Name of the environment type as a char* and +// the length of the string. +static TableEntry aEnvTable[ET_COUNT] = +{ + { "HOST" , 4 }, + { "YPDOMAIN" , 8 }, + { "DNSDOMAIN" , 9 }, + { "NTDOMAIN" , 8 }, + { "OS" , 2 }, + { "" , 0 } // unknown +}; + +// Priority table for the environment types. Lower numbers define +// a higher priority. Equal numbers has the same priority that means +// that the first match wins!! +static sal_Int16 aEnvPrioTable[ET_COUNT] = +{ + 1, // ET_HOST + 2, // ET_IPDOMAIN + 2, // ET_DNSDOMAIN + 2, // ET_NTDOMAIN + 3, // ET_OS + 99, // ET_UNKNOWN +}; + +// Table with all fixed/predefined variables supported. +static FixedVariable aFixedVarTable[] = +{ + { VARIABLE_INST, PREDEFVAR_INST, REPLACELENGTH_INST }, + { VARIABLE_PROG, PREDEFVAR_PROG, REPLACELENGTH_PROG }, + { VARIABLE_USER, PREDEFVAR_USER, REPLACELENGTH_USER }, + { VARIABLE_WORK, PREDEFVAR_WORK, REPLACELENGTH_WORK }, // Special variable (transient)! + { VARIABLE_HOME, PREDEFVAR_HOME, REPLACELENGTH_HOME }, + { VARIABLE_TEMP, PREDEFVAR_TEMP, REPLACELENGTH_TEMP }, + { VARIABLE_PATH, PREDEFVAR_PATH, REPLACELENGTH_PATH }, + { VARIABLE_LANG, PREDEFVAR_LANG, REPLACELENGTH_LANG }, + { VARIABLE_LANGID, PREDEFVAR_LANGID, REPLACELENGTH_LANGID }, + { VARIABLE_VLANG, PREDEFVAR_VLANG, REPLACELENGTH_VLANG }, + { VARIABLE_INSTPATH, PREDEFVAR_INSTPATH, REPLACELENGTH_INSTPATH }, + { VARIABLE_PROGPATH, PREDEFVAR_PROGPATH, REPLACELENGTH_PROGPATH }, + { VARIABLE_USERPATH, PREDEFVAR_USERPATH, REPLACELENGTH_USERPATH }, + { VARIABLE_INSTURL, PREDEFVAR_INSTURL, REPLACELENGTH_INSTURL }, + { VARIABLE_PROGURL, PREDEFVAR_PROGURL, REPLACELENGTH_PROGURL }, + { VARIABLE_USERURL, PREDEFVAR_USERURL, REPLACELENGTH_USERURL }, + { VARIABLE_WORKDIRURL, PREDEFVAR_WORKDIRURL, REPLACELENGTH_WORKDIRURL }, // Special variable (transient) and don't use for resubstitution! + // --> PB 2004-10-27 #i32656# - new variable of hierachy service + { VARIABLE_BASEINSTURL, PREDEFVAR_BASEINSTURL, REPLACELENGTH_BASEINSTURL }, + { VARIABLE_USERDATAURL, PREDEFVAR_USERDATAURL, REPLACELENGTH_USERDATAURL }, + // <-- + { "$(brandbaseurl)", PREDEFVAR_BRANDBASEURL, + RTL_CONSTASCII_LENGTH("$(brandbaseurl)") } +}; + +//_________________________________________________________________________________________________________________ +// Implementation helper classes +//_________________________________________________________________________________________________________________ +// + +OperatingSystem SubstitutePathVariables_Impl::GetOperatingSystemFromString( const rtl::OUString& aOSString ) +{ + for ( int i = 0; i < OS_COUNT; i++ ) + { + if ( aOSString.equalsIgnoreAsciiCaseAsciiL( aOSTable[i].pOSString, aOSTable[i].nStrLen )) + return (OperatingSystem)i; + } + + return OS_UNKNOWN; +} + +EnvironmentType SubstitutePathVariables_Impl::GetEnvTypeFromString( const rtl::OUString& aEnvTypeString ) +{ + for ( int i = 0; i < ET_COUNT; i++ ) + { + if ( aEnvTypeString.equalsIgnoreAsciiCaseAsciiL( aEnvTable[i].pOSString, aEnvTable[i].nStrLen )) + return (EnvironmentType)i; + } + + return ET_UNKNOWN; +} + +SubstitutePathVariables_Impl::SubstitutePathVariables_Impl( const Link& aNotifyLink ) : + utl::ConfigItem( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Office.Substitution" ))), + m_bYPDomainRetrieved( sal_False ), + m_bDNSDomainRetrieved( sal_False ), + m_bNTDomainRetrieved( sal_False ), + m_bHostRetrieved( sal_False ), + m_bOSRetrieved( sal_False ), + m_aListenerNotify( aNotifyLink ), + m_aSharePointsNodeName( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "SharePoints" ))), + m_aDirPropertyName( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/Directory" ))), + m_aEnvPropertyName( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/Environment" ))), + m_aLevelSep( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/" ))) +{ + // Enable notification mechanism + // We need it to get information about changes outside these class on our configuration branch + Sequence< rtl::OUString > aNotifySeq( 1 ); + aNotifySeq[0] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "SharePoints" )); + EnableNotification( aNotifySeq, sal_True ); +} + +SubstitutePathVariables_Impl::~SubstitutePathVariables_Impl() +{ +} + +void SubstitutePathVariables_Impl::GetSharePointsRules( SubstituteVariables& aSubstVarMap ) +{ + Sequence< rtl::OUString > aSharePointNames; + ReadSharePointsFromConfiguration( aSharePointNames ); + + if ( aSharePointNames.getLength() > 0 ) + { + sal_Int32 nSharePoints = 0; + + // Read SharePoints container from configuration + while ( nSharePoints < aSharePointNames.getLength() ) + { + rtl::OUString aSharePointNodeName( m_aSharePointsNodeName ); + aSharePointNodeName += rtl::OUString::createFromAscii( "/" ); + aSharePointNodeName += aSharePointNames[ nSharePoints ]; + + SubstituteRuleVector aRuleSet; + ReadSharePointRuleSetFromConfiguration( aSharePointNames[ nSharePoints ], aSharePointNodeName, aRuleSet ); + if ( !aRuleSet.empty() ) + { + // We have at minimum one rule. Filter the correct rule out of the rule set + // and put into our SubstituteVariable map + SubstituteRule aActiveRule; + if ( FilterRuleSet( aRuleSet, aActiveRule )) + { + // We have found an active rule + aActiveRule.aSubstVariable = aSharePointNames[ nSharePoints ]; + aSubstVarMap.insert( SubstituteVariables::value_type( + aActiveRule.aSubstVariable, aActiveRule )); + } + } + + ++nSharePoints; + } + } +} + +void SubstitutePathVariables_Impl::Notify( const com::sun::star::uno::Sequence< rtl::OUString >& /*aPropertyNames*/ ) +{ + // NOT implemented yet! +} + +void SubstitutePathVariables_Impl::Commit() +{ +} + + +//_________________________________________________________________________________________________________________ +// private methods +//_________________________________________________________________________________________________________________ +// + +OperatingSystem SubstitutePathVariables_Impl::GetOperatingSystem() +{ + if ( !m_bOSRetrieved ) + { +#ifdef SOLARIS + m_eOSType = OS_SOLARIS; +#elif defined LINUX + m_eOSType = OS_LINUX; +#elif defined WIN32 + m_eOSType = OS_WINDOWS; +#elif defined UNIX + m_eOSType = OS_UNIX; +#else + m_eOSType = OS_UNKNOWN; +#endif + m_bOSRetrieved = sal_True; + } + + return m_eOSType; +} + +const rtl::OUString& SubstitutePathVariables_Impl::GetYPDomainName() +{ + if ( !m_bYPDomainRetrieved ) + { + m_aYPDomain = NetworkDomain::GetYPDomainName().toAsciiLowerCase(); + m_bYPDomainRetrieved = sal_True; + } + + return m_aYPDomain; +} + +const rtl::OUString& SubstitutePathVariables_Impl::GetDNSDomainName() +{ + if ( !m_bDNSDomainRetrieved ) + { + rtl::OUString aTemp; + osl::SocketAddr aSockAddr; + oslSocketResult aResult; + + rtl::OUString aHostName = GetHostName(); + osl::SocketAddr::resolveHostname( aHostName, aSockAddr ); + aTemp = aSockAddr.getHostname( &aResult ); + + // DNS domain name begins after the first "." + sal_Int32 nIndex = aTemp.indexOf( '.' ); + if ( nIndex >= 0 && aTemp.getLength() > nIndex+1 ) + m_aDNSDomain = aTemp.copy( nIndex+1 ).toAsciiLowerCase(); + else + m_aDNSDomain = rtl::OUString(); + + m_bDNSDomainRetrieved = sal_True; + } + + return m_aDNSDomain; +} + +const rtl::OUString& SubstitutePathVariables_Impl::GetNTDomainName() +{ + if ( !m_bNTDomainRetrieved ) + { + m_aNTDomain = NetworkDomain::GetNTDomainName().toAsciiLowerCase(); + m_bNTDomainRetrieved = sal_True; + } + + return m_aNTDomain; +} + +const rtl::OUString& SubstitutePathVariables_Impl::GetHostName() +{ + if ( !m_bHostRetrieved ) + { + rtl::OUString aHostName; + oslSocketResult aSocketResult; + + m_aHost = osl::SocketAddr::getLocalHostname( &aSocketResult ).toAsciiLowerCase(); + } + + return m_aHost; +} + +sal_Bool SubstitutePathVariables_Impl::FilterRuleSet( const SubstituteRuleVector& aRuleSet, SubstituteRule& aActiveRule ) +{ + sal_Bool bResult = sal_False; + + if ( !aRuleSet.empty() ) + { + sal_Int16 nPrioCurrentRule = aEnvPrioTable[ ET_UNKNOWN ]; + const sal_uInt32 nCount = aRuleSet.size(); + for ( sal_uInt32 nIndex = 0; nIndex < nCount; nIndex++ ) + { + const SubstituteRule& aRule = aRuleSet[nIndex]; + EnvironmentType eEnvType = aRule.aEnvType; + + // Check if environment type has a higher priority than current one! + if ( nPrioCurrentRule > aEnvPrioTable[eEnvType] ) + { + switch ( eEnvType ) + { + case ET_HOST: + { + rtl::OUString aHost = GetHostName(); + rtl::OUString aHostStr; + aRule.aEnvValue >>= aHostStr; + aHostStr = aHostStr.toAsciiLowerCase(); + + // Pattern match if domain environment match + WildCard aPattern(aHostStr); + sal_Bool bMatch = aPattern.Matches(aHost); + if ( bMatch ) + { + aActiveRule = aRule; + bResult = sal_True; + nPrioCurrentRule = aEnvPrioTable[eEnvType]; + } + } + break; + + case ET_YPDOMAIN: + case ET_DNSDOMAIN: + case ET_NTDOMAIN: + { + rtl::OUString aDomain; + rtl::OUString aDomainStr; + aRule.aEnvValue >>= aDomainStr; + aDomainStr = aDomainStr.toAsciiLowerCase(); + + // Retrieve the correct domain value + if ( eEnvType == ET_YPDOMAIN ) + aDomain = GetYPDomainName(); + else if ( eEnvType == ET_DNSDOMAIN ) + aDomain = GetDNSDomainName(); + else + aDomain = GetNTDomainName(); + + // Pattern match if domain environment match + WildCard aPattern(aDomainStr); + sal_Bool bMatch = aPattern.Matches(aDomain); + if ( bMatch ) + { + aActiveRule = aRule; + bResult = sal_True; + nPrioCurrentRule = aEnvPrioTable[eEnvType]; + } + } + break; + + case ET_OS: + { + // No pattern matching for OS type + OperatingSystem eOSType = GetOperatingSystem(); + + sal_Int16 nValue = 0; + aRule.aEnvValue >>= nValue; + + sal_Bool bUnix = ( eOSType == OS_LINUX ) || ( eOSType == OS_SOLARIS ); + OperatingSystem eRuleOSType = (OperatingSystem)nValue; + + // Match if OS identical or rule is set to UNIX and OS is LINUX/SOLARIS! + if (( eRuleOSType == eOSType ) || ( eRuleOSType == OS_UNIX && bUnix )) + { + aActiveRule = aRule; + bResult = sal_True; + nPrioCurrentRule = aEnvPrioTable[eEnvType]; + } + } + break; + + case ET_UNKNOWN: // nothing to do + break; + + default: + break; + } + } + } + } + + return bResult; +} + +void SubstitutePathVariables_Impl::ReadSharePointsFromConfiguration( Sequence< rtl::OUString >& aSharePointsSeq ) +{ + //returns all the names of all share point nodes + aSharePointsSeq = GetNodeNames( m_aSharePointsNodeName ); +} + +void SubstitutePathVariables_Impl::ReadSharePointRuleSetFromConfiguration( + const rtl::OUString& aSharePointName, + const rtl::OUString& aSharePointNodeName, + SubstituteRuleVector& rRuleSet ) +{ + Sequence< rtl::OUString > aSharePointMappingsNodeNames = GetNodeNames( aSharePointNodeName, utl::CONFIG_NAME_LOCAL_PATH ); + + sal_Int32 nSharePointMapping = 0; + while ( nSharePointMapping < aSharePointMappingsNodeNames.getLength() ) + { + rtl::OUString aSharePointMapping( aSharePointNodeName ); + aSharePointMapping += m_aLevelSep; + aSharePointMapping += aSharePointMappingsNodeNames[ nSharePointMapping ]; + + // Read SharePointMapping + rtl::OUString aDirValue; + rtl::OUString aDirProperty( aSharePointMapping ); + aDirProperty += m_aDirPropertyName; + + // Read only the directory property + Sequence< rtl::OUString > aDirPropertySeq( 1 ); + aDirPropertySeq[0] = aDirProperty; + + Sequence< Any > aValueSeq = GetProperties( aDirPropertySeq ); + if ( aValueSeq.getLength() == 1 ) + aValueSeq[0] >>= aDirValue; + + // Read the environment setting + rtl::OUString aEnvUsed; + rtl::OUString aEnvProperty( aSharePointMapping ); + aEnvProperty += m_aEnvPropertyName; + Sequence< rtl::OUString > aEnvironmentVariable = GetNodeNames( aEnvProperty ); + + // Filter the property which has a value set + Sequence< rtl::OUString > aEnvUsedPropertySeq( aEnvironmentVariable.getLength() ); + + rtl::OUString aEnvUsePropNameTemplate( aEnvProperty ); + aEnvUsePropNameTemplate += m_aLevelSep; + + for ( sal_Int32 nProperty = 0; nProperty < aEnvironmentVariable.getLength(); nProperty++ ) + aEnvUsedPropertySeq[nProperty] = rtl::OUString( aEnvUsePropNameTemplate + aEnvironmentVariable[nProperty] ); + + Sequence< Any > aEnvUsedValueSeq; + aEnvUsedValueSeq = GetProperties( aEnvUsedPropertySeq ); + + rtl::OUString aEnvUsedValue; + for ( sal_Int32 nIndex = 0; nIndex < aEnvironmentVariable.getLength(); nIndex++ ) + { + if ( aEnvUsedValueSeq[nIndex] >>= aEnvUsedValue ) + { + aEnvUsed = aEnvironmentVariable[nIndex]; + break; + } + } + + // Decode the environment and optional the operatng system settings + Any aEnvValue; + EnvironmentType eEnvType = GetEnvTypeFromString( aEnvUsed ); + if ( eEnvType == ET_OS ) + { + OperatingSystem eOSType = GetOperatingSystemFromString( aEnvUsedValue ); + aEnvValue <<= (sal_Int16)eOSType; + } + else + aEnvValue <<= aEnvUsedValue; + + // Create rule struct and push it into the rule set + SubstituteRule aRule( aSharePointName, aDirValue, aEnvValue, eEnvType ); + rRuleSet.push_back( aRule ); + + ++nSharePointMapping; + } +} + +//***************************************************************************************************************** +// XInterface, XTypeProvider, XServiceInfo +//***************************************************************************************************************** +DEFINE_XSERVICEINFO_ONEINSTANCESERVICE ( SubstitutePathVariables , + ::cppu::OWeakObject , + SERVICENAME_SUBSTITUTEPATHVARIABLES , + IMPLEMENTATIONNAME_SUBSTITUTEPATHVARIABLES + ) + +DEFINE_INIT_SERVICE ( SubstitutePathVariables, {} ) + + +SubstitutePathVariables::SubstitutePathVariables( const Reference< XMultiServiceFactory >& xServiceManager ) : + ThreadHelpBase(), + m_aVarStart( SIGN_STARTVARIABLE ), + m_aVarEnd( SIGN_ENDVARIABLE ), + m_aImpl( LINK( this, SubstitutePathVariables, implts_ConfigurationNotify )), + m_xServiceManager( xServiceManager ) +{ + RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "SubstitutePathVariables::SubstitutePathVariables" ); + int i; + + SetPredefinedPathVariables( m_aPreDefVars ); + m_aImpl.GetSharePointsRules( m_aSubstVarMap ); + + // Init the predefined/fixed variable to index hash map + for ( i = 0; i < PREDEFVAR_COUNT; i++ ) + { + // Store variable name into struct of predefined/fixed variables + m_aPreDefVars.m_FixedVarNames[i] = rtl::OUString::createFromAscii( aFixedVarTable[i].pVarName ); + + // Create hash map entry + m_aPreDefVarMap.insert( VarNameToIndexMap::value_type( + m_aPreDefVars.m_FixedVarNames[i], aFixedVarTable[i].nEnumValue ) ); + } + + // Sort predefined/fixed variable to path length + for ( i = 0; i < PREDEFVAR_COUNT; i++ ) + { + if (( i != PREDEFVAR_WORKDIRURL ) && + ( i != PREDEFVAR_PATH )) + { + // Special path variables, don't include into automatic resubstituion search! + // $(workdirurl) is not allowed to resubstitute! This variable is the value of path settings entry + // and it could be possible that it will be resubstituted by itself!! + // Example: WORK_PATH=c:\test, $(workdirurl)=WORK_PATH => WORK_PATH=$(workdirurl) and this cannot be substituted! + ReSubstFixedVarOrder aFixedVar; + aFixedVar.eVariable = aFixedVarTable[i].nEnumValue; + aFixedVar.nVarValueLength = m_aPreDefVars.m_FixedVar[(sal_Int32)aFixedVar.eVariable].getLength(); + m_aReSubstFixedVarOrder.push_back( aFixedVar ); + } + } + m_aReSubstFixedVarOrder.sort(); + + // Sort user variables to path length + SubstituteVariables::const_iterator pIter; + for ( pIter = m_aSubstVarMap.begin(); pIter != m_aSubstVarMap.end(); pIter++ ) + { + ReSubstUserVarOrder aUserOrderVar; + rtl::OUStringBuffer aStrBuffer( pIter->second.aSubstVariable.getLength() ); + aStrBuffer.append( m_aVarStart ); + aStrBuffer.append( pIter->second.aSubstVariable ); + aStrBuffer.append( m_aVarEnd ); + aUserOrderVar.aVarName = aStrBuffer.makeStringAndClear(); + aUserOrderVar.nVarValueLength = pIter->second.aSubstVariable.getLength(); + m_aReSubstUserVarOrder.push_back( aUserOrderVar ); + } + m_aReSubstUserVarOrder.sort(); +} + +SubstitutePathVariables::~SubstitutePathVariables() +{ +} + +// XStringSubstitution +rtl::OUString SAL_CALL SubstitutePathVariables::substituteVariables( const ::rtl::OUString& aText, sal_Bool bSubstRequired ) +throw ( NoSuchElementException, RuntimeException ) +{ + RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "SubstitutePathVariables::substituteVariables" ); + ResetableGuard aLock( m_aLock ); + return impl_substituteVariable( aText, bSubstRequired ); +} + +rtl::OUString SAL_CALL SubstitutePathVariables::reSubstituteVariables( const ::rtl::OUString& aText ) +throw ( RuntimeException ) +{ + RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "SubstitutePathVariables::reSubstituteVariables" ); + ResetableGuard aLock( m_aLock ); + return impl_reSubstituteVariables( aText ); +} + +rtl::OUString SAL_CALL SubstitutePathVariables::getSubstituteVariableValue( const ::rtl::OUString& aVariable ) +throw ( NoSuchElementException, RuntimeException ) +{ + RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "SubstitutePathVariables::getSubstituteVariableValue" ); + ResetableGuard aLock( m_aLock ); + return impl_getSubstituteVariableValue( aVariable ); +} + +//_________________________________________________________________________________________________________________ +// protected methods +//_________________________________________________________________________________________________________________ +// + +IMPL_LINK( SubstitutePathVariables, implts_ConfigurationNotify, SubstitutePathNotify*, EMPTYARG ) +{ + /* SAFE AREA ----------------------------------------------------------------------------------------------- */ + ResetableGuard aLock( m_aLock ); + + return 0; +} + +rtl::OUString SubstitutePathVariables::ConvertOSLtoUCBURL( const rtl::OUString& aOSLCompliantURL ) const +{ + RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "SubstitutePathVariables::ConvertOSLtoUCBURL" ); + String aResult; + rtl::OUString aTemp; + + osl::FileBase::getSystemPathFromFileURL( aOSLCompliantURL, aTemp ); + utl::LocalFileHelper::ConvertPhysicalNameToURL( aTemp, aResult ); + + // Not all OSL URL's can be mapped to UCB URL's! + if ( aResult.Len() == 0 ) + return aOSLCompliantURL; + else + return rtl::OUString( aResult ); +} + +rtl::OUString SubstitutePathVariables::GetWorkPath() const +{ + RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "SubstitutePathVariables::GetWorkPath" ); + rtl::OUString aWorkPath; + ::comphelper::ConfigurationHelper::readDirectKey( + m_xServiceManager, + ::rtl::OUString::createFromAscii("org.openoffice.Office.Paths"), + ::rtl::OUString::createFromAscii("Paths/Work"), + ::rtl::OUString::createFromAscii("WritePath"), + ::comphelper::ConfigurationHelper::E_READONLY) >>= aWorkPath; + return aWorkPath; +} + +rtl::OUString SubstitutePathVariables::GetWorkVariableValue() const +{ + RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "SubstitutePathVariables::GetWorkVariableValue" ); + ::rtl::OUString aWorkPath; + ::comphelper::ConfigurationHelper::readDirectKey( + m_xServiceManager, + ::rtl::OUString::createFromAscii("org.openoffice.Office.Paths"), + ::rtl::OUString::createFromAscii("Variables"), + ::rtl::OUString::createFromAscii("Work"), + ::comphelper::ConfigurationHelper::E_READONLY) >>= aWorkPath; + + // fallback to $HOME in case platform dependend config layer does not return + // an usuable work dir value. + if (aWorkPath.getLength() < 1) + { + osl::Security aSecurity; + aSecurity.getHomeDir( aWorkPath ); + } + return ConvertOSLtoUCBURL( aWorkPath ); +} + +rtl::OUString SubstitutePathVariables::GetHomeVariableValue() const +{ + RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "SubstitutePathVariables::GetHomeVariableValue" ); + osl::Security aSecurity; + rtl::OUString aHomePath; + + aSecurity.getHomeDir( aHomePath ); + return ConvertOSLtoUCBURL( aHomePath ); +} + +rtl::OUString SubstitutePathVariables::GetPathVariableValue() const +{ + RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "SubstitutePathVariables::GetPathVariableValue" ); + const int PATH_EXTEND_FACTOR = 120; + + rtl::OUString aRetStr; + const char* pEnv = getenv( "PATH" ); + + if ( pEnv ) + { + rtl::OUString aTmp; + rtl::OUString aPathList( pEnv, strlen( pEnv ), gsl_getSystemTextEncoding() ); + rtl::OUStringBuffer aPathStrBuffer( aPathList.getLength() * PATH_EXTEND_FACTOR / 100 ); + + sal_Bool bAppendSep = sal_False; + sal_Int32 nToken = 0; + do + { + ::rtl::OUString sToken = aPathList.getToken(0, SAL_PATHSEPARATOR, nToken); + if (sToken.getLength()) + { + osl::FileBase::getFileURLFromSystemPath( sToken, aTmp ); + if ( bAppendSep ) + aPathStrBuffer.appendAscii( ";" ); // Office uses ';' as path separator + aPathStrBuffer.append( aTmp ); + bAppendSep = sal_True; + } + } + while(nToken>=0); + + aRetStr = aPathStrBuffer.makeStringAndClear(); + } + + return aRetStr; +} + +rtl::OUString SubstitutePathVariables::impl_substituteVariable( const ::rtl::OUString& rText, sal_Bool bSubstRequired ) +throw ( NoSuchElementException, RuntimeException ) +{ + RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "SubstitutePathVariables::impl_substituteVariable" ); + // This is maximal recursive depth supported! + const sal_Int32 nMaxRecursiveDepth = 8; + + rtl::OUString aWorkText = rText; + rtl::OUString aResult; + + // Use vector with strings to detect endless recursions! + std::vector< rtl::OUString > aEndlessRecursiveDetector; + + // Search for first occure of "$(...". + sal_Int32 nDepth = 0; + sal_Int32 bSubstitutionCompleted = sal_False; + sal_Int32 nPosition = aWorkText.indexOf( m_aVarStart ); // = first position of "$(" in string + sal_Int32 nLength = 0; // = count of letters from "$(" to ")" in string + sal_Bool bVarNotSubstituted = sal_False; + + // Have we found any variable like "$(...)"? + if ( nPosition != STRPOS_NOTFOUND ) + { + // Yes; Get length of found variable. + // If no ")" was found - nLength is set to 0 by default! see before. + sal_Int32 nEndPosition = aWorkText.indexOf( m_aVarEnd, nPosition ); + if ( nEndPosition != STRPOS_NOTFOUND ) + nLength = nEndPosition - nPosition + 1; + } + + // Is there something to replace ? + sal_Bool bWorkRetrieved = sal_False; + sal_Bool bWorkDirURLRetrieved = sal_False; + while ( !bSubstitutionCompleted && nDepth < nMaxRecursiveDepth ) + { + while ( ( nPosition != STRPOS_NOTFOUND ) && ( nLength > 3 ) ) // "$(" ")" + { + // YES; Get the next variable for replace. + sal_Int32 nReplaceLength = 0; + rtl::OUString aReplacement; + rtl::OUString aSubString = aWorkText.copy( nPosition, nLength ); + rtl::OUString aSubVarString; + + // Path variables are not case sensitive! + aSubVarString = aSubString.toAsciiLowerCase(); + VarNameToIndexMap::const_iterator pNTOIIter = m_aPreDefVarMap.find( aSubVarString ); + if ( pNTOIIter != m_aPreDefVarMap.end() ) + { + // Fixed/Predefined variable found + PreDefVariable nIndex = (PreDefVariable)pNTOIIter->second; + + // Determine variable value and length from array/table + if ( nIndex == PREDEFVAR_WORK && !bWorkRetrieved ) + { + // Transient value, retrieve it again + m_aPreDefVars.m_FixedVar[ (PreDefVariable)nIndex ] = GetWorkVariableValue(); + bWorkRetrieved = sal_True; + } + else if ( nIndex == PREDEFVAR_WORKDIRURL && !bWorkDirURLRetrieved ) + { + // Transient value, retrieve it again + m_aPreDefVars.m_FixedVar[ (PreDefVariable)nIndex ] = GetWorkPath(); + bWorkDirURLRetrieved = sal_True; + } + + aReplacement = m_aPreDefVars.m_FixedVar[ (PreDefVariable)nIndex ]; + nReplaceLength = nLength; + } + else + { + // Extract the variable name and try to find in the user defined variable set + rtl::OUString aVarName = aSubString.copy( 2, nLength-3 ); + SubstituteVariables::const_iterator pIter = m_aSubstVarMap.find( aVarName ); + if ( pIter != m_aSubstVarMap.end() ) + { + // found! + aReplacement = pIter->second.aSubstValue; + nReplaceLength = nLength; + } + } + + // Have we found something to replace? + if ( nReplaceLength > 0 ) + { + // Yes ... then do it. + aWorkText = aWorkText.replaceAt( nPosition, nReplaceLength, aReplacement ); + } + else + { + // Variable not known + bVarNotSubstituted = sal_False; + nPosition += nLength; + } + + // Step after replaced text! If no text was replaced (unknown variable!), + // length of aReplacement is 0 ... and we don't step then. + nPosition += aReplacement.getLength(); + + // We must control index in string before call something at OUString! + // The OUString-implementation don't do it for us :-( but the result is not defined otherwise. + if ( nPosition + 1 > aWorkText.getLength() ) + { + // Position is out of range. Break loop! + nPosition = STRPOS_NOTFOUND; + nLength = 0; + } + else + { + // Else; Position is valid. Search for next variable to replace. + nPosition = aWorkText.indexOf( m_aVarStart, nPosition ); + // Have we found any variable like "$(...)"? + if ( nPosition != STRPOS_NOTFOUND ) + { + // Yes; Get length of found variable. If no ")" was found - nLength must set to 0! + nLength = 0; + sal_Int32 nEndPosition = aWorkText.indexOf( m_aVarEnd, nPosition ); + if ( nEndPosition != STRPOS_NOTFOUND ) + nLength = nEndPosition - nPosition + 1; + } + } + } + + nPosition = aWorkText.indexOf( m_aVarStart ); + if ( nPosition == -1 ) + { + bSubstitutionCompleted = sal_True; + break; // All variables are substituted + } + else + { + // Check for recursion + const sal_uInt32 nCount = aEndlessRecursiveDetector.size(); + for ( sal_uInt32 i=0; i < nCount; i++ ) + { + if ( aEndlessRecursiveDetector[i] == aWorkText ) + { + if ( bVarNotSubstituted ) + break; // Not all variables could be substituted! + else + { + nDepth = nMaxRecursiveDepth; + break; // Recursion detected! + } + } + } + + aEndlessRecursiveDetector.push_back( aWorkText ); + + // Initialize values for next + sal_Int32 nEndPosition = aWorkText.indexOf( m_aVarEnd, nPosition ); + if ( nEndPosition != STRPOS_NOTFOUND ) + nLength = nEndPosition - nPosition + 1; + bVarNotSubstituted = sal_False; + ++nDepth; + } + } + + // Fill return value with result + if ( bSubstitutionCompleted ) + { + // Substitution successfull! + aResult = aWorkText; + } + else + { + // Substitution not successfull! + if ( nDepth == nMaxRecursiveDepth ) + { + // recursion depth reached! + if ( bSubstRequired ) + { + rtl::OUString aMsg( RTL_CONSTASCII_USTRINGPARAM( "Endless recursion detected. Cannot substitute variables!" )); + throw NoSuchElementException( aMsg, (cppu::OWeakObject *)this ); + } + else + aResult = rText; + } + else + { + // variable in text but unknwon! + if ( bSubstRequired ) + { + rtl::OUString aMsg( RTL_CONSTASCII_USTRINGPARAM( "Unknown variable found!" )); + throw NoSuchElementException( aMsg, (cppu::OWeakObject *)this ); + } + else + aResult = aWorkText; + } + } + + return aResult; +} + +rtl::OUString SubstitutePathVariables::impl_reSubstituteVariables( const ::rtl::OUString& rURL ) +throw ( RuntimeException ) +{ + RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "SubstitutePathVariables::impl_reSubstituteVariables" ); + rtl::OUString aURL; + + INetURLObject aUrl( rURL ); + if ( !aUrl.HasError() ) + aURL = aUrl.GetMainURL( INetURLObject::NO_DECODE ); + else + { + // Convert a system path to a UCB compliant URL before resubstitution + rtl::OUString aTemp; + if ( osl::FileBase::getFileURLFromSystemPath( rURL, aTemp ) == osl::FileBase::E_None ) + { + aTemp = ConvertOSLtoUCBURL( aTemp ); + if ( aTemp.getLength() ) + aURL = INetURLObject( aTemp ).GetMainURL( INetURLObject::NO_DECODE ); + else + return rURL; + } + else + { + // rURL is not a valid URL nor a osl system path. Give up and return error! + return rURL; + } + } + + // Due to a recursive definition this code must exchange variables with variables! + sal_Bool bResubstitutionCompleted = sal_False; + sal_Bool bVariableFound = sal_False; + + // Get transient predefined path variable $(work) value before starting resubstitution + m_aPreDefVars.m_FixedVar[ PREDEFVAR_WORK ] = GetWorkVariableValue(); + + while ( !bResubstitutionCompleted ) + { + ReSubstFixedVarOrderVector::const_iterator pIterFixed; + for ( pIterFixed = m_aReSubstFixedVarOrder.begin(); pIterFixed != m_aReSubstFixedVarOrder.end(); pIterFixed++ ) + { + rtl::OUString aValue = m_aPreDefVars.m_FixedVar[ (sal_Int32)pIterFixed->eVariable ]; + sal_Int32 nPos = aURL.indexOf( aValue ); + if ( nPos >= 0 ) + { + sal_Bool bMatch = sal_True; + if ( pIterFixed->eVariable == PREDEFVAR_LANG || + pIterFixed->eVariable == PREDEFVAR_LANGID || + pIterFixed->eVariable == PREDEFVAR_VLANG ) + { + // Special path variables as they can occur in the middle of a path. Only match if they + // describe a whole directory and not only a substring of a directory! + const sal_Unicode* pStr = aURL.getStr(); + + if ( nPos > 0 ) + bMatch = ( aURL[ nPos-1 ] == '/' ); + + if ( bMatch ) + { + if ( nPos + aValue.getLength() < aURL.getLength() ) + bMatch = ( pStr[ nPos + aValue.getLength() ] == '/' ); + } + } + + if ( bMatch ) + { + rtl::OUStringBuffer aStrBuffer( aURL.getLength() ); + aStrBuffer.append( aURL.copy( 0, nPos ) ); + aStrBuffer.append( m_aPreDefVars.m_FixedVarNames[ (sal_Int32)pIterFixed->eVariable ] ); // Get the variable name for struct var name array! + aStrBuffer.append( aURL.copy( nPos + aValue.getLength(), ( aURL.getLength() - ( nPos + aValue.getLength() )) )); + aURL = aStrBuffer.makeStringAndClear(); + bVariableFound = sal_True; // Resubstitution not finished yet! + break; + } + } + } + + // This part can be iteratered more than one time as variables can contain variables again! + ReSubstUserVarOrderVector::const_iterator pIterUser; + for ( pIterUser = m_aReSubstUserVarOrder.begin(); pIterUser != m_aReSubstUserVarOrder.end(); pIterUser++ ) + { + rtl::OUString aVarValue = pIterUser->aVarName; + sal_Int32 nPos = aURL.indexOf( aVarValue ); + if ( nPos >= 0 ) + { + rtl::OUStringBuffer aStrBuffer( aURL.getLength() ); + aStrBuffer.append( aURL.copy( 0, nPos ) ); + aStrBuffer.append( m_aVarStart ); + aStrBuffer.append( aVarValue ); + aStrBuffer.append( m_aVarEnd ); + aStrBuffer.append( aURL.copy( nPos + aVarValue.getLength(), ( aURL.getLength() - ( nPos + aVarValue.getLength() )) )); + aURL = aStrBuffer.makeStringAndClear(); + bVariableFound = sal_True; // Resubstitution not finished yet! + } + } + + if ( !bVariableFound ) + bResubstitutionCompleted = sal_True; + else + bVariableFound = sal_False; // Next resubstitution + } + + return aURL; +} + +// This method support both request schemes "$("<varname>")" or "<varname>". +::rtl::OUString SubstitutePathVariables::impl_getSubstituteVariableValue( const ::rtl::OUString& rVariable ) +throw ( NoSuchElementException, RuntimeException ) +{ + RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "SubstitutePathVariables::impl_getSubstituteVariableValue" ); + rtl::OUString aVariable; + + sal_Int32 nPos = rVariable.indexOf( m_aVarStart ); + if ( nPos == -1 ) + { + // Prepare variable name before hash map access + rtl::OUStringBuffer aStrBuffer( rVariable.getLength() + m_aVarStart.getLength() + m_aVarEnd.getLength() ); + aStrBuffer.append( m_aVarStart ); + aStrBuffer.append( rVariable ); + aStrBuffer.append( m_aVarEnd ); + aVariable = aStrBuffer.makeStringAndClear(); + } + + VarNameToIndexMap::const_iterator pNTOIIter = m_aPreDefVarMap.find( ( nPos == -1 ) ? aVariable : rVariable ); + + // Fixed/Predefined variable + if ( pNTOIIter != m_aPreDefVarMap.end() ) + { + PreDefVariable nIndex = (PreDefVariable)pNTOIIter->second; + return m_aPreDefVars.m_FixedVar[(sal_Int32)nIndex]; + } + else + { + // Prepare variable name before hash map access + if ( nPos >= 0 ) + { + if ( rVariable.getLength() > 3 ) + aVariable = rVariable.copy( 2, rVariable.getLength() - 3 ); + else + { + rtl::OUString aExceptionText( RTL_CONSTASCII_USTRINGPARAM( "Unknown variable!" )); + throw NoSuchElementException(); + } + } + else + aVariable = rVariable; + + // User defined variable + SubstituteVariables::const_iterator pIter = m_aSubstVarMap.find( aVariable ); + if ( pIter != m_aSubstVarMap.end() ) + { + // found! + return pIter->second.aSubstValue; + } + + rtl::OUString aExceptionText( RTL_CONSTASCII_USTRINGPARAM( "Unknown variable!" )); + throw NoSuchElementException( aExceptionText, (cppu::OWeakObject *)this ); + } +} + +void SubstitutePathVariables::SetPredefinedPathVariables( PredefinedPathVariables& aPreDefPathVariables ) +{ + RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "SubstitutePathVariables::SetPredefinedPathVariables" ); + Any aAny; + ::rtl::OUString aOfficePath; + ::rtl::OUString aUserPath; + ::rtl::OUString aTmp; + ::rtl::OUString aTmp2; + String aResult; + + // Get inspath and userpath from bootstrap mechanism in every case as file URL + ::utl::Bootstrap::PathStatus aState; + ::rtl::OUString sVal ; + + aState = utl::Bootstrap::locateBaseInstallation( sVal ); + if( aState==::utl::Bootstrap::PATH_EXISTS ) { + aPreDefPathVariables.m_FixedVar[ PREDEFVAR_INSTPATH ] = ConvertOSLtoUCBURL( sVal ); + } + else { + LOG_ERROR( "SubstitutePathVariables::SetPredefinedPathVariables", "Bootstrap code has no value for instpath!"); + } + + aState = utl::Bootstrap::locateUserData( sVal ); + if( aState == ::utl::Bootstrap::PATH_EXISTS ) { + aPreDefPathVariables.m_FixedVar[ PREDEFVAR_USERPATH ] = ConvertOSLtoUCBURL( sVal ); + } + else { + LOG_ERROR( "SubstitutePathVariables::SetPredefinedPathVariables", "Bootstrap code has no value for userpath"); + } + + // Set $(inst), $(instpath), $(insturl) + aPreDefPathVariables.m_FixedVar[ PREDEFVAR_INSTURL ] = aPreDefPathVariables.m_FixedVar[ PREDEFVAR_INSTPATH ]; + aPreDefPathVariables.m_FixedVar[ PREDEFVAR_INST ] = aPreDefPathVariables.m_FixedVar[ PREDEFVAR_INSTPATH ]; + // --> PB 2004-10-27 #i32656# - new variable of hierachy service + aPreDefPathVariables.m_FixedVar[ PREDEFVAR_BASEINSTURL ]= aPreDefPathVariables.m_FixedVar[ PREDEFVAR_INSTPATH ]; + // <-- + + // Set $(user), $(userpath), $(userurl) + aPreDefPathVariables.m_FixedVar[ PREDEFVAR_USERURL ] = aPreDefPathVariables.m_FixedVar[ PREDEFVAR_USERPATH ]; + aPreDefPathVariables.m_FixedVar[ PREDEFVAR_USER ] = aPreDefPathVariables.m_FixedVar[ PREDEFVAR_USERPATH ]; + // --> PB 2004-11-11 #i32656# - new variable of hierachy service + aPreDefPathVariables.m_FixedVar[ PREDEFVAR_USERDATAURL ]= aPreDefPathVariables.m_FixedVar[ PREDEFVAR_USERPATH ]; + // <-- + + // Detect the program directory + // Set $(prog), $(progpath), $(progurl) + INetURLObject aProgObj( + aPreDefPathVariables.m_FixedVar[ PREDEFVAR_INSTPATH ] ); + if ( !aProgObj.HasError() && + aProgObj.insertName( + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("program")) ) ) + { + aPreDefPathVariables.m_FixedVar[ PREDEFVAR_PROGPATH ] = aProgObj.GetMainURL(INetURLObject::NO_DECODE); + aPreDefPathVariables.m_FixedVar[ PREDEFVAR_PROGURL ] = aPreDefPathVariables.m_FixedVar[ PREDEFVAR_PROGPATH ]; + aPreDefPathVariables.m_FixedVar[ PREDEFVAR_PROG ] = aPreDefPathVariables.m_FixedVar[ PREDEFVAR_PROGPATH ]; + } + + // Detect the language type of the current office + aPreDefPathVariables.m_eLanguageType = LANGUAGE_ENGLISH_US; + rtl::OUString aLocaleStr; + if ( utl::ConfigManager::GetConfigManager()->GetDirectConfigProperty( utl::ConfigManager::LOCALE ) >>= aLocaleStr ) + aPreDefPathVariables.m_eLanguageType = MsLangId::convertIsoStringToLanguage( aLocaleStr ); + else + { + LOG_ERROR( "SubstitutePathVariables::SetPredefinedPathVariables", "Wrong Any type for language!" ); + } + + // Set $(lang) + aPreDefPathVariables.m_FixedVar[ PREDEFVAR_LANG ] = ConvertOSLtoUCBURL( + rtl::OUString::createFromAscii( ResMgr::GetLang( aPreDefPathVariables.m_eLanguageType, 0 ) )); + // Set $(vlang) + aPreDefPathVariables.m_FixedVar[ PREDEFVAR_VLANG ] = aLocaleStr; + + // Set $(langid) + aPreDefPathVariables.m_FixedVar[ PREDEFVAR_LANGID ] = rtl::OUString::valueOf( (sal_Int32)aPreDefPathVariables.m_eLanguageType ); + + // Set the other pre defined path variables + // Set $(work) + aPreDefPathVariables.m_FixedVar[ PREDEFVAR_WORK ] = GetWorkVariableValue(); + aPreDefPathVariables.m_FixedVar[ PREDEFVAR_HOME ] = GetHomeVariableValue(); + + // Set $(workdirurl) this is the value of the path PATH_WORK which doesn't make sense + // anymore because the path settings service has this value! It can deliver this value more + // quickly than the substitution service! + aPreDefPathVariables.m_FixedVar[ PREDEFVAR_WORKDIRURL ] = GetWorkPath(); + + // Set $(path) variable + aPreDefPathVariables.m_FixedVar[ PREDEFVAR_PATH ] = GetPathVariableValue(); + + // Set $(temp) + osl::FileBase::getTempDirURL( aTmp ); + aPreDefPathVariables.m_FixedVar[ PREDEFVAR_TEMP ] = ConvertOSLtoUCBURL( aTmp ); + + aPreDefPathVariables.m_FixedVar[PREDEFVAR_BRANDBASEURL] = rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM("$BRAND_BASE_DIR")); + rtl::Bootstrap::expandMacros( + aPreDefPathVariables.m_FixedVar[PREDEFVAR_BRANDBASEURL]); +} + +} // namespace framework |