diff options
Diffstat (limited to 'framework/inc/classes/filtercachedata.hxx')
-rw-r--r-- | framework/inc/classes/filtercachedata.hxx | 859 |
1 files changed, 859 insertions, 0 deletions
diff --git a/framework/inc/classes/filtercachedata.hxx b/framework/inc/classes/filtercachedata.hxx new file mode 100644 index 000000000000..e6ac179fee50 --- /dev/null +++ b/framework/inc/classes/filtercachedata.hxx @@ -0,0 +1,859 @@ +/************************************************************************* + * + * 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 __FRAMEWORK_CLASSES_FILTERCACHEDATA_HXX_ +#define __FRAMEWORK_CLASSES_FILTERCACHEDATA_HXX_ + +/** Attention: stl headers must(!) be included at first. Otherwhise it can make trouble + with solaris headers ... +*/ +#include <hash_map> +#include <vector> +#include <iterator> + +//_________________________________________________________________________________________________________________ +// my own includes +//_________________________________________________________________________________________________________________ +#include <classes/checkediterator.hxx> +#include <classes/wildcard.hxx> +#include <classes/converter.hxx> +#include <threadhelp/threadhelpbase.hxx> +#include <macros/xinterface.hxx> +#include <macros/debug.hxx> +#include <general.h> + +//_________________________________________________________________________________________________________________ +// interface includes +//_________________________________________________________________________________________________________________ +#include <com/sun/star/uno/Sequence.hxx> +#include <com/sun/star/uno/Any.hxx> +#include <com/sun/star/uno/Reference.hxx> +#include <com/sun/star/beans/PropertyValue.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/util/XChangesListener.hpp> +#include <com/sun/star/util/XChangesNotifier.hpp> + +//_________________________________________________________________________________________________________________ +// other includes +//_________________________________________________________________________________________________________________ +#include <unotools/configitem.hxx> +#include <cppuhelper/weak.hxx> +#include <rtl/ustring.hxx> +#include <rtl/logfile.hxx> + +//_________________________________________________________________________________________________________________ +// namespace +//_________________________________________________________________________________________________________________ + +namespace framework{ + +//_________________________________________________________________________________________________________________ +// exported const +//_________________________________________________________________________________________________________________ + +#define PACKAGENAME_TYPEDETECTION_STANDARD DECLARE_ASCII("Office.TypeDetection" ) /// Names of our configuration files. +#define PACKAGENAME_TYPEDETECTION_ADDITIONAL DECLARE_ASCII("Office.TypeDetectionAdditional" ) +#define CFG_PATH_SEPERATOR DECLARE_ASCII("/" ) /// seperator for configuration pathes +#define PROPERTY_SEPERATOR sal_Unicode(',') /// seperator for own formated property strings of types and filters +#define LIST_SEPERATOR sal_Unicode(';') /// seperator for own formated lists as part of our own formated type- or filter-string +#define LOCALE_FALLBACK DECLARE_ASCII("en-US" ) /// fallback, if configuration can't give us current set locale ... +#define DEFAULT_FILTERCACHE_VERSION 6 /// these implmentation of FilterCache support different version of TypeDetection.xml! This define the current set default one. + +#define DEFAULT_FILTERCACHE_MODE CONFIG_MODE_DELAYED_UPDATE | CONFIG_MODE_ALL_LOCALES /// ConfigItems could run in different modes: supported values are ... { CONFIG_MODE_IMMEDIATE_UPDATE, CONFIG_MODE_DELAYED_UPDATE, CONFIG_MODE_ALL_LOCALES } +//#define DEFAULT_FILTERCACHE_MODE CONFIG_MODE_DELAYED_UPDATE /// ConfigItems could run in different modes: supported values are ... { CONFIG_MODE_IMMEDIATE_UPDATE, CONFIG_MODE_DELAYED_UPDATE, CONFIG_MODE_ALL_LOCALES } + +#define CFG_ENCODING_OPEN DECLARE_ASCII("[\'" ) /// used to start encoding of set names +#define CFG_ENCODING_CLOSE DECLARE_ASCII("\']" ) /// used to finish encoding of set names +#define PRODUCTNAME_VARIABLE DECLARE_ASCII("%productname%") +#define PRODUCTNAME_VARLENGTH 13 +#define PRODUCTNAME_FALLBACK DECLARE_ASCII("StarOffice" ) /// fallback, if configuration can't give us current set product name ... +#define FORMATVERSION_VARIABLE DECLARE_ASCII("%formatversion%" ) +#define FORMATVERSION_VARLENGTH 15 +#define FORMATVERSION_FALLBACK DECLARE_ASCII("6.0/7" ) + +//***************************************************************************************************************** +// We know some default values ... +//***************************************************************************************************************** +#define NAME_DEFAULTDETECTOR DECLARE_ASCII("com.sun.star.comp.office.FilterDetect" ) +#define NAME_GENERICLOADER DECLARE_ASCII("com.sun.star.comp.office.FrameLoader" ) +#define UINAME_GENERICLOADER DECLARE_ASCII("com.sun.star.comp.office.FrameLoader" ) +#define TYPELIST_DEFAULTDETECTOR DECLARE_ASCII("*" ) +#define TYPELIST_GENERICLOADER DECLARE_ASCII("*" ) + +//***************************************************************************************************************** +// This are all supported set-names of our filter configuration. +//***************************************************************************************************************** +#define SUBLIST_TYPES DECLARE_ASCII("Types" ) +#define SUBLIST_FILTERS DECLARE_ASCII("Filters" ) +#define SUBLIST_DETECTSERVICES DECLARE_ASCII("DetectServices" ) +#define SUBLIST_FRAMELOADERS DECLARE_ASCII("FrameLoaders" ) +#define SUBLIST_CONTENTHANDLERS DECLARE_ASCII("ContentHandlers" ) +#define SUBLIST_DEFAULTS DECLARE_ASCII("Defaults" ) + +#define TEMPLATENAME_TYPE DECLARE_ASCII("Type" ) +#define TEMPLATENAME_FILTER DECLARE_ASCII("Filter" ) +#define TEMPLATENAME_DETECTSERVICE DECLARE_ASCII("DetectService" ) +#define TEMPLATENAME_FRAMELOADER DECLARE_ASCII("FrameLoader" ) +#define TEMPLATENAME_CONTENTHANDLER DECLARE_ASCII("ContentHandler" ) + +//***************************************************************************************************************** +// These defines declare all supported names of configuration key names. +// They are not sorted and could be shared by different base configuration items. +//***************************************************************************************************************** +#define SUBKEY_PREFERRED DECLARE_ASCII("Preferred" ) +#define SUBKEY_INSTALLED DECLARE_ASCII("Installed" ) +#define SUBKEY_NAME DECLARE_ASCII("Name" ) +#define SUBKEY_UINAME DECLARE_ASCII("UIName" ) +#define SUBKEY_MEDIATYPE DECLARE_ASCII("MediaType" ) +#define SUBKEY_CLIPBOARDFORMAT DECLARE_ASCII("ClipboardFormat" ) +#define SUBKEY_URLPATTERN DECLARE_ASCII("URLPattern" ) +#define SUBKEY_EXTENSIONS DECLARE_ASCII("Extensions" ) +#define SUBKEY_DOCUMENTICONID DECLARE_ASCII("DocumentIconID" ) +#define SUBKEY_TYPE DECLARE_ASCII("Type" ) +#define SUBKEY_DOCUMENTSERVICE DECLARE_ASCII("DocumentService" ) +#define SUBKEY_FILTERSERVICE DECLARE_ASCII("FilterService" ) +#define SUBKEY_FLAGS DECLARE_ASCII("Flags" ) +#define SUBKEY_USERDATA DECLARE_ASCII("UserData" ) +#define SUBKEY_FILEFORMATVERSION DECLARE_ASCII("FileFormatVersion" ) +#define SUBKEY_TEMPLATENAME DECLARE_ASCII("TemplateName" ) +#define SUBKEY_TYPES DECLARE_ASCII("Types" ) +#define SUBKEY_ORDER DECLARE_ASCII("Order" ) +#define SUBKEY_DEFAULTDETECTOR DECLARE_ASCII("DetectService" ) +#define SUBKEY_GENERICLOADER DECLARE_ASCII("FrameLoader" ) +#define SUBKEY_DATA DECLARE_ASCII("Data" ) +#define SUBKEY_UICOMPONENT DECLARE_ASCII("UIComponent" ) + +//***************************************************************************************************************** +// These defines declare all supported property names for our name container interface. +// They are not sorted by using ... and could be shared by different methods and access operations. +//***************************************************************************************************************** +#define PROPERTY_NAME DECLARE_ASCII("Name" ) +#define PROPERTY_PREFERRED DECLARE_ASCII("Preferred" ) +#define PROPERTY_INSTALLED DECLARE_ASCII("Installed" ) +#define PROPERTY_UINAME DECLARE_ASCII("UIName" ) +#define PROPERTY_UINAMES DECLARE_ASCII("UINames" ) +#define PROPERTY_MEDIATYPE DECLARE_ASCII("MediaType" ) +#define PROPERTY_CLIPBOARDFORMAT DECLARE_ASCII("ClipboardFormat" ) +#define PROPERTY_URLPATTERN DECLARE_ASCII("URLPattern" ) +#define PROPERTY_EXTENSIONS DECLARE_ASCII("Extensions" ) +#define PROPERTY_DOCUMENTICONID DECLARE_ASCII("DocumentIconID" ) +#define PROPERTY_TYPE DECLARE_ASCII("Type" ) +#define PROPERTY_DOCUMENTSERVICE DECLARE_ASCII("DocumentService" ) +#define PROPERTY_FILTERSERVICE DECLARE_ASCII("FilterService" ) +#define PROPERTY_FLAGS DECLARE_ASCII("Flags" ) +#define PROPERTY_USERDATA DECLARE_ASCII("UserData" ) +#define PROPERTY_FILEFORMATVERSION DECLARE_ASCII("FileFormatVersion" ) +#define PROPERTY_TEMPLATENAME DECLARE_ASCII("TemplateName" ) +#define PROPERTY_TYPES DECLARE_ASCII("Types" ) +#define PROPERTY_ORDER DECLARE_ASCII("Order" ) +#define PROPERTY_UICOMPONENT DECLARE_ASCII("UIComponent" ) + +//_________________________________________________________________________________________________________________ +// exported definitions +//_________________________________________________________________________________________________________________ + +enum EModifyState +{ + E_UNTOUCHED , + E_ADDED , + E_CHANGED , + E_REMOVED +}; + +enum EFilterPackage +{ + E_STANDARD , + E_ADDITIONAL +}; + +//***************************************************************************************************************** +// These struct define a type, which present the type of a file. +// He is used for easy filter detection without file stream detection! +// The internal name is the keyname of an item with these structure in our hash map or our configuration set! +//***************************************************************************************************************** +struct FileType +{ + //------------------------------------------------------------------------------------------------------------- + // public methods + //------------------------------------------------------------------------------------------------------------- + public: + + inline FileType ( ) { impl_clear(); } + inline FileType ( const FileType& rCopy ) { impl_copy( rCopy ); } + inline ~FileType ( ) { impl_clear(); } + inline FileType& operator= ( const FileType& rCopy ) { return impl_copy( rCopy ); } + inline void free ( ) { impl_clear(); } + + //------------------------------------------------------------------------------------------------------------- + // private methods + //------------------------------------------------------------------------------------------------------------- + private: + + inline void impl_clear() + { + bPreferred = sal_False ; + sName = ::rtl::OUString() ; + sMediaType = ::rtl::OUString() ; + sClipboardFormat = ::rtl::OUString() ; + nDocumentIconID = 0 ; + lUINames.free (); + lURLPattern.free(); + lExtensions.free(); + } + + inline FileType& impl_copy( const FileType& rCopy ) + { + bPreferred = rCopy.bPreferred ; + sName = rCopy.sName ; + lUINames = rCopy.lUINames ; + sMediaType = rCopy.sMediaType ; + sClipboardFormat = rCopy.sClipboardFormat; + nDocumentIconID = rCopy.nDocumentIconID ; + lURLPattern = rCopy.lURLPattern ; + lExtensions = rCopy.lExtensions ; + return (*this); + } + + //------------------------------------------------------------------------------------------------------------- + // public member + //------------------------------------------------------------------------------------------------------------- + public: + + sal_Bool bPreferred ; + ::rtl::OUString sName ; + OUStringHash lUINames ; + ::rtl::OUString sMediaType ; + ::rtl::OUString sClipboardFormat ; + sal_Int32 nDocumentIconID ; + OUStringList lURLPattern ; + OUStringList lExtensions ; +}; + +//***************************************************************************************************************** +// These struct describe a filter which is registered for one type. +// He hold information about services which present the document himself (like a item) and a filter service which +// filter a file in these document. +// The internal name is the keyname of an item with these structure in our hash map or our configuration set! +//***************************************************************************************************************** +struct Filter +{ + //------------------------------------------------------------------------------------------------------------- + // public methods + //------------------------------------------------------------------------------------------------------------- + public: + + inline Filter ( ) { impl_clear(); } + inline Filter ( const Filter& rCopy ) { impl_copy( rCopy ); } + inline ~Filter ( ) { impl_clear(); } + inline Filter& operator= ( const Filter& rCopy ) { return impl_copy( rCopy ); } + inline void free ( ) { impl_clear(); } + + //------------------------------------------------------------------------------------------------------------- + // private methods + //------------------------------------------------------------------------------------------------------------- + private: + + inline void impl_clear() + { + nOrder = 0 ; + sName = ::rtl::OUString(); + sType = ::rtl::OUString(); + sDocumentService = ::rtl::OUString(); + sFilterService = ::rtl::OUString(); + sUIComponent = ::rtl::OUString(); + nFlags = 0 ; + nFileFormatVersion = 0 ; + sTemplateName = ::rtl::OUString(); + lUINames.free (); + lUserData.free (); + } + + inline Filter& impl_copy( const Filter& rCopy ) + { + nOrder = rCopy.nOrder ; + sName = rCopy.sName ; + sType = rCopy.sType ; + lUINames = rCopy.lUINames ; + sDocumentService = rCopy.sDocumentService ; + sFilterService = rCopy.sFilterService ; + sUIComponent = rCopy.sUIComponent ; + nFlags = rCopy.nFlags ; + nFileFormatVersion = rCopy.nFileFormatVersion ; + sTemplateName = rCopy.sTemplateName ; + lUserData = rCopy.lUserData ; + return (*this); + } + + //------------------------------------------------------------------------------------------------------------- + // public member + //------------------------------------------------------------------------------------------------------------- + public: + + sal_Int32 nOrder ; + ::rtl::OUString sName ; + ::rtl::OUString sType ; + OUStringHash lUINames ; + ::rtl::OUString sDocumentService ; + ::rtl::OUString sFilterService ; + ::rtl::OUString sUIComponent ; + sal_Int32 nFlags ; + OUStringList lUserData ; + sal_Int32 nFileFormatVersion ; + ::rtl::OUString sTemplateName ; +}; + +//***************************************************************************************************************** +// Programmer can register his own services for an content detection of different types. +// The implementation or service name of these is the keyname of an item with these structure +// in our hash map or our configuration set! +//***************************************************************************************************************** +struct Detector +{ + //------------------------------------------------------------------------------------------------------------- + // public methods + //------------------------------------------------------------------------------------------------------------- + public: + + inline Detector ( ) { impl_clear(); } + inline Detector ( const Detector& rCopy ) { impl_copy( rCopy ); } + inline ~Detector ( ) { impl_clear(); } + inline Detector& operator= ( const Detector& rCopy ) { return impl_copy( rCopy ); } + inline void free ( ) { impl_clear(); } + + //------------------------------------------------------------------------------------------------------------- + // private methods + //------------------------------------------------------------------------------------------------------------- + private: + + inline void impl_clear() + { + sName = ::rtl::OUString(); + lTypes.free(); + } + + inline Detector& impl_copy( const Detector& rCopy ) + { + sName = rCopy.sName ; + lTypes = rCopy.lTypes ; + return (*this); + } + + //------------------------------------------------------------------------------------------------------------- + // public member + //------------------------------------------------------------------------------------------------------------- + public: + + ::rtl::OUString sName ; + OUStringList lTypes ; +}; + +//***************************************************************************************************************** +// Programmer can register his own services for loading documents in a frame. +// The implementation or service name of these is the keyname of an item with these structure +// in our hash map or our configuration set! +//***************************************************************************************************************** +struct Loader +{ + //------------------------------------------------------------------------------------------------------------- + // public methods + //------------------------------------------------------------------------------------------------------------- + public: + + inline Loader ( ) { impl_clear(); } + inline Loader ( const Loader& rCopy ) { impl_copy( rCopy ); } + inline ~Loader ( ) { impl_clear(); } + inline Loader& operator= ( const Loader& rCopy ) { return impl_copy( rCopy ); } + inline void free ( ) { impl_clear(); } + + //------------------------------------------------------------------------------------------------------------- + // private methods + //------------------------------------------------------------------------------------------------------------- + private: + + inline void impl_clear() + { + sName = ::rtl::OUString(); + lUINames.free (); + lTypes.free (); + } + + inline Loader& impl_copy( const Loader& rCopy ) + { + sName = rCopy.sName ; + lUINames = rCopy.lUINames ; + lTypes = rCopy.lTypes ; + return (*this); + } + + //------------------------------------------------------------------------------------------------------------- + // public member + //------------------------------------------------------------------------------------------------------------- + public: + + ::rtl::OUString sName ; + OUStringHash lUINames ; + OUStringList lTypes ; +}; + +//***************************************************************************************************************** +// Programmer can register his own services to handle a FileType and intercept dispatches. +// Don't forget: It's not a FrameLoader - it's a ContentHandler! (normaly without any UI) +//***************************************************************************************************************** +struct ContentHandler +{ + //------------------------------------------------------------------------------------------------------------- + // public methods + //------------------------------------------------------------------------------------------------------------- + public: + + inline ContentHandler( ) { impl_clear(); } + inline ContentHandler( const ContentHandler& rCopy ) { impl_copy( rCopy ); } + inline ~ContentHandler( ) { impl_clear(); } + inline ContentHandler& operator= ( const ContentHandler& rCopy ) { return impl_copy( rCopy ); } + inline void free ( ) { impl_clear(); } + + //------------------------------------------------------------------------------------------------------------- + // private methods + //------------------------------------------------------------------------------------------------------------- + private: + + inline void impl_clear() + { + sName = ::rtl::OUString(); + lTypes.free(); + } + + inline ContentHandler& impl_copy( const ContentHandler& rCopy ) + { + sName = rCopy.sName ; + lTypes = rCopy.lTypes; + return (*this); + } + + //------------------------------------------------------------------------------------------------------------- + // public member + //------------------------------------------------------------------------------------------------------------- + public: + + ::rtl::OUString sName ; + OUStringList lTypes ; +}; + +//***************************************************************************************************************** +// We need different hash maps for different tables of our configuration management. +// Follow maps convert <names> to <properties> of type, filter, detector, loader ... +// and could be used in a generic way +//***************************************************************************************************************** +template< class HashType > +class SetNodeHash : public ::std::hash_map< ::rtl::OUString , + HashType , + OUStringHashCode , + ::std::equal_to< ::rtl::OUString > > +{ + //------------------------------------------------------------------------------------------------------------- + // interface + //------------------------------------------------------------------------------------------------------------- + public: + //--------------------------------------------------------------------------------------------------------- + // The only way to free ALL memory realy! + //--------------------------------------------------------------------------------------------------------- + inline void free() + { + SetNodeHash().swap( *this ); + lAddedItems.free (); + lChangedItems.free(); + lRemovedItems.free(); + } + + //--------------------------------------------------------------------------------------------------------- + // Append changed, added or removed items to special lists + // Neccessary for saving changes + //--------------------------------------------------------------------------------------------------------- + void appendChange( const ::rtl::OUString& sName , + EModifyState eState ); + + //------------------------------------------------------------------------------------------------------------- + // member + //------------------------------------------------------------------------------------------------------------- + public: + OUStringList lAddedItems ; + OUStringList lChangedItems ; + OUStringList lRemovedItems ; +}; + +//***************************************************************************************************************** +// Use these hashes to implement different tables which assign types to frame loader or detect services. +// It's an optimism to find registered services faster! +// The preferred hash maps file extensions to preferred types to find these ones faster. +//***************************************************************************************************************** +class PerformanceHash : public ::std::hash_map< ::rtl::OUString , + OUStringList , + OUStringHashCode , + ::std::equal_to< ::rtl::OUString > > +{ + public: + //--------------------------------------------------------------------------------------------------------- + // try to free all used memory REALY! + //--------------------------------------------------------------------------------------------------------- + inline void free() + { + PerformanceHash().swap( *this ); + } + + //--------------------------------------------------------------------------------------------------------- + // normaly a complete string must match our hash key values ... + // But sometimes we need a search by using these key values as pattern! + // The in/out parameter "pStepper" is used to return a pointer to found element in hash ... + // and could be used for further searches again, which should be started at next element! + // We stop search at the end of hash. You can start it again by setting it to the begin by himself. + //--------------------------------------------------------------------------------------------------------- + inline sal_Bool findPatternKey( const ::rtl::OUString& sSearchValue , + const_iterator& pStepper ) + { + sal_Bool bFound = sal_False; + + // If this is the forst call - start search on first element. + // Otherwise start search on further elements! + if( pStepper != begin() ) + { + ++pStepper; + } + + while( + ( pStepper != end() ) && + ( bFound == sal_False ) + ) + { + bFound = Wildcard::match( sSearchValue, pStepper->first ); + // If element was found - break loop by setting right return value + // and don't change "pStepper". He must point to found element! + // Otherwise step to next one. + if( bFound == sal_False ) + ++pStepper; + } + return bFound; + } +}; + +//***************************************************************************************************************** +// Define easy usable types +//***************************************************************************************************************** +typedef SetNodeHash< FileType > FileTypeHash ; +typedef SetNodeHash< Filter > FilterHash ; +typedef SetNodeHash< Detector > DetectorHash ; +typedef SetNodeHash< Loader > LoaderHash ; +typedef SetNodeHash< ContentHandler > ContentHandlerHash ; +typedef OUStringHash PreferredHash ; +typedef OUStringList OrderList ; + +typedef CheckedIterator< OUStringList > CheckedStringListIterator ; +typedef CheckedIterator< FileTypeHash > CheckedTypeIterator ; +typedef CheckedIterator< PerformanceHash > CheckedPerformanceIterator ; + +typedef ::std::vector< FilterHash::const_iterator > FilterQuery ; + +//***************************************************************************************************************** +// Use private static data container to hold all values of configuration! +//***************************************************************************************************************** +class DataContainer : private ThreadHelpBase +{ + public: + + /** @short identifies different sets of the TypeDetection configuration package. + + @descr Most functions on top of this configuration package are the same ... + but must be executed on different places inside ths configuration structures. + These enum values can be used ate some interface methods to specify, which + configuration set should be used. + Further it must be possible to start the same action for more then one cfg type. + That's why these values must be interpreted as flags. Means: it's values must be + in range [2^n]! + */ + enum ECFGType + { + E_TYPE = 1, + E_FILTER = 2, + E_DETECTSERVICE = 4, + E_FRAMELOADER = 8, + E_CONTENTHANDLER = 16, + + E_ALL = E_TYPE | E_FILTER | E_DETECTSERVICE | E_FRAMELOADER | E_CONTENTHANDLER + }; + + public: + + DataContainer(); + + void startListener(); + void stopListener (); + + sal_Bool isModified(); + + LockHelper& getSyncronizer(); + void free(); + + sal_Bool isValidOrRepairable () const; + sal_Bool validateAndRepair (); + sal_Bool validateAndRepairTypes (); + sal_Bool validateAndRepairFilter (); + sal_Bool validateAndRepairDetectors(); + sal_Bool validateAndRepairLoader (); + sal_Bool validateAndRepairHandler (); + + sal_Bool existsType ( const ::rtl::OUString& sName ); + sal_Bool existsFilter ( const ::rtl::OUString& sName ); + sal_Bool existsDetector ( const ::rtl::OUString& sName ); + sal_Bool existsLoader ( const ::rtl::OUString& sName ); + sal_Bool existsContentHandler ( const ::rtl::OUString& sName ); + + void addType ( const FileType& aType , sal_Bool bSetModified ); + void addFilter ( const Filter& aFilter , sal_Bool bSetModified ); + void addDetector ( const Detector& aDetector, sal_Bool bSetModified ); + void addLoader ( const Loader& aLoader , sal_Bool bSetModified ); + void addContentHandler ( const ContentHandler& aHandler , sal_Bool bSetModified ); + + void replaceType ( const FileType& aType , sal_Bool bSetModified ); + void replaceFilter ( const Filter& aFilter , sal_Bool bSetModified ); + void replaceDetector ( const Detector& aDetector, sal_Bool bSetModified ); + void replaceLoader ( const Loader& aLoader , sal_Bool bSetModified ); + void replaceContentHandler( const ContentHandler& aHandler , sal_Bool bSetModified ); + + void removeType ( const ::rtl::OUString& sName , sal_Bool bSetModified ); + void removeFilter ( const ::rtl::OUString& sName , sal_Bool bSetModified ); + void removeDetector ( const ::rtl::OUString& sName , sal_Bool bSetModified ); + void removeLoader ( const ::rtl::OUString& sName , sal_Bool bSetModified ); + void removeContentHandler ( const ::rtl::OUString& sName , sal_Bool bSetModified ); + + static void convertFileTypeToPropertySequence ( const FileType& aSource , + css::uno::Sequence< css::beans::PropertyValue >& lDestination , + const ::rtl::OUString& sCurrentLocale ); + static void convertFilterToPropertySequence ( const Filter& aSource , + css::uno::Sequence< css::beans::PropertyValue >& lDestination , + const ::rtl::OUString& sCurrentLocale ); + static void convertDetectorToPropertySequence ( const Detector& aSource , + css::uno::Sequence< css::beans::PropertyValue >& lDestination ); + static void convertLoaderToPropertySequence ( const Loader& aSource , + css::uno::Sequence< css::beans::PropertyValue >& lDestination , + const ::rtl::OUString& sCurrentLocale ); + static void convertContentHandlerToPropertySequence ( const ContentHandler& aSource , + css::uno::Sequence< css::beans::PropertyValue >& lDestination ); + static void convertPropertySequenceToFilter ( const css::uno::Sequence< css::beans::PropertyValue >& lSource , + Filter& aDestination , + const ::rtl::OUString& sCurrentLocale ); + static void convertPropertySequenceToFileType ( const css::uno::Sequence< css::beans::PropertyValue >& lSource , + FileType& aDestination , + const ::rtl::OUString& sCurrentLocale ); + static void convertPropertySequenceToDetector ( const css::uno::Sequence< css::beans::PropertyValue >& lSource , + Detector& aDestination ); + static void convertPropertySequenceToLoader ( const css::uno::Sequence< css::beans::PropertyValue >& lSource , + Loader& aDestination , + const ::rtl::OUString& sCurrentLocale ); + static void convertPropertySequenceToContentHandler ( const css::uno::Sequence< css::beans::PropertyValue >& lSource , + ContentHandler& aDestination , + const ::rtl::OUString& sCurrentLocale ); + static void extractLocalizedStrings ( const ::rtl::OUString& sCurrentLocale , + const css::uno::Any& aCFGValue , + OUStringHash& lLocales ); + static void packLocalizedStrings ( sal_Int16 nMode , + const ::rtl::OUString& sCurrentLocale , + css::uno::Any& aCFGValue , + const OUStringHash& lLocales ); + static ::rtl::OUString getLocalelizedString ( const OUStringHash& lLocales , + const ::rtl::OUString& sLocale ); + static void setLocalelizedString ( OUStringHash& lLocales , + const ::rtl::OUString& sLocale , + const ::rtl::OUString& sValue ); + static void correctExtensions ( OUStringList& lExtensions ); + + public: + + FileTypeHash m_aTypeCache ; /// hold all informations about registered file types + FilterHash m_aFilterCache ; /// hold all informations about registered filters + DetectorHash m_aDetectorCache ; /// hold all informations about registered detect services + LoaderHash m_aLoaderCache ; /// hold all informations about registered loader services + ContentHandlerHash m_aContentHandlerCache ; /// hold all informations about registered content handler services + PerformanceHash m_aFastFilterCache ; /// hold all registered filter for a special file type + PerformanceHash m_aFastDetectorCache ; /// hold all registered detect services for a special file type + PerformanceHash m_aFastLoaderCache ; /// hold all registered loader services for a special file type + PerformanceHash m_aFastContentHandlerCache ; /// hold all registered content handler services for a special file type + PreferredHash m_aPreferredTypesCache ; /// assignment of extensions to preferred types for it + Loader m_aGenericLoader ; /// informations about our default frame loader + ::rtl::OUString m_sLocale ; /// current set locale of configuration to handle right UIName from set of all UINames! + sal_Bool m_bTypesModified ; + sal_Bool m_bFiltersModified ; + sal_Bool m_bDetectorsModified ; + sal_Bool m_bLoadersModified ; + sal_Bool m_bHandlersModified ; +}; + +/*-************************************************************************************************************//** + @short capsulate configuration access for fiter configuration + @descr We use the ConfigItem mechanism to read/write values from/to configuration. + This implementation could be used to handle standard AND additional filter configurations in the same way. + We set a data container pointer for filling or reading ... this class use it temp. + After successfuly calling of read(), we can use filled container directly or merge it with an existing one. + After successfuly calling of write() all values of given data container are flushed to our configuration. + + @implements - + @base ConfigItem + + @devstatus ready to use + @threadsafe no +*//*-*************************************************************************************************************/ +class FilterCFGAccess : public ::utl::ConfigItem +{ + //------------------------------------------------------------------------------------------------------------- + // interface + //------------------------------------------------------------------------------------------------------------- + public: + FilterCFGAccess ( const ::rtl::OUString& sPath , + sal_Int32 nVersion = DEFAULT_FILTERCACHE_VERSION , + sal_Int16 nMode = DEFAULT_FILTERCACHE_MODE ); // open configuration + virtual ~FilterCFGAccess( ); + + void read ( DataContainer& rData , + DataContainer::ECFGType eType ); // read values from configuration into given struct + void write ( DataContainer& rData , + DataContainer::ECFGType eType ); // write values from given struct to configuration + + static ::rtl::OUString encodeTypeData ( const FileType& aType ); // build own formated string of type properties + static void decodeTypeData ( const ::rtl::OUString& sData , + FileType& aType ); + static ::rtl::OUString encodeFilterData( const Filter& aFilter ); // build own formated string of filter properties + static void decodeFilterData( const ::rtl::OUString& sData , + Filter& aFilter ); + static ::rtl::OUString encodeStringList( const OUStringList& lList ); // build own formated string of OUStringList + static OUStringList decodeStringList( const ::rtl::OUString& sValue ); + + void setProductName ( OUStringHash& lUINames ); + void resetProductName ( OUStringHash& lUINames ); + + //------------------------------------------------------------------------------------------------------------- + // internal helper + //------------------------------------------------------------------------------------------------------------- + private: + void impl_initKeyCounts ( ); // set right key counts, which are used at reading/writing of set node properties + void impl_removeNodes ( OUStringList& rChangesList , // helper to remove list of set nodes + const ::rtl::OUString& sTemplateType , + const ::rtl::OUString& sSetName ); + + void impl_loadTypes ( DataContainer& rData ); // helper to load configuration parts + void impl_loadFilters ( DataContainer& rData ); + void impl_loadDetectors ( DataContainer& rData ); + void impl_loadLoaders ( DataContainer& rData ); + void impl_loadContentHandlers ( DataContainer& rData ); + void impl_loadDefaults ( DataContainer& rData ); + + void impl_saveTypes ( DataContainer& rData ); // helper to save configuration parts + void impl_saveFilters ( DataContainer& rData ); + void impl_saveDetectors ( DataContainer& rData ); + void impl_saveLoaders ( DataContainer& rData ); + void impl_saveContentHandlers ( DataContainer& rData ); + + //------------------------------------------------------------------------------------------------------------- + // debug checks + //------------------------------------------------------------------------------------------------------------- + private: + static sal_Bool implcp_ctor ( const ::rtl::OUString& sPath , // methods to check incoming parameter on our interface methods! + sal_Int32 nVersion , + sal_Int16 nMode ); + static sal_Bool implcp_read ( const DataContainer& rData ); + static sal_Bool implcp_write( const DataContainer& rData ); + + //------------------------------------------------------------------------------------------------------------- + // member + //------------------------------------------------------------------------------------------------------------- + private: + EFilterPackage m_ePackage ; // ... not realy used yet! should split configuration in STANDARD and ADDITIONAL filter + sal_Int32 m_nVersion ; // file format version of configuration! (neccessary for "xml2xcd" transformation!) + sal_Int32 m_nKeyCountTypes ; // follow key counts present count of configuration properties for types/filters ... and depends from m_nVersion - must be set right! + sal_Int32 m_nKeyCountFilters ; + sal_Int32 m_nKeyCountDetectors ; + sal_Int32 m_nKeyCountLoaders ; + sal_Int32 m_nKeyCountContentHandlers ; + ::rtl::OUString m_sProductName ; + ::rtl::OUString m_sFormatVersion ; +}; +/*DRAFT +class FilterCFGListener : public css::util::XChangesListener + , private ThreadHelpBase + , public ::cppu::OWeakObject +{ + public: + + enum ECFGType + { + E_TYPE , + E_FILTER , + E_LOADER , + E_DETECTOR , + E_CONTENTHANDLER + }; + + private: + + // read only access to the configuration, where we are regsieterd as changes listener. + css::uno::Reference< css::uno::XInterface > m_xCFG; + + // indicates, for which type of configuration item we listen. + ECFGType m_eType; + + DataContainer* m_pData; + + // we must know, if we are already registered as listener or not. + // That can be usefull to supress double registration calls ... + // which may will force double call backs in our disposing method! + // Such superflous calls can be dangerous. + sal_Bool m_bListening; + + public: + + DECLARE_XINTERFACE + + FilterCFGListener( const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR , + ECFGType eType , + DataContainer* pData ); + + void startListening(); + void stopListening (); + + virtual void SAL_CALL changesOccurred( const css::util::ChangesEvent& aEvent ) throw(css::uno::RuntimeException); + virtual void SAL_CALL disposing ( const css::lang::EventObject& aEvent ) throw(css::uno::RuntimeException); + + private: + + FileType impl_readType ( const css::uno::Reference< css::uno::XInterface >& xNode ); + Filter impl_readFilter ( const css::uno::Reference< css::uno::XInterface >& xNode ); + Detector impl_readDetector( const css::uno::Reference< css::uno::XInterface >& xNode ); + Loader impl_readLoader ( const css::uno::Reference< css::uno::XInterface >& xNode ); + ContentHandler impl_readHandler ( const css::uno::Reference< css::uno::XInterface >& xNode ); +}; +*/ + +} // namespace framework + +#endif // #ifndef __FRAMEWORK_CLASSES_FILTERCACHEDATA_HXX_ |