/************************************************************************* * * $RCSfile: prov.cxx,v $ * * $Revision: 1.10 $ * * last change: $Author: sb $ $Date: 2000-12-15 08:29:59 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses * * - GNU Lesser General Public License Version 2.1 * - Sun Industry Standards Source License Version 1.1 * * Sun Microsystems Inc., October, 2000 * * GNU Lesser General Public License Version 2.1 * ============================================= * Copyright 2000 by Sun Microsystems, Inc. * 901 San Antonio Road, Palo Alto, CA 94303, USA * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library 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 for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * * Sun Industry Standards Source License Version 1.1 * ================================================= * The contents of this file are subject to the Sun Industry Standards * Source License Version 1.1 (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.openoffice.org/license.html. * * Software provided under this License is provided on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. * See the License for the specific provisions governing your rights and * obligations concerning the Software. * * The Initial Developer of the Original Code is: Sun Microsystems, Inc. * * Copyright: 2000 by Sun Microsystems, Inc. * * All Rights Reserved. * * Contributor(s): _______________________________________ * * ************************************************************************/ #ifndef _OSL_FILE_HXX_ #include <osl/file.hxx> #endif #ifndef _OSL_SOCKET_H_ #include <osl/socket.h> #endif #ifndef _VOS_DIAGNOSE_HXX_ #include <vos/diagnose.hxx> #endif #ifndef _CPPUHELPER_FACTORY_HXX_ #include <cppuhelper/factory.hxx> #endif #ifndef _COM_SUN_STAR_REGISTRY_XREGISTRYKEY_HPP_ #include <com/sun/star/registry/XRegistryKey.hpp> #endif #ifndef COM_SUN_STAR_CONTAINER_XHIERARCHICALNAMEACCESS_HPP_ #include <com/sun/star/container/XHierarchicalNameAccess.hpp> #endif #ifndef _COM_SUN_STAR_FRAME_XCONFIGMANAGER_HPP_ #include <com/sun/star/frame/XConfigManager.hpp> #endif #ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBBUTE_HPP_ #include <com/sun/star/beans/PropertyAttribute.hpp> #endif #ifndef _COM_SUN_STAR_UCB_FILESYSTEMNOTATION_HPP_ #include <com/sun/star/ucb/FileSystemNotation.hpp> #endif #ifndef _COM_SUN_STAR_BEANS_PROPERTYSTATE_HPP_ #include <com/sun/star/beans/PropertyState.hpp> #endif #ifndef _FILID_HXX_ #include "filid.hxx" #endif #ifndef _SHELL_HXX_ #include "shell.hxx" #endif #ifndef _BC_HXX_ #include "bc.hxx" #endif #ifndef _PROV_HXX_ #include "prov.hxx" #endif using namespace fileaccess; using namespace com::sun::star; using namespace com::sun::star::ucb; //========================================================================= static sal_Bool writeInfo( void * pRegistryKey, const rtl::OUString & rImplementationName, uno::Sequence< rtl::OUString > const & rServiceNames ) { rtl::OUString aKeyName( rtl::OUString::createFromAscii( "/" ) ); aKeyName += rImplementationName; aKeyName += rtl::OUString::createFromAscii( "/UNO/SERVICES" ); uno::Reference< registry::XRegistryKey > xKey; try { xKey = static_cast< registry::XRegistryKey * >( pRegistryKey )->createKey( aKeyName ); } catch ( registry::InvalidRegistryException const & ) { } if ( !xKey.is() ) return sal_False; sal_Bool bSuccess = sal_True; for ( sal_Int32 n = 0; n < rServiceNames.getLength(); ++n ) { try { xKey->createKey( rServiceNames[ n ] ); } catch ( registry::InvalidRegistryException const & ) { bSuccess = sal_False; break; } } return bSuccess; } //========================================================================= extern "C" void SAL_CALL component_getImplementationEnvironment( const sal_Char ** ppEnvTypeName, uno_Environment ** ppEnv ) { *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; } //========================================================================= extern "C" sal_Bool SAL_CALL component_writeInfo( void * pServiceManager, void * pRegistryKey ) { return pRegistryKey && ////////////////////////////////////////////////////////////////////// // File Content Provider. ////////////////////////////////////////////////////////////////////// writeInfo( pRegistryKey, fileaccess::shell::getImplementationName_static(), fileaccess::shell::getSupportedServiceNames_static() ); } //========================================================================= extern "C" void * SAL_CALL component_getFactory( const sal_Char * pImplName, void * pServiceManager, void * pRegistryKey ) { void * pRet = 0; uno::Reference< lang::XMultiServiceFactory > xSMgr( reinterpret_cast< lang::XMultiServiceFactory * >( pServiceManager ) ); uno::Reference< lang::XSingleServiceFactory > xFactory; ////////////////////////////////////////////////////////////////////// // File Content Provider. ////////////////////////////////////////////////////////////////////// if ( fileaccess::shell::getImplementationName_static(). compareToAscii( pImplName ) == 0 ) { xFactory = FileProvider::createServiceFactory( xSMgr ); } ////////////////////////////////////////////////////////////////////// if ( xFactory.is() ) { xFactory->acquire(); pRet = xFactory.get(); } return pRet; } /****************************************************************************/ /* */ /* */ /* FileProvider */ /* */ /* */ /****************************************************************************/ #ifdef UNX extern "C" oslFileError osl_getRealPath(rtl_uString* strPath, rtl_uString** strRealPath); #endif FileProvider::FileProvider( const uno::Reference< lang::XMultiServiceFactory >& xMultiServiceFactory ) : m_xMultiServiceFactory( xMultiServiceFactory ), m_pMyShell( 0 ) { if( ! m_pMyShell ) m_pMyShell = new shell( m_xMultiServiceFactory, this ); try { rtl::OUString sProviderService = rtl::OUString::createFromAscii( "com.sun.star.configuration.ConfigurationProvider" ); // New access to configuration with locally cached components rtl::OUString plugin = rtl::OUString::createFromAscii( "plugin" ); uno::Any aAny; aAny <<= plugin; beans::PropertyValue aProp( rtl::OUString::createFromAscii( "servertype" ), -1, aAny, beans::PropertyState_DIRECT_VALUE ); uno::Sequence< uno::Any > seq(1); seq[0] <<= aProp; uno::Reference< lang::XMultiServiceFactory > sProvider( m_xMultiServiceFactory->createInstanceWithArguments( sProviderService,seq ), uno::UNO_QUERY ); /* // Old access to configuration without locally cached components uno::Reference< lang::XMultiServiceFactory > sProvider( m_xMultiServiceFactory->createInstance( sProviderService ), uno::UNO_QUERY ); */ rtl::OUString sReaderService = rtl::OUString::createFromAscii( "com.sun.star.configuration.ConfigurationAccess" ); uno::Sequence< uno::Any > aArguments( 1 ); #if SUPD > 604 aArguments[0] <<= rtl::OUString::createFromAscii( "org.openoffice.Security" ); #else aArguments[0] <<= rtl::OUString::createFromAscii( "com.sun.star.Security" ); #endif uno::Reference< container::XHierarchicalNameAccess > xHierAccess( sProvider->createInstanceWithArguments( sReaderService,aArguments ), uno::UNO_QUERY ); uno::Reference< container::XNameAccess > xSubNode( xHierAccess,uno::UNO_QUERY ); rtl::OUString d = rtl::OUString::createFromAscii( "Directory" ); rtl::OUString a = rtl::OUString::createFromAscii( "AliasName" ); rtl::OUString aRootDirectory; if( xSubNode.is() ) { uno::Reference< frame::XConfigManager > xCfgMgr( m_xMultiServiceFactory->createInstance( rtl::OUString::createFromAscii( "com.sun.star.config.SpecialConfigManager" ) ), uno::UNO_QUERY ); uno::Any aAny = xSubNode->getByName( rtl::OUString::createFromAscii("MountPoints" ) ); uno::Reference< container::XNameAccess > xSubSubNode; aAny >>= xSubSubNode; uno::Sequence< rtl::OUString > seqNames = xSubSubNode->getElementNames(); for( sal_Int32 k = 0; k < seqNames.getLength(); ++k ) { uno::Any nocheinany = xSubSubNode->getByName( seqNames[k] ); uno::Reference< container::XNameAccess > xAuaAuaAuaNode; nocheinany >>= xAuaAuaAuaNode; uno::Any vorletztesany = xAuaAuaAuaNode->getByName( d ); rtl::OUString aDirectory; vorletztesany >>= aDirectory; uno::Any letztesany = xAuaAuaAuaNode->getByName( a ); rtl::OUString aAliasName; letztesany >>= aAliasName; VOS_ENSURE( xCfgMgr.is(), "FileProvider::FileProvider - No Config Manager!" ); rtl::OUString aUnqDir; rtl::OUString aUnqAl; if ( xCfgMgr.is() ) { // Substitute path variables, like "$(user)". rtl::OUString aDir = xCfgMgr->substituteVariables( aDirectory ); // old,assuming URL: osl::FileBase::getNormalizedPathFromFileURL( aDir, aUnqDir ); // new, assuming system path: osl::FileBase::normalizePath( aDir,aUnqDir ); rtl::OUString aAlias = xCfgMgr->substituteVariables( aAliasName ); // old, assuming URL: osl::FileBase::getNormalizedPathFromFileURL( aAlias, aUnqAl ); // new, assuming system path: osl::FileBase::normalizePath( aAlias,aUnqAl ); } if ( !aUnqDir.getLength() ) osl::FileBase::normalizePath( aDirectory,aUnqDir ); // m_pMyShell->getUnqFromUrl( aDirectory,aUnqDir ); if ( !aUnqAl.getLength() ) osl::FileBase::normalizePath( aAliasName,aUnqAl ); // m_pMyShell->getUnqFromUrl( aAliasName,aUnqAl ); #ifdef UNX rtl::OUString aRealUnqDir; rtl::OUString aRealUnqAlias; osl_getRealPath( aUnqDir.pData, &aRealUnqDir.pData ); osl_getRealPath( aUnqAl.pData, &aRealUnqAlias.pData ); if ( !aRealUnqAlias.getLength() ) aRealUnqAlias = aUnqAl; if ( aRealUnqDir.getLength() && aRealUnqAlias.getLength() ) { m_pMyShell->m_vecMountPoint.push_back( shell::MountPoint( aRealUnqAlias, aRealUnqDir ) ); m_pMyShell->m_bFaked = true; } #else if ( aUnqDir.getLength() && aUnqAl.getLength() ) { m_pMyShell->m_vecMountPoint.push_back( shell::MountPoint( aUnqAl, aUnqDir ) ); m_pMyShell->m_bFaked = true; } #endif } } } catch( ... ) { } } FileProvider::~FileProvider() { if( m_pMyShell ) delete m_pMyShell; } ////////////////////////////////////////////////////////////////////////// // XInterface ////////////////////////////////////////////////////////////////////////// void SAL_CALL FileProvider::acquire( void ) throw( uno::RuntimeException ) { OWeakObject::acquire(); } void SAL_CALL FileProvider::release( void ) throw( uno::RuntimeException ) { OWeakObject::release(); } uno::Any SAL_CALL FileProvider::queryInterface( const uno::Type& rType ) throw( uno::RuntimeException ) { uno::Any aRet = cppu::queryInterface( rType, SAL_STATIC_CAST( XContentProvider*, this ), SAL_STATIC_CAST( XContentIdentifierFactory*, this ), SAL_STATIC_CAST( lang::XServiceInfo*, this ), SAL_STATIC_CAST( XFileIdentifierConverter*,this ), SAL_STATIC_CAST( beans::XPropertySet*, this ) ); return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType ); } //////////////////////////////////////////////////////////////////////////////// // XServiceInfo methods. rtl::OUString SAL_CALL FileProvider::getImplementationName() throw( uno::RuntimeException ) { return fileaccess::shell::getImplementationName_static(); } sal_Bool SAL_CALL FileProvider::supportsService( const rtl::OUString& ServiceName ) throw( uno::RuntimeException ) { return ServiceName == rtl::OUString::createFromAscii( "com.sun.star.ucb.FileProvider" ); } uno::Sequence< rtl::OUString > SAL_CALL FileProvider::getSupportedServiceNames( void ) throw( uno::RuntimeException ) { return fileaccess::shell::getSupportedServiceNames_static(); } uno::Reference< lang::XSingleServiceFactory > SAL_CALL FileProvider::createServiceFactory( const uno::Reference< lang::XMultiServiceFactory >& rxServiceMgr ) { /** * Create a single service factory.<BR> * Note: The function pointer ComponentInstantiation points to a function throws Exception. * * @param rServiceManager the service manager used by the implementation. * @param rImplementationName the implementation name. An empty string is possible. * @param ComponentInstantiation the function pointer to create an object. * @param rServiceNames the service supported by the implementation. * @return a factory that support the interfaces XServiceProvider, XServiceInfo * XSingleServiceFactory and XComponent. * * @see createOneInstanceFactory */ /* * Reference< ::com::sun::star::lang::XSingleServiceFactory > createSingleFactory * ( * const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > & rServiceManager, * const ::rtl::OUString & rImplementationName, * ComponentInstantiation pCreateFunction, * const ::com::sun::star::uno::Sequence< ::rtl::OUString > & rServiceNames * ); */ return uno::Reference< lang::XSingleServiceFactory > ( cppu::createSingleFactory( rxServiceMgr, fileaccess::shell::getImplementationName_static(), FileProvider::CreateInstance, fileaccess::shell::getSupportedServiceNames_static() ) ); } #if SUPD > 583 uno::Reference< uno::XInterface > SAL_CALL #else uno::Reference< uno::XInterface > #endif FileProvider::CreateInstance( const uno::Reference< lang::XMultiServiceFactory >& xMultiServiceFactory ) { lang::XServiceInfo* xP = (lang::XServiceInfo*) new FileProvider( xMultiServiceFactory ); return uno::Reference< uno::XInterface >::query( xP ); } //////////////////////////////////////////////////////////////////////////////// // XContent //////////////////////////////////////////////////////////////////////////////// uno::Reference< XContent > SAL_CALL FileProvider::queryContent( const uno::Reference< XContentIdentifier >& xIdentifier ) throw( IllegalIdentifierException, uno::RuntimeException) { rtl::OUString aUnc; sal_Bool err = m_pMyShell->getUnqFromUrl( xIdentifier->getContentIdentifier(), aUnc ); if( err ) throw IllegalIdentifierException(); rtl::OUString aRedirectedPath; sal_Bool mounted = m_pMyShell->checkMountPoint( aUnc,aRedirectedPath ); BaseContent* pBaseContent = 0; if( mounted ) pBaseContent = new BaseContent( m_pMyShell,xIdentifier,aRedirectedPath ); return uno::Reference< XContent >( pBaseContent ); } sal_Int32 SAL_CALL FileProvider::compareContentIds( const uno::Reference< XContentIdentifier >& Id1, const uno::Reference< XContentIdentifier >& Id2 ) throw( uno::RuntimeException ) { rtl::OUString aUrl1 = Id1->getContentIdentifier(); rtl::OUString aUrl2 = Id2->getContentIdentifier(); return aUrl1.compareTo( aUrl2 ); } uno::Reference< XContentIdentifier > SAL_CALL FileProvider::createContentIdentifier( const rtl::OUString& ContentId ) throw( uno::RuntimeException ) { FileContentIdentifier* p = new FileContentIdentifier( m_pMyShell,ContentId,false ); return uno::Reference< XContentIdentifier >( p ); } //XPropertySetInfoImpl class XPropertySetInfoImpl2 : public cppu::OWeakObject, public beans::XPropertySetInfo { public: XPropertySetInfoImpl2(); ~XPropertySetInfoImpl2(); // XInterface virtual uno::Any SAL_CALL queryInterface( const uno::Type& aType ) throw( uno::RuntimeException); virtual void SAL_CALL acquire( void ) throw( uno::RuntimeException); virtual void SAL_CALL release( void ) throw( uno::RuntimeException ); virtual uno::Sequence< beans::Property > SAL_CALL getProperties( void ) throw( uno::RuntimeException ); virtual beans::Property SAL_CALL getPropertyByName( const rtl::OUString& aName ) throw( beans::UnknownPropertyException, uno::RuntimeException); virtual sal_Bool SAL_CALL hasPropertyByName( const rtl::OUString& Name ) throw( uno::RuntimeException ); private: uno::Sequence< beans::Property > m_seq; }; XPropertySetInfoImpl2::XPropertySetInfoImpl2() : m_seq( 2 ) { m_seq[0] = beans::Property( rtl::OUString::createFromAscii( "HostName" ), -1, getCppuType( static_cast< rtl::OUString* >( 0 ) ), beans::PropertyAttribute::READONLY ); m_seq[1] = beans::Property( rtl::OUString::createFromAscii( "FileSystemNotation" ), -1, getCppuType( static_cast< sal_Int32* >( 0 ) ), beans::PropertyAttribute::READONLY ); } XPropertySetInfoImpl2::~XPropertySetInfoImpl2() { // nothing } void SAL_CALL XPropertySetInfoImpl2::acquire( void ) throw( uno::RuntimeException ) { OWeakObject::acquire(); } void SAL_CALL XPropertySetInfoImpl2::release( void ) throw( uno::RuntimeException ) { OWeakObject::release(); } uno::Any SAL_CALL XPropertySetInfoImpl2::queryInterface( const uno::Type& rType ) throw( uno::RuntimeException ) { uno::Any aRet = cppu::queryInterface( rType, SAL_STATIC_CAST( beans::XPropertySetInfo*,this) ); return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType ); } beans::Property SAL_CALL XPropertySetInfoImpl2::getPropertyByName( const rtl::OUString& aName ) throw( beans::UnknownPropertyException, uno::RuntimeException) { for( sal_Int32 i = 0; i < m_seq.getLength(); ++i ) if( m_seq[i].Name == aName ) return m_seq[i]; throw beans::UnknownPropertyException(); } uno::Sequence< beans::Property > SAL_CALL XPropertySetInfoImpl2::getProperties( void ) throw( uno::RuntimeException ) { return m_seq; } sal_Bool SAL_CALL XPropertySetInfoImpl2::hasPropertyByName( const rtl::OUString& aName ) throw( uno::RuntimeException ) { for( sal_Int32 i = 0; i < m_seq.getLength(); ++i ) if( m_seq[i].Name == aName ) return true; return false; } void SAL_CALL FileProvider::initProperties( void ) { if( ! m_xPropertySetInfo.is() ) { osl_getLocalHostname( &m_HostName.pData ); #if defined ( UNX ) m_FileSystemNotation = FileSystemNotation::UNIX_NOTATION; #elif defined( WNT ) m_FileSystemNotation = FileSystemNotation::DOS_NOTATION; #else m_FileSystemNotation = FileSystemNotation::UNKNOWN_NOTATION; #endif // static const sal_Int32 UNKNOWN_NOTATION = (sal_Int32)0; // static const sal_Int32 UNIX_NOTATION = (sal_Int32)1; // static const sal_Int32 DOS_NOTATION = (sal_Int32)2; // static const sal_Int32 MAC_NOTATION = (sal_Int32)3; XPropertySetInfoImpl2* p = new XPropertySetInfoImpl2(); m_xPropertySetInfo = uno::Reference< beans::XPropertySetInfo >( p ); } } // XPropertySet uno::Reference< beans::XPropertySetInfo > SAL_CALL FileProvider::getPropertySetInfo( ) throw( uno::RuntimeException ) { initProperties(); return m_xPropertySetInfo; } void SAL_CALL FileProvider::setPropertyValue( const rtl::OUString& aPropertyName, const uno::Any& aValue ) throw( beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException ) { if( aPropertyName.compareToAscii( "FileSystemNotation" ) == 0 || aPropertyName.compareToAscii( "HostName" ) == 0 ) return; else throw beans::UnknownPropertyException(); } uno::Any SAL_CALL FileProvider::getPropertyValue( const rtl::OUString& aPropertyName ) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException ) { initProperties(); if( aPropertyName.compareToAscii( "FileSystemNotation" ) == 0 ) { uno::Any aAny; aAny <<= m_FileSystemNotation; return aAny; } else if( aPropertyName.compareToAscii( "HostName" ) == 0 ) { uno::Any aAny; aAny <<= m_HostName; return aAny; } else throw beans::UnknownPropertyException(); } void SAL_CALL FileProvider::addPropertyChangeListener( const rtl::OUString& aPropertyName, const uno::Reference< beans::XPropertyChangeListener >& xListener ) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) { return; } void SAL_CALL FileProvider::removePropertyChangeListener( const rtl::OUString& aPropertyName, const uno::Reference< beans::XPropertyChangeListener >& aListener ) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException ) { return; } void SAL_CALL FileProvider::addVetoableChangeListener( const rtl::OUString& PropertyName, const uno::Reference< beans::XVetoableChangeListener >& aListener ) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException ) { return; } void SAL_CALL FileProvider::removeVetoableChangeListener( const rtl::OUString& PropertyName, const uno::Reference< beans::XVetoableChangeListener >& aListener ) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) { return; } // XFileIdentifierConverter sal_Int32 SAL_CALL FileProvider::getFileProviderLocality( const rtl::OUString& BaseURL ) throw( uno::RuntimeException ) { // If the base URL is a 'file' URL, return 10 (very 'local'), otherwise // return -1 (missmatch). What is missing is a fast comparison to ASCII, // ignoring case: return BaseURL.getLength() >= 5 && (BaseURL[0] == 'F' || BaseURL[0] == 'f') && (BaseURL[1] == 'I' || BaseURL[1] == 'i') && (BaseURL[2] == 'L' || BaseURL[2] == 'l') && (BaseURL[3] == 'E' || BaseURL[3] == 'e') && BaseURL[4] == ':' ? 10 : -1; } rtl::OUString SAL_CALL FileProvider::getFileURLFromSystemPath( const rtl::OUString& BaseURL, const rtl::OUString& SystemPath ) throw( uno::RuntimeException ) { rtl::OUString aNormalizedPath; if ( osl::FileBase::normalizePath( SystemPath,aNormalizedPath ) != osl::FileBase::E_None ) return rtl::OUString(); rtl::OUString aRed; sal_Bool success = m_pMyShell->uncheckMountPoint( aNormalizedPath,aRed ); if( ! success ) return rtl::OUString(); rtl::OUString aUrl; sal_Bool err = m_pMyShell->getUrlFromUnq( aRed,aUrl ); if( err ) return rtl::OUString(); return aUrl; } rtl::OUString SAL_CALL FileProvider::getSystemPathFromFileURL( const rtl::OUString& URL ) throw( uno::RuntimeException ) { rtl::OUString aUnq; sal_Bool err = m_pMyShell->getUnqFromUrl( URL,aUnq ); if( err ) return rtl::OUString(); rtl::OUString aRed; sal_Bool success = m_pMyShell->checkMountPoint( aUnq,aRed ); if( ! success ) return rtl::OUString(); rtl::OUString aSystemPath; if (osl::FileBase::getSystemPathFromNormalizedPath( aRed,aSystemPath ) != osl::FileBase::E_None ) return rtl::OUString(); return aSystemPath; }