diff options
Diffstat (limited to 'svtools/source/contnr/contentenumeration.hxx')
-rw-r--r-- | svtools/source/contnr/contentenumeration.hxx | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/svtools/source/contnr/contentenumeration.hxx b/svtools/source/contnr/contentenumeration.hxx new file mode 100644 index 000000000000..16db279ad547 --- /dev/null +++ b/svtools/source/contnr/contentenumeration.hxx @@ -0,0 +1,287 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef SVTOOLS_SOURCE_CONTNR_CONTENTENUMERATION_HXX +#define SVTOOLS_SOURCE_CONTNR_CONTENTENUMERATION_HXX + +/** === begin UNO includes === **/ +#include <com/sun/star/ucb/XCommandEnvironment.hpp> +#include <com/sun/star/document/XStandaloneDocumentInfo.hpp> +/** === end UNO includes === **/ +#include <osl/thread.hxx> +#include <rtl/ref.hxx> +#include <ucbhelper/content.hxx> +#include <rtl/ustring.hxx> +#include <tools/datetime.hxx> +#include <vcl/image.hxx> + +class IUrlFilter; +//........................................................................ +namespace svt +{ +//........................................................................ + + //==================================================================== + //= SortingData_Impl + //==================================================================== + struct SortingData_Impl + { + private: + ::rtl::OUString maFilename; // only filename in upper case - for compare purposes + ::rtl::OUString maTitle; // -> be carefull when changing maTitle to update maFilename only when new + ::rtl::OUString maLowerTitle; + + + public: + ::rtl::OUString maType; + ::rtl::OUString maTargetURL; + ::rtl::OUString maImageURL; + ::rtl::OUString maDisplayText; + DateTime maModDate; + Image maImage; + sal_Int64 maSize; + sal_Bool mbIsFolder; + sal_Bool mbIsVolume; + sal_Bool mbIsRemote; + sal_Bool mbIsRemoveable; + sal_Bool mbIsFloppy; + sal_Bool mbIsCompactDisc; + + inline SortingData_Impl(); + inline const ::rtl::OUString& GetTitle() const; + inline const ::rtl::OUString& GetLowerTitle() const; + inline const ::rtl::OUString& GetFileName() const; + inline void SetNewTitle( const ::rtl::OUString& rNewTitle ); // new maTitle is set -> maFilename is set to same! + inline void ChangeTitle( const ::rtl::OUString& rChangedTitle ); // maTitle is changed, maFilename is unchanged! + + private: + inline void SetTitles( const ::rtl::OUString& rNewTitle ); + }; + + inline SortingData_Impl::SortingData_Impl() : + maSize ( 0 ), + mbIsFolder ( sal_False ), + mbIsVolume ( sal_False ), + mbIsRemote ( sal_False ), + mbIsRemoveable ( sal_False ), + mbIsFloppy ( sal_False ), + mbIsCompactDisc ( sal_False ) + { + } + + inline const ::rtl::OUString& SortingData_Impl::GetTitle() const + { + return maTitle; + } + + inline const ::rtl::OUString& SortingData_Impl::GetLowerTitle() const + { + return maLowerTitle; + } + + inline const ::rtl::OUString& SortingData_Impl::GetFileName() const + { + return maFilename; + } + + inline void SortingData_Impl::SetNewTitle( const ::rtl::OUString& rNewTitle ) + { + SetTitles( rNewTitle ); + maFilename = rNewTitle.toAsciiUpperCase(); + } + + inline void SortingData_Impl::ChangeTitle( const ::rtl::OUString& rChangedTitle ) + { + SetTitles( rChangedTitle ); + } + + inline void SortingData_Impl::SetTitles( const ::rtl::OUString& rNewTitle ) + { + maTitle = rNewTitle; + maLowerTitle = rNewTitle.toAsciiLowerCase(); + } + + //==================================================================== + //= IContentTitleTranslation + //==================================================================== + class IContentTitleTranslation + { + public: + virtual sal_Bool GetTranslation( const ::rtl::OUString& _rOriginalName, ::rtl::OUString& _rTranslatedName ) const = 0; + }; + + //==================================================================== + //= EnumerationResult + //==================================================================== + enum EnumerationResult + { + SUCCESS, /// the enumration was successfull + ERROR, /// the enumration was unsuccessfull + RUNNING /// the enumeration is still running, and the maximum wait time has passed + }; + + //==================================================================== + //= FolderDescriptor + //==================================================================== + struct FolderDescriptor + { + /** a content object describing the folder. Can be <NULL/>, in this case <member>sURL</member> + is relevant. + */ + ::ucbhelper::Content aContent; + /** the URL of a folder. Will be ignored if <member>aContent</member> is not <NULL/>. + */ + String sURL; + + FolderDescriptor() { } + + FolderDescriptor( const ::ucbhelper::Content& _rContent ) + :aContent( _rContent ) + { + } + + FolderDescriptor( const String& _rURL ) + :sURL( _rURL ) + { + } + }; + + //==================================================================== + //= IEnumerationResultHandler + //==================================================================== + class IEnumerationResultHandler + { + public: + virtual void enumerationDone( EnumerationResult _eResult ) = 0; + }; + + //==================================================================== + //= FileViewContentEnumerator + //==================================================================== + class FileViewContentEnumerator + :public ::rtl::IReference + ,private ::osl::Thread + { + public: + typedef ::std::vector< SortingData_Impl* > ContentData; + + private: + ContentData& m_rContent; + ::osl::Mutex& m_rContentMutex; + + oslInterlockedCount m_refCount; + mutable ::osl::Mutex m_aMutex; + + FolderDescriptor m_aFolder; + ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XCommandEnvironment > + m_xCommandEnv; + const IUrlFilter* m_pFilter; + const IContentTitleTranslation* m_pTranslator; + IEnumerationResultHandler* m_pResultHandler; + bool m_bCancelled; + + mutable ::com::sun::star::uno::Reference< ::com::sun::star::document::XStandaloneDocumentInfo > + m_xDocInfo; + + ::com::sun::star::uno::Sequence< ::rtl::OUString > m_rBlackList; + + sal_Bool URLOnBlackList ( const ::rtl::OUString& sRealURL ); + + public: + /** constructs an enumerator instance + + @param _rContentToFill + the structure which is to be filled with the found content + @param _rContentMutex + the mutex which protects the access to <arg>_rContentToFill</arg> + @param _pTranslator + an instance which should be used to translate content titles. May be <NULL/> + */ + FileViewContentEnumerator( + const ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XCommandEnvironment >& _rxCommandEnv, + ContentData& _rContentToFill, + ::osl::Mutex& _rContentMutex, + const IContentTitleTranslation* _pTranslator + ); + + /** enumerates the content of a given folder + + @param _rFolder + the folder whose content is to be enumerated + @param _pFilter + a filter to apply to the found contents + @param _pResultHandler + an instance which should handle the results of the enumeration + */ + void enumerateFolderContent( + const FolderDescriptor& _rFolder, + const IUrlFilter* _pFilter, + IEnumerationResultHandler* _pResultHandler + ); + + /** enumerates the content of a given folder synchronously + */ + EnumerationResult enumerateFolderContentSync( + const FolderDescriptor& _rFolder, + const IUrlFilter* _pFilter, + const ::com::sun::star::uno::Sequence< ::rtl::OUString >& rBlackList = ::com::sun::star::uno::Sequence< ::rtl::OUString >() + ); + + /** cancels the running operation. + + Note that "cancel" may mean that the operation is running, but its result + is simply disregarded later on. + */ + void cancel(); + + // IReference overridables + virtual oslInterlockedCount SAL_CALL acquire(); + virtual oslInterlockedCount SAL_CALL release(); + + using Thread::operator new; + using Thread::operator delete; + + protected: + ~FileViewContentEnumerator(); + + private: + EnumerationResult enumerateFolderContent(); + + // Thread overridables + virtual void SAL_CALL run(); + virtual void SAL_CALL onTerminated(); + + private: + sal_Bool implGetDocTitle( const ::rtl::OUString& _rTargetURL, ::rtl::OUString& _rRet ) const; + }; + +//........................................................................ +} // namespace svt +//........................................................................ + +#endif // SVTOOLS_SOURCE_CONTNR_CONTENTENUMERATION_HXX + |