summaryrefslogtreecommitdiff
path: root/configmgr/source/api/confeventhelpers.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'configmgr/source/api/confeventhelpers.hxx')
-rw-r--r--configmgr/source/api/confeventhelpers.hxx248
1 files changed, 248 insertions, 0 deletions
diff --git a/configmgr/source/api/confeventhelpers.hxx b/configmgr/source/api/confeventhelpers.hxx
new file mode 100644
index 000000000000..1b3b45898377
--- /dev/null
+++ b/configmgr/source/api/confeventhelpers.hxx
@@ -0,0 +1,248 @@
+/*************************************************************************
+ *
+ * $RCSfile: confeventhelpers.hxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 16:13:40 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library 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 for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+#ifndef CONFIGMGR_API_EVENTHELPERS_HXX_
+#define CONFIGMGR_API_EVENTHELPERS_HXX_
+
+#ifndef _COM_SUN_STAR_UNO_RUNTIMEEXCEPTION_HPP_
+#include <com/sun/star/uno/RuntimeException.hpp>
+#endif
+
+#ifndef CONFIGMGR_API_EVENTS_HXX_
+#include "confevents.hxx"
+#endif
+
+#ifndef _OSL_DIAGNOSE_H_
+#include <osl/diagnose.h>
+#endif
+#ifndef _OSL_MUTEX_HXX_
+#include <osl/mutex.hxx>
+#endif
+
+#ifndef __SGI_STL_MAP
+#include <stl/map>
+#endif
+#ifndef __SGI_STL_SET
+#include <stl/set>
+#endif
+
+namespace configmgr
+{
+ namespace internal
+ {
+
+
+ ////////////////////////////////////////////////////////////////////////
+ template <class ListenerRef>
+ class BroadcastImplHelper
+ {
+ public:
+ osl::Mutex mutex;
+
+ public:
+ BroadcastImplHelper()
+ {}
+
+ ~BroadcastImplHelper()
+ {
+ OSL_ENSHURE(m_aInterfaces.empty(), "Configuration Broadcaster was not disposed properly");
+ }
+
+ public:
+ typedef std::set<ListenerRef> Interfaces;
+ typedef typename Interfaces::iterator FullIterator;
+ typedef typename Interfaces::const_iterator Iterator;
+
+ public:
+ FullIterator addListener(ListenerRef aListener)
+ {
+ return m_aInterfaces.insert(aListener).first;
+ }
+ void removeListener(ListenerRef aListener)
+ {
+ m_aInterfaces.erase(aListener);
+ }
+
+ void disposing(IConfigBroadcaster* pSource);
+
+ public:
+ Iterator begin() const { return m_aInterfaces.begin(); }
+ Iterator end() const { return m_aInterfaces.end(); }
+
+ Iterator find(ListenerRef aListener) const { return m_aInterfaces.find(aListener); }
+ FullIterator findFull(ListenerRef aListener) { return m_aInterfaces.find(aListener); }
+ private:
+ Interfaces m_aInterfaces;
+
+ // no implementation - not copyable
+ BroadcastImplHelper(BroadcastImplHelper&);
+ void operator=(BroadcastImplHelper&);
+ };
+
+ ////////////////////////////////////////////////////////////////////////
+ template <class Listener>
+ void BroadcastImplHelper<Listener>::disposing(IConfigBroadcaster* pSource)
+ {
+ osl::MutexGuard aGuard(this->mutex); // ensure that no notifications are running
+
+ for(FullIterator it = m_aInterfaces.begin(); it != m_aInterfaces.end(); )
+ {
+ FullIterator cur = it++;
+ if (*cur)
+ (*cur)->disposing(pSource);
+ m_aInterfaces.erase(cur);
+ }
+ }
+
+
+ /////////////////////////////////////////////////////////////////////////
+
+ class NodeListenerInfo
+ {
+ public:
+ typedef std::set<OUString> Pathes;
+
+ public:
+ NodeListenerInfo(INodeListener* pListener)
+ : m_pListener(pListener)
+ {
+ }
+
+ // path handling
+ Pathes const& pathList() const { return m_aPathes; }
+
+ void addPath(OUString const& sPath) const { m_aPathes.insert(sPath); }
+ void removePath(OUString const& sPath) const { m_aPathes.erase(sPath); }
+ //void removeChildPathes(OUString const& sPath);
+
+ // behave as pointer for use as a 'reference' class
+ INodeListener* get() const { return m_pListener; }
+ INodeListener* operator->() const { return get(); }
+ INodeListener& operator*() const { return *get(); }
+ // needed to allow if (info) ...
+ struct HasListener;
+ operator HasListener const*() const { return reinterpret_cast<HasListener*>(m_pListener); }
+
+ bool operator < (NodeListenerInfo const& aInfo) const
+ { return std::less<INodeListener*>()(m_pListener, aInfo.m_pListener); }
+
+ bool operator == (NodeListenerInfo const& aInfo) const
+ { return m_pListener == aInfo.m_pListener; }
+
+ bool operator > (NodeListenerInfo const& aInfo) const
+ { return aInfo.operator < (*this); }
+ bool operator >= (NodeListenerInfo const& aInfo) const
+ { return !operator<(aInfo); }
+ bool operator <= (NodeListenerInfo const& aInfo) const
+ { return !operator>(aInfo); }
+
+ bool operator != (NodeListenerInfo const& aInfo) const
+ { return !operator==(aInfo); }
+
+ private:
+ INodeListener* m_pListener;
+ mutable Pathes m_aPathes; // hack to be mutable as set element
+ };
+ class ConfigChangesBroadcasterImpl
+ {
+ public:
+ ConfigChangesBroadcasterImpl();
+ ~ConfigChangesBroadcasterImpl();
+
+ void add(OUString const& aName, INodeListener* pListener);
+ void remove(INodeListener* pListener);
+
+ void removed(OUString const& aPath, bool bRemovedFromModel, IConfigBroadcaster* pSource);
+
+ void dispatch(Change const& rBaseChange, OUString const& sChangeContext, sal_Bool _bError, IConfigBroadcaster* pSource);
+ void dispatch(TreeChangeList const& rList_, sal_Bool _bError, IConfigBroadcaster* pSource);
+ void disposing(IConfigBroadcaster* pSource);
+ private:
+ typedef BroadcastImplHelper<NodeListenerInfo> Listeners;
+ typedef Listeners::FullIterator InfoRef;
+ typedef std::multimap<OUString, InfoRef> PathMap;
+ Listeners m_aListeners;
+ PathMap m_aPathMap;
+ private:
+ void dispatchInner(INodeListener* pTarget, OUString const& sTargetPath, Change const& rBaseChange, OUString const& sChangeContext, sal_Bool _bError, IConfigBroadcaster* pSource);
+ void dispatchOuter(INodeListener* pTarget, OUString const& sTargetPath, Change const& rBaseChange, OUString const& sChangeContext, sal_Bool _bError, IConfigBroadcaster* pSource);
+ };
+
+ /////////////////////////////////////////////////////////////////////////
+ class ConfigMessageBroadcasterImpl
+ {
+ public:
+ void add(IMessageHandler* pListener);
+ void remove(IMessageHandler* pListener);
+
+ void dispatch(OUString const& _rNotifyReason, sal_Int32 _nNotificationId, IConfigBroadcaster* pSource);
+ void disposing(IConfigBroadcaster* pSource);
+ private:
+ typedef BroadcastImplHelper<IMessageHandler*> Listeners;
+ Listeners m_aListeners;
+ };
+
+ /////////////////////////////////////////////////////////////////////////
+ } // namespace
+} // namespace
+
+#endif // CONFIGMGR_API_EVENTHELPERS_HXX_
+
+