summaryrefslogtreecommitdiff
path: root/configmgr/source/api2/broadcaster.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'configmgr/source/api2/broadcaster.cxx')
-rw-r--r--configmgr/source/api2/broadcaster.cxx1229
1 files changed, 0 insertions, 1229 deletions
diff --git a/configmgr/source/api2/broadcaster.cxx b/configmgr/source/api2/broadcaster.cxx
deleted file mode 100644
index 7db7b1090111..000000000000
--- a/configmgr/source/api2/broadcaster.cxx
+++ /dev/null
@@ -1,1229 +0,0 @@
-/*************************************************************************
- *
- * 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: broadcaster.cxx,v $
- * $Revision: 1.21 $
- *
- * 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.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_configmgr.hxx"
-
-#include "broadcaster.hxx"
-#include "notifierimpl.hxx"
-#include "confignotifier.hxx"
-#include "noderef.hxx"
-#include "nodechange.hxx"
-#include "nodechangeinfo.hxx"
-#include "translatechanges.hxx"
-#include "apifactory.hxx"
-#include "apitreeaccess.hxx"
-#include "apitreeimplobj.hxx"
-#include <vos/refernce.hxx>
-
-#ifndef INCLUDED_MAP
-#include <map>
-#define INCLUDED_MAP
-#endif
-#ifndef INCLUDED_SET
-#include <set>
-#define INCLUDED_SET
-#endif
-#ifndef INCLUDED_FUNCTIONAL
-#include <functional>
-#define INCLUDED_FUNCTIONAL
-#endif
-
-namespace configmgr
-{
- namespace configapi
- {
-// ---------------------------------------------------------------------------------------------------
-// Broadcaster implementation
-// ---------------------------------------------------------------------------------------------------
- class BroadcasterHelper
- {
- public:
- static vos::ORef<NotifierImpl> getImpl(Notifier const& aNotifier) { return aNotifier.m_aImpl; }
- };
-// ---------------------------------------------------------------------------------------------------
-
- namespace
- {
- // -----------------------------------------------------------------------------------------------
- template <class T>
- struct LessORefBodyPtr
- {
- bool operator()(vos::ORef<T> const& lhs, vos::ORef<T> const& rhs) const
- {
- return ptr_less(lhs.getBodyPtr(), rhs.getBodyPtr());
- }
-
- std::less<T*> ptr_less;
- };
- // -----------------------------------------------------------------------------------------------
- class ApiTreeRef
- {
- ApiTreeImpl const* m_pApiTree;
- uno::Reference<uno::XInterface> m_xKeepAlive;
- public:
- explicit ApiTreeRef(ApiTreeImpl const* _pApiTree = NULL)
- : m_pApiTree(_pApiTree)
- , m_xKeepAlive()
- {
- if (m_pApiTree) m_xKeepAlive = m_pApiTree->getUnoInstance();
- }
-
- bool is() const
- {
- OSL_ASSERT(!m_pApiTree == !m_xKeepAlive.is());
- return m_pApiTree != NULL;
- }
-
- ApiTreeImpl const* get() const { return m_pApiTree; }
- ApiTreeImpl const* operator->() const { return m_pApiTree; }
-
- friend bool operator==(ApiTreeRef const& lhs,ApiTreeRef const& rhs)
- { return lhs.m_pApiTree == rhs.m_pApiTree; }
-
- friend bool operator!=(ApiTreeRef const& lhs,ApiTreeRef const& rhs)
- { return lhs.m_pApiTree != rhs.m_pApiTree; }
- };
- // -----------------------------------------------------------------------------------------------
- typedef std::map< vos::ORef<NotifierImpl>, ApiTreeRef, LessORefBodyPtr<NotifierImpl> > NotifierSet;
- // -----------------------------------------------------------------------------------------------
-
- }
-// ---------------------------------------------------------------------------------------------------
-// class Broadcaster::Impl
-// ---------------------------------------------------------------------------------------------------
- class Broadcaster::Impl : public vos::OReference
- {
- private:
- NotifierSet::value_type m_aNotifierData;
- public:
- Impl(NotifierSet::value_type const& aNotifierData) : m_aNotifierData(aNotifierData) {}
-
- NotifierSet::value_type getNotifierData() const { return m_aNotifierData; }
-
- bool translateChanges(configuration::NodeChangesInformation& aInfos, configuration::NodeChanges const& aChanges, bool bSingleBase) const;
- bool translateChanges(configuration::NodeChangesInformation& aInfos, configuration::NodeChangesInformation const& aChanges, bool bSingleBase) const;
-
- void queryConstraints(configuration::NodeChangesInformation const& aChanges) { this->doQueryConstraints(aChanges); }
- void notifyListeners(configuration::NodeChangesInformation const& aChanges) { this->doNotifyListeners(aChanges); }
-
- void notifyRootListeners(configuration::NodeChangesInformation const& aChanges);
-
- static vos::ORef<Impl> create(vos::ORef<NotifierImpl> const& rNotifierImpl, ApiTreeRef const& pTreeImpl, configuration::NodeChange const& aChange, bool bLocal);
- static vos::ORef<Impl> create(vos::ORef<NotifierImpl> const& rNotifierImpl, ApiTreeRef const& pTreeImpl, configuration::NodeChanges const& aChange, bool bLocal);
- static vos::ORef<Impl> create(vos::ORef<NotifierImpl> const& rNotifierImpl, ApiTreeRef const& pTreeImpl, configuration::NodeChangeInformation const& aChange, bool bLocal);
- static vos::ORef<Impl> create(vos::ORef<NotifierImpl> const& rNotifierImpl, ApiTreeRef const& pTreeImpl, configuration::NodeChangesInformation const& aChange, bool bLocal);
-
- private:
- virtual void doQueryConstraints(configuration::NodeChangesInformation const& aChanges) = 0;
- virtual void doNotifyListeners(configuration::NodeChangesInformation const& aChanges) = 0;
- };
-// ---------------------------------------------------------------------------------------------------
- namespace
- {
- // -----------------------------------------------------------------------------------------------
-
- class EmptyBroadcaster_Impl : public Broadcaster::Impl
- {
- EmptyBroadcaster_Impl(NotifierSet::value_type const& rNotifierData)
- : Broadcaster::Impl(rNotifierData)
- {
- }
- public:
- static
- vos::ORef< Broadcaster::Impl > create(NotifierSet::value_type const& rRootNotifier)
- {
- return new EmptyBroadcaster_Impl(rRootNotifier);
- }
- private:
- virtual void doQueryConstraints(configuration::NodeChangesInformation const& aChanges);
- virtual void doNotifyListeners(configuration::NodeChangesInformation const& aChanges);
- };
-
- void EmptyBroadcaster_Impl::doQueryConstraints(configuration::NodeChangesInformation const&) {}
- void EmptyBroadcaster_Impl::doNotifyListeners(configuration::NodeChangesInformation const&) {}
- // -----------------------------------------------------------------------------------------------
-
- class NodeLocalBroadcaster_Impl : public Broadcaster::Impl
- {
- configuration::NodeID aAffectedNode;
-
- public:
- NodeLocalBroadcaster_Impl(NotifierSet::value_type const& rTreeNotifierData, configuration::NodeID const& aAffectedID)
- : Broadcaster::Impl(rTreeNotifierData)
- , aAffectedNode(aAffectedID)
- {
- }
-
- configuration::NodeID getAffectedNodeID() const { return aAffectedNode; }
- unsigned int getNodeIndex() const { return aAffectedNode.toIndex(); }
-
- protected:
- void querySingleConstraint(configuration::NodeChangeInformation const& aChange, bool bMore);
- void notifySingleChange(configuration::NodeChangeInformation const& aChange, bool bMore, css::beans::PropertyChangeEvent*& pCurEvent);
- };
- // -----------------------------------------------------------------------------------------------
-
- class SingleChangeBroadcaster_Impl : public NodeLocalBroadcaster_Impl
- {
- configuration::SubNodeID m_aChangingValue;
-
- SingleChangeBroadcaster_Impl(NotifierSet::value_type const& rTreeNotifierData, configuration::NodeID const& aAffectedID, configuration::SubNodeID const& aChangedValue);
-
- public:
- static
- NodeLocalBroadcaster_Impl* create(
- NotifierSet::value_type const& rLocalNotifier,
- configuration::NodeChangeLocation const& aChange);
- static
- NodeLocalBroadcaster_Impl* create(
- NotifierSet::value_type const& rLocalNotifier,
- configuration::NodeID const& aAffectedID,
- configuration::NodeChangeLocation const& aChange);
- static
- NodeLocalBroadcaster_Impl* create(
- NotifierSet::value_type const& rLocalNotifier,
- configuration::NodeID const& aAffectedID,
- configuration::SubNodeID const& aChangedNode,
- configuration::NodeChangeLocation const& aChange);
- private:
- virtual void doQueryConstraints(configuration::NodeChangesInformation const& aChanges);
- virtual void doNotifyListeners(configuration::NodeChangesInformation const& aChanges);
- };
-
- // -----------------------------------------------------------------------------------------------
- class MultiChangeBroadcaster_Impl : public NodeLocalBroadcaster_Impl
- {
- std::set< configuration::SubNodeID > m_aChangingNodes;
-
- MultiChangeBroadcaster_Impl(NotifierSet::value_type const& rTreeNotifierData, configuration::NodeID const& aAffectedID, std::set< configuration::SubNodeID >& aChangedNodes);
-
- public:
- static
- NodeLocalBroadcaster_Impl* create(
- NotifierSet::value_type const& rLocalNotifier,
- configuration::NodeChangesInformation const& aChanges);
- static
- NodeLocalBroadcaster_Impl* create(
- NotifierSet::value_type const& rLocalNotifier,
- configuration::NodeID const& aAffectedID,
- configuration::NodeChangesInformation const& aChanges);
- private:
- virtual void doQueryConstraints(configuration::NodeChangesInformation const& aChanges);
- virtual void doNotifyListeners(configuration::NodeChangesInformation const& aChanges);
- };
- // -----------------------------------------------------------------------------------------------
- class SingleTreeBroadcaster_Impl : public Broadcaster::Impl
- {
- std::vector< vos::ORef<NodeLocalBroadcaster_Impl> > m_aBroadcasters;
-
- SingleTreeBroadcaster_Impl(NotifierSet::value_type const& rTreeNotifierData, std::vector< vos::ORef<NodeLocalBroadcaster_Impl> >& aBroadcasters);
-
- public:
- //--------------------------
- static
- vos::ORef< Broadcaster::Impl > create(
- NotifierSet::value_type const& rRootNotifier,
- NotifierSet::value_type const& rLocalNotifier,
- configuration::NodeChangesInformation const& aChanges);
-
- static bool selectChanges(configuration::NodeChangesInformation& rSelected, configuration::NodeChangesInformation const& aOriginal, configuration::NodeID const& aSelector);
- //--------------------------
- private:
- virtual void doQueryConstraints(configuration::NodeChangesInformation const& aChanges);
- virtual void doNotifyListeners(configuration::NodeChangesInformation const& aChanges);
- };
- // -----------------------------------------------------------------------------------------------
- class MultiTreeBroadcaster_Impl : public Broadcaster::Impl
- {
- std::vector< vos::ORef< Broadcaster::Impl > > m_aBroadcasters;
-
- MultiTreeBroadcaster_Impl(NotifierSet::value_type const& rRootNotifierData, std::vector< vos::ORef< Broadcaster::Impl > >& aBroadcasters);
- public:
- //--------------------------
- static
- vos::ORef< Broadcaster::Impl > create(
- NotifierSet::value_type const& rRootNotifier,
- NotifierSet const& rNotifiers,
- configuration::NodeChangesInformation const& aChanges);
-
- static bool selectChanges(configuration::NodeChangesInformation& rSelected, configuration::NodeChangesInformation const& aOriginal, NotifierSet::value_type const& aSelector);
- //--------------------------
- private:
- virtual void doQueryConstraints(configuration::NodeChangesInformation const& aChanges);
- virtual void doNotifyListeners(configuration::NodeChangesInformation const& aChanges);
- };
-
- // -----------------------------------------------------------------------------------------------
-
- inline configuration::NodeID makeRootID( rtl::Reference< configuration::Tree > const& aTree ) { return configuration::NodeID( aTree, aTree->getRootNode() ); }
- inline configuration::NodeID makeRootID( ApiTreeRef const& pTreeImpl ) { return makeRootID( pTreeImpl->getTree() ); }
- // -----------------------------------------------------------------------------------------------
- NotifierSet::value_type findNotifier(configuration::NodeChangeLocation const& aChange, ApiTreeRef const& pTreeImpl)
- {
- OSL_ENSURE(aChange.isValidData(),"Invalid change location - cannot find notifier");
-
- configuration::NodeID aAffectedNode = aChange.getAffectedNodeID();
- if (aAffectedNode.isEmpty())
- return NotifierSet::value_type();
-
- ApiTreeRef aAffectedImpl( Factory::findDescendantTreeImpl(aAffectedNode, pTreeImpl.get()) );
- if (aAffectedImpl.is())
- {
- vos::ORef<NotifierImpl> aAffectedNotifier = BroadcasterHelper::getImpl(aAffectedImpl->getNotifier());
-
- return NotifierSet::value_type(aAffectedNotifier, aAffectedImpl);
- }
- else
- return NotifierSet::value_type();
- }
- // -----------------------------------------------------------------------------------------------
- inline
- NotifierSet::value_type findNotifier(configuration::NodeChangeInformation const& aChange, ApiTreeRef const& pTreeImpl)
- {
- return findNotifier(aChange.location,pTreeImpl);
- }
- // -----------------------------------------------------------------------------------------------
-
- void findNotifiers(NotifierSet& aNotifiers, configuration::NodeChangesInformation const& aChanges, ApiTreeRef const& pTreeImpl )
- {
- for (std::vector< configuration::NodeChangeInformation >::const_iterator it = aChanges.begin(); it != aChanges.end(); ++it)
- {
- NotifierSet::value_type aNotifierData( findNotifier(*it,pTreeImpl) );
-
- if (aNotifierData.first.isValid())
- {
- aNotifiers.insert( aNotifierData );
- OSL_ENSURE( aNotifiers[aNotifierData.first] == aNotifierData.second, "Different Api Trees for the same notifier" );
- }
- }
- }
- // -----------------------------------------------------------------------------------------------
- // NodeLocalBroadcaster_Impl
- // -----------------------------------------------------------------------------------------------
- void NodeLocalBroadcaster_Impl::querySingleConstraint(configuration::NodeChangeInformation const& aChange, bool bMore)
- {
- uno::Reference< css::beans::XVetoableChangeListener > const * const SelectListener = 0;
-
- vos::ORef<NotifierImpl> pNotifierImpl = getNotifierData().first;
-
- cppu::OInterfaceContainerHelper* pListeners = pNotifierImpl->m_aListeners.getContainer( getNodeIndex(), getCppuType(SelectListener) );
- cppu::OInterfaceContainerHelper* pSpecial = pNotifierImpl->m_aListeners.getSpecialContainer( aChange.location.getChangingValueID() );
-
- if (pSpecial || pListeners)
- {
- css::beans::PropertyChangeEvent aEvent;
- aEvent.Source = pNotifierImpl->m_aListeners.getObjectAt( getNodeIndex() );
-
- if (configapi::fillEventDataFromResolved(aEvent,aChange,bMore))
- {
- // Catch only RuntimeExceptions here: vetoableChange issues its veto by throwing
- // a PropertyVetoException (which is not a RuntimeException)
- if (pListeners)
- {
- ListenerContainerIterator< css::beans::XVetoableChangeListener > aIterator(*pListeners);
-
- UnoApiLockReleaser aGuardReleaser;
- while (aIterator.hasMoreElements())
- try
- {
- aIterator.next()->vetoableChange(aEvent);
- }
- catch (uno::RuntimeException & )
- {}
- }
- if (pSpecial)
- {
- ListenerContainerIterator< css::beans::XVetoableChangeListener > aIterator(*pSpecial);
-
- UnoApiLockReleaser aGuardReleaser;
- while (aIterator.hasMoreElements())
- try
- {
- aIterator.next()->vetoableChange(aEvent);
- }
- catch (uno::RuntimeException & )
- {}
- }
- }
- }
-
- }
- // -----------------------------------------------------------------------------------------------
- void NodeLocalBroadcaster_Impl::notifySingleChange(configuration::NodeChangeInformation const& aChange, bool bMore, css::beans::PropertyChangeEvent*& pCurEvent)
- {
- uno::Reference< css::beans::XPropertyChangeListener > const * const SelectPropertyListener = 0;
- uno::Reference< css::container::XContainerListener > const * const SelectContainerListener = 0;
-
- vos::ORef<NotifierImpl> pNotifierImpl = getNotifierData().first;
-
- cppu::OInterfaceContainerHelper* pContainerListeners = pNotifierImpl->m_aListeners.getContainer( getNodeIndex(), getCppuType(SelectContainerListener) );
-
- if (pContainerListeners)
- {
- css::container::ContainerEvent aEvent;
- aEvent.Source = pNotifierImpl->m_aListeners.getObjectAt( getNodeIndex() );
-
- if (configapi::fillEventDataFromResolved(aEvent,aChange))
- {
-
- ListenerContainerIterator< css::container::XContainerListener > aIterator(*pContainerListeners);
-
- UnoApiLockReleaser aGuardReleaser;
- while (aIterator.hasMoreElements())
- try
- {
- uno::Reference<css::container::XContainerListener> xListener( aIterator.next() );
- OSL_ASSERT( xListener.is() );
-
- switch (aChange.change.type)
- {
- case configuration::NodeChangeData::eSetValue:
- case configuration::NodeChangeData::eSetDefault:
- case configuration::NodeChangeData::eReplaceElement:
- xListener->elementReplaced(aEvent);
- break;
-
- case configuration::NodeChangeData::eInsertElement:
- xListener->elementInserted(aEvent);
- break;
-
- case configuration::NodeChangeData::eRemoveElement:
- xListener->elementRemoved(aEvent);
- break;
-
-
- case configuration::NodeChangeData::eResetSetDefault:
- case configuration::NodeChangeData::eRenameElementTree:
- case configuration::NodeChangeData::eNoChange:
- OSL_ASSERT(false);
- break;
- }
- }
- catch (uno::Exception &)
- {}
- }
- }
-
-
- OSL_ASSERT(pCurEvent);
- css::beans::PropertyChangeEvent& rEvent = *pCurEvent;
-
- rEvent.Source = pNotifierImpl->m_aListeners.getObjectAt( getNodeIndex() );
-
- if (configapi::fillEventDataFromResolved(rEvent,aChange,bMore))
- {
- cppu::OInterfaceContainerHelper* pPropertyListeners = pNotifierImpl->m_aListeners.getContainer( getNodeIndex(), getCppuType(SelectPropertyListener) );
- if (pPropertyListeners)
- {
- ListenerContainerIterator< css::beans::XPropertyChangeListener > aIterator(*pPropertyListeners);
- UnoApiLockReleaser aGuardReleaser;
- while (aIterator.hasMoreElements())
- try { aIterator.next()->propertyChange(rEvent); } catch (uno::Exception & ) {}
- }
-
- cppu::OInterfaceContainerHelper* pSpecialListeners = pNotifierImpl->m_aListeners.getSpecialContainer( aChange.location.getChangingValueID() );
- if (pSpecialListeners)
- {
- ListenerContainerIterator< css::beans::XPropertyChangeListener > aIterator(*pSpecialListeners);
- UnoApiLockReleaser aGuardReleaser;
- while (aIterator.hasMoreElements())
- try { aIterator.next()->propertyChange(rEvent); } catch (uno::Exception & ) {}
- }
-
- ++pCurEvent;
- }
-
- }
- // -----------------------------------------------------------------------------------------------
-
- // -----------------------------------------------------------------------------------------------
- // SingleBroadcaster_Impl
- // -----------------------------------------------------------------------------------------------
- SingleChangeBroadcaster_Impl::SingleChangeBroadcaster_Impl(
- NotifierSet::value_type const& rTreeNotifierData,
- configuration::NodeID const& aAffectedID, configuration::SubNodeID const& aChangedNode
- )
- : NodeLocalBroadcaster_Impl(rTreeNotifierData,aAffectedID)
- , m_aChangingValue(aChangedNode)
- {
- }
- // -----------------------------------------------------------------------------------------------
- NodeLocalBroadcaster_Impl* SingleChangeBroadcaster_Impl::create(
- NotifierSet::value_type const& rLocalNotifier,
- configuration::NodeChangeLocation const& aChange)
- {
- OSL_ENSURE(rLocalNotifier.second->getTree() == aChange.getAffectedTreeRef(),
- "ERROR: Tree Mismatch creating Single Broadcaster");
-
- OSL_ENSURE(aChange.isValidData(), "ERROR: Invalid Change Location for Broadcaster");
-
- configuration::NodeID aAffectedNodeID = aChange.getAffectedNodeID();
- if (aAffectedNodeID.isEmpty())
- return 0;
-
- return create(rLocalNotifier,aAffectedNodeID,aChange.getChangingValueID(),aChange);
- }
- // -----------------------------------------------------------------------------------------------
- NodeLocalBroadcaster_Impl* SingleChangeBroadcaster_Impl::create(
- NotifierSet::value_type const& rLocalNotifier,
- configuration::NodeID const& aAffectedID,
- configuration::NodeChangeLocation const& aChange)
- {
-
- return create(rLocalNotifier,aAffectedID,aChange.getChangingValueID(),aChange);
- }
- // -----------------------------------------------------------------------------------------------
- NodeLocalBroadcaster_Impl* SingleChangeBroadcaster_Impl::create(
- NotifierSet::value_type const& rLocalNotifier,
- configuration::NodeID const& aAffectedID,
- configuration::SubNodeID const& aChangedNodeID,
- configuration::NodeChangeLocation const& aChange)
- {
- { (void)aChange; }
- OSL_ENSURE(aChange.isValidData(), "ERROR: Invalid Change Location for Broadcaster");
- OSL_ENSURE(aAffectedID.isValidNode(),"Cannot broadcast without affected node");
-
- OSL_ENSURE(rLocalNotifier.second->getTree() == aChange.getAffectedTreeRef(),
- "ERROR: Tree Mismatch creating Single Broadcaster");
- OSL_ENSURE( aChange.getAffectedNodeID() == aAffectedID,
- "ERROR: Node Mismatch creating Single Broadcaster");
- OSL_ENSURE( aChange.getChangingValueID() == aChangedNodeID,
- "ERROR: Value Node Mismatch creating Single Broadcaster");
-
- return new SingleChangeBroadcaster_Impl(rLocalNotifier,aAffectedID,aChangedNodeID);
- }
- // -----------------------------------------------------------------------------------------------
- void SingleChangeBroadcaster_Impl::doQueryConstraints(configuration::NodeChangesInformation const& aChanges)
- {
- OSL_ASSERT(aChanges.size() <= 1);
- if (!aChanges.empty())
- {
- std::vector< configuration::NodeChangeInformation >::const_iterator it = aChanges.begin();
-
- OSL_ENSURE( m_aChangingValue == it->location.getChangingValueID(), "Broadcasting unanticipated change");
-
- querySingleConstraint(*it, false);
- }
-
- }
- // -----------------------------------------------------------------------------------------------
- void SingleChangeBroadcaster_Impl::doNotifyListeners(configuration::NodeChangesInformation const& aChanges)
- {
- OSL_ASSERT(aChanges.size() <= 1);
- if (!aChanges.empty())
- {
- css::beans::PropertyChangeEvent aEvent;
- css::beans::PropertyChangeEvent * pEventNext = &aEvent;
-
- std::vector< configuration::NodeChangeInformation >::const_iterator it = aChanges.begin();
-
- OSL_ENSURE( m_aChangingValue == it->location.getChangingValueID(), "Broadcasting unanticipated change");
-
- notifySingleChange(*it, false, pEventNext);
-
- if (pEventNext != &aEvent)
- {
- uno::Sequence< css::beans::PropertyChangeEvent > aPropertyEvents(&aEvent,1);
-
- uno::Reference< css::beans::XPropertiesChangeListener > const * const SelectListener = 0;
-
- vos::ORef<NotifierImpl> pNotifierImpl = getNotifierData().first;
-
- cppu::OInterfaceContainerHelper* pContainer = pNotifierImpl->m_aListeners.getContainer( getNodeIndex(), getCppuType(SelectListener) );
-
- if (pContainer)
- {
- ListenerContainerIterator< css::beans::XPropertiesChangeListener > aIterator(*pContainer);
- UnoApiLockReleaser aGuardReleaser;
- while (aIterator.hasMoreElements())
- try { aIterator.next()->propertiesChange(aPropertyEvents); } catch (uno::Exception & ) {}
- }
- }
- }
- }
-
- // -----------------------------------------------------------------------------------------------
- // MultiChangeBroadcaster_Impl
- // -----------------------------------------------------------------------------------------------
-
- MultiChangeBroadcaster_Impl::MultiChangeBroadcaster_Impl(
- NotifierSet::value_type const& rTreeNotifierData,
- configuration::NodeID const& aAffectedID, std::set< configuration::SubNodeID >& aChangedNodes
- )
- : NodeLocalBroadcaster_Impl(rTreeNotifierData,aAffectedID)
- , m_aChangingNodes()
- {
- m_aChangingNodes.swap(aChangedNodes);
- }
- // -----------------------------------------------------------------------------------------------
- NodeLocalBroadcaster_Impl* MultiChangeBroadcaster_Impl::create(
- NotifierSet::value_type const& rLocalNotifier,
- configuration::NodeChangesInformation const& aChanges)
- {
- if (aChanges.empty())
- return 0;
-
- OSL_ENSURE(aChanges.begin()->hasValidLocation(), "ERROR: Invalid Change Location for Broadcaster");
-
- configuration::NodeID aAffectedNodeID = aChanges.begin()->location.getAffectedNodeID();
- if (aAffectedNodeID.isEmpty())
- return 0;
-
- return create(rLocalNotifier, aAffectedNodeID, aChanges);
- }
- // -----------------------------------------------------------------------------------------------
- NodeLocalBroadcaster_Impl* MultiChangeBroadcaster_Impl::create(
- NotifierSet::value_type const& rLocalNotifier,
- configuration::NodeID const& aAffectedNodeID,
- configuration::NodeChangesInformation const& aChanges)
- {
- if (aChanges.empty())
- return 0;
-
- else if (aChanges.size() == 1)
- return SingleChangeBroadcaster_Impl::create(rLocalNotifier,aAffectedNodeID,aChanges.begin()->location);
-
- else
- {
- OSL_ENSURE(aAffectedNodeID.isValidNode(),"Cannot broadcast without affected node");
-
- std::set< configuration::SubNodeID > aChangedNodes;
- for (std::vector< configuration::NodeChangeInformation >::const_iterator it = aChanges.begin(); it != aChanges.end(); ++it)
- {
- OSL_ENSURE(it->hasValidLocation(), "ERROR: Invalid Change Location for Broadcaster");
-
- OSL_ENSURE(it->location.getAffectedNodeID() == aAffectedNodeID, "ERROR: Change is not local to affected node (as advertised)");
- OSL_ENSURE(rLocalNotifier.second->getTree() == it->location.getAffectedTreeRef(),
- "ERROR: Tree Mismatch creating Multi Change Broadcaster");
-
- configuration::SubNodeID aChangedValueID = it->location.getChangingValueID();
-
- aChangedNodes.insert(aChangedValueID);
- }
- OSL_ENSURE(!aChangedNodes.empty(), "Changes don't affect any nodes");
-
- if (aChangedNodes.size() == 1) OSL_TRACE("WARNING: Different changes all affect the same node !");
-
- return new MultiChangeBroadcaster_Impl(rLocalNotifier, aAffectedNodeID, aChangedNodes);
- }
- }
- // -----------------------------------------------------------------------------------------------
- void MultiChangeBroadcaster_Impl::doQueryConstraints(configuration::NodeChangesInformation const& aChanges)
- {
- std::vector< configuration::NodeChangeInformation >::const_iterator const stop = aChanges.end(), last = stop-1;
-
- for (std::vector< configuration::NodeChangeInformation >::const_iterator it = aChanges.begin(); it != stop; ++it)
- {
- OSL_ENSURE( m_aChangingNodes.find( it->location.getChangingValueID() ) != m_aChangingNodes.end(), "Broadcasting unanticipated change");
-
- querySingleConstraint(*it, it != last);
- }
-
- }
- // -----------------------------------------------------------------------------------------------
- void MultiChangeBroadcaster_Impl::doNotifyListeners(configuration::NodeChangesInformation const& aChanges)
- {
- uno::Sequence< css::beans::PropertyChangeEvent > aPropertyEvents(aChanges.size());
-
- css::beans::PropertyChangeEvent * const pEventStart = aPropertyEvents.getArray();
- css::beans::PropertyChangeEvent * pEventNext = pEventStart;
-
- std::vector< configuration::NodeChangeInformation >::const_iterator const stop = aChanges.end(), last = stop-1;
-
- for (std::vector< configuration::NodeChangeInformation >::const_iterator it = aChanges.begin(); it != stop; ++it)
- {
- // #92463# Skip nodes that are not in the tree
- if (it->location.getAffectedNodeID().isEmpty()) continue;
-
- OSL_ENSURE( m_aChangingNodes.find( it->location.getChangingValueID() ) != m_aChangingNodes.end(), "Broadcasting unanticipated change");
-
- notifySingleChange(*it, it != last, pEventNext);
- }
-
- sal_Int32 nPropertyEvents = pEventNext-pEventStart;
-
- if (nPropertyEvents > 0)
- {
- OSL_ASSERT(nPropertyEvents <= aPropertyEvents.getLength());
- if (nPropertyEvents != aPropertyEvents.getLength())
- aPropertyEvents.realloc(nPropertyEvents);
-
- uno::Reference< css::beans::XPropertiesChangeListener > const * const SelectListener = 0;
-
- vos::ORef<NotifierImpl> pNotifierImpl = getNotifierData().first;
-
- cppu::OInterfaceContainerHelper* pContainer = pNotifierImpl->m_aListeners.getContainer( getNodeIndex(), getCppuType(SelectListener) );
-
- if (pContainer)
- {
- ListenerContainerIterator< css::beans::XPropertiesChangeListener > aIterator(*pContainer);
- UnoApiLockReleaser aGuardReleaser;
- while (aIterator.hasMoreElements())
- try { aIterator.next()->propertiesChange(aPropertyEvents); } catch (uno::Exception & ) {}
- }
- }
- }
- // -----------------------------------------------------------------------------------------------
- // TreeLocalBroadcaster_Impl
- // -----------------------------------------------------------------------------------------------
-
- SingleTreeBroadcaster_Impl::SingleTreeBroadcaster_Impl(
- NotifierSet::value_type const& aTreeNotifierData,
- std::vector< vos::ORef<NodeLocalBroadcaster_Impl> >& aBroadcasters
- )
- : Broadcaster::Impl(aTreeNotifierData)
- , m_aBroadcasters()
- {
- m_aBroadcasters.swap(aBroadcasters);
- }
-
- // -----------------------------------------------------------------------------------------------
-
- bool SingleTreeBroadcaster_Impl::selectChanges(configuration::NodeChangesInformation& rSelected, configuration::NodeChangesInformation const& aOriginal, configuration::NodeID const& aSelector)
- {
- OSL_ASSERT(rSelected.empty()); // nothing in there yet
-
- for (std::vector< configuration::NodeChangeInformation >::const_iterator it = aOriginal.begin(); it != aOriginal.end(); ++it)
- {
- if ( it->location.getAffectedNodeID() == aSelector )
- {
- rSelected.push_back(*it);
- }
- }
- return !rSelected.empty();
- }
- // -----------------------------------------------------------------------------------------------
-
- vos::ORef< Broadcaster::Impl > SingleTreeBroadcaster_Impl::create(
- NotifierSet::value_type const& rRootNotifier,
- NotifierSet::value_type const& rLocalNotifier,
- configuration::NodeChangesInformation const& aChanges)
- {
- std::set< configuration::NodeID > aNodes;
- for (std::vector< configuration::NodeChangeInformation >::const_iterator itChanges = aChanges.begin(); itChanges != aChanges.end(); ++itChanges)
- {
- OSL_ENSURE(itChanges->hasValidLocation(), "ERROR: Invalid Change Location for Broadcaster");
-
- configuration::NodeID aAffectedNodeID = itChanges->location.getAffectedNodeID();
- if (!aAffectedNodeID.isEmpty())
- aNodes.insert(aAffectedNodeID);
- }
-
- std::vector< vos::ORef<NodeLocalBroadcaster_Impl> > aNodecasters;
- for (std::set< configuration::NodeID >::const_iterator itNodes = aNodes.begin(); itNodes != aNodes.end(); ++itNodes)
- {
- OSL_ASSERT(itNodes->isValidNode()); // filtered empty ones above
-
- configuration::NodeChangesInformation aSelectedChanges;
- if ( selectChanges(aSelectedChanges, aChanges, *itNodes))
- {
- NodeLocalBroadcaster_Impl* pSelectedImpl = MultiChangeBroadcaster_Impl::create(rLocalNotifier, *itNodes, aSelectedChanges);
- if (pSelectedImpl)
- aNodecasters.push_back(pSelectedImpl);
- }
- }
-
- if (aNodecasters.empty())
- return 0;
-
- else if (aNodecasters.size() == 1)
- return aNodecasters.begin()->getBodyPtr();
-
- else
- return new SingleTreeBroadcaster_Impl(rRootNotifier, aNodecasters);
- }
- // -----------------------------------------------------------------------------------------------
- void SingleTreeBroadcaster_Impl::doQueryConstraints(configuration::NodeChangesInformation const& aChanges)
- {
- for(std::vector< vos::ORef<NodeLocalBroadcaster_Impl> >::iterator it = m_aBroadcasters.begin(); it != m_aBroadcasters.end(); ++it)
- {
- configuration::NodeChangesInformation aSelectedInfos;
- if ( selectChanges(aSelectedInfos, aChanges, (*it)->getAffectedNodeID()) )
- (*it)->queryConstraints(aSelectedInfos);
- }
- }
- // -----------------------------------------------------------------------------------------------
- void SingleTreeBroadcaster_Impl::doNotifyListeners(configuration::NodeChangesInformation const& aChanges)
- {
- for(std::vector< vos::ORef<NodeLocalBroadcaster_Impl> >::iterator it = m_aBroadcasters.begin(); it != m_aBroadcasters.end(); ++it)
- {
- configuration::NodeChangesInformation aSelectedInfos;
- if ( selectChanges(aSelectedInfos, aChanges, (*it)->getAffectedNodeID()) )
- (*it)->notifyListeners(aSelectedInfos);
- }
- }
- // -----------------------------------------------------------------------------------------------
- // MultiTreeBroadcaster_Impl
- // -----------------------------------------------------------------------------------------------
- MultiTreeBroadcaster_Impl::MultiTreeBroadcaster_Impl(NotifierSet::value_type const& aRootSelector, std::vector< vos::ORef< Broadcaster::Impl > >& aBroadcasters)
- : Broadcaster::Impl(aRootSelector)
- , m_aBroadcasters()
- {
- m_aBroadcasters.swap(aBroadcasters);
- }
-
- // -----------------------------------------------------------------------------------------------
-
- bool MultiTreeBroadcaster_Impl::selectChanges(configuration::NodeChangesInformation& rSelected, configuration::NodeChangesInformation const& aOriginal, NotifierSet::value_type const& aSelector)
- {
- OSL_ASSERT(aSelector.first.isValid());
- OSL_ASSERT(aSelector.second.is());
-
- OSL_ASSERT(rSelected.empty()); // nothing in there yet
-
- rtl::Reference< configuration::Tree > const aSelectedTree( aSelector.second->getTree() );
-
- for (std::vector< configuration::NodeChangeInformation >::const_iterator it = aOriginal.begin(); it != aOriginal.end(); ++it)
- {
- if (it->location.getAffectedTreeRef() == aSelectedTree)
- {
- rSelected.push_back(*it);
- }
- }
- return !rSelected.empty();
- }
- // -------------------------------------------------------------------------------------------
-
- vos::ORef< Broadcaster::Impl > MultiTreeBroadcaster_Impl::create(NotifierSet::value_type const& rRootNotifier, NotifierSet const& rNotifiers, configuration::NodeChangesInformation const& aChanges)
- {
- std::vector< vos::ORef< Broadcaster::Impl > > aTreecasters;
- for (NotifierSet::const_iterator it = rNotifiers.begin(); it != rNotifiers.end(); ++it)
- {
- configuration::NodeChangesInformation aSelectedChanges;
- if ( selectChanges(aSelectedChanges, aChanges, *it))
- {
- vos::ORef< Broadcaster::Impl > pSelectedImpl = SingleTreeBroadcaster_Impl::create(rRootNotifier, *it, aSelectedChanges);
- if (pSelectedImpl.isValid())
- aTreecasters.push_back(pSelectedImpl);
- }
- }
-
- if (aTreecasters.empty())
- return 0;
-
- else if (aTreecasters.size() == 1)
- return *aTreecasters.begin();
-
- else
- return new MultiTreeBroadcaster_Impl(rRootNotifier, aTreecasters);
- }
- // -------------------------------------------------------------------------------------------
-
- void MultiTreeBroadcaster_Impl::doQueryConstraints(configuration::NodeChangesInformation const& aChanges)
- {
- for(std::vector< vos::ORef< Broadcaster::Impl > >::iterator it = m_aBroadcasters.begin(); it != m_aBroadcasters.end(); ++it)
- {
- configuration::NodeChangesInformation aSelectedInfos;
- if ( selectChanges(aSelectedInfos, aChanges, (*it)->getNotifierData()) )
- (*it)->queryConstraints(aSelectedInfos);
- }
- }
- // -------------------------------------------------------------------------------------------
-
- void MultiTreeBroadcaster_Impl::doNotifyListeners(configuration::NodeChangesInformation const& aChanges)
- {
- for(std::vector< vos::ORef< Broadcaster::Impl > >::iterator it = m_aBroadcasters.begin(); it != m_aBroadcasters.end(); ++it)
- {
- configuration::NodeChangesInformation aSelectedInfos;
- if ( selectChanges(aSelectedInfos, aChanges, (*it)->getNotifierData()) )
- (*it)->notifyListeners(aSelectedInfos);
- }
- }
- // -----------------------------------------------------------------------------------------------
- }
-// ---------------------------------------------------------------------------------------------------
-
- vos::ORef< Broadcaster::Impl > Broadcaster::Impl::create(vos::ORef<NotifierImpl> const& rNotifierImpl, ApiTreeRef const& pTreeImpl, configuration::NodeChange const& aChange, bool bLocal)
- {
- OSL_ASSERT(pTreeImpl.is());
-
- vos::ORef< Broadcaster::Impl > pRet;
-
- configuration::NodeChangeLocation aLocation;
- if (aChange.getChangeLocation(aLocation))
- {
- if (bLocal)
- {
- pRet = SingleChangeBroadcaster_Impl::create( NotifierSet::value_type(rNotifierImpl,pTreeImpl), aLocation);
- }
- else
- {
- NotifierSet::value_type aAffectedNotifier( findNotifier(aLocation, pTreeImpl) );
- if (aAffectedNotifier.second.is()) // only if we found a notifier we are able to create a broadcaster (DG)
- pRet = SingleChangeBroadcaster_Impl::create( aAffectedNotifier, aLocation);
- }
- }
- else
- {
- OSL_ENSURE(false, "Invalid change location set in node change - cannot broadcast");
- // can't create a matching change - must still create an empty one
- }
-
- if (pRet.isEmpty())
- pRet = EmptyBroadcaster_Impl::create( NotifierSet::value_type(rNotifierImpl,pTreeImpl) );
-
- return pRet;
- }
-// ---------------------------------------------------------------------------------------------------
-
- vos::ORef< Broadcaster::Impl > Broadcaster::Impl::create(vos::ORef<NotifierImpl> const& rNotifierImpl, ApiTreeRef const& pTreeImpl, configuration::NodeChanges const& aChanges, bool bLocal)
- {
- NotifierSet::value_type aRootData(rNotifierImpl, pTreeImpl);
-
- configuration::NodeChangesInformation aChangeInfos;
- if (aChanges.getChangesInfos(aChangeInfos))
- {
- return create(rNotifierImpl,pTreeImpl,aChangeInfos,bLocal);
- }
- else
- {
- OSL_ENSURE(aChanges.isEmpty(), "Cannot get information for changes - cannot notify");
-
- // make an empty one below
- vos::ORef< Broadcaster::Impl > pRet = EmptyBroadcaster_Impl::create( aRootData );
-
- return pRet;
- }
-
- }
-// ---------------------------------------------------------------------------------------------------
-
- vos::ORef< Broadcaster::Impl > Broadcaster::Impl::create(vos::ORef<NotifierImpl> const& rNotifierImpl, ApiTreeRef const& pTreeImpl, configuration::NodeChangeInformation const& aChange, bool bLocal)
- {
- OSL_ASSERT(pTreeImpl.is());
-
- vos::ORef< Broadcaster::Impl > pRet;
-
- if (aChange.hasValidLocation())
- {
- if (bLocal)
- {
- pRet = SingleChangeBroadcaster_Impl::create( NotifierSet::value_type(rNotifierImpl,pTreeImpl), aChange.location);
- }
- else
- {
- NotifierSet::value_type aAffectedNotifier( findNotifier(aChange.location, pTreeImpl) );
- if (aAffectedNotifier.second.is()) // only if we found a notifier we are able to create a broadcaster (DG)
- pRet = SingleChangeBroadcaster_Impl::create( aAffectedNotifier, aChange.location);
- }
- }
- else
- {
- OSL_ENSURE(false, "Invalid change location set in node change - cannot broadcast");
- // can't create a matching change - must still create an empty one
- }
-
- if (pRet.isEmpty())
- pRet = EmptyBroadcaster_Impl::create( NotifierSet::value_type(rNotifierImpl,pTreeImpl) );
-
- return pRet;
- }
-// ---------------------------------------------------------------------------------------------------
-
- vos::ORef< Broadcaster::Impl > Broadcaster::Impl::create(vos::ORef<NotifierImpl> const& rNotifierImpl, ApiTreeRef const& pTreeImpl, configuration::NodeChangesInformation const& aChanges, bool bLocal)
- {
- vos::ORef< Broadcaster::Impl > pRet;
-
- NotifierSet::value_type aRootData(rNotifierImpl, pTreeImpl);
-
- if (aChanges.size() == 1)
- {
- pRet = create(rNotifierImpl, pTreeImpl, *aChanges.begin(), bLocal);
- }
- else if (bLocal)
- {
- pRet = MultiChangeBroadcaster_Impl::create( aRootData, aChanges);
- }
- else
- {
- NotifierSet aNotifiers;
- findNotifiers( aNotifiers, aChanges, pTreeImpl);
-
- if (aNotifiers.size() > 1)
- {
- pRet = MultiTreeBroadcaster_Impl::create(aRootData, aNotifiers, aChanges);
- }
- else if (!aNotifiers.empty())
- {
- pRet = SingleTreeBroadcaster_Impl::create(aRootData, *aNotifiers.begin(), aChanges);
- }
- // else: empty
- }
-
- if (pRet.isEmpty())
- pRet = EmptyBroadcaster_Impl::create( aRootData );
-
- return pRet;
- }
-// ---------------------------------------------------------------------------------------------------
-
- bool Broadcaster::Impl::translateChanges(configuration::NodeChangesInformation& _rInfos, configuration::NodeChanges const& aChanges, bool /*bSingleBase*/) const
- {
- rtl::Reference< configuration::Tree > aBaseTree = m_aNotifierData.second->getTree();
- Factory& rFactory = m_aNotifierData.second->getFactory();
-
- configuration::NodeChangesInformation aRawInfos;
-
- sal_uInt32 nChanges = aChanges.getChangesInfos(aRawInfos);
-
- OSL_ENSURE(nChanges, "Cannot get info(s) for change - skipping for notification");
- OSL_ENSURE(nChanges == aRawInfos.size(), "Incorrect change count returned");
-
- configuration::NodeChangesInformation aNewInfos;
- aNewInfos.reserve(nChanges);
-
- for (std::vector< configuration::NodeChangeInformation >::const_iterator pos = aRawInfos.begin(); pos != aRawInfos.end(); ++pos)
- {
- configuration::NodeChangeInformation aInfo = *pos;
- if( !configapi::rebaseChange(aInfo.location,aBaseTree) )
- {
- OSL_TRACE("Change is not within expected tree - skipping for notification");
- continue;
- }
-
- OSL_ENSURE(!pos->isEmptyChange(), "Empty Change Found for Notification");
- // it actually is expected that elements may not be found - thus ignoring result
- configapi::resolveToUno(aInfo.change, rFactory);
-
- aNewInfos.push_back( aInfo );
- }
-
- aNewInfos.swap(_rInfos);
-
- return !_rInfos.empty();
- }
-
-// ---------------------------------------------------------------------------------------------------
-
- bool Broadcaster::Impl::translateChanges(configuration::NodeChangesInformation& aInfos, configuration::NodeChangesInformation const& aChanges, bool /*bSingleBase*/) const
- {
- configuration::NodeChangesInformation aNewInfos;
- aNewInfos.reserve( aChanges.size() );
-
- rtl::Reference< configuration::Tree > aBaseTree = m_aNotifierData.second->getTree();
- Factory& rFactory = m_aNotifierData.second->getFactory();
-
- for (std::vector< configuration::NodeChangeInformation >::const_iterator it = aChanges.begin(); it != aChanges.end(); ++it)
- {
- configuration::NodeChangeInformation aInfo(*it);
- if( !configapi::rebaseChange(aInfo.location,aBaseTree) )
- {
- OSL_TRACE("Change is not within expected tree - skipping for notification");
- continue;
- }
-
- if( !configapi::resolveToUno(aInfo.change,rFactory) )
- {
- // it actually is expected that elements may not be found
- // OSL_TRACE("Cannot find affected elements of Change");
- }
-
- aNewInfos.push_back( aInfo );
- }
-
- aNewInfos.swap(aInfos);
- return !aInfos.empty();
- }
-
-// ---------------------------------------------------------------------------------------------------
- void Broadcaster::Impl::notifyRootListeners(configuration::NodeChangesInformation const& aChanges)
- {
- if (aChanges.empty()) return;
-
- ApiTreeRef pRootTree( m_aNotifierData.second->getRootTreeImpl() );
- if (pRootTree.is())
- {
- vos::ORef<NotifierImpl> aRootNotifier = BroadcasterHelper::getImpl(pRootTree->getNotifier());
- if (aRootNotifier.isValid())
- {
- uno::Reference< css::util::XChangesListener > const * const pSelect = 0;
-
- configuration::NodeID aNotifiedNode = makeRootID( pRootTree );
-
- if (cppu::OInterfaceContainerHelper* pContainer = aRootNotifier->m_aListeners.getContainer(aNotifiedNode.toIndex(), ::getCppuType(pSelect)) )
- {
- css::util::ChangesEvent aEvent;
- aEvent.Source = pRootTree->getUnoInstance();
-
- uno::Reference<uno::XInterface> xBaseInstance = m_aNotifierData.second->getUnoInstance();
- aEvent.Base <<= xBaseInstance;
-
- // translate and collect the changes
- aEvent.Changes.realloc(aChanges.size());
- css::util::ElementChange* pChange = aEvent.Changes.getArray();
-
- for (std::vector< configuration::NodeChangeInformation >::const_iterator it = aChanges.begin(); it != aChanges.end(); ++it)
- {
- fillChangeFromResolved(*pChange, *it);
- ++pChange;
- }
-
- // now notify
- ListenerContainerIterator< css::util::XChangesListener > aIter(*pContainer);
-
- UnoApiLockReleaser aGuardReleaser;
- while (aIter.hasMoreElements())
- try { aIter.next()->changesOccurred(aEvent); } catch (uno::Exception & ) {}
- }
- }
- }
- }
-
-// ---------------------------------------------------------------------------------------------------
-// class Broadcaster
-// ---------------------------------------------------------------------------------------------------
-Broadcaster::Broadcaster(Notifier const& aNotifier, configuration::NodeChange const& aChange, bool bLocal)
-: m_pImpl( Impl::create(aNotifier.m_aImpl,ApiTreeRef(aNotifier.m_pTree),aChange,bLocal) )
-{
- OSL_ASSERT(m_pImpl.isValid());
-}
-// ---------------------------------------------------------------------------------------------------
-Broadcaster::Broadcaster(Notifier const& aNotifier, configuration::NodeChanges const& aChanges, bool bLocal)
-: m_pImpl( Impl::create(aNotifier.m_aImpl,ApiTreeRef(aNotifier.m_pTree),aChanges,bLocal) )
-{
- OSL_ASSERT(m_pImpl.isValid());
-}
-// ---------------------------------------------------------------------------------------------------
-Broadcaster::Broadcaster(Notifier const& aNotifier, configuration::NodeChangesInformation const& aChanges, bool bLocal)
-: m_pImpl( Impl::create(aNotifier.m_aImpl,ApiTreeRef(aNotifier.m_pTree),aChanges,bLocal) )
-{
- OSL_ASSERT(m_pImpl.isValid());
-}
-// ---------------------------------------------------------------------------------------------------
-
-Broadcaster::Broadcaster(Broadcaster const& aOther)
-: m_pImpl(aOther.m_pImpl)
-{
- OSL_ASSERT(m_pImpl.isValid());
-}
-// ---------------------------------------------------------------------------------------------------
-
-Broadcaster::~Broadcaster()
-{
-}
-// ---------------------------------------------------------------------------------------------------
-
-void Broadcaster::queryConstraints(configuration::NodeChange const& aChange) throw(beans::PropertyVetoException)
-{
- OSL_ENSURE(aChange.isChange(),"Constraint query without a change !");
-
- configuration::NodeChanges aChanges;
- aChanges.add(aChange);
- this->queryConstraints(aChanges,true);
-}
-// ---------------------------------------------------------------------------------------------------
-
-void Broadcaster::queryConstraints(configuration::NodeChanges const& aChanges, bool bSingleBase) throw(beans::PropertyVetoException)
-{
- OSL_ENSURE(!aChanges.isEmpty(),"Constraint query without a change !");
-
- try
- {
- configuration::NodeChangesInformation aInfos;
- if (m_pImpl->translateChanges(aInfos,aChanges,bSingleBase))
- {
- m_pImpl->queryConstraints(aInfos);
- }
- }
- catch (beans::PropertyVetoException & )
- {
- throw;
- }
- catch (uno::Exception & )
- {
- OSL_ENSURE(false, "configmgr::Broadcaster: Unexpected UNO exception in notifyListeners");
- }
- catch (configuration::Exception & )
- {
- OSL_ENSURE(false, "configmgr::Broadcaster: Unexpected internal exception in notifyListeners");
- }
-}
-// ---------------------------------------------------------------------------------------------------
-
-void Broadcaster::notifyListeners(configuration::NodeChange const& aChange) throw()
-{
- OSL_ENSURE(aChange.isChange(),"Notifying without a change !");
-
- configuration::NodeChanges aChanges;
- aChanges.add(aChange);
- this->notifyListeners(aChanges, true);
-}
-// ---------------------------------------------------------------------------------------------------
-
-void Broadcaster::notifyListeners(configuration::NodeChanges const& aChanges, bool bSingleBase) throw()
-{
- OSL_ENSURE(!aChanges.isEmpty(),"Notifying without a change !");
-
- try
- {
- configuration::NodeChangesInformation aInfos;
- if (m_pImpl->translateChanges(aInfos,aChanges, bSingleBase))
- {
- m_pImpl->notifyListeners(aInfos);
- m_pImpl->notifyRootListeners(aInfos);
- }
- }
- catch (uno::Exception & )
- {
- OSL_ENSURE(false, "configmgr::Broadcaster: Unexpected UNO exception in notifyListeners");
- }
- catch (configuration::Exception & )
- {
- OSL_ENSURE(false, "configmgr::Broadcaster: Unexpected internal exception in notifyListeners");
- }
-}
-// ---------------------------------------------------------------------------------------------------
-
-void Broadcaster::notifyListeners(configuration::NodeChangesInformation const& aChanges, bool bSingleBase) throw()
-{
- OSL_ENSURE(!aChanges.empty(),"Notifying without a change !");
-
- try
- {
- configuration::NodeChangesInformation aInfos;
- if (m_pImpl->translateChanges(aInfos,aChanges, bSingleBase))
- {
- m_pImpl->notifyListeners(aInfos);
- m_pImpl->notifyRootListeners(aInfos);
- }
- }
- catch (uno::Exception & )
- {
- OSL_ENSURE(false, "configmgr::Broadcaster: Unexpected UNO exception in notifyListeners");
- }
- catch (configuration::Exception & )
- {
- OSL_ENSURE(false, "configmgr::Broadcaster: Unexpected internal exception in notifyListeners");
- }
-}
-// ---------------------------------------------------------------------------------------------------
- }
-}