1*3a7cf181SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*3a7cf181SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*3a7cf181SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*3a7cf181SAndrew Rist * distributed with this work for additional information 6*3a7cf181SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*3a7cf181SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*3a7cf181SAndrew Rist * "License"); you may not use this file except in compliance 9*3a7cf181SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*3a7cf181SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*3a7cf181SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*3a7cf181SAndrew Rist * software distributed under the License is distributed on an 15*3a7cf181SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*3a7cf181SAndrew Rist * KIND, either express or implied. See the License for the 17*3a7cf181SAndrew Rist * specific language governing permissions and limitations 18*3a7cf181SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*3a7cf181SAndrew Rist *************************************************************/ 21*3a7cf181SAndrew Rist 22*3a7cf181SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir #include "precompiled_configmgr.hxx" 25cdf0e10cSrcweir #include "sal/config.h" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include "com/sun/star/beans/XPropertiesChangeListener.hpp" 28cdf0e10cSrcweir #include "com/sun/star/beans/XPropertyChangeListener.hpp" 29cdf0e10cSrcweir #include "com/sun/star/container/XContainerListener.hpp" 30cdf0e10cSrcweir #include "com/sun/star/lang/DisposedException.hpp" 31cdf0e10cSrcweir #include "com/sun/star/lang/WrappedTargetRuntimeException.hpp" 32cdf0e10cSrcweir #include "com/sun/star/lang/XEventListener.hpp" 33cdf0e10cSrcweir #include "com/sun/star/uno/Any.hxx" 34cdf0e10cSrcweir #include "com/sun/star/uno/Exception.hpp" 35cdf0e10cSrcweir #include "com/sun/star/uno/Reference.hxx" 36cdf0e10cSrcweir #include "com/sun/star/uno/XInterface.hpp" 37cdf0e10cSrcweir #include "com/sun/star/util/XChangesListener.hpp" 38cdf0e10cSrcweir #include "cppuhelper/exc_hlp.hxx" 39cdf0e10cSrcweir #include "osl/diagnose.hxx" 40cdf0e10cSrcweir #include "rtl/string.h" 41cdf0e10cSrcweir #include "rtl/ustrbuf.hxx" 42cdf0e10cSrcweir #include "rtl/ustring.h" 43cdf0e10cSrcweir #include "rtl/ustring.hxx" 44cdf0e10cSrcweir 45cdf0e10cSrcweir #include "broadcaster.hxx" 46cdf0e10cSrcweir 47cdf0e10cSrcweir namespace configmgr { 48cdf0e10cSrcweir 49cdf0e10cSrcweir namespace { 50cdf0e10cSrcweir 51cdf0e10cSrcweir namespace css = com::sun::star; 52cdf0e10cSrcweir 53cdf0e10cSrcweir void appendMessage( 54cdf0e10cSrcweir rtl::OUStringBuffer & buffer, css::uno::Exception const & exception) 55cdf0e10cSrcweir { 56cdf0e10cSrcweir buffer.appendAscii(RTL_CONSTASCII_STRINGPARAM("; ")); 57cdf0e10cSrcweir buffer.append(exception.Message); 58cdf0e10cSrcweir } 59cdf0e10cSrcweir 60cdf0e10cSrcweir } 61cdf0e10cSrcweir 62cdf0e10cSrcweir void Broadcaster::addDisposeNotification( 63cdf0e10cSrcweir css::uno::Reference< css::lang::XEventListener > const & listener, 64cdf0e10cSrcweir css::lang::EventObject const & event) 65cdf0e10cSrcweir { 66cdf0e10cSrcweir disposeNotifications_.push_back(DisposeNotification(listener, event)); 67cdf0e10cSrcweir } 68cdf0e10cSrcweir 69cdf0e10cSrcweir void Broadcaster::addContainerElementReplacedNotification( 70cdf0e10cSrcweir css::uno::Reference< css::container::XContainerListener > const & listener, 71cdf0e10cSrcweir css::container::ContainerEvent const & event) 72cdf0e10cSrcweir { 73cdf0e10cSrcweir containerElementReplacedNotifications_.push_back( 74cdf0e10cSrcweir ContainerNotification(listener, event)); 75cdf0e10cSrcweir } 76cdf0e10cSrcweir 77cdf0e10cSrcweir void Broadcaster::addContainerElementInsertedNotification( 78cdf0e10cSrcweir css::uno::Reference< css::container::XContainerListener > const & listener, 79cdf0e10cSrcweir css::container::ContainerEvent const & event) 80cdf0e10cSrcweir { 81cdf0e10cSrcweir containerElementInsertedNotifications_.push_back( 82cdf0e10cSrcweir ContainerNotification(listener, event)); 83cdf0e10cSrcweir } 84cdf0e10cSrcweir 85cdf0e10cSrcweir void Broadcaster::addContainerElementRemovedNotification( 86cdf0e10cSrcweir css::uno::Reference< css::container::XContainerListener > const & listener, 87cdf0e10cSrcweir css::container::ContainerEvent const & event) 88cdf0e10cSrcweir { 89cdf0e10cSrcweir containerElementRemovedNotifications_.push_back( 90cdf0e10cSrcweir ContainerNotification(listener, event)); 91cdf0e10cSrcweir } 92cdf0e10cSrcweir 93cdf0e10cSrcweir void Broadcaster::addPropertyChangeNotification( 94cdf0e10cSrcweir css::uno::Reference< css::beans::XPropertyChangeListener > const & listener, 95cdf0e10cSrcweir css::beans::PropertyChangeEvent const & event) 96cdf0e10cSrcweir { 97cdf0e10cSrcweir propertyChangeNotifications_.push_back( 98cdf0e10cSrcweir PropertyChangeNotification(listener, event)); 99cdf0e10cSrcweir } 100cdf0e10cSrcweir 101cdf0e10cSrcweir void Broadcaster::addPropertiesChangeNotification( 102cdf0e10cSrcweir css::uno::Reference< css::beans::XPropertiesChangeListener > const & 103cdf0e10cSrcweir listener, 104cdf0e10cSrcweir css::uno::Sequence< css::beans::PropertyChangeEvent > const & event) 105cdf0e10cSrcweir { 106cdf0e10cSrcweir propertiesChangeNotifications_.push_back( 107cdf0e10cSrcweir PropertiesChangeNotification(listener, event)); 108cdf0e10cSrcweir } 109cdf0e10cSrcweir 110cdf0e10cSrcweir void Broadcaster::addChangesNotification( 111cdf0e10cSrcweir css::uno::Reference< css::util::XChangesListener > const & listener, 112cdf0e10cSrcweir css::util::ChangesEvent const & event) 113cdf0e10cSrcweir { 114cdf0e10cSrcweir changesNotifications_.push_back(ChangesNotification(listener, event)); 115cdf0e10cSrcweir } 116cdf0e10cSrcweir 117cdf0e10cSrcweir void Broadcaster::send() { 118cdf0e10cSrcweir css::uno::Any exception; 119cdf0e10cSrcweir rtl::OUStringBuffer messages; 120cdf0e10cSrcweir for (DisposeNotifications::iterator i(disposeNotifications_.begin()); 121cdf0e10cSrcweir i != disposeNotifications_.end(); ++i) { 122cdf0e10cSrcweir try { 123cdf0e10cSrcweir i->listener->disposing(i->event); 124cdf0e10cSrcweir } catch (css::lang::DisposedException &) { 125cdf0e10cSrcweir } catch (css::uno::Exception & e) { 126cdf0e10cSrcweir exception = cppu::getCaughtException(); 127cdf0e10cSrcweir appendMessage(messages, e); 128cdf0e10cSrcweir } 129cdf0e10cSrcweir } 130cdf0e10cSrcweir for (ContainerNotifications::iterator i( 131cdf0e10cSrcweir containerElementInsertedNotifications_.begin()); 132cdf0e10cSrcweir i != containerElementInsertedNotifications_.end(); ++i) 133cdf0e10cSrcweir { 134cdf0e10cSrcweir try { 135cdf0e10cSrcweir i->listener->elementInserted(i->event); 136cdf0e10cSrcweir } catch (css::lang::DisposedException &) { 137cdf0e10cSrcweir } catch (css::uno::Exception & e) { 138cdf0e10cSrcweir exception = cppu::getCaughtException(); 139cdf0e10cSrcweir appendMessage(messages, e); 140cdf0e10cSrcweir } 141cdf0e10cSrcweir } 142cdf0e10cSrcweir for (ContainerNotifications::iterator i( 143cdf0e10cSrcweir containerElementRemovedNotifications_.begin()); 144cdf0e10cSrcweir i != containerElementRemovedNotifications_.end(); ++i) 145cdf0e10cSrcweir { 146cdf0e10cSrcweir try { 147cdf0e10cSrcweir i->listener->elementRemoved(i->event); 148cdf0e10cSrcweir } catch (css::lang::DisposedException &) { 149cdf0e10cSrcweir } catch (css::uno::Exception & e) { 150cdf0e10cSrcweir exception = cppu::getCaughtException(); 151cdf0e10cSrcweir appendMessage(messages, e); 152cdf0e10cSrcweir } 153cdf0e10cSrcweir } 154cdf0e10cSrcweir for (ContainerNotifications::iterator i( 155cdf0e10cSrcweir containerElementReplacedNotifications_.begin()); 156cdf0e10cSrcweir i != containerElementReplacedNotifications_.end(); ++i) 157cdf0e10cSrcweir { 158cdf0e10cSrcweir try { 159cdf0e10cSrcweir i->listener->elementReplaced(i->event); 160cdf0e10cSrcweir } catch (css::lang::DisposedException &) { 161cdf0e10cSrcweir } catch (css::uno::Exception & e) { 162cdf0e10cSrcweir exception = cppu::getCaughtException(); 163cdf0e10cSrcweir appendMessage(messages, e); 164cdf0e10cSrcweir } 165cdf0e10cSrcweir } 166cdf0e10cSrcweir for (PropertyChangeNotifications::iterator i( 167cdf0e10cSrcweir propertyChangeNotifications_.begin()); 168cdf0e10cSrcweir i != propertyChangeNotifications_.end(); ++i) 169cdf0e10cSrcweir { 170cdf0e10cSrcweir try { 171cdf0e10cSrcweir i->listener->propertyChange(i->event); 172cdf0e10cSrcweir } catch (css::lang::DisposedException &) { 173cdf0e10cSrcweir } catch (css::uno::Exception & e) { 174cdf0e10cSrcweir exception = cppu::getCaughtException(); 175cdf0e10cSrcweir appendMessage(messages, e); 176cdf0e10cSrcweir } 177cdf0e10cSrcweir } 178cdf0e10cSrcweir for (PropertiesChangeNotifications::iterator i( 179cdf0e10cSrcweir propertiesChangeNotifications_.begin()); 180cdf0e10cSrcweir i != propertiesChangeNotifications_.end(); ++i) 181cdf0e10cSrcweir { 182cdf0e10cSrcweir try { 183cdf0e10cSrcweir i->listener->propertiesChange(i->event); 184cdf0e10cSrcweir } catch (css::lang::DisposedException &) { 185cdf0e10cSrcweir } catch (css::uno::Exception & e) { 186cdf0e10cSrcweir exception = cppu::getCaughtException(); 187cdf0e10cSrcweir appendMessage(messages, e); 188cdf0e10cSrcweir } 189cdf0e10cSrcweir } 190cdf0e10cSrcweir for (ChangesNotifications::iterator i(changesNotifications_.begin()); 191cdf0e10cSrcweir i != changesNotifications_.end(); ++i) { 192cdf0e10cSrcweir try { 193cdf0e10cSrcweir i->listener->changesOccurred(i->event); 194cdf0e10cSrcweir } catch (css::lang::DisposedException &) { 195cdf0e10cSrcweir } catch (css::uno::Exception & e) { 196cdf0e10cSrcweir exception = cppu::getCaughtException(); 197cdf0e10cSrcweir appendMessage(messages, e); 198cdf0e10cSrcweir } 199cdf0e10cSrcweir } 200cdf0e10cSrcweir if (exception.hasValue()) { 201cdf0e10cSrcweir throw css::lang::WrappedTargetRuntimeException( 202cdf0e10cSrcweir (rtl::OUString( 203cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( 204cdf0e10cSrcweir "configmgr exceptions during listener notification")) + 205cdf0e10cSrcweir messages.makeStringAndClear()), 206cdf0e10cSrcweir css::uno::Reference< css::uno::XInterface >(), 207cdf0e10cSrcweir exception); 208cdf0e10cSrcweir } 209cdf0e10cSrcweir } 210cdf0e10cSrcweir 211cdf0e10cSrcweir Broadcaster::DisposeNotification::DisposeNotification( 212cdf0e10cSrcweir css::uno::Reference< css::lang::XEventListener > const & theListener, 213cdf0e10cSrcweir css::lang::EventObject const & theEvent): 214cdf0e10cSrcweir listener(theListener), event(theEvent) 215cdf0e10cSrcweir { 216cdf0e10cSrcweir OSL_ASSERT(theListener.is()); 217cdf0e10cSrcweir } 218cdf0e10cSrcweir 219cdf0e10cSrcweir Broadcaster::ContainerNotification::ContainerNotification( 220cdf0e10cSrcweir css::uno::Reference< css::container::XContainerListener > const & 221cdf0e10cSrcweir theListener, 222cdf0e10cSrcweir css::container::ContainerEvent const & theEvent): 223cdf0e10cSrcweir listener(theListener), event(theEvent) 224cdf0e10cSrcweir { 225cdf0e10cSrcweir OSL_ASSERT(theListener.is()); 226cdf0e10cSrcweir } 227cdf0e10cSrcweir 228cdf0e10cSrcweir Broadcaster::PropertyChangeNotification::PropertyChangeNotification( 229cdf0e10cSrcweir css::uno::Reference< css::beans::XPropertyChangeListener > const & 230cdf0e10cSrcweir theListener, 231cdf0e10cSrcweir css::beans::PropertyChangeEvent const & theEvent): 232cdf0e10cSrcweir listener(theListener), event(theEvent) 233cdf0e10cSrcweir { 234cdf0e10cSrcweir OSL_ASSERT(theListener.is()); 235cdf0e10cSrcweir } 236cdf0e10cSrcweir 237cdf0e10cSrcweir Broadcaster::PropertiesChangeNotification::PropertiesChangeNotification( 238cdf0e10cSrcweir css::uno::Reference< css::beans::XPropertiesChangeListener > const & 239cdf0e10cSrcweir theListener, 240cdf0e10cSrcweir css::uno::Sequence< css::beans::PropertyChangeEvent > const & theEvent): 241cdf0e10cSrcweir listener(theListener), event(theEvent) 242cdf0e10cSrcweir { 243cdf0e10cSrcweir OSL_ASSERT(theListener.is()); 244cdf0e10cSrcweir } 245cdf0e10cSrcweir 246cdf0e10cSrcweir Broadcaster::ChangesNotification::ChangesNotification( 247cdf0e10cSrcweir css::uno::Reference< css::util::XChangesListener > const & theListener, 248cdf0e10cSrcweir css::util::ChangesEvent const & theEvent): 249cdf0e10cSrcweir listener(theListener), event(theEvent) 250cdf0e10cSrcweir { 251cdf0e10cSrcweir OSL_ASSERT(theListener.is()); 252cdf0e10cSrcweir } 253cdf0e10cSrcweir 254cdf0e10cSrcweir } 255