diff options
author | Rüdiger Timm <rt@openoffice.org> | 2004-03-30 13:54:11 +0000 |
---|---|---|
committer | Rüdiger Timm <rt@openoffice.org> | 2004-03-30 13:54:11 +0000 |
commit | 756b55ebdb406bdfb28db430473e17bff1971ca0 (patch) | |
tree | a2ed8fc475d8993d592bd7ff4ad4cd153600ce71 /configmgr | |
parent | 8f3ffcae2a82cdffdd6bdee3d5b9f203b4681ae9 (diff) |
INTEGRATION: CWS cfg04 (1.1.6); FILE ADDED
2003/12/01 11:16:33 ssmith 1.1.6.1: merge from apoco2
Diffstat (limited to 'configmgr')
-rw-r--r-- | configmgr/source/backend/backendnotifier.cxx | 231 | ||||
-rw-r--r-- | configmgr/source/backend/backendnotifier.hxx | 170 |
2 files changed, 401 insertions, 0 deletions
diff --git a/configmgr/source/backend/backendnotifier.cxx b/configmgr/source/backend/backendnotifier.cxx new file mode 100644 index 000000000000..92db282c9e5f --- /dev/null +++ b/configmgr/source/backend/backendnotifier.cxx @@ -0,0 +1,231 @@ +/************************************************************************* + * + * $RCSfile: backendnotifier.cxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: rt $ $Date: 2004-03-30 14:53:53 $ + * + * 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): _______________________________________ + * + * + ************************************************************************/ + +#include "backendnotifier.hxx" + +#ifndef INCLUDED_ALGORITHM +#include <algorithm> +#define INCLUDED_ALGORITHM +#endif + +#ifndef CONFIGMGR_CONFIGPATH_HXX_ +#include "configpath.hxx" +#endif + +namespace configmgr +{ +// --------------------------------------------------------------------------- + namespace backend + { + + +//---------------------------------------------------------------------------- +BackendChangeNotifier::BackendChangeNotifier(const uno::Reference<backenduno::XBackend>& _xBackend) +: m_aMutex() + ,m_aListeners() + ,m_aBackend(_xBackend, uno::UNO_QUERY) +{ + +} +// --------------------------------------------------------------------------- + +BackendChangeNotifier::~BackendChangeNotifier() +{ + m_aListeners.clear(); +} +// --------------------------------------------------------------------------- +void SAL_CALL BackendChangeNotifier::componentDataChanged(const backenduno::ComponentChangeEvent& _aEvent) + throw (::com::sun::star::uno::RuntimeException) +{ + rtl::OUString aComponentName = _aEvent.Component; + ListenerList::iterator aIter = m_aListeners.find(aComponentName); + if(aIter != m_aListeners.end()) + { + aIter->second.notifyListeners(aComponentName); + } +} +// ----------------------------------------------------------------------------- +void SAL_CALL BackendChangeNotifier::disposing( lang::EventObject const & rSource ) +throw (uno::RuntimeException) +{ + osl::MutexGuard aListGuard(m_aMutex); + if (m_aBackend.is()) + { + m_aBackend.clear(); + } + m_aListeners.clear(); +} +// ----------------------------------------------------------------------------- +void BackendChangeNotifier::addListener(INodeDataListener * _xListener, const ComponentRequest& _aRequest) CFG_NOTHROW() +{ + osl::MutexGuard aListGuard(m_aMutex); + + OSL_PRECOND(_xListener, "ERROR: trying to register a NULL listener"); + ComponentListener aComponentListener(_xListener, _aRequest.getOptions()); + + const rtl::OUString aComponentName = _aRequest.getComponentName().toString() ; + + //Check if we have a Listener registered for that Component + ListenerList::iterator aIter; + aIter = m_aListeners.find(aComponentName); + if (aIter == m_aListeners.end()) + { + ComponentNotifier aComponentNotifier; + aComponentNotifier.addListenerToList(aComponentListener); + m_aListeners[aComponentName] = aComponentNotifier; + + //Now need to register Listener with MultiStratumBackend for that Component + if (m_aBackend.is()) + { + m_aBackend->addChangesListener(this, aComponentName); + } + } + else + { + //Add Listener and Option to ComponentNotifier list + aIter->second.addListenerToList(aComponentListener); + + } + +} +// --------------------------------------------------------------------------- + +void BackendChangeNotifier::removeListener(INodeDataListener * _xListener, const ComponentRequest& _aRequest) CFG_NOTHROW() +{ + osl::MutexGuard aListGuard(m_aMutex); + OSL_PRECOND(!m_aListeners.empty(), + "BackendChangeNotifier:Cannot Remove Listener, no Listeners Registered"); + OSL_PRECOND(_xListener, "ERROR: trying to remove a NULL listener"); + + ListenerList::iterator aIter; + rtl::OUString aComponentName = _aRequest.getComponentName().toString() ; + + aIter = m_aListeners.find(aComponentName); + if (aIter == m_aListeners.end()) + { + OSL_TRACE("BackendChangeNotifier: removeListener: no listener registered for component %s", + aComponentName.getStr()); + } + else + { + ComponentListener aComponentListener(_xListener, _aRequest.getOptions()); + aIter->second.removeListenerFromList(aComponentListener); + if (aIter->second.isListEmpty()) + { + m_aListeners.erase(aIter); + //Need all to de-register listeners from the lower layers + if (m_aBackend.is()) + { + m_aBackend->removeChangesListener(this, aComponentName); + } + } + } + +} +// --------------------------------------------------------------------------- +ComponentNotifier::ComponentNotifier():m_aListenerList() +{ +} +// --------------------------------------------------------------------------- + + +void ComponentNotifier::addListenerToList(const ComponentListener& _aListener) +{ + m_aListenerList.push_back(_aListener); + //REM TO REMOVE + ComponentListener aListener = m_aListenerList.front(); + +} +// --------------------------------------------------------------------------- +void ComponentNotifier::removeListenerFromList(const ComponentListener& _aListener) +{ + OSL_PRECOND(!m_aListenerList.empty(), + "ComponentNotifier:Cannot Remove Listener, no Listeners Registered"); + + std::list<ComponentListener>::iterator aIter; + + //Remove first instance that matches in the list + aIter = std::find(m_aListenerList.begin(), m_aListenerList.end(),_aListener); + if(aIter != m_aListenerList.end()) + { + m_aListenerList.erase(aIter); + } +} +// --------------------------------------------------------------------------- +void ComponentNotifier::notifyListeners(const rtl::OUString& _aComponent) +{ + + for( std::list<ComponentListener>::iterator aIter = m_aListenerList.begin(); + aIter != m_aListenerList.end(); aIter++) + { + ComponentRequest aRequest( configuration::makeName + (_aComponent,configuration::Name::NoValidate()), + (*aIter).m_aOptions ); + + (*aIter).m_aListener->dataChanged(aRequest); + } + +} +// --------------------------------------------------------------------------- + } // namespace backend + +// --------------------------------------------------------------------------- +} // namespace configmgr diff --git a/configmgr/source/backend/backendnotifier.hxx b/configmgr/source/backend/backendnotifier.hxx new file mode 100644 index 000000000000..45685c635f51 --- /dev/null +++ b/configmgr/source/backend/backendnotifier.hxx @@ -0,0 +1,170 @@ +/************************************************************************* + * + * $RCSfile: backendnotifier.hxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: rt $ $Date: 2004-03-30 14:54:11 $ + * + * 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_BACKEND_BACKENDNOTIFIER_HXX +#define CONFIGMGR_BACKEND_BACKENDNOTIFIER_HXX + +#ifndef CONFIGMGR_BACKEND_MERGEDDATAPROVIDER_HXX +#include "mergeddataprovider.hxx" +#endif // CONFIGMGR_BACKEND_MERGEDDATAPROVIDER_HXX + +#ifndef _COM_SUN_STAR_CONFIGURATION_BACKEND_XBACKEND_HPP_ +#include <com/sun/star/configuration/backend/XBackend.hpp> +#endif + +#ifndef _COM_SUN_STAR_CONFIGURATION_BACKEND_XBACKENDCHANGESNOTIFIER_HPP_ +#include <com/sun/star/configuration/backend/XBackendChangesNotifier.hpp> +#endif + +#ifndef _OSL_MUTEX_HXX_ +#include <osl/mutex.hxx> +#endif + +#ifndef _CPPUHELPER_IMPLBASE1_HXX_ +#include <cppuhelper/implbase1.hxx> +#endif + +#ifndef INCLUDED_MAP +#include <map> +#define INCLUDED_MAP +#endif + +#ifndef INCLUDED_LIST +#include <list> +#define INCLUDED_LIST +#endif + + +namespace configmgr +{ +// --------------------------------------------------------------------------- + namespace backend + { + namespace uno = ::com::sun::star::uno; + namespace lang = ::com::sun::star::lang; + namespace backenduno = ::com::sun::star::configuration::backend; +// --------------------------------------------------------------------------- + typedef struct ComponentListener + { + explicit + ComponentListener(INodeDataListener * _xListener, RequestOptions _aOptions): + m_aListener( _xListener), + m_aOptions(_aOptions) + {} + + bool operator==(const ComponentListener& _aListener)const + { + return ( (&m_aListener == &_aListener.m_aListener)&& + (compareRequestOptions(m_aOptions, _aListener.m_aOptions)== 0) ); + + } + INodeDataListener * m_aListener; + RequestOptions m_aOptions; + } aComponentListener; + + /** Class used to store ComponentListener(listener and options) + */ + class ComponentNotifier + { + public: + ComponentNotifier(); + void addListenerToList(const ComponentListener& _aListener); + void removeListenerFromList(const ComponentListener& _aListener); + bool isListEmpty(){ return m_aListenerList.empty();} + void notifyListeners(const rtl::OUString& _aComponent); + private: + std::list<ComponentListener> m_aListenerList; + }; + // --------------------------------------------------------------------------- + typedef ::cppu::WeakImplHelper1<backenduno::XBackendChangesListener> BackendListener_Base; + /** Interface providing a multicasting service for changes in the backend + */ + class BackendChangeNotifier :public BackendListener_Base + { + public: + BackendChangeNotifier(const uno::Reference<backenduno::XBackend>& _xBackend); + ~BackendChangeNotifier(); + + virtual void SAL_CALL componentDataChanged(const backenduno::ComponentChangeEvent& aEvent) + throw (::com::sun::star::uno::RuntimeException); + + virtual void SAL_CALL disposing( lang::EventObject const & rSource ) + throw (uno::RuntimeException); + // notification support. + /// register a listener for observing changes to the cached data + void addListener(INodeDataListener * _xListener, const ComponentRequest& _aRequest) CFG_NOTHROW(); + /// unregister a listener previously registered + void removeListener(INodeDataListener * _xListener, const ComponentRequest& _aRequest) CFG_NOTHROW(); + private: + typedef std::map<rtl::OUString, ComponentNotifier> ListenerList; + osl::Mutex m_aMutex; + ListenerList m_aListeners; + + /** Backend being accessed */ + uno::Reference<backenduno::XBackendChangesNotifier> m_aBackend ; + }; +// --------------------------------------------------------------------------- + } // namespace backend + +// --------------------------------------------------------------------------- +} // namespace configmgr + +#endif + |