/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_comphelper.hxx" #include "comphelper_module.hxx" /************************************************************************** TODO ************************************************************************** *************************************************************************/ #include "osl/file.hxx" #include "com/sun/star/beans/XPropertySet.hpp" #include "com/sun/star/util/XMacroExpander.hpp" #include "officeinstallationdirectories.hxx" using namespace com::sun::star; using namespace comphelper; //========================================================================= // helpers //========================================================================= //========================================================================= static bool makeCanonicalFileURL( rtl::OUString & rURL ) { OSL_ENSURE( rURL.matchAsciiL( "file:", sizeof( "file:" ) - 1 , 0 ) , "File URL expected!" ); rtl::OUString aNormalizedURL; if ( osl::FileBase::getAbsoluteFileURL( rtl::OUString(), rURL, aNormalizedURL ) == osl::DirectoryItem::E_None ) { osl::DirectoryItem aDirItem; if ( osl::DirectoryItem::get( aNormalizedURL, aDirItem ) == osl::DirectoryItem::E_None ) { osl::FileStatus aFileStatus( FileStatusMask_FileURL ); if ( aDirItem.getFileStatus( aFileStatus ) == osl::DirectoryItem::E_None ) { aNormalizedURL = aFileStatus.getFileURL(); if ( !aNormalizedURL.isEmpty() ) { if ( aNormalizedURL .getStr()[ aNormalizedURL.getLength() - 1 ] != sal_Unicode( '/' ) ) rURL = aNormalizedURL; else rURL = aNormalizedURL .copy( 0, aNormalizedURL.getLength() - 1 ); return true; } } } } return false; } //========================================================================= //========================================================================= // // OfficeInstallationDirectories Implementation. // //========================================================================= //========================================================================= OfficeInstallationDirectories::OfficeInstallationDirectories( const uno::Reference< uno::XComponentContext > & xCtx ) : m_aOfficeBrandDirMacro( RTL_CONSTASCII_USTRINGPARAM( "$(brandbaseurl)" ) ), m_aOfficeBaseDirMacro( RTL_CONSTASCII_USTRINGPARAM( "$(baseinsturl)" ) ), m_aUserDirMacro( RTL_CONSTASCII_USTRINGPARAM( "$(userdataurl)" ) ), m_xCtx( xCtx ), m_pOfficeBrandDir( 0 ), m_pOfficeBaseDir( 0 ), m_pUserDir( 0 ) { } //========================================================================= // virtual OfficeInstallationDirectories::~OfficeInstallationDirectories() { delete m_pOfficeBrandDir; delete m_pOfficeBaseDir; delete m_pUserDir; } //========================================================================= // util::XOfficeInstallationDirectories //========================================================================= // virtual rtl::OUString SAL_CALL OfficeInstallationDirectories::getOfficeInstallationDirectoryURL() throw ( uno::RuntimeException ) { initDirs(); return rtl::OUString( *m_pOfficeBrandDir ); } //========================================================================= // virtual rtl::OUString SAL_CALL OfficeInstallationDirectories::getOfficeUserDataDirectoryURL() throw ( uno::RuntimeException ) { initDirs(); return rtl::OUString( *m_pUserDir ); } //========================================================================= // virtual rtl::OUString SAL_CALL OfficeInstallationDirectories::makeRelocatableURL( const rtl::OUString& URL ) throw ( uno::RuntimeException ) { if ( !URL.isEmpty() ) { initDirs(); rtl::OUString aCanonicalURL( URL ); makeCanonicalFileURL( aCanonicalURL ); sal_Int32 nIndex = aCanonicalURL.indexOf( *m_pOfficeBrandDir ); if ( nIndex != -1 ) { return rtl::OUString( URL.replaceAt( nIndex, m_pOfficeBrandDir->getLength(), m_aOfficeBrandDirMacro ) ); } else { nIndex = aCanonicalURL.indexOf( *m_pOfficeBaseDir ); if ( nIndex != -1 ) { return rtl::OUString( URL.replaceAt( nIndex, m_pOfficeBaseDir->getLength(), m_aOfficeBaseDirMacro ) ); } else { nIndex = aCanonicalURL.indexOf( *m_pUserDir ); if ( nIndex != -1 ) { return rtl::OUString( URL.replaceAt( nIndex, m_pUserDir->getLength(), m_aUserDirMacro ) ); } } } } return rtl::OUString( URL ); } //========================================================================= // virtual rtl::OUString SAL_CALL OfficeInstallationDirectories::makeAbsoluteURL( const rtl::OUString& URL ) throw ( uno::RuntimeException ) { if ( !URL.isEmpty() ) { sal_Int32 nIndex = URL.indexOf( m_aOfficeBrandDirMacro ); if ( nIndex != -1 ) { initDirs(); return rtl::OUString( URL.replaceAt( nIndex, m_aOfficeBrandDirMacro.getLength(), *m_pOfficeBrandDir ) ); } else { nIndex = URL.indexOf( m_aOfficeBaseDirMacro ); if ( nIndex != -1 ) { initDirs(); return rtl::OUString( URL.replaceAt( nIndex, m_aOfficeBaseDirMacro.getLength(), *m_pOfficeBaseDir ) ); } else { nIndex = URL.indexOf( m_aUserDirMacro ); if ( nIndex != -1 ) { initDirs(); return rtl::OUString( URL.replaceAt( nIndex, m_aUserDirMacro.getLength(), *m_pUserDir ) ); } } } } return rtl::OUString( URL ); } //========================================================================= // lang::XServiceInfo //========================================================================= // virtual rtl::OUString SAL_CALL OfficeInstallationDirectories::getImplementationName() throw ( uno::RuntimeException ) { return getImplementationName_static(); } //========================================================================= // virtual sal_Bool SAL_CALL OfficeInstallationDirectories::supportsService( const rtl::OUString& ServiceName ) throw ( uno::RuntimeException ) { const uno::Sequence< rtl::OUString > & aNames = getSupportedServiceNames(); const rtl::OUString * p = aNames.getConstArray(); for ( sal_Int32 nPos = 0; nPos < aNames.getLength(); nPos++ ) { if ( p[ nPos ].equals( ServiceName ) ) return sal_True; } return sal_False; } //========================================================================= // virtual uno::Sequence< ::rtl::OUString > SAL_CALL OfficeInstallationDirectories::getSupportedServiceNames() throw ( uno::RuntimeException ) { return getSupportedServiceNames_static(); } //========================================================================= // static rtl::OUString SAL_CALL OfficeInstallationDirectories::getImplementationName_static() { return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.util.OfficeInstallationDirectories" ) ); } //========================================================================= // static uno::Sequence< ::rtl::OUString > SAL_CALL OfficeInstallationDirectories::getSupportedServiceNames_static() { const rtl::OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.util.OfficeInstallationDirectories" ) ); return uno::Sequence< rtl::OUString >( &aServiceName, 1 ); } //========================================================================= // static rtl::OUString SAL_CALL OfficeInstallationDirectories::getSingletonName_static() { return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.util.theOfficeInstallationDirectories" ) ); } //========================================================================= // static uno::Reference< uno::XInterface > SAL_CALL OfficeInstallationDirectories::Create( const uno::Reference< uno::XComponentContext > & rxContext ) { return static_cast< cppu::OWeakObject * >( new OfficeInstallationDirectories( rxContext ) ); } //========================================================================= // non-UNO //========================================================================= void OfficeInstallationDirectories::initDirs() { if ( m_pOfficeBrandDir == 0 ) { osl::MutexGuard aGuard( m_aMutex ); if ( m_pOfficeBrandDir == 0 ) { m_pOfficeBrandDir = new rtl::OUString; m_pOfficeBaseDir = new rtl::OUString; m_pUserDir = new rtl::OUString; uno::Reference< util::XMacroExpander > xExpander; m_xCtx->getValueByName( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/singletons/com.sun.star.util.theMacroExpander" ) ) ) >>= xExpander; OSL_ENSURE( xExpander.is(), "Unable to obtain macro expander singleton!" ); if ( xExpander.is() ) { *m_pOfficeBrandDir = xExpander->expandMacros( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "$OOO_BASE_DIR" ) ) ); OSL_ENSURE( !m_pOfficeBrandDir->isEmpty(), "Unable to obtain office brand installation directory!" ); makeCanonicalFileURL( *m_pOfficeBrandDir ); *m_pOfficeBaseDir = *m_pOfficeBrandDir; // xExpander->expandMacros( // rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( // "${$OOO_BASE_DIR/program/" SAL_CONFIGFILE( "bootstrap" ) ":BaseInstallation}" ) ) ); // OSL_ENSURE( m_pOfficeBaseDir->getLength() > 0, // "Unable to obtain office base installation directory!" ); makeCanonicalFileURL( *m_pOfficeBaseDir ); *m_pUserDir = xExpander->expandMacros( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "${$OOO_BASE_DIR/program/" SAL_CONFIGFILE( "bootstrap" ) ":UserInstallation}" ) ) ); OSL_ENSURE( !m_pUserDir->isEmpty(), "Unable to obtain office user data directory!" ); makeCanonicalFileURL( *m_pUserDir ); } } } } void createRegistryInfo_OfficeInstallationDirectories() { static ::comphelper::module::OSingletonRegistration< OfficeInstallationDirectories > aAutoRegistration; }