diff options
Diffstat (limited to 'configmgr/source/api/confeventhelpers.hxx')
-rw-r--r-- | configmgr/source/api/confeventhelpers.hxx | 248 |
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_ + + |