summaryrefslogtreecommitdiff
path: root/sd
diff options
context:
space:
mode:
authorAndrzej J. R. Hunt <andrzej@ahunt.org>2012-07-19 13:02:03 +0200
committerMichael Meeks <michael.meeks@suse.com>2012-08-06 10:22:58 +0100
commit4967e88b9adf73f538a379f0a215b0e0b6c2a968 (patch)
tree15de42911e1d25934c444db0cdb12c15e7c0e307 /sd
parent61abbf7f6c8ae0a6ce284881b5c99d1fe9b1ba3d (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.hxx1
-rw-r--r--sd/source/ui/remotecontrol/Listener.cxx43
-rw-r--r--sd/source/ui/remotecontrol/Listener.hxx7
-rw-r--r--sd/source/ui/remotecontrol/Server.cxx12
-rw-r--r--sd/source/ui/remotecontrol/Transmitter.cxx57
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() );
}