summaryrefslogtreecommitdiff
path: root/configmgr
diff options
context:
space:
mode:
authorRüdiger Timm <rt@openoffice.org>2004-03-30 13:54:11 +0000
committerRüdiger Timm <rt@openoffice.org>2004-03-30 13:54:11 +0000
commit756b55ebdb406bdfb28db430473e17bff1971ca0 (patch)
treea2ed8fc475d8993d592bd7ff4ad4cd153600ce71 /configmgr
parent8f3ffcae2a82cdffdd6bdee3d5b9f203b4681ae9 (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.cxx231
-rw-r--r--configmgr/source/backend/backendnotifier.hxx170
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
+