blob: 804ffcae378e25cba9a4edb0d8d32ffb14c043e5 [file] [log] [blame]
/**************************************************************
*
* 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.
*
*************************************************************/
#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