diff options
author | Andrzej J. R. Hunt <andrzej@ahunt.org> | 2012-07-19 13:02:03 +0200 |
---|---|---|
committer | Michael Meeks <michael.meeks@suse.com> | 2012-08-06 10:22:58 +0100 |
commit | 4967e88b9adf73f538a379f0a215b0e0b6c2a968 (patch) | |
tree | 15de42911e1d25934c444db0cdb12c15e7c0e307 /sd | |
parent | 61abbf7f6c8ae0a6ce284881b5c99d1fe9b1ba3d (diff) |
Fixed the Listener lifecycle, prevents crash on slideshow exit.
Change-Id: I918754dc7b99cd48bbc012d62b2a8cd0eb0e438e
Diffstat (limited to 'sd')
-rw-r--r-- | sd/source/ui/inc/Server.hxx | 1 | ||||
-rw-r--r-- | sd/source/ui/remotecontrol/Listener.cxx | 43 | ||||
-rw-r--r-- | sd/source/ui/remotecontrol/Listener.hxx | 7 | ||||
-rw-r--r-- | sd/source/ui/remotecontrol/Server.cxx | 12 | ||||
-rw-r--r-- | sd/source/ui/remotecontrol/Transmitter.cxx | 57 |
5 files changed, 50 insertions, 70 deletions
diff --git a/sd/source/ui/inc/Server.hxx b/sd/source/ui/inc/Server.hxx index 8447292d2089..b0dcc1c62a75 100644 --- a/sd/source/ui/inc/Server.hxx +++ b/sd/source/ui/inc/Server.hxx @@ -42,6 +42,7 @@ namespace sd static void setup(); static void presentationStarted( const css::uno::Reference< css::presentation::XSlideShowController > &rController ); + void informListenerDestroyed(); private: Server(); ~Server(); diff --git a/sd/source/ui/remotecontrol/Listener.cxx b/sd/source/ui/remotecontrol/Listener.cxx index 7b607abd858e..ed6532c478e7 100644 --- a/sd/source/ui/remotecontrol/Listener.cxx +++ b/sd/source/ui/remotecontrol/Listener.cxx @@ -22,13 +22,12 @@ using rtl::OString; using rtl::OStringBuffer; -Listener::Listener( sd::Transmitter *aTransmitter ) +Listener::Listener( const ::rtl::Reference<Server>& rServer, sd::Transmitter *aTransmitter ) : ::cppu::WeakComponentImplHelper1< XSlideShowListener >( m_aMutex ), + mServer( rServer ), pTransmitter( NULL ) { - fprintf( stderr, "listener:: address of Transmitter1:%p\n", aTransmitter ); pTransmitter = aTransmitter; - fprintf( stderr, "listener:: address of Transmitter2:%p\n", pTransmitter ); } Listener::~Listener() @@ -83,22 +82,7 @@ void SAL_CALL Listener::resumed (void) void SAL_CALL Listener::slideEnded (sal_Bool bReverse) throw (css::uno::RuntimeException) { - fprintf( stderr, "listener:: address of Transmitter__:%p\n", pTransmitter ); - fprintf( stderr, "slideEnded\n" ); (void) bReverse; - sal_Int32 aSlide = mController->getCurrentSlideIndex(); - - OStringBuffer aBuilder( "slide_updated\n" ); - aBuilder.append( OString::valueOf( aSlide ) ); - aBuilder.append( "\n\n" ); - - if ( pTransmitter ) - { - fprintf( stderr, "Transmitter is, transmitting.\n" ); - pTransmitter->addMessage( aBuilder.makeStringAndClear(), - Transmitter::Priority::HIGH ); - } - fprintf( stderr, "Transmitted\n" ); } void SAL_CALL Listener::hyperLinkClicked (const rtl::OUString &) @@ -109,35 +93,50 @@ void SAL_CALL Listener::hyperLinkClicked (const rtl::OUString &) void SAL_CALL Listener::slideTransitionStarted (void) throw (css::uno::RuntimeException) { - fprintf( stderr, "slideTransitionStarted\n" ); + sal_Int32 aSlide = mController->getCurrentSlideIndex(); + + OStringBuffer aBuilder( "slide_updated\n" ); + aBuilder.append( OString::valueOf( aSlide + 1 ) ); // Slides are numbered from 0 + aBuilder.append( "\n\n" ); + + if ( pTransmitter ) + { + pTransmitter->addMessage( aBuilder.makeStringAndClear(), + Transmitter::Priority::HIGH ); + } } void SAL_CALL Listener::slideTransitionEnded (void) throw (css::uno::RuntimeException) { - fprintf( stderr, "slideTransitionEnded\n" ); } void SAL_CALL Listener::slideAnimationsEnded (void) throw (css::uno::RuntimeException) { - fprintf( stderr, "slideAnimationsEnded\n" ); } void SAL_CALL Listener::disposing (void) { + fprintf( stderr, "In disposing\n" ); pTransmitter = NULL; + fprintf( stderr, "Nulled transmitter\n" ); if ( mController.is() ) { + fprintf( stderr, "mController was\n" ); mController->removeSlideShowListener( this ); + mController = NULL; } + mServer->informListenerDestroyed(); + fprintf( stderr, "finished disposing\n" ); } void SAL_CALL Listener::disposing ( const css::lang::EventObject& rEvent) throw (::com::sun::star::uno::RuntimeException) { + fprintf( stderr, "disposing\n"); (void) rEvent; - dispose(); + dispose(); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file diff --git a/sd/source/ui/remotecontrol/Listener.hxx b/sd/source/ui/remotecontrol/Listener.hxx index 9527ed998a58..09c04ea8a0b1 100644 --- a/sd/source/ui/remotecontrol/Listener.hxx +++ b/sd/source/ui/remotecontrol/Listener.hxx @@ -17,7 +17,9 @@ #include <cppuhelper/compbase1.hxx> #include <cppuhelper/basemutex.hxx> #include <osl/socket.hxx> +#include <rtl/ref.hxx> +#include "Server.hxx" #include "Transmitter.hxx" namespace css = ::com::sun::star; @@ -28,9 +30,9 @@ class Listener public ::cppu::WeakComponentImplHelper1< css::presentation::XSlideShowListener > { public: - Listener( sd::Transmitter *aTransmitter ); + Listener( const ::rtl::Reference<Server>& rServer, sd::Transmitter *aTransmitter ); ~Listener(); - void init( const css::uno::Reference< css::presentation::XSlideShowController >& aController); + void init( const css::uno::Reference< css::presentation::XSlideShowController >& aController ); // XAnimationListener virtual void SAL_CALL beginEvent(const css::uno::Reference< @@ -58,6 +60,7 @@ public: throw (com::sun::star::uno::RuntimeException); private: + rtl::Reference<Server> mServer; sd::Transmitter *pTransmitter; css::uno::Reference< css::presentation::XSlideShowController > mController; }; diff --git a/sd/source/ui/remotecontrol/Server.cxx b/sd/source/ui/remotecontrol/Server.cxx index 2906f6c4c76a..919d47152435 100644 --- a/sd/source/ui/remotecontrol/Server.cxx +++ b/sd/source/ui/remotecontrol/Server.cxx @@ -129,17 +129,19 @@ void Server::execute() } +void Server::informListenerDestroyed() +{ + mListener.clear(); +} void Server::presentationStarted( const css::uno::Reference< css::presentation::XSlideShowController > &rController ) { if ( pTransmitter ) { - Listener *aListener = new Listener( pTransmitter ); - aListener->init( rController ); - fprintf( stderr, "presentationStarted:init--done\n"); - mListener = rtl::Reference<Listener>( aListener ); - fprintf( stderr, "presentationStarted:mListener--done\n"); + mListener = rtl::Reference<Listener>( new Listener( spServer, pTransmitter ) ); + mListener->init( rController ); + } } diff --git a/sd/source/ui/remotecontrol/Transmitter.cxx b/sd/source/ui/remotecontrol/Transmitter.cxx index efece0ffb2b9..ba432c1e0b4e 100644 --- a/sd/source/ui/remotecontrol/Transmitter.cxx +++ b/sd/source/ui/remotecontrol/Transmitter.cxx @@ -21,44 +21,32 @@ Transmitter::Transmitter( StreamSocket &aSocket ) mLowPriority(), mHighPriority() { - fprintf( stderr, "Address of low queue in constructor:%p\n", &mLowPriority ); } void Transmitter::execute() { - fprintf( stderr, "Waiting\n" ); while ( true ) { mQueuesNotEmpty.wait(); - fprintf( stderr, "Continuing after condition\n" ); - while ( true ) - { - fprintf( stderr, "Trying to acquire mutex in Transmitter Thread\n" ); - ::osl::MutexGuard aQueueGuard( mQueueMutex ); - fprintf( stderr, "Acquired mutex in Transmitter Thread\n" ); - while ( mHighPriority.size() ) - { - OString aMessage( mHighPriority.front() ); - mHighPriority.pop(); - fprintf(stderr , " Writing HIGHP:\n%s<<END>>", aMessage.getStr() ); - mStreamSocket.write( aMessage.getStr(), aMessage.getLength() ); - } - - if( mLowPriority.size() ) - { - OString aMessage( mLowPriority.front() ); - mLowPriority.pop(); - fprintf(stderr , " Writing LOWP:\n%s<<END>>", aMessage.getStr() ); - mStreamSocket.write( aMessage.getStr(), aMessage.getLength() ); - } - if ( mLowPriority.empty() && mHighPriority.empty() ) - { - mQueuesNotEmpty.reset(); - break; - } + ::osl::MutexGuard aQueueGuard( mQueueMutex ); + if ( !mHighPriority.empty() ) + { + OString aMessage( mHighPriority.front() ); + mHighPriority.pop(); + mStreamSocket.write( aMessage.getStr(), aMessage.getLength() ); + } + else if ( !mLowPriority.empty() ) + { + OString aMessage( mLowPriority.front() ); + mLowPriority.pop(); + mStreamSocket.write( aMessage.getStr(), aMessage.getLength() ); } + if ( mLowPriority.empty() && mHighPriority.empty() ) + { + mQueuesNotEmpty.reset(); + } } } @@ -70,33 +58,20 @@ Transmitter::~Transmitter() void Transmitter::addMessage( const OString& aMessage, const Priority aPriority ) { - fprintf(stderr, "Acquiring\n"); ::osl::MutexGuard aQueueGuard( mQueueMutex ); - fprintf(stderr, "Acquired\n" ); - fprintf( stderr, "Address of low queue in addMessge:%p\n", &mLowPriority ); switch ( aPriority ) { case Priority::LOW: - fprintf(stderr, "PushingLow\n"); mLowPriority.push( aMessage ); break; case Priority::HIGH: - fprintf(stderr, "PushingHigh\n<<<%s>>>\n", aMessage.getStr() ); mHighPriority.push( aMessage ); break; } - fprintf( stderr, "Setting\n" ); if ( !mQueuesNotEmpty.check() ) { mQueuesNotEmpty.set(); - fprintf( stderr, "Condition has now been set\n" ); - } - else - { - fprintf( stderr, "Condition was already set\n" ); } - fprintf( stderr, "Added\n" ); - fprintf( stderr, "Front:\n<<<%s>>>\n", mHighPriority.front().getStr() ); } |