summaryrefslogtreecommitdiff
path: root/ucb/source/ucp/file/prov.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'ucb/source/ucp/file/prov.cxx')
-rw-r--r--ucb/source/ucp/file/prov.cxx738
1 files changed, 738 insertions, 0 deletions
diff --git a/ucb/source/ucp/file/prov.cxx b/ucb/source/ucp/file/prov.cxx
new file mode 100644
index 000000000000..a456d2acbd32
--- /dev/null
+++ b/ucb/source/ucp/file/prov.cxx
@@ -0,0 +1,738 @@
+/*************************************************************************
+ *
+ * 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_ucb.hxx"
+#include <osl/security.hxx>
+#include <osl/file.hxx>
+#include <osl/socket.h>
+#include <cppuhelper/factory.hxx>
+#include <com/sun/star/registry/XRegistryKey.hpp>
+#ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBBUTE_HPP_
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#endif
+#include <com/sun/star/ucb/FileSystemNotation.hpp>
+#include <com/sun/star/beans/PropertyState.hpp>
+#include "filglob.hxx"
+#include "filid.hxx"
+#include "shell.hxx"
+#include "bc.hxx"
+#include "prov.hxx"
+
+
+using namespace fileaccess;
+using namespace com::sun::star;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::beans;
+using namespace com::sun::star::ucb;
+using namespace com::sun::star::container;
+
+//=========================================================================
+static sal_Bool writeInfo( void * pRegistryKey,
+ const rtl::OUString & rImplementationName,
+ Sequence< rtl::OUString > const & rServiceNames )
+{
+ rtl::OUString aKeyName( rtl::OUString::createFromAscii( "/" ) );
+ aKeyName += rImplementationName;
+ aKeyName += rtl::OUString::createFromAscii( "/UNO/SERVICES" );
+
+ 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 ** )
+{
+ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
+}
+
+//=========================================================================
+extern "C" sal_Bool SAL_CALL component_writeInfo( void *, 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 * )
+{
+ void * pRet = 0;
+
+ Reference< XMultiServiceFactory > xSMgr(
+ reinterpret_cast< XMultiServiceFactory * >( pServiceManager ) );
+ Reference< 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 */
+/* */
+/* */
+/****************************************************************************/
+
+
+
+FileProvider::FileProvider( const Reference< XMultiServiceFactory >& xMultiServiceFactory )
+ : m_xMultiServiceFactory( xMultiServiceFactory ),
+ m_pMyShell( 0 )
+{
+}
+
+
+FileProvider::~FileProvider()
+{
+ if( m_pMyShell )
+ delete m_pMyShell;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+// XInterface
+//////////////////////////////////////////////////////////////////////////
+
+void SAL_CALL
+FileProvider::acquire(
+ void )
+ throw()
+{
+ OWeakObject::acquire();
+}
+
+
+void SAL_CALL
+FileProvider::release(
+ void )
+ throw()
+{
+ OWeakObject::release();
+}
+
+
+Any SAL_CALL
+FileProvider::queryInterface(
+ const Type& rType )
+ throw( RuntimeException )
+{
+ Any aRet = cppu::queryInterface(
+ rType,
+ SAL_STATIC_CAST( XContentProvider*, this ),
+ SAL_STATIC_CAST( XInitialization*, this ),
+ SAL_STATIC_CAST( XContentIdentifierFactory*, this ),
+ SAL_STATIC_CAST( XServiceInfo*, this ),
+ SAL_STATIC_CAST( XTypeProvider*, this ),
+ SAL_STATIC_CAST( XFileIdentifierConverter*,this ),
+ SAL_STATIC_CAST( XPropertySet*, this ) );
+ return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// XInitialization
+
+void SAL_CALL FileProvider::init()
+{
+ if( ! m_pMyShell )
+ m_pMyShell = new shell( m_xMultiServiceFactory, this, sal_True );
+}
+
+
+void SAL_CALL
+FileProvider::initialize(
+ const Sequence< Any >& aArguments )
+ throw (Exception, RuntimeException)
+{
+ if( ! m_pMyShell ) {
+ rtl::OUString config;
+ if( aArguments.getLength() > 0 &&
+ (aArguments[0] >>= config) &&
+ config.compareToAscii("NoConfig") == 0 )
+ m_pMyShell = new shell( m_xMultiServiceFactory, this, sal_False );
+ else
+ m_pMyShell = new shell( m_xMultiServiceFactory, this, sal_True );
+ }
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// XTypeProvider methods.
+
+
+XTYPEPROVIDER_IMPL_7( FileProvider,
+ XTypeProvider,
+ XServiceInfo,
+ XInitialization,
+ XContentIdentifierFactory,
+ XPropertySet,
+ XFileIdentifierConverter,
+ XContentProvider )
+
+
+////////////////////////////////////////////////////////////////////////////////
+// XServiceInfo methods.
+
+rtl::OUString SAL_CALL
+FileProvider::getImplementationName()
+ throw( RuntimeException )
+{
+ return fileaccess::shell::getImplementationName_static();
+}
+
+
+sal_Bool SAL_CALL
+FileProvider::supportsService(
+ const rtl::OUString& ServiceName )
+ throw( RuntimeException )
+{
+ return ServiceName == rtl::OUString::createFromAscii( "com.sun.star.ucb.FileContentProvider" );
+}
+
+
+Sequence< rtl::OUString > SAL_CALL
+FileProvider::getSupportedServiceNames(
+ void )
+ throw( RuntimeException )
+{
+ return fileaccess::shell::getSupportedServiceNames_static();
+}
+
+
+
+Reference< XSingleServiceFactory > SAL_CALL
+FileProvider::createServiceFactory(
+ const Reference< 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::XSingleServiceFactory > createSingleFactory
+ * (
+ * const ::com::sun::star::Reference< ::com::sun::star::XMultiServiceFactory > & rServiceManager,
+ * const ::rtl::OUString & rImplementationName,
+ * ComponentInstantiation pCreateFunction,
+
+ * const ::com::sun::star::Sequence< ::rtl::OUString > & rServiceNames
+ * );
+ */
+
+ return Reference< XSingleServiceFactory > ( cppu::createSingleFactory(
+ rxServiceMgr,
+ fileaccess::shell::getImplementationName_static(),
+ FileProvider::CreateInstance,
+ fileaccess::shell::getSupportedServiceNames_static() ) );
+}
+
+Reference< XInterface > SAL_CALL
+FileProvider::CreateInstance(
+ const Reference< XMultiServiceFactory >& xMultiServiceFactory )
+{
+ XServiceInfo* xP = (XServiceInfo*) new FileProvider( xMultiServiceFactory );
+ return Reference< XInterface >::query( xP );
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+// XContent
+////////////////////////////////////////////////////////////////////////////////
+
+
+Reference< XContent > SAL_CALL
+FileProvider::queryContent(
+ const Reference< XContentIdentifier >& xIdentifier )
+ throw( IllegalIdentifierException,
+ RuntimeException)
+{
+ init();
+ rtl::OUString aUnc;
+ sal_Bool err = m_pMyShell->getUnqFromUrl( xIdentifier->getContentIdentifier(),
+ aUnc );
+
+ if( err )
+ throw IllegalIdentifierException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
+
+ return Reference< XContent >( new BaseContent( m_pMyShell,xIdentifier,aUnc ) );
+}
+
+
+
+sal_Int32 SAL_CALL
+FileProvider::compareContentIds(
+ const Reference< XContentIdentifier >& Id1,
+ const Reference< XContentIdentifier >& Id2 )
+ throw( RuntimeException )
+{
+ init();
+ rtl::OUString aUrl1 = Id1->getContentIdentifier();
+ rtl::OUString aUrl2 = Id2->getContentIdentifier();
+
+ sal_Int32 iComp = aUrl1.compareTo( aUrl2 );
+
+ if ( 0 != iComp )
+ {
+ rtl::OUString aPath1, aPath2;
+
+ m_pMyShell->getUnqFromUrl( aUrl1, aPath1 );
+ m_pMyShell->getUnqFromUrl( aUrl2, aPath2 );
+
+ osl::FileBase::RC error;
+ osl::DirectoryItem aItem1, aItem2;
+
+ error = osl::DirectoryItem::get( aPath1, aItem1 );
+ if ( error == osl::FileBase::E_None )
+ error = osl::DirectoryItem::get( aPath2, aItem2 );
+
+ if ( error != osl::FileBase::E_None )
+ return iComp;
+
+ osl::FileStatus aStatus1( FileStatusMask_FileURL );
+ osl::FileStatus aStatus2( FileStatusMask_FileURL );
+ error = aItem1.getFileStatus( aStatus1 );
+ if ( error == osl::FileBase::E_None )
+ error = aItem2.getFileStatus( aStatus2 );
+
+ if ( error == osl::FileBase::E_None )
+ {
+ iComp = aStatus1.getFileURL().compareTo( aStatus2.getFileURL() );
+
+// Quick hack for Windows to threat all file systems as case insensitive
+#ifdef WNT
+ if ( 0 != iComp )
+ {
+ error = osl::FileBase::getSystemPathFromFileURL( aStatus1.getFileURL(), aPath1 );
+ if ( error == osl::FileBase::E_None )
+ error = osl::FileBase::getSystemPathFromFileURL( aStatus2.getFileURL(), aPath2 );
+
+ if ( error == osl::FileBase::E_None )
+ iComp = rtl_ustr_compareIgnoreAsciiCase( aPath1.getStr(), aPath2.getStr() );
+ }
+#endif
+ }
+ }
+
+ return iComp;
+}
+
+
+
+Reference< XContentIdentifier > SAL_CALL
+FileProvider::createContentIdentifier(
+ const rtl::OUString& ContentId )
+ throw( RuntimeException )
+{
+ init();
+ FileContentIdentifier* p = new FileContentIdentifier( m_pMyShell,ContentId,false );
+ return Reference< XContentIdentifier >( p );
+}
+
+
+
+//XPropertySetInfoImpl
+
+class XPropertySetInfoImpl2
+ : public cppu::OWeakObject,
+ public XPropertySetInfo
+{
+public:
+ XPropertySetInfoImpl2();
+ ~XPropertySetInfoImpl2();
+
+ // XInterface
+ virtual Any SAL_CALL
+ queryInterface(
+ const Type& aType )
+ throw( RuntimeException);
+
+ virtual void SAL_CALL
+ acquire(
+ void )
+ throw();
+
+ virtual void SAL_CALL
+ release(
+ void )
+ throw();
+
+
+ virtual Sequence< Property > SAL_CALL
+ getProperties(
+ void )
+ throw( RuntimeException );
+
+ virtual Property SAL_CALL
+ getPropertyByName(
+ const rtl::OUString& aName )
+ throw( UnknownPropertyException,
+ RuntimeException);
+
+ virtual sal_Bool SAL_CALL
+ hasPropertyByName( const rtl::OUString& Name )
+ throw( RuntimeException );
+
+
+private:
+ Sequence< Property > m_seq;
+};
+
+
+XPropertySetInfoImpl2::XPropertySetInfoImpl2()
+ : m_seq( 3 )
+{
+ m_seq[0] = Property( rtl::OUString::createFromAscii( "HostName" ),
+ -1,
+ getCppuType( static_cast< rtl::OUString* >( 0 ) ),
+ PropertyAttribute::READONLY );
+
+ m_seq[1] = Property( rtl::OUString::createFromAscii( "HomeDirectory" ),
+ -1,
+ getCppuType( static_cast< rtl::OUString* >( 0 ) ),
+ PropertyAttribute::READONLY );
+
+ m_seq[2] = Property( rtl::OUString::createFromAscii( "FileSystemNotation" ),
+ -1,
+ getCppuType( static_cast< sal_Int32* >( 0 ) ),
+ PropertyAttribute::READONLY );
+}
+
+
+XPropertySetInfoImpl2::~XPropertySetInfoImpl2()
+{
+ // nothing
+}
+
+
+void SAL_CALL
+XPropertySetInfoImpl2::acquire(
+ void )
+ throw()
+{
+ OWeakObject::acquire();
+}
+
+
+void SAL_CALL
+XPropertySetInfoImpl2::release(
+ void )
+ throw()
+{
+ OWeakObject::release();
+}
+
+
+Any SAL_CALL
+XPropertySetInfoImpl2::queryInterface(
+ const Type& rType )
+ throw( RuntimeException )
+{
+ Any aRet = cppu::queryInterface( rType,
+ SAL_STATIC_CAST( XPropertySetInfo*,this) );
+ return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
+}
+
+
+Property SAL_CALL
+XPropertySetInfoImpl2::getPropertyByName(
+ const rtl::OUString& aName )
+ throw( UnknownPropertyException,
+ RuntimeException)
+{
+ for( sal_Int32 i = 0; i < m_seq.getLength(); ++i )
+ if( m_seq[i].Name == aName )
+ return m_seq[i];
+
+ throw UnknownPropertyException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
+}
+
+
+
+Sequence< Property > SAL_CALL
+XPropertySetInfoImpl2::getProperties(
+ void )
+ throw( RuntimeException )
+{
+ return m_seq;
+}
+
+
+sal_Bool SAL_CALL
+XPropertySetInfoImpl2::hasPropertyByName(
+ const rtl::OUString& aName )
+ throw( 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 )
+{
+ osl::MutexGuard aGuard( m_aMutex );
+ if( ! m_xPropertySetInfo.is() )
+ {
+ osl_getLocalHostname( &m_HostName.pData );
+
+#if defined ( UNX )
+ m_FileSystemNotation = FileSystemNotation::UNIX_NOTATION;
+#elif defined( WNT ) || defined( OS2 )
+ m_FileSystemNotation = FileSystemNotation::DOS_NOTATION;
+#else
+ m_FileSystemNotation = FileSystemNotation::UNKNOWN_NOTATION;
+#endif
+ osl::Security aSecurity;
+ aSecurity.getHomeDir( m_HomeDirectory );
+
+ // 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 = Reference< XPropertySetInfo >( p );
+ }
+}
+
+
+// XPropertySet
+
+Reference< XPropertySetInfo > SAL_CALL
+FileProvider::getPropertySetInfo( )
+ throw( RuntimeException )
+{
+ initProperties();
+ return m_xPropertySetInfo;
+}
+
+
+void SAL_CALL
+FileProvider::setPropertyValue( const rtl::OUString& aPropertyName,
+ const Any& )
+ throw( UnknownPropertyException,
+ PropertyVetoException,
+ IllegalArgumentException,
+ WrappedTargetException,
+ RuntimeException )
+{
+ if( aPropertyName.compareToAscii( "FileSystemNotation" ) == 0 ||
+ aPropertyName.compareToAscii( "HomeDirectory" ) == 0 ||
+ aPropertyName.compareToAscii( "HostName" ) == 0 )
+ return;
+ else
+ throw UnknownPropertyException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
+}
+
+
+
+Any SAL_CALL
+FileProvider::getPropertyValue(
+ const rtl::OUString& aPropertyName )
+ throw( UnknownPropertyException,
+ WrappedTargetException,
+ RuntimeException )
+{
+ initProperties();
+ if( aPropertyName.compareToAscii( "FileSystemNotation" ) == 0 )
+ {
+ Any aAny;
+ aAny <<= m_FileSystemNotation;
+ return aAny;
+ }
+ else if( aPropertyName.compareToAscii( "HomeDirectory" ) == 0 )
+ {
+ Any aAny;
+ aAny <<= m_HomeDirectory;
+ return aAny;
+ }
+ else if( aPropertyName.compareToAscii( "HostName" ) == 0 )
+ {
+ Any aAny;
+ aAny <<= m_HostName;
+ return aAny;
+ }
+ else
+ throw UnknownPropertyException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
+}
+
+
+void SAL_CALL
+FileProvider::addPropertyChangeListener(
+ const rtl::OUString&,
+ const Reference< XPropertyChangeListener >& )
+ throw( UnknownPropertyException,
+ WrappedTargetException,
+ RuntimeException)
+{
+ return;
+}
+
+
+void SAL_CALL
+FileProvider::removePropertyChangeListener(
+ const rtl::OUString&,
+ const Reference< XPropertyChangeListener >& )
+ throw( UnknownPropertyException,
+ WrappedTargetException,
+ RuntimeException )
+{
+ return;
+}
+
+void SAL_CALL
+FileProvider::addVetoableChangeListener(
+ const rtl::OUString&,
+ const Reference< XVetoableChangeListener >& )
+ throw( UnknownPropertyException,
+ WrappedTargetException,
+ RuntimeException )
+{
+ return;
+}
+
+
+void SAL_CALL
+FileProvider::removeVetoableChangeListener(
+ const rtl::OUString&,
+ const Reference< XVetoableChangeListener >& )
+ throw( UnknownPropertyException,
+ WrappedTargetException,
+ RuntimeException)
+{
+ return;
+}
+
+
+
+// XFileIdentifierConverter
+
+sal_Int32 SAL_CALL
+FileProvider::getFileProviderLocality( const rtl::OUString& BaseURL )
+ throw( 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&,
+ const rtl::OUString& SystemPath )
+ throw( RuntimeException )
+{
+ rtl::OUString aNormalizedPath;
+ if ( osl::FileBase::getFileURLFromSystemPath( SystemPath,aNormalizedPath ) != osl::FileBase::E_None )
+ return rtl::OUString();
+
+ return aNormalizedPath;
+}
+
+rtl::OUString SAL_CALL FileProvider::getSystemPathFromFileURL( const rtl::OUString& URL )
+ throw( RuntimeException )
+{
+ rtl::OUString aSystemPath;
+ if (osl::FileBase::getSystemPathFromFileURL( URL,aSystemPath ) != osl::FileBase::E_None )
+ return rtl::OUString();
+
+ return aSystemPath;
+}
+