/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #include "precompiled_framework.hxx" #include "services/EventMultiplexer.hxx" #include "services.h" using ::rtl::OUString; #define A2S(s) ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(s)) namespace framework { #define IMPLEMENTATION_NAME "org.apache.openoffice.comp.framework.EventMultiplexer" #define SERVICE_NAME "com.sun.star.ui.ContextChangeEventMultiplexer" #define SINGLETON_NAME "org.apache.openoffice.comp.framework.EventMultiplexer" EventMultiplexer::EventMultiplexer (const cssu::Reference& rxContext) : EventMultiplexerInterfaceBase(m_aMutex), maListeners() { (void)rxContext; } EventMultiplexer::~EventMultiplexer (void) { maListeners.clear(); } // XEventMultiplexer void SAL_CALL EventMultiplexer::addEventListener ( const cssu::Reference& rxListener, const cssu::Reference& rxEventFocus) throw(cssu::RuntimeException,cssl::IllegalArgumentException) { if ( ! rxListener.is()) throw css::lang::IllegalArgumentException(A2S("can not add an empty reference"), static_cast(this), 0); ListenerMap::iterator iListenerContainer (maListeners.find(rxEventFocus)); if (iListenerContainer == maListeners.end()) { // Create a new listener container for the event focus. iListenerContainer = maListeners.insert( ListenerMap::value_type( rxEventFocus, ListenerContainer())).first; } if (iListenerContainer != maListeners.end()) { ListenerContainer& rContainer (iListenerContainer->second); if (::std::find(rContainer.begin(), rContainer.end(), rxListener) == rContainer.end()) rContainer.push_back(rxListener); else { // The listener was added for the same event focus // previously. That is an error. throw cssl::IllegalArgumentException(A2S("listener added twice"), static_cast(this), 0); } } } void SAL_CALL EventMultiplexer::removeEventListener ( const cssu::Reference& rxListener, const cssu::Reference& rxEventFocus) throw(cssu::RuntimeException,cssl::IllegalArgumentException) { if ( ! rxListener.is()) throw cssl::IllegalArgumentException(A2S("can not remove an empty reference"), static_cast(this), 0); ListenerMap::iterator iListenerContainer (maListeners.find(rxEventFocus)); if (iListenerContainer != maListeners.end()) { ListenerContainer& rContainer (iListenerContainer->second); const ListenerContainer::iterator iListener (::std::find(rContainer.begin(), rContainer.end(), rxListener)); if (iListener != rContainer.end()) rContainer.erase(iListener); } } void SAL_CALL EventMultiplexer::removeAllEventListeners ( const cssu::Reference& rxListener) throw(cssu::RuntimeException,cssl::IllegalArgumentException) { if ( ! rxListener.is()) throw cssl::IllegalArgumentException(A2S("can not remove an empty reference"), static_cast(this), 0); for (ListenerMap::iterator iContainer(maListeners.begin()), iEnd(maListeners.end()); iContainer!=iEnd; ++iContainer) { const ListenerContainer::iterator iListener (::std::find(iContainer->second.begin(), iContainer->second.end(), rxListener)); if (iListener != iContainer->second.end()) iContainer->second.erase(iListener); } } void SAL_CALL EventMultiplexer::broadcastEvent ( const cssl::EventObject& rEventObject, const cssu::Reference& rxEventFocus) throw(cssu::RuntimeException) { BroadcastEventToSingleContainer(rEventObject, rxEventFocus); if (rxEventFocus.is()) BroadcastEventToSingleContainer(rEventObject, NULL); } void EventMultiplexer::BroadcastEventToSingleContainer ( const cssl::EventObject& rEventObject, const cssu::Reference& rxEventFocus) { ListenerMap::iterator iListenerContainer (maListeners.find(rxEventFocus)); if (iListenerContainer != maListeners.end()) { // Create a copy of the listener container to avoid problems // when one of the called listeners calls add... or remove... ListenerContainer aContainer (iListenerContainer->second); for (ListenerContainer::const_iterator iListener(aContainer.begin()), iEnd(aContainer.end()); iListener!=iEnd; ++iListener) { (*iListener)->notifyEvent(rEventObject); } } } // XSingleComponentFactory cssu::Reference SAL_CALL EventMultiplexer::createInstanceWithContext ( const cssu::Reference& rxContext) throw (cssu::Exception, cssu::RuntimeException) { return cssu::Reference(); } cssu::Reference SAL_CALL EventMultiplexer::createInstanceWithArgumentsAndContext ( const cssu::Sequence& rArguments, const cssu::Reference& rxContext) throw (cssu::Exception, cssu::RuntimeException) { return cssu::Reference(); } // XServiceInfo ::rtl::OUString SAL_CALL EventMultiplexer::getImplementationName (void) throw(cssu::RuntimeException) { return impl_getStaticImplementationName(); } sal_Bool SAL_CALL EventMultiplexer::supportsService ( const ::rtl::OUString& rsServiceName) throw (cssu::RuntimeException) { return ::comphelper::findValue(static_GetSupportedServiceNames(), rsServiceName, sal_True).getLength() != 0; } cssu::Sequence SAL_CALL EventMultiplexer::getSupportedServiceNames (void) throw (cssu::RuntimeException) { return static_GetSupportedServiceNames(); } // Local and static methods. OUString SAL_CALL EventMultiplexer::impl_getStaticImplementationName (void) { return A2S(IMPLEMENTATION_NAME); } cssu::Sequence SAL_CALL EventMultiplexer::static_GetSupportedServiceNames (void) { cssu::Sequence aServiceNames (2); aServiceNames[0] = A2S(SERVICE_NAME); aServiceNames[1] = A2S(SINGLETON_NAME); return aServiceNames; } cssu::Reference EventMultiplexer::impl_createFactory ( const cssu::Reference& rxServiceManager) { return cppu::createSingleComponentFactory( EventMultiplexer::static_CreateInstance, EventMultiplexer::impl_getStaticImplementationName(), EventMultiplexer::static_GetSupportedServiceNames() ); } cssu::Reference SAL_CALL EventMultiplexer::static_CreateInstance ( const cssu::Reference& rxComponentContext) throw (cssu::Exception) { EventMultiplexer* pObject = new EventMultiplexer(rxComponentContext); cssu::Reference xService (static_cast(pObject), cssu::UNO_QUERY); return xService; } } // end of namespace framework