summaryrefslogtreecommitdiff
path: root/filter/source/config/cache/filtercache.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'filter/source/config/cache/filtercache.hxx')
-rw-r--r--filter/source/config/cache/filtercache.hxx1066
1 files changed, 1066 insertions, 0 deletions
diff --git a/filter/source/config/cache/filtercache.hxx b/filter/source/config/cache/filtercache.hxx
new file mode 100644
index 000000000000..0c0e34b2783b
--- /dev/null
+++ b/filter/source/config/cache/filtercache.hxx
@@ -0,0 +1,1066 @@
+/*************************************************************************
+ *
+ * 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 __FILTER_CONFIG_FILTERCACHE_HXX_
+#define __FILTER_CONFIG_FILTERCACHE_HXX_
+
+//_______________________________________________
+// includes
+
+#include "cacheitem.hxx"
+#include <com/sun/star/uno/Exception.hpp>
+#include <com/sun/star/util/URL.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/uno/XInterface.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/container/XNameReplace.hpp>
+#include <com/sun/star/util/ChangesEvent.hpp>
+#include <com/sun/star/uno/Reference.h>
+#include <com/sun/star/uno/Any.h>
+#include <rtl/ustring.hxx>
+
+//_______________________________________________
+// namespace
+
+namespace filter{
+ namespace config{
+
+//_______________________________________________
+// definitions
+
+//_______________________________________________
+
+/** @short implements a cache, which contains all
+ elements of our filter and type detection
+ configuration.
+
+ @descr The cache itself is threadsafe implemented.
+ Because it should be used as a singleton only.
+ To do so please use reference mechanism as wrapper
+ around this FilterCache class.
+
+ @attention Because we use a trick to get a full initialized
+ mutex lock during initialization time (means during
+ the constructor runs), the base class FilterCacheLock
+ must be the first of all declared one!
+ Further we make it public. So any user of this class
+ can lock us from outside too.
+ */
+class FilterCache : public BaseLock
+{
+ //-------------------------------------------
+ // public types
+
+ public:
+
+ //---------------------------------------
+
+ /** @short identify the type of a container item.
+
+ @descr Because the cache interface is a generic one
+ every group of container items must be specified.
+ */
+ enum EItemType
+ {
+ E_TYPE ,
+ E_FILTER ,
+ E_FRAMELOADER ,
+ E_CONTENTHANDLER,
+ E_DETECTSERVICE
+ };
+
+ //---------------------------------------
+
+ /** @short indicates, which items already exists inside this cache
+ and which not.
+
+ @descr This cache supports a 2-step load mechanism.
+ First only types (and only some special properties of every type!)
+ but no filters/frame loaders/content handlers will be readed.
+ That should be enough to work with this cache e.g. for loading
+ the first document. After this first document was loaded successfully,
+ a special "load-on-demand-thread" will be started to fill this cache
+ with ALL other informations, which was not readed before.
+ Thats the second step. All operations on top of this cache will be
+ blocked then.
+ */
+ enum EFillState
+ {
+ E_CONTAINS_NOTHING = 0,
+ E_CONTAINS_STANDARD = 1,
+ E_CONTAINS_TYPES = 2,
+ E_CONTAINS_FILTERS = 4,
+ E_CONTAINS_DETECTSERVICES = 8,
+ E_CONTAINS_FRAMELOADERS = 16,
+ E_CONTAINS_CONTENTHANDLERS = 32,
+ E_CONTAINS_ALL = 63 // must be a combination of all excepting E_CONTAINS_NOTHING! Please update if items will be added or removed ...
+ };
+
+ //-------------------------------------------
+ // private types
+
+ private:
+
+ //---------------------------------------
+ /** @short regulate, which properties of a configured item
+ will be readed.
+
+ @descr To perform reading of all configuration items,
+ only standard properties will be handled. At a second
+ step all optional properties will be read and added to
+ our internal structures. Of course the combination of
+ both options can be used too, to get all properties
+ at the same time.
+ */
+ enum EReadOption
+ {
+ E_READ_NOTHING = 0,
+ E_READ_STANDARD = 1,
+ E_READ_UPDATE = 2,
+ E_READ_ALL = 3
+ };
+
+ //---------------------------------------
+ /** @short indicates the state of a configuration set item.
+
+ @descr Inside method flush we check:
+ <ul>
+ <li>if the item exists inside config layer but not inside our cache => REMOVED</li>
+ <li>if the item exists inside config layer and inside our cache => CHANGED</li>
+ <li>if the item does not exists inside config layer but inside our cache => ADDED.</li>
+ </ul>
+ */
+ enum EItemFlushState
+ {
+ /// indicates an unchanged item (can occure e.g. if an item was added and(!) removed before it was flushed ...
+ E_ITEM_UNCHANGED = 0,
+ /// indicates an item, which exists inside config layer but not inside our own cache
+ E_ITEM_REMOVED = 1,
+ /// indicates an item, which exists inside config layer and inside our own cache
+ E_ITEM_CHANGED = 2,
+ /// indicates an item, which does not exists inside config layer but inside our own cache
+ E_ITEM_ADDED = 3
+ };
+
+ //---------------------------------------
+ /** TODO document me */
+ enum EConfigProvider
+ {
+ E_PROVIDER_TYPES = 0,
+ E_PROVIDER_FILTERS = 1,
+ E_PROVIDER_OTHERS = 2,
+ E_PROVIDER_OLD = 3
+ };
+
+ //-------------------------------------------
+ // member
+
+ private:
+
+ //---------------------------------------
+ /** @short reference to an uno service manager, which can be used
+ to create own needed services. */
+ mutable css::uno::Reference< css::lang::XMultiServiceFactory > m_xSMGR;
+
+ //---------------------------------------
+ /** @short holds the used configuration provider alive, which
+ provides access to the list of types. */
+ mutable css::uno::Reference< css::uno::XInterface > m_xConfigTypes;
+
+ //---------------------------------------
+ /** @short holds the used configuration provider alive, which
+ provides access to the list of filters. */
+ mutable css::uno::Reference< css::uno::XInterface > m_xConfigFilters;
+
+ //---------------------------------------
+ /** @short holds the used configuration provider alive, which
+ provides access to the list of other values needed
+ by our type detection framework. */
+ mutable css::uno::Reference< css::uno::XInterface > m_xConfigOthers;
+
+ //---------------------------------------
+ /** @short contains all loaded types with its properties. */
+ mutable CacheItemList m_lTypes;
+
+ //---------------------------------------
+ /** @short contains all well known detect service with its properties. */
+ mutable CacheItemList m_lDetectServices;
+
+ //---------------------------------------
+ /** @short contains all loaded filters with its properties. */
+ mutable CacheItemList m_lFilters;
+
+ //---------------------------------------
+ /** @short contains all loaded frame loader with its properties. */
+ mutable CacheItemList m_lFrameLoaders;
+
+ //---------------------------------------
+ /** @short contains all loaded content handler with its properties. */
+ mutable CacheItemList m_lContentHandlers;
+
+ //---------------------------------------
+ /** @short optimize mapping of URL extensions to a type representation,
+ by using extensions as key and a list of internal
+ type names as value. */
+ mutable CacheItemRegistration m_lExtensions2Types;
+
+ //---------------------------------------
+ /** @short optimize mapping of URL pattern to a type representation,
+ by using patterns as key and a list of internal
+ type names as value. */
+ mutable CacheItemRegistration m_lURLPattern2Types;
+
+ //---------------------------------------
+ /** @short contains the current locale of the office and will be
+ used to work with localized configuration values. */
+ ::rtl::OUString m_sActLocale;
+
+ //---------------------------------------
+ /** TODO */
+ ::rtl::OUString m_sFormatName;
+
+ //---------------------------------------
+ /** TODO */
+ ::rtl::OUString m_sFormatVersion;
+
+ //---------------------------------------
+ /** @short contains status, which cache items/properties
+ was already loaded from the underlying configuration.
+
+ @descr This information can be used to detect missing
+ informations and load it on demand.
+
+ @see EFillState
+ @see load()
+ */
+ EFillState m_eFillState;
+
+ //---------------------------------------
+ /** TODO document me ... */
+ OUStringList m_lChangedTypes;
+ OUStringList m_lChangedFilters;
+ OUStringList m_lChangedDetectServices;
+ OUStringList m_lChangedFrameLoaders;
+ OUStringList m_lChangedContentHandlers;
+
+ //---------------------------------------
+ /// readonly acccess to the module configuration of OOo
+ css::uno::Reference< css::container::XNameAccess > m_xModuleCfg;
+
+ //-------------------------------------------
+ // interface
+
+ public:
+
+ //---------------------------------------
+ // ctor/dtor
+
+ /** @short standard ctor
+
+ @descr Its not allowed to do anything here ...
+ especialy is forbidden to start operations,
+ which needs a FilterCache instance too!
+ Why? Because thie FilterCache instance will be
+ used as a singleton! And if during this ctor any
+ action related to this FilterCache singleton is
+ started ... a race will be the result.
+
+ The first method after construction of a new
+ singleton reference should be "load()". There
+ a special fill state of this cache can be forced.
+ */
+ FilterCache();
+
+ //---------------------------------------
+
+ /** @short standard dtor.
+ */
+ virtual ~FilterCache();
+
+ //---------------------------------------
+
+ /** @short creates a copy of this container.
+
+ @descr Such copy can be used then to modify items (add/change/remove)
+ without the risk to damage the original container.
+ After its changed data was flushed to the configuration it can be
+ removed.
+
+ The original container will get these new data automaticly
+ because it listen for changes on the internal used configuration layer.
+ If the new data are needed immediatly inside the original container,
+ the method takeOver() can be used to copy all changes back.
+ The may be following notifications of the configuration will be superflous then.
+ But they cant be stopped ...
+
+ All internal structures will be copied here. But the internal used
+ configuration (update) access wont be copied. The cloned instance contains
+ a different one.
+
+ @note The cloned instance is created on the heap. The user of this instance
+ has to remove it later.
+ */
+ virtual FilterCache* clone() const;
+
+ //---------------------------------------
+
+ /** @short copy the cache content or rClone back to this instance.
+ */
+ virtual void takeOver(const FilterCache& rClone);
+
+ //---------------------------------------
+
+ /** @short force special fill state of this cache.
+
+ @descr This method check if all requested items/properties already
+ exists. Only missing informations will be readed.
+ Otherwhise this method does nothing!
+
+ This method must be called from every user of this cache
+ everytimes it need a filled cache. Normaly we load
+ only standard informations into this cache on startup.
+ After a few seconds we start a special thread, which
+ may fill this cache completely. But if somehwere outside
+ need a filled cache before ... it can run into trouble,
+ if this "load-on-demand" thread does not finished its work before.
+ This method "load(xxx)" synchronize such load-on-demand requests.
+
+ Of course it would be possible to supress this special load thread
+ in general and start it manualy inside this load() request.
+ The outside code decide then, if and when this cache will be filled
+ with all available informations ...
+
+ @param bByThread
+ indicates using of this method by our global "load-on-demand-thread".
+ Its an implementation detail! We use it to check, if this "load()"
+ request was forced e.g. by one of our derived service container (which need
+ it to full fill its own operations) or if it was forced by our own
+ "load-on-demand-thread", which tries to optimize our startup performance
+ and start this load() only in case the office startup was already finished!
+
+ @throw An exception if the cache could not be filled realy
+ or seems to be invalid afterwards. But there is no reaction
+ at all if this method does nothing inside, because the cache
+ is already full filled!
+ */
+ virtual void load(EFillState eRequired ,
+ sal_Bool bByThread = sal_False)
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** @short return the current fill state of this cache.
+
+ @descr This information can be used e.g. to start
+ a search on top of this cache with a minimum on
+ informations ... and do it again, if some other
+ cache items seems to be available after calling of "loadAll()"
+ on this cache and first search does not had any valid results.
+
+ @return TRUE if the required fill state exists for this cache; FALSE
+ otherwise.
+ */
+ virtual sal_Bool isFillState(EFillState eRequired) const
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** @short return a list of key names for items, which match
+ the specified criteria.
+
+ @descr The returned key names can be used at another method "getItem()"
+ of this cache to get further informations about this item.
+
+ @attention Please note: because this cache can be used inside multithreaded
+ environments, such returned key name can point to an already removed
+ item! Please be aware of some "NoSuchElementExceptions" if you try to
+ call any other method of this cache in relation to this key name.
+
+ @param eType
+ specify the sub container of this cache, which should be used for
+ searching. see also EItemType.
+
+ @param lIProps
+ specify the property set, which must exist at the searched items
+ as minimum.
+
+ @param lEProps
+ specify the property set, which must not(!) exist at the searched items
+ as minimum.
+
+ @return [OUStringList]
+ a list of key names, which identify items of the queried sub container.
+ May be an empty list.
+
+ @throw [css::uno::Exception]
+ if some input parameter are wrong or the cache itself is not valid
+ any longer, because any operation before damage it.
+ */
+ virtual OUStringList getMatchingItemsByProps( EItemType eType ,
+ const CacheItem& lIProps ,
+ const CacheItem& lEProps = CacheItem()) const
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** @short indicates if the requested sub container
+ contains some items.
+
+ @descr We dont provide any information about the count
+ of such items. Because we dont implement any index
+ based interface! The information "we have items or not"
+ must be enough for the outside code ... till somewhere
+ give us a good reason. :-)
+
+ @param eType
+ specify the sub container of this cache, which should be used.
+ see also EItemType.
+
+ @return [sal_Bool]
+ True, if the requested sub container contains some items;
+ False otherwhise.
+
+ @throw [css::uno::Exception]
+ if some input parameter are wrong or the cache itself is not valid
+ any longer, because any operation before damage it.
+ */
+ virtual sal_Bool hasItems(EItemType eType) const
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** @short return a list of all key names, which represent
+ an item inside the specified sub container.
+
+ @attention Please note: because this cache can be used inside multithreaded
+ environments, such returned key names can point to some already removed
+ items! Please be aware of some "NoSuchElementExceptions" if you try to
+ call any other method of this cache in relation to this key names.
+
+ @param eType
+ specify the sub container of this cache, which should be used for
+ searching. see also EItemType.
+
+ @return [OUStringList]
+ a list of key names, which can be used to access the item properties
+ using some other methods of this cache.
+
+ @throw [css::uno::Exception]
+ if some input parameter are wrong or the cache itself is not valid
+ any longer, because any operation before damage it.
+ */
+ virtual OUStringList getItemNames(EItemType eType) const
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** @short check if the required item exist inside this container.
+
+ @attention This method exists to supports some UNO container interfaces
+ only. (e.g. XNameAccess.hasByName()). But inside multithreaded
+ environments there is no guarantee, that this item still exists, if
+ its realy requested e.g. by calling getItem()!
+ Be aware of some NoSuchElementExistExceptions ...
+
+ @param eType
+ specify the sub container of this cache, which should be used.
+ see also EItemType.
+
+ @param sItem
+ the key name of the requested item inside the pecified sub container.
+
+ @throw [css::uno::Exception]
+ if some input parameter are wrong or the cache itself is not valid
+ any longer, because any operation before damage it.
+ */
+ virtual sal_Bool hasItem( EItemType eType,
+ const ::rtl::OUString& sItem)
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** @short return an item, which match the specified type and name.
+
+ @descr Because this cache can be used inside multithreaded environments
+ the caller must be aware of some exceptions - especialy a "NoSuchElementExcepotion".
+ May another thread already removed the required item before ...
+
+ @param eType
+ specify the sub container of this cache, which should be used for
+ searching. see also EItemType.
+
+ @param sItem
+ specify the requested item by its key name.
+
+ @return [CacheItem]
+ the required item if it could be located ...
+ But we throw an exception if the required item does not exist!
+
+ @throw [css::container::NoSuchElementException]
+ if the required item does not still exist.
+
+ @throw [css::uno::Exception]
+ if some input parameter are wrong or the cache itself is not valid
+ any longer, because any operation before damage it.
+ */
+ virtual CacheItem getItem( EItemType eType,
+ const ::rtl::OUString& sItem)
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** TODO document me ...
+ */
+ virtual void removeItem( EItemType eType,
+ const ::rtl::OUString& sItem)
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** TODO document me ...
+ */
+ virtual void setItem( EItemType eType ,
+ const ::rtl::OUString& sItem ,
+ const CacheItem& aValue)
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** TODO document me ...
+ */
+ virtual void refreshItem( EItemType eType,
+ const ::rtl::OUString& sItem)
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** @short add some implicit properties to the given
+ cache item reference.
+
+ @descr Such properties can e.g. finalized or mandatory.
+ They are not persistent and not realy part of e.g. a
+ filter not. But they are attributes of a configuration
+ entry and can influence our container interface.
+
+ @attention These properties are not part of the normal CacheItem
+ returned by the method getItem(). Because getItem() is
+ used internaly too but these specialized properties
+ are needed at our container services only. So these
+ function sets are different to allow different handling.
+
+ @param eType
+ specify the sub container of this cache, which should be used for
+ searching. see also EItemType.
+
+ @param sItem
+ specify the requested item by its key name.
+
+ @param rItem
+ contains already the normal properties of this item,
+ and will be used as out parameter to add the implicit
+ attributes there.
+
+ @throw [css::uno::Exception]
+ if an internal error occured.
+ Note: If the item is missing inside the underlying configuration
+ no exception will be thrown. In such case the item is marked as
+ finalized/mandatory automaticly
+ Reason: May be the item cames from the old configuration package and
+ was not migrated to the new one. So we cant provide write access
+ to such items ...
+ */
+ virtual void addStatePropsToItem( EItemType eType,
+ const ::rtl::OUString& sItem,
+ CacheItem& rItem)
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** TODO document me
+ */
+ virtual void removeStatePropsFromItem(CacheItem& aValue)
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** @short force writing of all changes (which was made after
+ last flush was called) back to the configuration.
+
+ @descr TODO
+
+ @throw [css::uno::Exception]
+ if the cache itself is not valid
+ any longer, because any operation before damage it.
+ */
+ virtual void flush()
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** @short supports a flat type detection for given URL.
+
+ @descr Because such detection works on our optimized internal
+ structures (e.g. mapping from extensions/pattern to type names),
+ it should be made inside this cache.
+
+ @param aURL
+ URL of the content, which type should be detected.
+ Its already parsed and splitted into its differnt parts,
+ like e.g.: main, jump marks etcpp.
+
+ @param rFlatTypes
+ used as [out] parameter to add all types, which match to the given
+ URL. Further an information is added for every type. It indicates, how
+ this type is related to the specified URL (means e.g. if it matches
+ by extension or URLPattern ...).
+
+ @attention Please note: because this cache can be used inside multithreaded
+ environments, such returned key names can point to some already removed
+ items! Please be aware of some "NoSuchElementExceptions" if you try to
+ call any other method of this cache in relation to this key names.
+
+ @throw [css::uno::Exception]
+ if the cache itself is not valid
+ any longer, because any operation before damage it.
+ */
+ virtual void detectFlatForURL(const css::util::URL& aURL ,
+ FlatDetection& rFlatTypes) const
+ throw(css::uno::Exception);
+
+ //-------------------------------------------
+ // private helper
+
+ private:
+
+ //---------------------------------------
+
+ /** @short return a reference to one of our internal
+ sub container, which contains items of the
+ requested type.
+
+ @param eType
+ specify, which sub container is needed outside.
+
+ @return [CacheItemList&]
+ a reference(!) to the right sub container member.
+
+ @throw [css::uno::Exception]
+ if the required list does not exist.
+ */
+ CacheItemList& impl_getItemList(EItemType eType) const
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** @short return a valid configuration update access
+ to the underlying configuration package, which
+ is fix for this cache.
+
+ @descr It checks first, if the internal member m_xConfig already
+ points to an open update access. If not - it opens a new one.
+ Doing so this method can be called everytimes a configuration
+ access is needed.
+
+ @param eProvider
+ specify the needed configuration provider.
+ see EConfigProvider for further informations ...
+
+ @attention If a configuration access was opened successfully
+ all neccessary listener connections will be established
+ too. So this cache will be informed about outside updates.
+ */
+ css::uno::Reference< css::uno::XInterface > impl_openConfig(EConfigProvider eProvide)
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** @short tries to open the requested configuration root
+ using the specified modi.
+
+ @param sRoot
+ specify the configuration root, which should be opened.
+
+ @param bReadOnly
+ enable/disable write access on the returned configuration
+ object.
+
+ @param bLocalesMode
+ enable/disable special handling of localized configuratiom
+ items by the returned configuration object.
+
+ @return A valid reference, if the configuration access could be opened
+ and initialized within the requested modes successfully;
+ a NULL reference otherwhise.
+ */
+ css::uno::Reference< css::uno::XInterface > impl_createConfigAccess(const ::rtl::OUString& sRoot ,
+ sal_Bool bReadOnly ,
+ sal_Bool bLocalesMode);
+
+ //---------------------------------------
+
+ /** @short reads the specified configuration key
+ and return its value.
+
+ @descr The specified key must be an absolute configuration path,
+ which can be splitted into its package and relative path tokens.
+
+ @attention Because this function might opens a new configuration
+ read access for reading one key value only, it should
+ be used in rare cases only. Its an easy way ... but an
+ expensive one.
+
+ @param sDirectKey
+ the absolute configuration path, which should be readed.
+
+ @return [css::uno::Any]
+ the value of the requested key.
+ Can be empty if an internal error occured or if the requested
+ key does not exists!
+ */
+ css::uno::Any impl_getDirectCFGValue(const ::rtl::OUString& sDirectKey);
+
+ //---------------------------------------
+
+ /** @short load the underlying configuration into this cache.
+
+ @descr Which items should be readed can be regulate by the
+ parameter eRequiredState. That provides the possibility
+ to load standard values on startup only and update this
+ cache later on demand with all available informations.
+
+ @param eRequiredState
+ indicates, which fill state this cache should have afterwards.
+ */
+ void impl_load(EFillState eRequiredState)
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** @short validate the whole cache and create
+ structures for optimized items access.
+
+ @descr Wrong cache items will be removed automaticly.
+ Wrong dependencies will be corrected automaticly.
+ If something could not be repaired - an exception
+ is thrown.
+ Further some optmized structures will be created.
+ E.g.: a hash to map extensions to her types.
+
+ @attention There is no exception, if the cache could be repaired
+ but contained wrong elements before!
+
+ @throw [css::uno::Exception]
+ if cache is invalid and could not be repaired.
+ */
+ void impl_validateAndOptimize()
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** @short register the specified item for the given type.
+
+ @descr Because detect services, frame loader or content handler
+ are not listed inside the xml configuration as seperated
+ items (they are properties of any type entry!), this method update
+ the internal lists of such items. Thats neccessary to have
+ it accessible for our container interfaces of detect, frame loader
+ and content handler services.
+
+ @param pList
+ points to a CacheItemList of this filter cache, where
+ this item registration should be updated or added.
+
+ @param sItem
+ specify the detect service, frame loader or content handler,
+ which should be registered for the given type.
+
+ @param sType
+ contains the internal type name, where the item should be registered for.
+
+ @throw [css::uno::Exception]
+ If registration failed by any reason.
+ That does not include double registrations!
+ */
+ void impl_resolveItem4TypeRegistration( CacheItemList* pList,
+ const ::rtl::OUString& sItem,
+ const ::rtl::OUString& sType)
+ throw(css::uno::Exception);
+
+ //-------------------------------------------
+ // static helper
+
+ private:
+
+ //---------------------------------------
+
+ /** @short read the specified config set into the cache.
+
+ @descr This method provides the following mechanism for reading:
+ a) read only standard properties of set items
+ b) read anything
+ c) read only optional properties and update already existing
+ items of the specified cache
+
+ @param xConfig
+ API which provides access to the required configuration set.
+
+ @param eType
+ specify the type of config item, which must be interpreted.
+ Of course this information can be used to locate the right set
+ at the given xConfig API object.
+
+ @param eOption
+ regulate reading of standard/optional or all properties.
+
+ @param pCache
+ points to the cache member, which should be filled or updated.
+
+ @throw [css::uno::Exception]
+ if an unrecoverable error occure inside this operation.
+ */
+ void impl_loadSet(const css::uno::Reference< css::container::XNameAccess >& xConfig,
+ EItemType eType ,
+ EReadOption eOption,
+ CacheItemList* pCache )
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** @short read the specified container item from the given configuration set.
+
+ @descr Its not added to any internal structures here. That must be done
+ outside this method.
+
+ @param xSet
+ provides access to the configuration set, which includes all items.
+
+ @param eType
+ specify, which container item type must be readed.
+
+ @param sItem
+ means the internal name, which can be used to adress the item
+ properties relativ to the given configuration set.
+
+ @param eOption
+ regulate, which properties of the requested item should be read.
+ See defintion of EReadOption for further informations.
+
+ @throw [css::uno::Exception]
+ if an unrecoverable error occure inside this operation.
+ */
+ CacheItem impl_loadItem(const css::uno::Reference< css::container::XNameAccess >& xSet ,
+ EItemType eType ,
+ const ::rtl::OUString& sItem ,
+ EReadOption eOption)
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** @short try to load the requested item on demand from the underlying configuration
+ layer.
+
+ @descr The outside code has to be shure, that the item does not already exists
+ inside this cachse. Otherwise it will be loaded twice. This method
+ doesnt check such constellations!
+
+ @param eType
+ specify the type of config item, which must be interpreted.
+ Of course this information can be used to locate the right set
+ at the given xConfig API object.
+
+ @param sItem
+ the set node name of the requested item.
+
+ @return An iterator, which points directly to the new cached item.
+ Is a valid iterator if no exception occured here!
+ But to improve robustness - it should be checked :-)
+
+ @throw [css::container::NoSuchElementException]
+ if the item does not exists inside the configuration layer too!
+
+ @throw [css::uno::Exception]
+ if an unrecoverable error occure inside this operation.
+ */
+ CacheItemList::iterator impl_loadItemOnDemand( EItemType eType,
+ const ::rtl::OUString& sItem)
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** TODO */
+ void impl_saveItem(const css::uno::Reference< css::container::XNameReplace >& xSet ,
+ EItemType eType ,
+ const CacheItem& aValue)
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** TODO */
+ void impl_addItem2FlushList( EItemType eType,
+ const ::rtl::OUString& sItem)
+ throw(css::uno::Exception);
+
+
+ //---------------------------------------
+
+ /** TODO */
+ void impl_flushByList(const css::uno::Reference< css::container::XNameAccess >& xSet ,
+ EItemType eType ,
+ const CacheItemList& rCache,
+ const OUStringList& lItems)
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** @short specify, which save operation is neccessary for the specified item.
+
+ @desrc If an item of this cache will be added/removed or modified it will
+ be changed inside memory only first. But we save its name inside a special
+ list of changed items. If at least the method flush() is called, we use
+ this list to check if the item was changed/added or removed. This method
+ checks the exist state of the requested item inside our own cache
+ and inside the underlying configuration layer to find out, if the item
+ must be removed/added or modified inside the configuratuion layer.
+
+ @param xSet
+ points directly to the configuration set, where the item should resist
+ (if it exists!).
+
+ @param rList
+ points to our internal cache list, where the item should resist
+ (if it exists!).
+
+ @param sItem
+ the internal name of the item, which should be checked.
+
+ @return An enum value of type EItemFlushState, which indicates the needed
+ API operation for updating the underlying configuration layer.
+
+ @throws An exception if anything failed inside this operation.
+ e.g. the given configuration set was not open.
+ */
+ EItemFlushState impl_specifyFlushOperation(const css::uno::Reference< css::container::XNameAccess >& xSet ,
+ const CacheItemList& rList,
+ const ::rtl::OUString& sItem)
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** TODO */
+ void impl_readPatchUINames(const css::uno::Reference< css::container::XNameAccess >& xNode,
+ CacheItem& rItem)
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** TODO */
+ void impl_savePatchUINames(const css::uno::Reference< css::container::XNameReplace >& xNode,
+ const CacheItem& rItem)
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** TODO */
+ void impl_readOldFormat()
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** TODO */
+ CacheItem impl_readOldItem(const css::uno::Reference< css::container::XNameAccess >& xSet ,
+ EItemType eType,
+ const ::rtl::OUString& sItem)
+ throw(css::uno::Exception);
+
+ //---------------------------------------
+
+ /** TODO */
+ void impl_interpretDataVal4Type(const ::rtl::OUString& sValue,
+ sal_Int32 nProp ,
+ CacheItem& rItem );
+
+ //---------------------------------------
+
+ /** TODO */
+ void impl_interpretDataVal4Filter(const ::rtl::OUString& sValue,
+ sal_Int32 nProp ,
+ CacheItem& rItem );
+
+ //---------------------------------------
+
+ /** TODO */
+ OUStringList impl_tokenizeString(const ::rtl::OUString& sData ,
+ sal_Unicode cSeperator);
+
+ //---------------------------------------
+
+#if OSL_DEBUG_LEVEL > 0
+ /** TODO */
+ ::rtl::OUString impl_searchFrameLoaderForType(const ::rtl::OUString& sType) const;
+ ::rtl::OUString impl_searchContentHandlerForType(const ::rtl::OUString& sType) const;
+#endif
+
+ //---------------------------------------
+ /** @short check if the specified OOo module is installed.
+
+ @param sModule
+ the long name of the module (e.g. "com.sun.star.text.TextDocument").
+
+ @return TRUE if the requested module is installed; FALSE otherwise.
+ */
+ sal_Bool impl_isModuleInstalled(const ::rtl::OUString& sModule);
+
+ //---------------------------------------
+
+ /** @short convert a list of flag names to its int representation.
+
+ @param lNames
+ the list of flag names.
+
+ @return [sal_Int32]
+ the converted flag field.
+ */
+ static sal_Int32 impl_convertFlagNames2FlagField(const css::uno::Sequence< ::rtl::OUString >& lNames);
+
+ //---------------------------------------
+
+ /** @short convert a flag field value to its list representation of flag names.
+
+ @param nFlags
+ the flag field value
+
+ @return [seq< string >]
+ the converted flag name list.
+ */
+ static css::uno::Sequence< ::rtl::OUString > impl_convertFlagField2FlagNames(sal_Int32 nFlags);
+};
+
+ } // namespace config
+} // namespace filter
+
+#endif // __FILTER_CONFIG_FILTERCACHE_HXX_