summaryrefslogtreecommitdiff
path: root/filter/source/config/cache/basecontainer.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'filter/source/config/cache/basecontainer.hxx')
-rw-r--r--filter/source/config/cache/basecontainer.hxx326
1 files changed, 326 insertions, 0 deletions
diff --git a/filter/source/config/cache/basecontainer.hxx b/filter/source/config/cache/basecontainer.hxx
new file mode 100644
index 000000000000..66d2ba4873ff
--- /dev/null
+++ b/filter/source/config/cache/basecontainer.hxx
@@ -0,0 +1,326 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: basecontainer.hxx,v $
+ * $Revision: 1.9 $
+ *
+ * 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_BASECONTAINER_HXX_
+#define __FILTER_CONFIG_BASECONTAINER_HXX_
+
+//_______________________________________________
+// includes
+
+#include "filtercache.hxx"
+#include <com/sun/star/uno/Exception.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/util/XRefreshable.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/container/XContainerQuery.hpp>
+#include <com/sun/star/util/XFlushable.hpp>
+#include <cppuhelper/interfacecontainer.h>
+#include <salhelper/singletonref.hxx>
+#include <cppuhelper/implbase4.hxx>
+#include <cppuhelper/weakref.hxx>
+#include <rtl/ustring.hxx>
+
+//_______________________________________________
+// namespace
+
+namespace filter{
+ namespace config{
+
+//_______________________________________________
+// definitions
+
+//_______________________________________________
+
+/** @short implements the interface css::container::XNameContainer
+ on top of a FilterCache reference.
+
+ @descr This class can be used as base for own service implementations,
+ which must provide read/write access to the filter configuration.
+ Parameters regulate read/write access, which sub set of informations
+ should be available etc.
+
+ @attention The base class BaseLock must be the first of declared ones.
+ Otherwhise we cant be shure, that our own mutex member (which is
+ present by this base class!) was full initialized inside our own
+ ctor as first!
+ */
+class BaseContainer : public BaseLock
+ , public ::cppu::WeakImplHelper4< css::lang::XServiceInfo ,
+ css::container::XNameContainer , // => XNameReplace => XNameAccess => XElementAccess
+ css::container::XContainerQuery ,
+ css::util::XFlushable >
+{
+ //-------------------------------------------
+ // member
+
+ protected:
+
+ /** @short reference to an uno service manager, which can be used
+ to create own needed services. */
+ css::uno::Reference< css::lang::XMultiServiceFactory > m_xSMGR;
+
+ // TODO
+ css::uno::WeakReference< css::util::XRefreshable > m_xRefreshBroadcaster;
+
+ /** @short the implementation name of our derived class, which we provide
+ at the interface XServiceInfo of our class ... */
+ ::rtl::OUString m_sImplementationName;
+
+ /** @short the list of supported uno service names of our derived class, which we provide
+ at the interface XServiceInfo of our class ... */
+ css::uno::Sequence< ::rtl::OUString > m_lServiceNames;
+
+ /** @short reference(!) to a singleton filter cache implementation,
+ which is used to work with the underlying configuration. */
+ ::salhelper::SingletonRef< FilterCache > m_rCache;
+
+ /** @short local filter cache, which is used to collect changes on the
+ filter configuration first and flush it later.
+
+ @descr Normaly this member isnt used nor initialized. Thats true,
+ if this container is used for reading only. The first write access
+ (e.g. by calling insertByName()) creates a copy of the current
+ global cache m_rCache to initialize the m_pFlushCache member.
+
+ Afterwards only the flush cache copy is used. Inside flush() this
+ copy will be removed and m_rCache can be used again.
+
+ m_pFlushCache and m_rCache must not be synchronized manually here.
+ m_rCache listen on the global configuration, where m_pFlushCache
+ write its data. m_rCache update itself automaticly.
+ */
+ FilterCache* m_pFlushCache;
+
+ /** @short specify, which sub container of the used filter cache
+ must be wrapped by this container interface. */
+ FilterCache::EItemType m_eType;
+
+ /** @short holds all listener, which are registered at this instance. */
+ ::cppu::OMultiTypeInterfaceContainerHelper m_lListener;
+
+ /** @short hold at least on filter cache instance alive and
+ prevent he office from unloading this cache if no filter
+ is currently used.*/
+ static ::salhelper::SingletonRef< FilterCache >* m_pPerformanceOptimizer;
+
+ //-------------------------------------------
+ // native interface
+
+ public:
+
+ //---------------------------------------
+ // ctor/dtor
+
+ /** @short standard ctor.
+
+ @descr Because mostly this class is used as base class for own service
+ implementations in combination with a ImplInheritanceHelper2 template ...
+ there is no way to provide some initializing data through the ctor :-(
+ This base class will be created inside its default ctor and must be
+ initialized with its needed parameters explicitly by calling: "init()".
+
+ @see init()
+ */
+ BaseContainer();
+
+ //---------------------------------------
+
+ /** @short standard dtor.
+ */
+ virtual ~BaseContainer();
+
+ //---------------------------------------
+
+ /** @short initialize this generic intsnace with some specialized values
+ from our derived object.
+
+ @descr Because an outside class must use ImplInheritanceHelper2 template to
+ use us a base class ... and there is no way to pass such initializing
+ parameters trough a required default ctor ... we must be initialized
+ by this special method. Of course this method must be called first before
+ any other interface method is used.
+
+ @param xSMGR
+ reference to the uno service manager, which created this service instance.
+
+ @param sImplementationName
+ the implementation name of our derived class, which we provide
+ at the interface XServiceInfo of our class ...
+
+ @param lServiceNames
+ the list of supported uno service names of our derived class, which we provide
+ at the interface XServiceInfo of our class ...
+
+ @param eType
+ specify, which sub container of the used filter cache
+ must be wrapped by this container interface.
+ */
+ virtual void init(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR ,
+ const ::rtl::OUString& sImplementationName,
+ const css::uno::Sequence< ::rtl::OUString >& lServiceNames ,
+ FilterCache::EItemType eType );
+
+ //-------------------------------------------
+ // helper
+
+ protected:
+
+ //---------------------------------------
+
+ /** @short check if the underlying configuration data was already loaded
+ and do it if neccessary automaticly.
+ */
+ void impl_loadOnDemand();
+
+ //---------------------------------------
+
+ /** @short it creates the global instance m_pFilterCache, which is a copy
+ of the global instance m_rCache, and will be used to change the
+ configuration.
+
+ @descr If no exception occures, its guaranteed, that the member m_rFlushCache
+ was initialized right and can be used further.
+ */
+ void impl_initFlushMode()
+ throw (css::uno::RuntimeException);
+
+ //---------------------------------------
+
+ /** @short returns a pointer to the current used cache member.
+
+ @descr Its a point to the FilterCache instance behind m_pFlushCache
+ or m_rCache.
+
+ @note The lifetime of this pointer is restricted to the time, where
+ the mutex of this BaseContainer instance is locked.
+ Otherwhise may be the interface method flush() will destroy
+ m_pFlushCache and the here returned pointer will be invalid!
+
+ Use:
+
+ Guard aLock(m_aLock);
+ FilterCache* p = impl_getWorkingCache();
+ p->doSomething();
+ aLock.clear();
+ // after this point p cant b e guaranteed any longer!
+ */
+ FilterCache* impl_getWorkingCache() const;
+
+ //-------------------------------------------
+ // uno interface
+
+ public:
+
+ //---------------------------------------
+ // XServiceInfo
+
+ virtual ::rtl::OUString SAL_CALL getImplementationName()
+ throw (css::uno::RuntimeException);
+
+ virtual sal_Bool SAL_CALL supportsService(const ::rtl::OUString& sServiceName)
+ throw (css::uno::RuntimeException);
+
+ virtual css::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames()
+ throw (css::uno::RuntimeException);
+
+ //---------------------------------------
+ // XNameContainer
+
+ virtual void SAL_CALL insertByName(const ::rtl::OUString& sItem ,
+ const css::uno::Any& aValue)
+ throw (css::lang::IllegalArgumentException ,
+ css::container::ElementExistException,
+ css::lang::WrappedTargetException ,
+ css::uno::RuntimeException );
+
+ virtual void SAL_CALL removeByName(const ::rtl::OUString& sItem)
+ throw (css::container::NoSuchElementException,
+ css::lang::WrappedTargetException ,
+ css::uno::RuntimeException );
+
+ //---------------------------------------
+ // XNameReplace
+
+ virtual void SAL_CALL replaceByName(const ::rtl::OUString& sItem ,
+ const css::uno::Any& aValue)
+ throw (css::lang::IllegalArgumentException ,
+ css::container::NoSuchElementException,
+ css::lang::WrappedTargetException ,
+ css::uno::RuntimeException );
+
+ //---------------------------------------
+ // XElementAccess
+
+ virtual css::uno::Any SAL_CALL getByName(const ::rtl::OUString& sItem)
+ throw (css::container::NoSuchElementException,
+ css::lang::WrappedTargetException ,
+ css::uno::RuntimeException );
+
+ virtual css::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames()
+ throw (css::uno::RuntimeException);
+
+ virtual sal_Bool SAL_CALL hasByName(const ::rtl::OUString& sItem)
+ throw (css::uno::RuntimeException);
+
+ virtual css::uno::Type SAL_CALL getElementType()
+ throw (css::uno::RuntimeException);
+
+ virtual sal_Bool SAL_CALL hasElements()
+ throw (css::uno::RuntimeException);
+
+ //---------------------------------------
+ // XContainerQuery
+
+ // must be implemented realy by derived class ...
+ // We implement return of an empty result here only!
+ // But we show an assertion :-)
+ virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createSubSetEnumerationByQuery(const ::rtl::OUString& sQuery)
+ throw (css::uno::RuntimeException);
+
+ virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createSubSetEnumerationByProperties(const css::uno::Sequence< css::beans::NamedValue >& lProperties)
+ throw (css::uno::RuntimeException);
+
+ //---------------------------------------
+ // XFlushable
+
+ virtual void SAL_CALL flush()
+ throw (css::uno::RuntimeException);
+
+ virtual void SAL_CALL addFlushListener(const css::uno::Reference< css::util::XFlushListener >& xListener)
+ throw (css::uno::RuntimeException);
+
+ virtual void SAL_CALL removeFlushListener(const css::uno::Reference< css::util::XFlushListener >& xListener)
+ throw (css::uno::RuntimeException);
+};
+
+ } // namespace config
+} // namespace filter
+
+#endif // __FILTER_CONFIG_BASECONTAINER_HXX_