[Libreoffice-commits] core.git: comphelper/source include/comphelper

Kohei Yoshida kohei.yoshida at collabora.com
Sun Feb 19 01:58:00 UTC 2017


 comphelper/source/misc/accessibleeventnotifier.cxx |  374 ++++++++++-----------
 include/comphelper/accessibleeventnotifier.hxx     |  169 ++++-----
 2 files changed, 261 insertions(+), 282 deletions(-)

New commits:
commit 6ba107fbab8a110a6545a935bbdbdb9356d53d61
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Sat Feb 18 19:01:14 2017 -0500

    Consistent formatting & indentation.
    
    Change-Id: I5dce7d05156313d460533040b8f7a3de3d8c59d7
    Reviewed-on: https://gerrit.libreoffice.org/34420
    Reviewed-by: Kohei Yoshida <libreoffice at kohei.us>
    Tested-by: Kohei Yoshida <libreoffice at kohei.us>

diff --git a/comphelper/source/misc/accessibleeventnotifier.cxx b/comphelper/source/misc/accessibleeventnotifier.cxx
index 9eeeafc..507b4f8 100644
--- a/comphelper/source/misc/accessibleeventnotifier.cxx
+++ b/comphelper/source/misc/accessibleeventnotifier.cxx
@@ -31,261 +31,251 @@ using namespace ::com::sun::star::lang;
 using namespace ::com::sun::star::accessibility;
 using namespace ::comphelper;
 
-namespace
+namespace {
+
+typedef std::pair< AccessibleEventNotifier::TClientId,
+        AccessibleEventObject > ClientEvent;
+
+typedef std::map< AccessibleEventNotifier::TClientId,
+            ::comphelper::OInterfaceContainerHelper2* > ClientMap;
+
+/// key is the end of the interval, value is the start of the interval
+typedef std::map<AccessibleEventNotifier::TClientId,
+            AccessibleEventNotifier::TClientId> IntervalMap;
+
+struct lclMutex : public rtl::Static< ::osl::Mutex, lclMutex > {};
+
+struct Clients : public rtl::Static< ClientMap, Clients > {};
+
+struct FreeIntervals : public rtl::StaticWithInit<IntervalMap, FreeIntervals>
 {
-    typedef std::pair< AccessibleEventNotifier::TClientId,
-            AccessibleEventObject > ClientEvent;
-
-    typedef std::map< AccessibleEventNotifier::TClientId,
-                ::comphelper::OInterfaceContainerHelper2* > ClientMap;
-
-    /// key is the end of the interval, value is the start of the interval
-    typedef std::map<AccessibleEventNotifier::TClientId,
-                AccessibleEventNotifier::TClientId> IntervalMap;
-
-    struct lclMutex
-        : public rtl::Static< ::osl::Mutex, lclMutex > {};
-    struct Clients
-        : public rtl::Static< ClientMap, Clients > {};
-    struct FreeIntervals
-        : public rtl::StaticWithInit<IntervalMap, FreeIntervals> {
-            IntervalMap operator() () {
-                IntervalMap map;
-                map.insert(std::make_pair(
-                    std::numeric_limits<AccessibleEventNotifier::TClientId>::max(), 1));
-                return map;
-            }
-        };
-
-    void releaseId(AccessibleEventNotifier::TClientId const nId)
+    IntervalMap operator() ()
     {
-        IntervalMap & rFreeIntervals(FreeIntervals::get());
-        IntervalMap::iterator const upper(rFreeIntervals.upper_bound(nId));
-        assert(upper != rFreeIntervals.end());
-        assert(nId < upper->second); // second is start of the interval!
-        if (nId + 1 == upper->second)
-        {
-            --upper->second; // add nId to existing interval
-        }
-        else
-        {
-            IntervalMap::iterator const lower(rFreeIntervals.lower_bound(nId));
-            if (lower != rFreeIntervals.end() && lower->first == nId - 1)
-            {
-                // add nId by replacing lower with new merged entry
-                rFreeIntervals.insert(std::make_pair(nId, lower->second));
-                rFreeIntervals.erase(lower);
-            }
-            else // otherwise just add new 1-element interval
-            {
-                rFreeIntervals.insert(std::make_pair(nId, nId));
-            }
-        }
-        // currently it's not checked whether intervals can be merged now
-        // hopefully that won't be a problem in practice
+        IntervalMap map;
+        map.insert(std::make_pair(
+            std::numeric_limits<AccessibleEventNotifier::TClientId>::max(), 1));
+        return map;
     }
+};
 
-    /// generates a new client id
-    AccessibleEventNotifier::TClientId generateId()
+void releaseId(AccessibleEventNotifier::TClientId const nId)
+{
+    IntervalMap & rFreeIntervals(FreeIntervals::get());
+    IntervalMap::iterator const upper(rFreeIntervals.upper_bound(nId));
+    assert(upper != rFreeIntervals.end());
+    assert(nId < upper->second); // second is start of the interval!
+    if (nId + 1 == upper->second)
+    {
+        --upper->second; // add nId to existing interval
+    }
+    else
     {
-        IntervalMap & rFreeIntervals(FreeIntervals::get());
-        assert(!rFreeIntervals.empty());
-        IntervalMap::iterator const iter(rFreeIntervals.begin());
-        AccessibleEventNotifier::TClientId const nFirst = iter->first;
-        AccessibleEventNotifier::TClientId const nFreeId = iter->second;
-        assert(nFreeId <= nFirst);
-        if (nFreeId != nFirst)
+        IntervalMap::iterator const lower(rFreeIntervals.lower_bound(nId));
+        if (lower != rFreeIntervals.end() && lower->first == nId - 1)
         {
-            ++iter->second; // remove nFreeId from interval
+            // add nId by replacing lower with new merged entry
+            rFreeIntervals.insert(std::make_pair(nId, lower->second));
+            rFreeIntervals.erase(lower);
         }
-        else
+        else // otherwise just add new 1-element interval
         {
-            rFreeIntervals.erase(iter); // remove 1-element interval
+            rFreeIntervals.insert(std::make_pair(nId, nId));
         }
+    }
+    // currently it's not checked whether intervals can be merged now
+    // hopefully that won't be a problem in practice
+}
 
-        assert(Clients::get().end() == Clients::get().find(nFreeId));
-
-        return nFreeId;
+/// generates a new client id
+AccessibleEventNotifier::TClientId generateId()
+{
+    IntervalMap & rFreeIntervals(FreeIntervals::get());
+    assert(!rFreeIntervals.empty());
+    IntervalMap::iterator const iter(rFreeIntervals.begin());
+    AccessibleEventNotifier::TClientId const nFirst = iter->first;
+    AccessibleEventNotifier::TClientId const nFreeId = iter->second;
+    assert(nFreeId <= nFirst);
+    if (nFreeId != nFirst)
+    {
+        ++iter->second; // remove nFreeId from interval
+    }
+    else
+    {
+        rFreeIntervals.erase(iter); // remove 1-element interval
     }
 
-    /** looks up a client in our client map, asserts if it cannot find it or
-        no event thread is present
+    assert(Clients::get().end() == Clients::get().find(nFreeId));
 
-        @precond
-            to be called with our mutex locked
+    return nFreeId;
+}
 
-        @param nClient
-            the id of the client to lookup
-        @param rPos
-            out-parameter for the position of the client in the client map
+/** looks up a client in our client map, asserts if it cannot find it or
+    no event thread is present
 
-        @return
-            <TRUE/> if and only if the client could be found and
-            <arg>rPos</arg> has been filled with its position
-    */
-    bool implLookupClient(
-            const AccessibleEventNotifier::TClientId nClient,
-            ClientMap::iterator& rPos )
-    {
-        // look up this client
-        ClientMap &rClients = Clients::get();
-        rPos = rClients.find( nClient );
-        assert( rClients.end() != rPos &&
-            "AccessibleEventNotifier::implLookupClient: invalid client id "
-            "(did you register your client?)!" );
-
-        return ( rClients.end() != rPos );
-    }
+    @precond
+        to be called with our mutex locked
+
+    @param nClient
+        the id of the client to lookup
+    @param rPos
+        out-parameter for the position of the client in the client map
+
+    @return
+        <TRUE/> if and only if the client could be found and
+        <arg>rPos</arg> has been filled with its position
+*/
+bool implLookupClient(
+        const AccessibleEventNotifier::TClientId nClient,
+        ClientMap::iterator& rPos )
+{
+    // look up this client
+    ClientMap &rClients = Clients::get();
+    rPos = rClients.find( nClient );
+    assert( rClients.end() != rPos &&
+        "AccessibleEventNotifier::implLookupClient: invalid client id "
+        "(did you register your client?)!" );
+
+    return ( rClients.end() != rPos );
 }
 
+} // anonymous namespace
 
-namespace comphelper
+namespace comphelper {
+
+AccessibleEventNotifier::TClientId AccessibleEventNotifier::registerClient()
 {
+    ::osl::MutexGuard aGuard( lclMutex::get() );
 
+    // generate a new client id
+    TClientId nNewClientId = generateId( );
 
-    AccessibleEventNotifier::TClientId AccessibleEventNotifier::registerClient( )
-    {
-        ::osl::MutexGuard aGuard( lclMutex::get() );
+    // the event listeners for the new client
+    ::comphelper::OInterfaceContainerHelper2 *const pNewListeners =
+        new ::comphelper::OInterfaceContainerHelper2( lclMutex::get() );
+        // note that we're using our own mutex here, so the listener containers for all
+        // our clients share this same mutex.
+        // this is a reminiscence to the days where the notifier was asynchronous. Today this is
+        // completely nonsense, and potentially slowing down the Office me thinks...
 
-        // generate a new client id
-        TClientId nNewClientId = generateId( );
+    // add the client
+    Clients::get().insert( ClientMap::value_type( nNewClientId, pNewListeners ) );
 
-        // the event listeners for the new client
-        ::comphelper::OInterfaceContainerHelper2 *const pNewListeners =
-            new ::comphelper::OInterfaceContainerHelper2( lclMutex::get() );
-            // note that we're using our own mutex here, so the listener containers for all
-            // our clients share this same mutex.
-            // this is a reminiscence to the days where the notifier was asynchronous. Today this is
-            // completely nonsense, and potentially slowing down the Office me thinks...
+    // outta here
+    return nNewClientId;
+}
 
-        // add the client
-        Clients::get().insert( ClientMap::value_type( nNewClientId, pNewListeners ) );
+void AccessibleEventNotifier::revokeClient( const TClientId _nClient )
+{
+    ::osl::MutexGuard aGuard( lclMutex::get() );
 
-        // outta here
-        return nNewClientId;
-    }
+    ClientMap::iterator aClientPos;
+    if ( !implLookupClient( _nClient, aClientPos ) )
+        // already asserted in implLookupClient
+        return;
 
+    // remove it from the clients map
+    delete aClientPos->second;
+    Clients::get().erase( aClientPos );
+    releaseId(_nClient);
+}
+
+void AccessibleEventNotifier::revokeClientNotifyDisposing(
+    const TClientId _nClient, const Reference< XInterface >& _rxEventSource )
+{
+    ::comphelper::OInterfaceContainerHelper2* pListeners(nullptr);
 
-    void AccessibleEventNotifier::revokeClient( const TClientId _nClient )
     {
+        // rhbz#1001768 drop the mutex before calling disposeAndClear
         ::osl::MutexGuard aGuard( lclMutex::get() );
 
         ClientMap::iterator aClientPos;
-        if ( !implLookupClient( _nClient, aClientPos ) )
+        if (!implLookupClient(_nClient, aClientPos))
             // already asserted in implLookupClient
             return;
 
-        // remove it from the clients map
-        delete aClientPos->second;
-        Clients::get().erase( aClientPos );
+        // notify the listeners
+        pListeners = aClientPos->second;
+
+        // we do not need the entry in the clients map anymore
+        // (do this before actually notifying, because some client
+        // implementations have re-entrance problems and call into
+        // revokeClient while we are notifying from here)
+        Clients::get().erase(aClientPos);
         releaseId(_nClient);
     }
 
+    // notify the "disposing" event for this client
+    EventObject aDisposalEvent;
+    aDisposalEvent.Source = _rxEventSource;
 
-    void AccessibleEventNotifier::revokeClientNotifyDisposing( const TClientId _nClient,
-            const Reference< XInterface >& _rxEventSource )
-    {
-        ::comphelper::OInterfaceContainerHelper2* pListeners(nullptr);
+    // now really do the notification
+    pListeners->disposeAndClear( aDisposalEvent );
+    delete pListeners;
+}
 
-        {
-            // rhbz#1001768 drop the mutex before calling disposeAndClear
-            ::osl::MutexGuard aGuard( lclMutex::get() );
-
-            ClientMap::iterator aClientPos;
-            if (!implLookupClient(_nClient, aClientPos))
-                // already asserted in implLookupClient
-                return;
-
-            // notify the listeners
-            pListeners = aClientPos->second;
-
-            // we do not need the entry in the clients map anymore
-            // (do this before actually notifying, because some client
-            // implementations have re-entrance problems and call into
-            // revokeClient while we are notifying from here)
-            Clients::get().erase(aClientPos);
-            releaseId(_nClient);
-        }
+sal_Int32 AccessibleEventNotifier::addEventListener(
+    const TClientId _nClient, const Reference< XAccessibleEventListener >& _rxListener )
+{
+    ::osl::MutexGuard aGuard( lclMutex::get() );
 
-        // notify the "disposing" event for this client
-        EventObject aDisposalEvent;
-        aDisposalEvent.Source = _rxEventSource;
+    ClientMap::iterator aClientPos;
+    if ( !implLookupClient( _nClient, aClientPos ) )
+        // already asserted in implLookupClient
+        return 0;
 
-        // now really do the notification
-        pListeners->disposeAndClear( aDisposalEvent );
-        delete pListeners;
-    }
+    if ( _rxListener.is() )
+        aClientPos->second->addInterface( _rxListener );
 
+    return aClientPos->second->getLength();
+}
 
-    sal_Int32 AccessibleEventNotifier::addEventListener(
-        const TClientId _nClient, const Reference< XAccessibleEventListener >& _rxListener )
-    {
-        ::osl::MutexGuard aGuard( lclMutex::get() );
+sal_Int32 AccessibleEventNotifier::removeEventListener(
+    const TClientId _nClient, const Reference< XAccessibleEventListener >& _rxListener )
+{
+    ::osl::MutexGuard aGuard( lclMutex::get() );
 
-        ClientMap::iterator aClientPos;
-        if ( !implLookupClient( _nClient, aClientPos ) )
-            // already asserted in implLookupClient
-            return 0;
+    ClientMap::iterator aClientPos;
+    if ( !implLookupClient( _nClient, aClientPos ) )
+        // already asserted in implLookupClient
+        return 0;
 
-        if ( _rxListener.is() )
-            aClientPos->second->addInterface( _rxListener );
+    if ( _rxListener.is() )
+        aClientPos->second->removeInterface( _rxListener );
 
-        return aClientPos->second->getLength();
-    }
+    return aClientPos->second->getLength();
+}
 
+void AccessibleEventNotifier::addEvent( const TClientId _nClient, const AccessibleEventObject& _rEvent )
+{
+    std::vector< Reference< XInterface > > aListeners;
 
-    sal_Int32 AccessibleEventNotifier::removeEventListener(
-        const TClientId _nClient, const Reference< XAccessibleEventListener >& _rxListener )
     {
         ::osl::MutexGuard aGuard( lclMutex::get() );
 
         ClientMap::iterator aClientPos;
         if ( !implLookupClient( _nClient, aClientPos ) )
             // already asserted in implLookupClient
-            return 0;
-
-        if ( _rxListener.is() )
-            aClientPos->second->removeInterface( _rxListener );
+            return;
 
-        return aClientPos->second->getLength();
+        // since we're synchronous, again, we want to notify immediately
+        aListeners = aClientPos->second->getElements();
     }
 
-
-    void AccessibleEventNotifier::addEvent( const TClientId _nClient, const AccessibleEventObject& _rEvent )
+    // default handling: loop through all listeners, and notify them
+    for ( const auto& rListener : aListeners )
     {
-        std::vector< Reference< XInterface > > aListeners;
-
-        // --- <mutex lock> -------------------------------
+        try
         {
-            ::osl::MutexGuard aGuard( lclMutex::get() );
-
-            ClientMap::iterator aClientPos;
-            if ( !implLookupClient( _nClient, aClientPos ) )
-                // already asserted in implLookupClient
-                return;
-
-            // since we're synchronous, again, we want to notify immediately
-            aListeners = aClientPos->second->getElements();
+            static_cast< XAccessibleEventListener* >( rListener.get() )->notifyEvent( _rEvent );
         }
-        // --- </mutex lock> ------------------------------
-
-            // default handling: loop through all listeners, and notify them
-        for ( const auto& rListener : aListeners )
+        catch( const Exception& )
         {
-            try
-            {
-                static_cast< XAccessibleEventListener* >( rListener.get() )->notifyEvent( _rEvent );
-            }
-            catch( const Exception& )
-            {
-                // no assertion, because a broken access remote bridge or something like this
-                // can cause this exception
-            }
+            // no assertion, because a broken access remote bridge or something like this
+            // can cause this exception
         }
     }
+}
 
-
-}   // namespace comphelper
-
+} // namespace comphelper
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/comphelper/accessibleeventnotifier.hxx b/include/comphelper/accessibleeventnotifier.hxx
index 572ac77..f8cf110 100644
--- a/include/comphelper/accessibleeventnotifier.hxx
+++ b/include/comphelper/accessibleeventnotifier.hxx
@@ -25,98 +25,87 @@
 
 #include <comphelper/comphelperdllapi.h>
 
+namespace comphelper {
 
-namespace comphelper
+class COMPHELPER_DLLPUBLIC AccessibleEventNotifier
 {
-
-
-    //= AccessibleEventNotifier
-
-    class COMPHELPER_DLLPUBLIC AccessibleEventNotifier
-    {
-    // typedefs
-    public:
-        typedef sal_uInt32  TClientId;
-
-    public:
-        AccessibleEventNotifier() = delete;
-        ~AccessibleEventNotifier() = delete;
-        AccessibleEventNotifier( const AccessibleEventNotifier& ) = delete;
-        AccessibleEventNotifier& operator=( const AccessibleEventNotifier& ) = delete;
-
-        /** registers a client of this class, means a broadcaster of AccessibleEvents
-
-            <p>No precaution is taken to care for disposal of this component. When the component
-            dies, it <b>must</b> call <member>revokeClient</member> or <member>revokeClientNotifyDisposing</member>
-            explicitly itself.</p>
-        */
-        static  TClientId   registerClient( );
-
-        /** revokes a broadcaster of AccessibleEvents
-
-            <p>Note that no disposing event is fired when you use this method, the client is simply revoked.
-            You can for instance revoke a client if the last listener for it is revoked, but the client
-            itself is not disposed.<br/>
-            When the client is disposed, you should prefer <member>revokeClientNotifyDisposing</member></p>
-
-            <p>Any possibly pending events for this client are removed from the queue.</p>
-
-            @seealso revokeClientNotifyDisposing
-        */
-        static  void        revokeClient( const TClientId _nClient );
-
-        /** revokes a client, with additionally notifying a disposing event to all listeners registered for
-            this client
-
-            <p>Any other possibly pending events for this client are removed from the queue</p>
-
-            @param _nClient
-                the id of the client which should be revoked
-            @param _rxEventSource
-                the source to be notified together with the <member scope="com.sun.star.lang">XComponent::disposing</member>
-                call.
-        */
-        static  void        revokeClientNotifyDisposing(
-                        const TClientId _nClient,
-                        const css::uno::Reference< css::uno::XInterface >& _rxEventSource
-                    );
-
-        /** registers a listener for the given client
-
-            @param _nClient
-                the id of the client for which a listener should be registered
-            @return
-                the number of event listeners currently registered for this client
-        */
-        static sal_Int32 addEventListener(
-                        const TClientId _nClient,
-                        const css::uno::Reference< css::accessibility::XAccessibleEventListener >& _rxListener
-                    );
-
-        /** revokes a listener for the given client
-
-            @param _nClient
-                the id of the client for which a listener should be revoked
-            @return
-                the number of event listeners currently registered for this client
-        */
-        static sal_Int32 removeEventListener(
-                        const TClientId _nClient,
-                        const css::uno::Reference< css::accessibility::XAccessibleEventListener >& _rxListener
-                    );
-
-        /** adds an event, which is to be broadcasted, to the queue
-
-            @param _nClient
-                the id of the client which needs to broadcast the event
-        */
-        static void addEvent(
-                        const TClientId _nClient,
-                        const css::accessibility::AccessibleEventObject& _rEvent
-                    );
-
-    };
-
+public:
+    typedef sal_uInt32 TClientId;
+
+public:
+    AccessibleEventNotifier() = delete;
+    ~AccessibleEventNotifier() = delete;
+    AccessibleEventNotifier( const AccessibleEventNotifier& ) = delete;
+    AccessibleEventNotifier& operator=( const AccessibleEventNotifier& ) = delete;
+
+    /** registers a client of this class, means a broadcaster of AccessibleEvents
+
+        <p>No precaution is taken to care for disposal of this component. When the component
+        dies, it <b>must</b> call <member>revokeClient</member> or <member>revokeClientNotifyDisposing</member>
+        explicitly itself.</p>
+    */
+    static TClientId registerClient();
+
+    /** revokes a broadcaster of AccessibleEvents
+
+        <p>Note that no disposing event is fired when you use this method, the client is simply revoked.
+        You can for instance revoke a client if the last listener for it is revoked, but the client
+        itself is not disposed.<br/>
+        When the client is disposed, you should prefer <member>revokeClientNotifyDisposing</member></p>
+
+        <p>Any possibly pending events for this client are removed from the queue.</p>
+
+        @seealso revokeClientNotifyDisposing
+    */
+    static void revokeClient( const TClientId _nClient );
+
+    /** revokes a client, with additionally notifying a disposing event to all listeners registered for
+        this client
+
+        <p>Any other possibly pending events for this client are removed from the queue</p>
+
+        @param _nClient
+            the id of the client which should be revoked
+        @param _rxEventSource
+            the source to be notified together with the <member scope="com.sun.star.lang">XComponent::disposing</member>
+            call.
+    */
+    static void revokeClientNotifyDisposing(
+        const TClientId _nClient,
+        const css::uno::Reference< css::uno::XInterface >& _rxEventSource );
+
+    /** registers a listener for the given client
+
+        @param _nClient
+            the id of the client for which a listener should be registered
+        @return
+            the number of event listeners currently registered for this client
+    */
+    static sal_Int32 addEventListener(
+        const TClientId _nClient,
+        const css::uno::Reference< css::accessibility::XAccessibleEventListener >& _rxListener );
+
+    /** revokes a listener for the given client
+
+        @param _nClient
+            the id of the client for which a listener should be revoked
+        @return
+            the number of event listeners currently registered for this client
+    */
+    static sal_Int32 removeEventListener(
+        const TClientId _nClient,
+        const css::uno::Reference< css::accessibility::XAccessibleEventListener >& _rxListener );
+
+    /** adds an event, which is to be broadcasted, to the queue
+
+        @param _nClient
+            the id of the client which needs to broadcast the event
+    */
+    static void addEvent(
+        const TClientId _nClient,
+        const css::accessibility::AccessibleEventObject& _rEvent );
+
+};
 
 }   // namespace comphelper
 


More information about the Libreoffice-commits mailing list