diff options
Diffstat (limited to 'ucb/source/ucp/file/shell.hxx')
-rw-r--r-- | ucb/source/ucp/file/shell.hxx | 607 |
1 files changed, 607 insertions, 0 deletions
diff --git a/ucb/source/ucp/file/shell.hxx b/ucb/source/ucp/file/shell.hxx new file mode 100644 index 000000000000..14e332959a26 --- /dev/null +++ b/ucb/source/ucp/file/shell.hxx @@ -0,0 +1,607 @@ +/************************************************************************* + * + * 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 _SHELL_HXX_ +#define _SHELL_HXX_ + + +#include <cppuhelper/weak.hxx> +#include <cppuhelper/interfacecontainer.hxx> +#include <cppuhelper/typeprovider.hxx> +#include <vector> +#include <hash_map> +#include <hash_set> +#include <list> +#include <osl/file.hxx> + +#include "osl/mutex.hxx" +#include <rtl/ustring.hxx> +#include <com/sun/star/uno/Sequence.hxx> +#include <com/sun/star/beans/PropertyChangeEvent.hpp> +#include <com/sun/star/ucb/XCommandInfo.hpp> +#include <com/sun/star/beans/Property.hpp> +#include <com/sun/star/beans/PropertyValue.hpp> +#include <com/sun/star/io/XStream.hpp> +#include <com/sun/star/beans/XPropertyChangeListener.hpp> +#include <com/sun/star/ucb/XCommandProcessor.hpp> +#include <com/sun/star/io/XOutputStream.hpp> +#include <com/sun/star/io/XInputStream.hpp> +#include <com/sun/star/beans/XPropertySetInfo.hpp> +#include <com/sun/star/beans/XPropertiesChangeNotifier.hpp> +#include <com/sun/star/ucb/NumberedSortingInfo.hpp> +#include <com/sun/star/sdbc/XRow.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/ucb/XContentProvider.hpp> +#include <com/sun/star/ucb/XDynamicResultSet.hpp> +#include <com/sun/star/beans/XPropertyContainer.hpp> +#include <com/sun/star/beans/XPropertyAccess.hpp> +#include <com/sun/star/ucb/XPropertySetRegistryFactory.hpp> +#include <com/sun/star/ucb/TransferInfo.hpp> +#include <com/sun/star/ucb/ContentInfo.hpp> +#include "filtask.hxx" +#include "filnot.hxx" + +namespace fileaccess { + + class FileProvider; + class XPropertySetInfo_impl; + class XCommandInfo_impl; + class XResultSet_impl; + class BaseContent; + class shell; + + class shell + : public virtual TaskManager + { + friend class XPropertySetInfo_impl; + friend class XResultSet_impl; + friend class XCommandInfo_impl; + public: + // Type definitions + + typedef rtl::OUString UniquePath; + typedef equalOUString eUniquePath; + typedef hashOUString hUniquePath; + + class MyProperty + { + private: + rtl::OUString PropertyName; + sal_Int32 Handle; + sal_Bool isNative; + com::sun::star::uno::Type Typ; // Duplicates information in Value + com::sun::star::uno::Any Value; + com::sun::star::beans::PropertyState State; + sal_Int16 Attributes; + public: + MyProperty(); + MyProperty( const rtl::OUString& __PropertyName ); + MyProperty( const sal_Bool& __isNative, + const rtl::OUString& __PropertyName, + const sal_Int32& __Handle, + const com::sun::star::uno::Type& __Typ, + const com::sun::star::uno::Any& __Value, + const com::sun::star::beans::PropertyState& __State, + const sal_Int16& __Attributes ); + + ~MyProperty(); + inline const sal_Bool& SAL_CALL IsNative() const; + inline const rtl::OUString& SAL_CALL getPropertyName() const { return PropertyName; } + inline const sal_Int32& SAL_CALL getHandle() const; + inline const com::sun::star::uno::Type& SAL_CALL getType() const; + inline const com::sun::star::uno::Any& SAL_CALL getValue() const; + inline const com::sun::star::beans::PropertyState& SAL_CALL getState() const; + inline const sal_Int16& SAL_CALL getAttributes() const; + + // The set* functions are declared const, because the key of "this" stays intact + inline void SAL_CALL setHandle( const sal_Int32& __Handle ) const; + inline void SAL_CALL setType( const com::sun::star::uno::Type& __Type ) const; + inline void SAL_CALL setValue( const com::sun::star::uno::Any& __Value ) const; + inline void SAL_CALL setState( const com::sun::star::beans::PropertyState& __State ) const; + inline void SAL_CALL setAttributes( const sal_Int16& __Attributes ) const; + }; + + struct eMyProperty + { + bool operator()( const MyProperty& rKey1, const MyProperty& rKey2 ) const + { + return !!( rKey1.getPropertyName() == rKey2.getPropertyName() ); + } + }; + + struct hMyProperty + { + size_t operator()( const MyProperty& rName ) const + { + return rName.getPropertyName().hashCode(); + } + }; + + typedef std::hash_set< MyProperty,hMyProperty,eMyProperty > PropertySet; + typedef std::list< Notifier* > NotifierList; + + + class UnqPathData + { + public: + UnqPathData(); + ~UnqPathData(); + UnqPathData( const UnqPathData& ); + UnqPathData& operator=( UnqPathData& ); + + PropertySet* properties; + NotifierList* notifier; + + // Three views on the PersistentPropertySet + com::sun::star::uno::Reference< com::sun::star::ucb::XPersistentPropertySet > xS; + com::sun::star::uno::Reference< com::sun::star::beans::XPropertyContainer > xC; + com::sun::star::uno::Reference< com::sun::star::beans::XPropertyAccess > xA; + }; + + typedef std::hash_map< UniquePath,UnqPathData,hUniquePath,eUniquePath > ContentMap; + + public: + + // MethodenDefinitionen + shell( const com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory >& xMultiServiceFactory, + FileProvider* pProvider,sal_Bool bWithConfig ); + + virtual ~shell(); + + + + /** + * This two methods register and deregister a change listener for the content belonging + * to URL aUnqPath + */ + + void SAL_CALL registerNotifier( const rtl::OUString& aUnqPath,Notifier* pNotifier ); + + void SAL_CALL deregisterNotifier( const rtl::OUString& aUnqPath,Notifier* pNotifier ); + + + + /** + * Used to associate and deassociate a new property with + * the content belonging to URL UnqPath. + * The default value and the the attributes are input + */ + + void SAL_CALL associate( const rtl::OUString& UnqPath, + const rtl::OUString& PropertyName, + const com::sun::star::uno::Any& DefaultValue, + const sal_Int16 Attributes ) + throw( com::sun::star::beans::PropertyExistException, + com::sun::star::beans::IllegalTypeException, + com::sun::star::uno::RuntimeException); + + + void SAL_CALL deassociate( const rtl::OUString& UnqPath, + const rtl::OUString& PropertyName ) + throw( com::sun::star::beans::UnknownPropertyException, + com::sun::star::beans::NotRemoveableException, + com::sun::star::uno::RuntimeException); + + + + // + // Every method having a command id is not allowed to throw anything, + // but instead must install every error code in the task handler + // + + + /** + * Given an xOutputStream, this method writes the content of the file belonging to + * URL aUnqPath into the XOutputStream + */ + + void SAL_CALL page( sal_Int32 CommandId, + const rtl::OUString& aUnqPath, + const com::sun::star::uno::Reference< com::sun::star::io::XOutputStream >& xOutputStream ) + throw(); + + + /** + * Given a file URL aUnqPath, this methods returns a XInputStream which reads from the open file. + */ + + com::sun::star::uno::Reference< com::sun::star::io::XInputStream > SAL_CALL + open( sal_Int32 CommandId, + const rtl::OUString& aUnqPath, + sal_Bool bLock ) + throw(); + + + /** + * Given a file URL aUnqPath, this methods returns a XStream which can be used + * to read and write from/to the file. + */ + + com::sun::star::uno::Reference< com::sun::star::io::XStream > SAL_CALL + open_rw( sal_Int32 CommandId, + const rtl::OUString& aUnqPath, + sal_Bool bLock ) + throw(); + + + /** + * This method returns the result set containing the the children of the directory belonging + * to file URL aUnqPath + */ + + com::sun::star::uno::Reference< com::sun::star::ucb::XDynamicResultSet > SAL_CALL + ls( sal_Int32 CommandId, + const rtl::OUString& aUnqPath, + const sal_Int32 OpenMode, + const com::sun::star::uno::Sequence< com::sun::star::beans::Property >& sProperty, + const com::sun::star::uno::Sequence< com::sun::star::ucb::NumberedSortingInfo > & sSortingInfo ) + throw(); + + + /** + * Info methods + */ + + // Info for commands + com::sun::star::uno::Reference< com::sun::star::ucb::XCommandInfo > SAL_CALL + info_c() + throw(); + + // Info for the properties + com::sun::star::uno::Reference< com::sun::star::beans::XPropertySetInfo > SAL_CALL + info_p( const rtl::OUString& aUnqPath ) + throw(); + + + /** + * Sets the values of the properties belonging to fileURL aUnqPath + */ + + com::sun::star::uno::Sequence< com::sun::star::uno::Any > SAL_CALL + setv( const rtl::OUString& aUnqPath, + const com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >& values ) + throw(); + + + /** + * Reads the values of the properties belonging to fileURL aUnqPath; + * Returns an XRow object containing the values in the requested order. + */ + + com::sun::star::uno::Reference< com::sun::star::sdbc::XRow > SAL_CALL + getv( sal_Int32 CommandId, + const rtl::OUString& aUnqPath, + const com::sun::star::uno::Sequence< com::sun::star::beans::Property >& properties ) + throw(); + + + /********************************************************************************/ + /* transfer-commands */ + /********************************************************************************/ + + /** + * Moves the content belonging to fileURL srcUnqPath to fileURL dstUnqPath( files and directories ) + */ + + void SAL_CALL + move( sal_Int32 CommandId, + const rtl::OUString srcUnqPath, // Full file(folder)-path + const rtl::OUString dstUnqPath, // Path to the destination-directory + const sal_Int32 NameClash ) + throw(); + + /** + * Copies the content belonging to fileURL srcUnqPath to fileURL dstUnqPath ( files and directories ) + */ + + void SAL_CALL + copy( sal_Int32 CommandId, // See "move" + const rtl::OUString srcUnqPath, + const rtl::OUString dstUnqPath, + sal_Int32 NameClash ) + throw(); + +#define RemoveFolder 1 +#define RemoveFile -1 +#define RemoveUnknown 0 + + /** + * Deletes the content belonging to fileURL aUnqPath( recursively in case of directory ) + */ + + sal_Bool SAL_CALL + remove( sal_Int32 CommandId, + const rtl::OUString& aUnqPath, + sal_Int32 TypeToMove = RemoveUnknown, + sal_Bool MustExist = sal_True ) + throw(); + +#undef RemoveUnknown +#undef RemoveFile +#undef RemoveFolder + + + /********************************************************************************/ + /* write and create - commandos */ + /********************************************************************************/ + + /** + * Creates new directory with given URL, recursively if necessary + * Return:: success of operation + */ + + sal_Bool SAL_CALL + mkdir( sal_Int32 CommandId, + const rtl::OUString& aDirectoryName, + sal_Bool OverWrite ) + throw(); + + + /** + * Creates new file with given URL. + * The content of aInputStream becomes the content of the file + * Return:: success of operation + */ + + sal_Bool SAL_CALL + mkfil( sal_Int32 CommandId, + const rtl::OUString& aFileName, + sal_Bool OverWrite, + const com::sun::star::uno::Reference< com::sun::star::io::XInputStream >& aInputStream ) + throw(); + + + /** + * writes to the file with given URL. + * The content of aInputStream becomes the content of the file + * Return:: success of operation + */ + sal_Bool SAL_CALL + write( sal_Int32 CommandId, + const rtl::OUString& aUnqPath, + sal_Bool OverWrite, + const com::sun::star::uno::Reference< com::sun::star::io::XInputStream >& aInputStream ) + throw(); + + + + void SAL_CALL insertDefaultProperties( const rtl::OUString& aUnqPath ); + + com::sun::star::uno::Sequence< com::sun::star::ucb::ContentInfo > + queryCreatableContentsInfo(); + + + /******************************************************************************/ + /* */ + /* mapping of file urls */ + /* to uncpath and vice versa */ + /* */ + /******************************************************************************/ + + sal_Bool SAL_CALL getUnqFromUrl( const rtl::OUString& Url, rtl::OUString& Unq ); + + sal_Bool SAL_CALL getUrlFromUnq( const rtl::OUString& Unq, rtl::OUString& Url ); + + + sal_Bool m_bWithConfig; + FileProvider* m_pProvider; + com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory > m_xMultiServiceFactory; + com::sun::star::uno::Reference< com::sun::star::ucb::XPropertySetRegistry > m_xFileRegistry; + + private: + + /********************************************************************************/ + /* get eventListeners */ + /********************************************************************************/ + + std::list< ContentEventNotifier* >* SAL_CALL + getContentEventListeners( const rtl::OUString& aName ); + + std::list< ContentEventNotifier* >* SAL_CALL + getContentDeletedEventListeners( const rtl::OUString& aName ); + + std::vector< std::list< ContentEventNotifier* >* >* SAL_CALL + getContentExchangedEventListeners( const rtl::OUString aOldPrefix, + const rtl::OUString aNewPrefix, + sal_Bool withChilds ); + + std::list< PropertyChangeNotifier* >* SAL_CALL + getPropertyChangeNotifier( const rtl::OUString& aName ); + + std::list< PropertySetInfoChangeNotifier* >* SAL_CALL + getPropertySetListeners( const rtl::OUString& aName ); + + + /********************************************************************************/ + /* notify eventListeners */ + /********************************************************************************/ + + void SAL_CALL notifyPropertyChanges( + std::list< PropertyChangeNotifier* >* listeners, + const com::sun::star::uno::Sequence< com::sun::star::beans::PropertyChangeEvent >& seqChanged ); + + void SAL_CALL notifyContentExchanged( + std::vector< std::list< ContentEventNotifier* >* >* listeners_vec ); + + void SAL_CALL notifyInsert( + std::list< ContentEventNotifier* >* listeners,const rtl::OUString& aChildName ); + + void SAL_CALL notifyContentDeleted( + std::list< ContentEventNotifier* >* listeners ); + + void SAL_CALL notifyContentRemoved( + std::list< ContentEventNotifier* >* listeners, + const rtl::OUString& aChildName ); + + void SAL_CALL notifyPropertyAdded( + std::list< PropertySetInfoChangeNotifier* >* listeners, + const rtl::OUString& aPropertyName ); + + void SAL_CALL notifyPropertyRemoved( + std::list< PropertySetInfoChangeNotifier* >* listeners, + const rtl::OUString& aPropertyName ); + + + /********************************************************************************/ + /* remove persistent propertyset */ + /********************************************************************************/ + + void SAL_CALL erasePersistentSet( const rtl::OUString& aUnqPath, + sal_Bool withChilds = false ); + + /********************************************************************************/ + /* copy persistent propertyset */ + /* from srcUnqPath to dstUnqPath */ + /********************************************************************************/ + + void SAL_CALL copyPersistentSet( const rtl::OUString& srcUnqPath, + const rtl::OUString& dstUnqPath, + sal_Bool withChilds = false ); + + + // Special optimized method for getting the properties of a directoryitem, which + // is returned by osl::DirectoryItem::getNextItem() + + com::sun::star::uno::Reference< com::sun::star::sdbc::XRow > SAL_CALL + getv( Notifier* pNotifier, + const com::sun::star::uno::Sequence< com::sun::star::beans::Property >& properties, + osl::DirectoryItem& DirItem, + rtl::OUString& aUnqPath, + sal_Bool& bIsRegular ); + + + /** + * Load the properties from configuration, if create == true create them. + * The Properties are stored under the url belonging to it->first. + */ + + void SAL_CALL load( const shell::ContentMap::iterator& it, + sal_Bool create ); + + /** + * Commit inserts the determined properties in the filestatus object into + * the internal map, so that is possible to determine on a subsequent + * setting of file properties which properties have changed without filestat + */ + + void SAL_CALL + commit( + const shell::ContentMap::iterator& it, + const osl::FileStatus& aFileStatus ); + + /** + * Given a Sequence of properties seq, this method determines the mask + * used to instantiate a osl::FileStatus, so that a call to + * osl::DirectoryItem::getFileStatus fills the required fields. + */ + + void SAL_CALL + getMaskFromProperties( + sal_Int32& n_Mask, + const com::sun::star::uno::Sequence< com::sun::star::beans::Property >& seq ); + + + void SAL_CALL + setFileProperties( + const com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >& values, + sal_Int32 numberOfValues ) + throw(); + + + // Helper function for public copy + + osl::FileBase::RC SAL_CALL + copy_recursive( + const rtl::OUString& srcUnqPath, + const rtl::OUString& dstUnqPath, + sal_Int32 TypeToCopy, + sal_Bool testExistence ) + throw(); + + + // Helper function for mkfil,mkdir and write + // Creates whole path + // returns success of the operation + // The calle determines the errorCode, which should be used to install + // any error + + sal_Bool SAL_CALL + ensuredir( sal_Int32 CommandId, + const rtl::OUString& aDirectoryName, + sal_Int32 errorCode ) + throw(); + + // General + osl::Mutex m_aMutex; + ContentMap m_aContent; + + // Default properties + + const rtl::OUString Title; + const rtl::OUString CasePreservingURL; + const rtl::OUString IsDocument; + const rtl::OUString IsFolder; + const rtl::OUString DateModified; + const rtl::OUString Size; + const rtl::OUString IsVolume; + const rtl::OUString IsRemoveable; + const rtl::OUString IsRemote; + const rtl::OUString IsCompactDisc; + const rtl::OUString IsFloppy; + const rtl::OUString IsHidden; + const rtl::OUString ContentType; + const rtl::OUString IsReadOnly; + const rtl::OUString CreatableContentsInfo; + + public: + + const rtl::OUString FolderContentType; + const rtl::OUString FileContentType; + + + private: + + PropertySet m_aDefaultProperties; + com::sun::star::uno::Sequence< com::sun::star::ucb::CommandInfo > m_sCommandInfo; + + public: + // Misceancellous: + // Methods for "writeComponentInfo" and "createComponentFactory" + + static void SAL_CALL getScheme( rtl::OUString& Scheme ); + + static rtl::OUString SAL_CALL getImplementationName_static( void ); + + static com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames_static( void ); + + }; // end class shell + +} // end namespace fileaccess + +#endif + |