LCOV - code coverage report
Current view: top level - sfx2/source/notify - globalevents.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 113 179 63.1 %
Date: 2014-11-03 Functions: 28 38 73.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <sal/types.h>
      21             : 
      22             : #include <com/sun/star/task/theJobExecutor.hpp>
      23             : #include <com/sun/star/container/XNameReplace.hpp>
      24             : #include <com/sun/star/container/XSet.hpp>
      25             : #include <com/sun/star/document/XEventListener.hpp>
      26             : #include <com/sun/star/document/XEventBroadcaster.hpp>
      27             : #include <com/sun/star/document/XDocumentEventListener.hpp>
      28             : #include <com/sun/star/frame/XGlobalEventBroadcaster.hpp>
      29             : #include <com/sun/star/lang/XServiceInfo.hpp>
      30             : #include <com/sun/star/uno/Type.hxx>
      31             : 
      32             : #include <cppuhelper/implbase1.hxx>
      33             : #include <cppuhelper/implbase3.hxx>
      34             : #include <cppuhelper/interfacecontainer.hxx>
      35             : #include <cppuhelper/supportsservice.hxx>
      36             : #include <rtl/ref.hxx>
      37             : #include <sfx2/app.hxx>
      38             : #include <sfx2/objsh.hxx>
      39             : #include <sfx2/sfxbasemodel.hxx>
      40             : #include <sfx2/evntconf.hxx>
      41             : #include <tools/diagnose_ex.h>
      42             : #include <unotools/eventcfg.hxx>
      43             : #include <eventsupplier.hxx>
      44             : 
      45             : #include <vector>
      46             : 
      47             : using namespace css;
      48             : 
      49             : namespace {
      50             : 
      51         775 : struct ModelCollectionMutexBase
      52             : {
      53             : public:
      54             :     osl::Mutex m_aLock;
      55             : };
      56             : 
      57             : typedef ::std::vector< css::uno::Reference< css::frame::XModel > > TModelList;
      58             : 
      59             : class ModelCollectionEnumeration : public ModelCollectionMutexBase
      60             :                                  , public ::cppu::WeakImplHelper1< css::container::XEnumeration >
      61             : {
      62             : private:
      63             :     TModelList m_lModels;
      64             :     TModelList::iterator m_pEnumerationIt;
      65             : 
      66             : public:
      67             :     ModelCollectionEnumeration();
      68             :     virtual ~ModelCollectionEnumeration();
      69             :     void setModelList(const TModelList& rList);
      70             : 
      71             :     // css.container.XEnumeration
      72             :     virtual sal_Bool SAL_CALL hasMoreElements()
      73             :         throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
      74             : 
      75             :     virtual css::uno::Any SAL_CALL nextElement()
      76             :         throw(css::container::NoSuchElementException,
      77             :               css::lang::WrappedTargetException     ,
      78             :               css::uno::RuntimeException, std::exception            ) SAL_OVERRIDE;
      79             : };
      80             : 
      81             : 
      82             : //TODO: remove support of obsolete document::XEventBroadcaster/Listener
      83             : class SfxGlobalEvents_Impl : public ModelCollectionMutexBase
      84             :                            , public ::cppu::WeakImplHelper3< css::lang::XServiceInfo
      85             :                                                            , css::frame::XGlobalEventBroadcaster
      86             :                                                            , css::document::XEventListener
      87             :                                                             >
      88             : {
      89             :     css::uno::Reference< css::container::XNameReplace > m_xEvents;
      90             :     css::uno::Reference< css::document::XEventListener > m_xJobExecutorListener;
      91             :     ::cppu::OInterfaceContainerHelper m_aLegacyListeners;
      92             :     ::cppu::OInterfaceContainerHelper m_aDocumentListeners;
      93             :     TModelList m_lModels;
      94             :     GlobalEventConfig* pImp;
      95             : 
      96             : public:
      97             :     SfxGlobalEvents_Impl(const css::uno::Reference < css::uno::XComponentContext >& rxContext);
      98             :     virtual ~SfxGlobalEvents_Impl();
      99             : 
     100           0 :     virtual OUString SAL_CALL getImplementationName()
     101             :         throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE
     102             :     {
     103           0 :         return OUString("com.sun.star.comp.sfx2.GlobalEventBroadcaster");
     104             :     }
     105             : 
     106           0 :     virtual sal_Bool SAL_CALL supportsService(OUString const & ServiceName)
     107             :         throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE
     108             :     {
     109           0 :         return cppu::supportsService(this, ServiceName);
     110             :     }
     111             : 
     112           0 :     virtual css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames()
     113             :         throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE
     114             :     {
     115           0 :         css::uno::Sequence< OUString > aSeq(1);
     116           0 :         aSeq[0] = OUString("com.sun.star.frame.GlobalEventBroadcaster");
     117           0 :         return aSeq;
     118             :     }
     119             : 
     120             :     // css.document.XEventBroadcaster
     121             :     virtual css::uno::Reference< css::container::XNameReplace > SAL_CALL getEvents()
     122             :         throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
     123             : 
     124             :     virtual void SAL_CALL addEventListener(const css::uno::Reference< css::document::XEventListener >& xListener)
     125             :         throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
     126             : 
     127             :     virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::document::XEventListener >& xListener)
     128             :         throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
     129             : 
     130             :     // css.document.XDocumentEventBroadcaster
     131             :     virtual void SAL_CALL addDocumentEventListener( const css::uno::Reference< css::document::XDocumentEventListener >& _Listener ) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
     132             :     virtual void SAL_CALL removeDocumentEventListener( const css::uno::Reference< css::document::XDocumentEventListener >& _Listener ) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
     133             :     virtual void SAL_CALL notifyDocumentEvent( const OUString& _EventName, const css::uno::Reference< css::frame::XController2 >& _ViewController, const css::uno::Any& _Supplement ) throw (css::lang::IllegalArgumentException, css::lang::NoSupportException, css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
     134             : 
     135             :     // css.document.XEventListener
     136             :     virtual void SAL_CALL notifyEvent(const css::document::EventObject& aEvent)
     137             :         throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
     138             : 
     139             :     // css.document.XDocumentEventListener
     140             :     virtual void SAL_CALL documentEventOccured( const css::document::DocumentEvent& Event ) throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
     141             : 
     142             :     // css.container.XSet
     143             :     virtual sal_Bool SAL_CALL has(const css::uno::Any& aElement)
     144             :         throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
     145             : 
     146             :     virtual void SAL_CALL insert(const css::uno::Any& aElement)
     147             :         throw(css::lang::IllegalArgumentException  ,
     148             :               css::container::ElementExistException,
     149             :               css::uno::RuntimeException, std::exception           ) SAL_OVERRIDE;
     150             : 
     151             :     virtual void SAL_CALL remove(const css::uno::Any& aElement)
     152             :         throw(css::lang::IllegalArgumentException   ,
     153             :               css::container::NoSuchElementException,
     154             :               css::uno::RuntimeException, std::exception            ) SAL_OVERRIDE;
     155             : 
     156             :     // css.container.XEnumerationAccess
     157             :     virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createEnumeration()
     158             :         throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
     159             : 
     160             :     // css.container.XElementAccess
     161             :     virtual css::uno::Type SAL_CALL getElementType()
     162             :         throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
     163             : 
     164             :     virtual sal_Bool SAL_CALL hasElements()
     165             :         throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
     166             : 
     167             :     // css.lang.XEventListener
     168             :     virtual void SAL_CALL disposing(const css::lang::EventObject& aEvent)
     169             :         throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
     170             : 
     171             : private:
     172             : 
     173             :     // threadsafe
     174             :     void implts_notifyJobExecution(const css::document::EventObject& aEvent);
     175             :     void implts_checkAndExecuteEventBindings(const css::document::DocumentEvent& aEvent);
     176             :     void implts_notifyListener(const css::document::DocumentEvent& aEvent);
     177             : 
     178             :     // not threadsafe
     179             :     TModelList::iterator impl_searchDoc(const css::uno::Reference< css::frame::XModel >& xModel);
     180             : };
     181             : 
     182         100 : ModelCollectionEnumeration::ModelCollectionEnumeration()
     183             :     : ModelCollectionMutexBase(                 )
     184         100 :     , m_pEnumerationIt        (m_lModels.begin())
     185             : {
     186         100 : }
     187             : 
     188         200 : ModelCollectionEnumeration::~ModelCollectionEnumeration()
     189             : {
     190         200 : }
     191             : 
     192         100 : void ModelCollectionEnumeration::setModelList(const TModelList& rList)
     193             : {
     194             :     // SAFE ->
     195         100 :     ::osl::ResettableMutexGuard aLock(m_aLock);
     196         100 :     m_lModels        = rList;
     197         100 :     m_pEnumerationIt = m_lModels.begin();
     198         100 :     aLock.clear();
     199             :     // <- SAFE
     200         100 : }
     201             : 
     202         117 : sal_Bool SAL_CALL ModelCollectionEnumeration::hasMoreElements()
     203             :     throw(uno::RuntimeException, std::exception)
     204             : {
     205             :     // SAFE ->
     206         117 :     ::osl::ResettableMutexGuard aLock(m_aLock);
     207         117 :     return (m_pEnumerationIt != m_lModels.end());
     208             :     // <- SAFE
     209             : }
     210             : 
     211          17 : uno::Any SAL_CALL ModelCollectionEnumeration::nextElement()
     212             :     throw(container::NoSuchElementException,
     213             :           lang::WrappedTargetException     ,
     214             :           uno::RuntimeException, std::exception            )
     215             : {
     216             :     // SAFE ->
     217          17 :     ::osl::ResettableMutexGuard aLock(m_aLock);
     218          17 :     if (m_pEnumerationIt == m_lModels.end())
     219             :         throw container::NoSuchElementException(
     220             :                     OUString("End of model enumeration reached."),
     221           0 :                     static_cast< container::XEnumeration* >(this));
     222          34 :     uno::Reference< frame::XModel > xModel(*m_pEnumerationIt, uno::UNO_QUERY);
     223          17 :     ++m_pEnumerationIt;
     224          17 :     aLock.clear();
     225             :     // <- SAFE
     226             : 
     227          34 :     return uno::makeAny(xModel);
     228             : }
     229             : 
     230             : 
     231         290 : SfxGlobalEvents_Impl::SfxGlobalEvents_Impl( const uno::Reference < uno::XComponentContext >& rxContext)
     232             :     : ModelCollectionMutexBase(       )
     233             :     , m_xJobExecutorListener( task::theJobExecutor::get( rxContext ), uno::UNO_QUERY_THROW )
     234             :     , m_aLegacyListeners      (m_aLock)
     235             :     , m_aDocumentListeners    (m_aLock)
     236         290 :     , pImp                    (0      )
     237             : {
     238         290 :     m_refCount++;
     239         290 :     SfxGetpApp();
     240         290 :     pImp                   = new GlobalEventConfig();
     241         290 :     m_xEvents              = pImp;
     242         290 :     m_refCount--;
     243         290 : }
     244             : 
     245             : 
     246         570 : SfxGlobalEvents_Impl::~SfxGlobalEvents_Impl()
     247             : {
     248         570 : }
     249             : 
     250             : 
     251           0 : uno::Reference< container::XNameReplace > SAL_CALL SfxGlobalEvents_Impl::getEvents()
     252             :     throw(uno::RuntimeException, std::exception)
     253             : {
     254             :     // SAFE ->
     255           0 :     ::osl::ResettableMutexGuard aLock(m_aLock);
     256           0 :     return m_xEvents;
     257             :     // <- SAFE
     258             : }
     259             : 
     260             : 
     261          98 : void SAL_CALL SfxGlobalEvents_Impl::addEventListener(const uno::Reference< document::XEventListener >& xListener)
     262             :     throw(uno::RuntimeException, std::exception)
     263             : {
     264             :     // container is threadsafe
     265          98 :     m_aLegacyListeners.addInterface(xListener);
     266          98 : }
     267             : 
     268             : 
     269          96 : void SAL_CALL SfxGlobalEvents_Impl::removeEventListener(const uno::Reference< document::XEventListener >& xListener)
     270             :     throw(uno::RuntimeException, std::exception)
     271             : {
     272             :     // container is threadsafe
     273          96 :     m_aLegacyListeners.removeInterface(xListener);
     274          96 : }
     275             : 
     276             : 
     277          96 : void SAL_CALL SfxGlobalEvents_Impl::addDocumentEventListener( const uno::Reference< document::XDocumentEventListener >& _Listener )
     278             :     throw(uno::RuntimeException, std::exception)
     279             : {
     280          96 :     m_aDocumentListeners.addInterface( _Listener );
     281          96 : }
     282             : 
     283             : 
     284          92 : void SAL_CALL SfxGlobalEvents_Impl::removeDocumentEventListener( const uno::Reference< document::XDocumentEventListener >& _Listener )
     285             :     throw(uno::RuntimeException, std::exception)
     286             : {
     287          92 :     m_aDocumentListeners.removeInterface( _Listener );
     288          92 : }
     289             : 
     290             : 
     291           0 : void SAL_CALL SfxGlobalEvents_Impl::notifyDocumentEvent( const OUString& /*_EventName*/,
     292             :         const uno::Reference< frame::XController2 >& /*_ViewController*/, const uno::Any& /*_Supplement*/ )
     293             :         throw (lang::IllegalArgumentException, lang::NoSupportException, uno::RuntimeException, std::exception)
     294             : {
     295             :     // we're a multiplexer only, no chance to generate artificial events here
     296           0 :     throw lang::NoSupportException(OUString(), *this);
     297             : }
     298             : 
     299             : 
     300           0 : void SAL_CALL SfxGlobalEvents_Impl::notifyEvent(const document::EventObject& aEvent)
     301             :     throw(uno::RuntimeException, std::exception)
     302             : {
     303           0 :     document::DocumentEvent aDocEvent(aEvent.Source, aEvent.EventName, NULL, uno::Any());
     304           0 :     implts_notifyJobExecution(aEvent);
     305           0 :     implts_checkAndExecuteEventBindings(aDocEvent);
     306           0 :     implts_notifyListener(aDocEvent);
     307           0 : }
     308             : 
     309             : 
     310       70573 : void SAL_CALL SfxGlobalEvents_Impl::documentEventOccured( const document::DocumentEvent& _Event )
     311             :     throw (uno::RuntimeException, std::exception)
     312             : {
     313       70573 :     implts_notifyJobExecution(document::EventObject(_Event.Source, _Event.EventName));
     314       70572 :     implts_checkAndExecuteEventBindings(_Event);
     315       70572 :     implts_notifyListener(_Event);
     316       70572 : }
     317             : 
     318             : 
     319        7163 : void SAL_CALL SfxGlobalEvents_Impl::disposing(const lang::EventObject& aEvent)
     320             :     throw(uno::RuntimeException, std::exception)
     321             : {
     322        7163 :     uno::Reference< frame::XModel > xDoc(aEvent.Source, uno::UNO_QUERY);
     323             : 
     324             :     // SAFE ->
     325       14326 :     ::osl::ResettableMutexGuard aLock(m_aLock);
     326        7163 :     TModelList::iterator pIt = impl_searchDoc(xDoc);
     327        7163 :     if (pIt != m_lModels.end())
     328        7163 :         m_lModels.erase(pIt);
     329       14326 :     aLock.clear();
     330             :     // <- SAFE
     331        7163 : }
     332             : 
     333             : 
     334           0 : sal_Bool SAL_CALL SfxGlobalEvents_Impl::has(const uno::Any& aElement)
     335             :     throw (uno::RuntimeException, std::exception)
     336             : {
     337           0 :     uno::Reference< frame::XModel > xDoc;
     338           0 :     aElement >>= xDoc;
     339             : 
     340           0 :     bool bHas = false;
     341             : 
     342             :     // SAFE ->
     343           0 :     ::osl::ResettableMutexGuard aLock(m_aLock);
     344           0 :     TModelList::iterator pIt = impl_searchDoc(xDoc);
     345           0 :     if (pIt != m_lModels.end())
     346           0 :         bHas = true;
     347           0 :     aLock.clear();
     348             :     // <- SAFE
     349             : 
     350           0 :     return bHas;
     351             : }
     352             : 
     353             : 
     354        7166 : void SAL_CALL SfxGlobalEvents_Impl::insert( const uno::Any& aElement )
     355             :     throw (lang::IllegalArgumentException  ,
     356             :            container::ElementExistException,
     357             :            uno::RuntimeException, std::exception           )
     358             : {
     359        7166 :     uno::Reference< frame::XModel > xDoc;
     360        7166 :     aElement >>= xDoc;
     361        7166 :     if (!xDoc.is())
     362             :         throw lang::IllegalArgumentException(
     363             :                 OUString("Cant locate at least the model parameter."),
     364             :                 static_cast< container::XSet* >(this),
     365           0 :                 0);
     366             : 
     367             :     // SAFE ->
     368       14332 :     ::osl::ResettableMutexGuard aLock(m_aLock);
     369        7166 :     TModelList::iterator pIt = impl_searchDoc(xDoc);
     370        7166 :     if (pIt != m_lModels.end())
     371             :         throw container::ElementExistException(
     372             :                 OUString(),
     373           0 :                 static_cast< container::XSet* >(this));
     374        7166 :     m_lModels.push_back(xDoc);
     375        7166 :     aLock.clear();
     376             :     // <- SAFE
     377             : 
     378       14332 :     uno::Reference< document::XDocumentEventBroadcaster > xDocBroadcaster(xDoc, uno::UNO_QUERY );
     379        7166 :     if (xDocBroadcaster.is())
     380        7166 :         xDocBroadcaster->addDocumentEventListener(this);
     381             :     else
     382             :     {
     383             :         // try the "legacy version" of XDocumentEventBroadcaster, which is XEventBroadcaster
     384           0 :         uno::Reference< document::XEventBroadcaster > xBroadcaster(xDoc, uno::UNO_QUERY);
     385           0 :         if (xBroadcaster.is())
     386           0 :             xBroadcaster->addEventListener(static_cast< document::XEventListener* >(this));
     387        7166 :     }
     388        7166 : }
     389             : 
     390             : 
     391           0 : void SAL_CALL SfxGlobalEvents_Impl::remove( const uno::Any& aElement )
     392             :     throw (lang::IllegalArgumentException   ,
     393             :            container::NoSuchElementException,
     394             :            uno::RuntimeException, std::exception            )
     395             : {
     396           0 :     uno::Reference< frame::XModel > xDoc;
     397           0 :     aElement >>= xDoc;
     398           0 :     if (!xDoc.is())
     399             :         throw lang::IllegalArgumentException(
     400             :                 OUString("Cant locate at least the model parameter."),
     401             :                 static_cast< container::XSet* >(this),
     402           0 :                 0);
     403             : 
     404             :     // SAFE ->
     405           0 :     ::osl::ResettableMutexGuard aLock(m_aLock);
     406           0 :     TModelList::iterator pIt = impl_searchDoc(xDoc);
     407           0 :     if (pIt == m_lModels.end())
     408             :         throw container::NoSuchElementException(
     409             :                 OUString(),
     410           0 :                 static_cast< container::XSet* >(this));
     411           0 :     m_lModels.erase(pIt);
     412           0 :     aLock.clear();
     413             :     // <- SAFE
     414             : 
     415           0 :     uno::Reference< document::XDocumentEventBroadcaster > xDocBroadcaster(xDoc, uno::UNO_QUERY );
     416           0 :     if (xDocBroadcaster.is())
     417           0 :         xDocBroadcaster->removeDocumentEventListener(this);
     418             :     else
     419             :     {
     420             :         // try the "legacy version" of XDocumentEventBroadcaster, which is XEventBroadcaster
     421           0 :         uno::Reference< document::XEventBroadcaster > xBroadcaster(xDoc, uno::UNO_QUERY);
     422           0 :         if (xBroadcaster.is())
     423           0 :             xBroadcaster->removeEventListener(static_cast< document::XEventListener* >(this));
     424           0 :     }
     425           0 : }
     426             : 
     427             : 
     428         100 : uno::Reference< container::XEnumeration > SAL_CALL SfxGlobalEvents_Impl::createEnumeration()
     429             :     throw (uno::RuntimeException, std::exception)
     430             : {
     431             :     // SAFE ->
     432         100 :     ::osl::ResettableMutexGuard aLock(m_aLock);
     433         100 :     ModelCollectionEnumeration* pEnum = new ModelCollectionEnumeration();
     434         100 :     pEnum->setModelList(m_lModels);
     435             :     uno::Reference< container::XEnumeration > xEnum(
     436         100 :         static_cast< container::XEnumeration* >(pEnum),
     437         100 :         uno::UNO_QUERY);
     438         100 :     aLock.clear();
     439             :     // <- SAFE
     440             : 
     441         100 :     return xEnum;
     442             : }
     443             : 
     444             : 
     445           0 : uno::Type SAL_CALL SfxGlobalEvents_Impl::getElementType()
     446             :     throw (uno::RuntimeException, std::exception)
     447             : {
     448           0 :     return cppu::UnoType<frame::XModel>::get();
     449             : }
     450             : 
     451             : 
     452           0 : sal_Bool SAL_CALL SfxGlobalEvents_Impl::hasElements()
     453             :     throw (uno::RuntimeException, std::exception)
     454             : {
     455             :     // SAFE ->
     456           0 :     ::osl::ResettableMutexGuard aLock(m_aLock);
     457           0 :     return (m_lModels.size()>0);
     458             :     // <- SAFE
     459             : }
     460             : 
     461             : 
     462       70573 : void SfxGlobalEvents_Impl::implts_notifyJobExecution(const document::EventObject& aEvent)
     463             : {
     464             :     try
     465             :     {
     466       70573 :         m_xJobExecutorListener->notifyEvent(aEvent);
     467             :     }
     468           0 :     catch(const uno::RuntimeException&)
     469           0 :         { throw; }
     470           0 :     catch(const uno::Exception&)
     471             :         {}
     472       70572 : }
     473             : 
     474             : 
     475       70572 : void SfxGlobalEvents_Impl::implts_checkAndExecuteEventBindings(const document::DocumentEvent& aEvent)
     476             : {
     477             :     try
     478             :     {
     479             :         // SAFE ->
     480       70572 :         ::osl::ResettableMutexGuard aLock(m_aLock);
     481      141144 :         uno::Reference< container::XNameReplace > xEvents = m_xEvents;
     482       70572 :         aLock.clear();
     483             :         // <- SAFE
     484             : 
     485      141144 :         uno::Any aAny;
     486       70572 :         if ( xEvents.is() && xEvents->hasByName( aEvent.EventName ) )
     487       69588 :             aAny = xEvents->getByName(aEvent.EventName);
     488      141144 :         SfxEvents_Impl::Execute(aAny, aEvent, 0);
     489             :     }
     490           0 :     catch ( uno::RuntimeException const & )
     491             :     {
     492           0 :         throw;
     493             :     }
     494           0 :     catch ( uno::Exception const & )
     495             :     {
     496             :        DBG_UNHANDLED_EXCEPTION();
     497             :     }
     498       70572 : }
     499             : 
     500             : 
     501       70572 : void SfxGlobalEvents_Impl::implts_notifyListener(const document::DocumentEvent& aEvent)
     502             : {
     503             :     // containers are threadsafe
     504       70572 :     document::EventObject aLegacyEvent(aEvent.Source, aEvent.EventName);
     505       70572 :     m_aLegacyListeners.notifyEach( &document::XEventListener::notifyEvent, aLegacyEvent );
     506             : 
     507       70572 :     m_aDocumentListeners.notifyEach( &document::XDocumentEventListener::documentEventOccured, aEvent );
     508       70572 : }
     509             : 
     510             : 
     511             : // not threadsafe ... must be locked from outside!
     512       14329 : TModelList::iterator SfxGlobalEvents_Impl::impl_searchDoc(const uno::Reference< frame::XModel >& xModel)
     513             : {
     514       14329 :     if (!xModel.is())
     515           0 :         return m_lModels.end();
     516             : 
     517       14329 :     TModelList::iterator pIt;
     518       60132 :     for (  pIt  = m_lModels.begin();
     519       40088 :            pIt != m_lModels.end()  ;
     520             :          ++pIt                     )
     521             :     {
     522       12878 :         uno::Reference< frame::XModel > xContainerDoc(*pIt, uno::UNO_QUERY);
     523       12878 :         if (xContainerDoc == xModel)
     524        7163 :             break;
     525        5715 :     }
     526             : 
     527       14329 :     return pIt;
     528             : }
     529             : 
     530         290 : struct Instance {
     531         290 :     explicit Instance(
     532             :         css::uno::Reference<css::uno::XComponentContext> const & context):
     533             :         instance(
     534         290 :             static_cast<cppu::OWeakObject *>(new SfxGlobalEvents_Impl(context)))
     535         290 :     {}
     536             : 
     537             :     rtl::Reference<css::uno::XInterface> instance;
     538             : };
     539             : 
     540             : struct Singleton:
     541             :     public rtl::StaticWithArg<
     542             :         Instance, css::uno::Reference<css::uno::XComponentContext>, Singleton>
     543             : {};
     544             : 
     545             : }
     546             : 
     547             : extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
     548         292 : com_sun_star_comp_sfx2_GlobalEventBroadcaster_get_implementation(
     549             :     css::uno::XComponentContext *context,
     550             :     css::uno::Sequence<css::uno::Any> const &)
     551             : {
     552             :     return cppu::acquire(static_cast<cppu::OWeakObject *>(
     553         292 :                 Singleton::get(context).instance.get()));
     554         951 : }
     555             : 
     556             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10