/************************************************************** * * 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. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_filter.hxx" #include "cacheupdatelistener.hxx" #include "constant.hxx" //_______________________________________________ // includes #include #include #include #include #include //_______________________________________________ // namespace namespace filter{ namespace config{ namespace css = ::com::sun::star; //_______________________________________________ // definitions /*----------------------------------------------- 05.03.2004 08:36 -----------------------------------------------*/ CacheUpdateListener::CacheUpdateListener(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR , const css::uno::Reference< css::uno::XInterface >& xConfigAccess, FilterCache::EItemType eConfigType ) : BaseLock ( ) , m_xSMGR (xSMGR ) , m_rCache ( ) , m_xConfig (xConfigAccess) , m_eConfigType(eConfigType ) { } /*----------------------------------------------- 05.03.2004 08:37 -----------------------------------------------*/ CacheUpdateListener::~CacheUpdateListener() { } /*----------------------------------------------- 07.03.2004 07:59 -----------------------------------------------*/ void CacheUpdateListener::startListening() { // SAFE -> ::osl::ResettableMutexGuard aLock(m_aLock); css::uno::Reference< css::util::XChangesNotifier > xNotifier(m_xConfig, css::uno::UNO_QUERY); aLock.clear(); // <- SAFE if (!xNotifier.is()) return; css::uno::Reference< css::util::XChangesListener > xThis(static_cast< css::util::XChangesListener* >(this), css::uno::UNO_QUERY_THROW); xNotifier->addChangesListener(xThis); /* css::uno::Reference< css::container::XContainer > xNotifier(xConfigAccess, css::uno::UNO_QUERY); if (!xNotifier.is()) return; css::uno::Reference< css::container::XContainerListener > xThis(static_cast< css::container::XContainerListener* >(this), css::uno::UNO_QUERY); xNotifier->addContainerListener(xThis); */ } /*----------------------------------------------- 07.03.2004 07:59 -----------------------------------------------*/ void CacheUpdateListener::stopListening() { // SAFE -> ::osl::ResettableMutexGuard aLock(m_aLock); css::uno::Reference< css::util::XChangesNotifier > xNotifier(m_xConfig, css::uno::UNO_QUERY); aLock.clear(); // <- SAFE if (!xNotifier.is()) return; css::uno::Reference< css::util::XChangesListener > xThis(static_cast< css::util::XChangesListener* >(this), css::uno::UNO_QUERY); xNotifier->removeChangesListener(xThis); /* css::uno::Reference< css::container::XContainer > xNotifier(xConfigAccess, css::uno::UNO_QUERY); if (!xNotifier.is()) return; css::uno::Reference< css::container::XContainerListener > xThis(static_cast< css::container::XContainerListener* >(this), css::uno::UNO_QUERY); xNotifier->removeContainerListener(xThis); */ } /*----------------------------------------------- 07.03.2004 08:17 -----------------------------------------------*/ void SAL_CALL CacheUpdateListener::changesOccurred(const css::util::ChangesEvent& aEvent) throw(css::uno::RuntimeException) { // SAFE -> ::osl::ResettableMutexGuard aLock(m_aLock); // disposed ? if ( ! m_xConfig.is()) return; css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = m_xSMGR; FilterCache::EItemType eType = m_eConfigType; aLock.clear(); // <- SAFE OUStringList lChangedItems; sal_Int32 c = aEvent.Changes.getLength(); sal_Int32 i = 0; for (i=0; i 1) Filters/Filter["filtername"]/Property 2) Filters/Filter["filtername"]/LocalizedProperty/Locale */ aChange.Accessor >>= sOrgPath; if ( ! ::utl::splitLastFromConfigurationPath(sOrgPath, sTempPath, sLocale)) continue; sOrgPath = sTempPath; if ( ! ::utl::splitLastFromConfigurationPath(sOrgPath, sTempPath, sProperty)) { sNode = sLocale; sProperty = ::rtl::OUString(); sLocale = ::rtl::OUString(); } else { sOrgPath = sTempPath; if ( ! ::utl::splitLastFromConfigurationPath(sOrgPath, sTempPath, sNode)) { sNode = sProperty; sProperty = sLocale; sLocale = ::rtl::OUString(); } } if ( ! sNode.getLength() ) continue; OUStringList::const_iterator pIt = ::std::find(lChangedItems.begin(), lChangedItems.end(), sNode); if (pIt == lChangedItems.end()) lChangedItems.push_back(sNode); } sal_Bool bNotifyRefresh = sal_False; OUStringList::const_iterator pIt; for ( pIt = lChangedItems.begin(); pIt != lChangedItems.end() ; ++pIt ) { const ::rtl::OUString& sItem = *pIt; try { m_rCache->refreshItem(eType, sItem); } catch(const css::container::NoSuchElementException&) { // can be ignored! Because we must be aware that // sItem was removed from the condfiguration and we forced an update of the cache. // But we know, that the cache is up-to-date know and has thrown this exception afterwards .-) } // NO FLUSH! Otherwise we start a never ending story here .-) bNotifyRefresh = sal_True; } // notify sfx cache about the changed filter cache .-) if (bNotifyRefresh) { css::uno::Reference< css::util::XRefreshable > xRefreshBroadcaster( xSMGR->createInstance(SERVICE_FILTERCONFIGREFRESH), css::uno::UNO_QUERY); if (xRefreshBroadcaster.is()) xRefreshBroadcaster->refresh(); } } /*----------------------------------------------- 05.03.2004 08:44 -----------------------------------------------*/ void SAL_CALL CacheUpdateListener::disposing(const css::lang::EventObject& aEvent) throw(css::uno::RuntimeException) { // SAFE -> ::osl::ResettableMutexGuard aLock(m_aLock); if (aEvent.Source == m_xConfig) m_xConfig.clear(); aLock.clear(); // <- SAFE } } // namespace config } // namespace filter