diff options
author | Rüdiger Timm <rt@openoffice.org> | 2004-09-20 10:53:47 +0000 |
---|---|---|
committer | Rüdiger Timm <rt@openoffice.org> | 2004-09-20 10:53:47 +0000 |
commit | 03f6bc669263a64cbff953be21a801305ae1146a (patch) | |
tree | f388d0fd5732344340d5af3e656dc3f8786299a0 /ucb | |
parent | 426a0d58c4102bc4f8cc87ba4ffde8a0b7dc9532 (diff) |
INTEGRATION: CWS fwk01ea (1.1.2); FILE ADDED
2004/07/14 09:19:28 abi 1.1.2.2: added license information
2004/04/27 13:32:59 abi 1.1.2.1: initial revision gnomevfs
Diffstat (limited to 'ucb')
-rw-r--r-- | ucb/source/ucp/gvfs/directory.cxx | 459 |
1 files changed, 459 insertions, 0 deletions
diff --git a/ucb/source/ucp/gvfs/directory.cxx b/ucb/source/ucp/gvfs/directory.cxx new file mode 100644 index 000000000000..5e732f917145 --- /dev/null +++ b/ucb/source/ucp/gvfs/directory.cxx @@ -0,0 +1,459 @@ +/************************************************************************* + * + * $RCSfile: directory.cxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: rt $ $Date: 2004-09-20 11:53:47 $ + * + * 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): Michael Meeks__________________________ + * + * + ************************************************************************/ +/* + * This file pinched from webdavdatasupplier (etc.) + * cut & paste + new getData impl. & collate ResultSet code. + */ +#include <vector> +#ifndef _OSL_DIAGNOSE_H_ +#include <osl/diagnose.h> +#endif +#ifndef _COM_SUN_STAR_UCB_OPENMODE_HPP_ +#include <com/sun/star/ucb/OpenMode.hpp> +#endif +#ifndef _UCBHELPER_CONTENTIDENTIFIER_HXX +#include <ucbhelper/contentidentifier.hxx> +#endif +#ifndef _UCBHELPER_PROVIDERHELPER_HXX +#include <ucbhelper/providerhelper.hxx> +#endif + +#include "directory.hxx" + +#include <libgnomevfs/gnome-vfs-utils.h> +#include <libgnomevfs/gnome-vfs-directory.h> + +using namespace com::sun::star; +using namespace gvfs; + +// DynamicResultSet Implementation. + +DynamicResultSet::DynamicResultSet( + const uno::Reference< lang::XMultiServiceFactory >& rxSMgr, + const rtl::Reference< Content >& rxContent, + const com::sun::star::ucb::OpenCommandArgument2& rCommand, + const uno::Reference<com::sun::star::ucb::XCommandEnvironment >& rxEnv ) + : ResultSetImplHelper( rxSMgr, rCommand ), + m_xContent( rxContent ), + m_xEnv( rxEnv ) +{ +} +void DynamicResultSet::initStatic() +{ + m_xResultSet1 + = new ::ucb::ResultSet( m_xSMgr, + m_aCommand.Properties, + new DataSupplier( m_xSMgr, + m_xContent, + m_aCommand.Mode ), + m_xEnv ); +} +void DynamicResultSet::initDynamic() +{ + initStatic(); + m_xResultSet2 = m_xResultSet1; +} + +//========================================================================= + + +// DataSupplier Implementation. + + + +struct ResultListEntry +{ + rtl::OUString aId; + uno::Reference< com::sun::star::ucb::XContentIdentifier > xId; + uno::Reference< com::sun::star::ucb::XContent > xContent; + uno::Reference< sdbc::XRow > xRow; + GnomeVFSFileInfo aInfo; + + ResultListEntry( const GnomeVFSFileInfo *fileInfo) + { + gnome_vfs_file_info_copy (&aInfo, fileInfo); + } + + ~ResultListEntry() + { + gnome_vfs_file_info_clear (&aInfo); + } +}; + +//========================================================================= +// +// ResultList. +// +//========================================================================= + +typedef std::vector< ResultListEntry* > ResultList; + +//========================================================================= +// +// struct DataSupplier_Impl. +// +//========================================================================= + +struct gvfs::DataSupplier_Impl +{ + osl::Mutex m_aMutex; + ResultList m_aResults; + rtl::Reference< Content > m_xContent; + uno::Reference< lang::XMultiServiceFactory > m_xSMgr; + sal_Int32 m_nOpenMode; + sal_Bool m_bCountFinal; + + DataSupplier_Impl( + const uno::Reference< lang::XMultiServiceFactory >& rxSMgr, + const rtl::Reference< Content >& rContent, + sal_Int32 nOpenMode ) + : m_xContent( rContent ), m_xSMgr( rxSMgr ), + m_nOpenMode( nOpenMode ), m_bCountFinal( sal_False ) {} + ~DataSupplier_Impl() + { + ResultList::const_iterator it = m_aResults.begin(); + ResultList::const_iterator end = m_aResults.end(); + + while ( it != end ) + { + delete (*it); + it++; + } + } +}; + +DataSupplier::DataSupplier( + const uno::Reference< lang::XMultiServiceFactory >& rxSMgr, + const rtl::Reference< Content >& rContent, + sal_Int32 nOpenMode ) +: m_pImpl( new DataSupplier_Impl( rxSMgr, rContent, nOpenMode ) ) +{ +} + +//========================================================================= +// virtual +DataSupplier::~DataSupplier() +{ + delete m_pImpl; +} + +// virtual +rtl::OUString DataSupplier::queryContentIdentifierString( sal_uInt32 nIndex ) +{ + osl::Guard< osl::Mutex > aGuard( m_pImpl->m_aMutex ); + + if ( nIndex < m_pImpl->m_aResults.size() ) { + rtl::OUString aId = m_pImpl->m_aResults[ nIndex ]->aId; + if ( aId.getLength() ) // cached + return aId; + } + + if ( getResult( nIndex ) ) { + rtl::OUString aId = m_pImpl->m_xContent->getOUURI(); + + char *escaped_name; + escaped_name = gnome_vfs_escape_string( m_pImpl->m_aResults[ nIndex ]->aInfo.name ); + + if ( ( aId.lastIndexOf( '/' ) + 1 ) != aId.getLength() ) + aId += rtl::OUString::createFromAscii( "/" ); + + aId += rtl::OUString::createFromAscii( escaped_name ); + + g_free( escaped_name ); + + m_pImpl->m_aResults[ nIndex ]->aId = aId; + return aId; + } + + return rtl::OUString(); +} + +// virtual +uno::Reference< com::sun::star::ucb::XContentIdentifier > +DataSupplier::queryContentIdentifier( sal_uInt32 nIndex ) +{ + osl::Guard< osl::Mutex > aGuard( m_pImpl->m_aMutex ); + + if ( nIndex < m_pImpl->m_aResults.size() ) { + uno::Reference< com::sun::star::ucb::XContentIdentifier > xId + = m_pImpl->m_aResults[ nIndex ]->xId; + if ( xId.is() ) // Already cached. + return xId; + } + + rtl::OUString aId = queryContentIdentifierString( nIndex ); + if ( aId.getLength() ) { + uno::Reference< com::sun::star::ucb::XContentIdentifier > xId + = new ::ucb::ContentIdentifier( aId ); + m_pImpl->m_aResults[ nIndex ]->xId = xId; + return xId; + } + + return uno::Reference< com::sun::star::ucb::XContentIdentifier >(); +} + +// virtual +uno::Reference< com::sun::star::ucb::XContent > +DataSupplier::queryContent( sal_uInt32 nIndex ) +{ + osl::Guard< osl::Mutex > aGuard( m_pImpl->m_aMutex ); + + if ( nIndex < m_pImpl->m_aResults.size() ) { + uno::Reference< com::sun::star::ucb::XContent > xContent + = m_pImpl->m_aResults[ nIndex ]->xContent; + if ( xContent.is() ) // Already cached. + return xContent; + } + + uno::Reference< com::sun::star::ucb::XContentIdentifier > xId + = queryContentIdentifier( nIndex ); + if ( xId.is() ) { + try + { + // FIXME: + // It would be really nice to propagate this information + // to the Content, but we can't then register it with the + // ContentProvider, and the ucbhelper hinders here. + uno::Reference< com::sun::star::ucb::XContent > xContent + = m_pImpl->m_xContent->getProvider()->queryContent( xId ); + m_pImpl->m_aResults[ nIndex ]->xContent = xContent; + return xContent; + + } + catch ( com::sun::star::ucb::IllegalIdentifierException& ) { + } + } + return uno::Reference< com::sun::star::ucb::XContent >(); +} + +// virtual +sal_Bool DataSupplier::getResult( sal_uInt32 nIndex ) +{ + osl::ClearableGuard< osl::Mutex > aGuard( m_pImpl->m_aMutex ); + + if ( m_pImpl->m_aResults.size() > nIndex ) // Result already present. + return sal_True; + + if ( getData() && m_pImpl->m_aResults.size() > nIndex ) + return sal_True; + + return sal_False; +} + +// virtual +sal_uInt32 DataSupplier::totalCount() +{ + getData(); + + osl::Guard< osl::Mutex > aGuard( m_pImpl->m_aMutex ); + + return m_pImpl->m_aResults.size(); +} + +// virtual +sal_uInt32 DataSupplier::currentCount() +{ + osl::Guard< osl::Mutex > aGuard( m_pImpl->m_aMutex ); + return m_pImpl->m_aResults.size(); +} + +// virtual +sal_Bool DataSupplier::isCountFinal() +{ + osl::Guard< osl::Mutex > aGuard( m_pImpl->m_aMutex ); + return m_pImpl->m_bCountFinal; +} + +// virtual +uno::Reference< sdbc::XRow > DataSupplier::queryPropertyValues( sal_uInt32 nIndex ) +{ + osl::Guard< osl::Mutex > aGuard( m_pImpl->m_aMutex ); + + if ( nIndex < m_pImpl->m_aResults.size() ) { + uno::Reference< sdbc::XRow > xRow = m_pImpl->m_aResults[ nIndex ]->xRow; + if ( xRow.is() ) // Already cached. + return xRow; + } + + if ( getResult( nIndex ) ) { + // Inefficient - but we can't create xContent's sensibly + // nor can we do the property code sensibly cleanly staticaly. + Content *pContent = static_cast< ::gvfs::Content * >(queryContent( nIndex ).get()); + + uno::Reference< sdbc::XRow > xRow = + pContent->getPropertyValues( getResultSet()->getProperties(), + getResultSet()->getEnvironment() ); + + m_pImpl->m_aResults[ nIndex ]->xRow = xRow; + + return xRow; + } + + return uno::Reference< sdbc::XRow >(); +} + +// virtual +void DataSupplier::releasePropertyValues( sal_uInt32 nIndex ) +{ + osl::Guard< osl::Mutex > aGuard( m_pImpl->m_aMutex ); + + if ( nIndex < m_pImpl->m_aResults.size() ) + m_pImpl->m_aResults[ nIndex ]->xRow = uno::Reference< sdbc::XRow >(); +} + +// virtual +void DataSupplier::close() +{ +} + +// virtual +void DataSupplier::validate() + throw( com::sun::star::ucb::ResultSetException ) +{ +} + +sal_Bool DataSupplier::getData() +{ + osl::ClearableGuard< osl::Mutex > aGuard( m_pImpl->m_aMutex ); + + if ( !m_pImpl->m_bCountFinal ) { + GnomeVFSResult result; + GnomeVFSDirectoryHandle *dirHandle = NULL; + + { + Authentication aAuth( getResultSet()->getEnvironment() ); + char *uri = m_pImpl->m_xContent->getURI(); + result = gnome_vfs_directory_open + ( &dirHandle, uri, GNOME_VFS_FILE_INFO_DEFAULT ); + + if (result != GNOME_VFS_OK) { +#ifdef DEBUG + g_warning ("Failed open of '%s' with '%s'", + uri, gnome_vfs_result_to_string( result )); +#endif + g_free( uri ); + return sal_False; + } + + g_free( uri ); + } + + + GnomeVFSFileInfo fileInfo = { 0 }; + while ((result = gnome_vfs_directory_read_next (dirHandle, &fileInfo)) == GNOME_VFS_OK) { + if( fileInfo.name && fileInfo.name[0] == '.' && + ( fileInfo.name[1] == '\0' || + ( fileInfo.name[1] == '.' && fileInfo.name[2] == '\0' ) ) ) + continue; + + switch ( m_pImpl->m_nOpenMode ) { + case com::sun::star::ucb::OpenMode::FOLDERS: + if ( !(fileInfo.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_TYPE) || + fileInfo.type != GNOME_VFS_FILE_TYPE_DIRECTORY ) + continue; + break; + + case com::sun::star::ucb::OpenMode::DOCUMENTS: + if ( !(fileInfo.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_TYPE) || + fileInfo.type != GNOME_VFS_FILE_TYPE_REGULAR ) + continue; + break; + + case com::sun::star::ucb::OpenMode::ALL: + default: + break; + } + + m_pImpl->m_aResults.push_back( new ResultListEntry( &fileInfo ) ); + } +#ifdef DEBUG + g_warning ("Got %d directory entries", result); +#endif + + m_pImpl->m_bCountFinal = sal_True; + + // Callback possible, because listeners may be informed! + aGuard.clear(); + getResultSet()->rowCountFinal(); + + if (result != GNOME_VFS_ERROR_EOF) { +#ifdef DEBUG + g_warning( "Failed read_next '%s'", + gnome_vfs_result_to_string( result ) ); +#endif + return sal_False; + } + + result = gnome_vfs_directory_close (dirHandle); + if (result != GNOME_VFS_OK) { +#ifdef DEBUG + g_warning( "Failed close '%s'", + gnome_vfs_result_to_string( result ) ); +#endif + return sal_False; + } + } + + return sal_True; +} + + + |