summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sd/source/ui/remotecontrol/Communicator.cxx2
-rw-r--r--sd/source/ui/remotecontrol/ImagePreparer.cxx33
-rw-r--r--sd/source/ui/remotecontrol/ImagePreparer.hxx10
-rw-r--r--sd/source/ui/remotecontrol/Listener.cxx9
-rw-r--r--sd/source/ui/remotecontrol/Receiver.cxx24
-rw-r--r--sd/source/ui/remotecontrol/Receiver.hxx10
6 files changed, 55 insertions, 33 deletions
diff --git a/sd/source/ui/remotecontrol/Communicator.cxx b/sd/source/ui/remotecontrol/Communicator.cxx
index f567b106ff8d..3e3e7bce1b90 100644
--- a/sd/source/ui/remotecontrol/Communicator.cxx
+++ b/sd/source/ui/remotecontrol/Communicator.cxx
@@ -81,7 +81,7 @@ void Communicator::execute()
}
else
{
- aReceiver.parseCommand( aCommand );
+ aReceiver.pushCommand( aCommand );
aCommand.clear();
}
}
diff --git a/sd/source/ui/remotecontrol/ImagePreparer.cxx b/sd/source/ui/remotecontrol/ImagePreparer.cxx
index 66b2791253e8..3530a4a1b259 100644
--- a/sd/source/ui/remotecontrol/ImagePreparer.cxx
+++ b/sd/source/ui/remotecontrol/ImagePreparer.cxx
@@ -50,36 +50,29 @@ ImagePreparer::ImagePreparer(
: xController( rxController ),
pTransmitter( aTransmitter )
{
+ SetTimeout( 50 );
+ mnSendingSlide = 0;
+ Start();
}
ImagePreparer::~ImagePreparer()
{
+ Stop();
}
-void SAL_CALL ImagePreparer::run()
+void ImagePreparer::Timeout()
{
sal_uInt32 aSlides = xController->getSlideCount();
- for ( sal_uInt32 i = 0; i < aSlides; i++ )
+ if ( xController->isRunning() && // not stopped/disposed of.
+ mnSendingSlide < aSlides )
{
- if ( !xController->isRunning() ) // stopped/disposed of.
- {
- break;
- }
- sendPreview( i );
- }
- for ( sal_uInt32 i = 0; i < aSlides; i++ )
- {
- if ( !xController->isRunning() ) // stopped/disposed of.
- {
- break;
- }
- sendNotes( i );
+ sendPreview( mnSendingSlide );
+ sendNotes( mnSendingSlide );
+ mnSendingSlide++;
+ Start();
}
-}
-
-void SAL_CALL ImagePreparer::onTerminated()
-{
- delete this;
+ else
+ Stop();
}
void ImagePreparer::sendPreview( sal_uInt32 aSlideNumber )
diff --git a/sd/source/ui/remotecontrol/ImagePreparer.hxx b/sd/source/ui/remotecontrol/ImagePreparer.hxx
index aa013d766c16..66b30aeeee4c 100644
--- a/sd/source/ui/remotecontrol/ImagePreparer.hxx
+++ b/sd/source/ui/remotecontrol/ImagePreparer.hxx
@@ -10,7 +10,7 @@
#define _SD_IMPRESSREMOTE_IMAGEPREPARER_HXX
#include <osl/thread.hxx>
-
+#include <vcl/timer.hxx>
#include <com/sun/star/presentation/XSlideShowController.hpp>
#include "Transmitter.hxx"
@@ -18,9 +18,9 @@
namespace sd
{
-class ImagePreparer:
- public osl::Thread
+class ImagePreparer : Timer
{
+ sal_uInt32 mnSendingSlide;
public:
ImagePreparer( const
css::uno::Reference<css::presentation::XSlideShowController>&
@@ -31,9 +31,7 @@ private:
css::uno::Reference<css::presentation::XSlideShowController> xController;
Transmitter *pTransmitter;
- // Thread method
- virtual void SAL_CALL run();
- virtual void SAL_CALL onTerminated();
+ virtual void Timeout();
void sendPreview( sal_uInt32 aSlideNumber );
css::uno::Sequence<sal_Int8> preparePreview( sal_uInt32 aSlideNumber,
diff --git a/sd/source/ui/remotecontrol/Listener.cxx b/sd/source/ui/remotecontrol/Listener.cxx
index 30b29a90a4ce..2052fbf4d065 100644
--- a/sd/source/ui/remotecontrol/Listener.cxx
+++ b/sd/source/ui/remotecontrol/Listener.cxx
@@ -10,12 +10,13 @@
#include <comphelper/processfactory.hxx>
#include <com/sun/star/presentation/XPresentationSupplier.hpp>
#include <com/sun/star/presentation/XPresentation2.hpp>
-
#include <rtl/strbuf.hxx>
+#include <vcl/svapp.hxx>
#include "Listener.hxx"
#include "ImagePreparer.hxx"
+
using namespace sd;
using namespace ::com::sun::star::presentation;
using namespace ::com::sun::star::frame;
@@ -53,8 +54,10 @@ void Listener::init( const css::uno::Reference< css::presentation::XSlideShowCon
pTransmitter->addMessage( aBuffer.makeStringAndClear(),
Transmitter::PRIORITY_HIGH );
- ImagePreparer* pPreparer = new ImagePreparer( aController, pTransmitter );
- pPreparer->create();
+ {
+ SolarMutexGuard aGuard;
+ /* ImagePreparer* pPreparer = */ new ImagePreparer( aController, pTransmitter );
+ }
}
else
{
diff --git a/sd/source/ui/remotecontrol/Receiver.cxx b/sd/source/ui/remotecontrol/Receiver.cxx
index 968fbb4e4ee7..c3e7d8a1f18f 100644
--- a/sd/source/ui/remotecontrol/Receiver.cxx
+++ b/sd/source/ui/remotecontrol/Receiver.cxx
@@ -30,13 +30,35 @@ using namespace std;
Receiver::Receiver( Transmitter *aTransmitter )
{
pTransmitter = aTransmitter;
+ SetTimeout( 0 );
}
Receiver::~Receiver()
{
}
-void Receiver::parseCommand( std::vector<OString> aCommand )
+// Bounce the commands to the main thread to avoid threading woes
+void Receiver::pushCommand( const std::vector<OString> &rCommand )
+{
+ SolarMutexGuard aGuard;
+ maExecQueue.push_back( rCommand );
+ Start();
+}
+
+void Receiver::Timeout()
+{
+ if( maExecQueue.size() )
+ {
+ std::vector< rtl::OString > aCommands( maExecQueue.front() );
+ maExecQueue.pop_front();
+ executeCommand( aCommands );
+ Start();
+ }
+ else
+ Stop();
+}
+
+void Receiver::executeCommand( const std::vector<OString> &aCommand )
{
uno::Reference<presentation::XSlideShowController> xSlideShowController;
uno::Reference<presentation::XPresentation2> xPresentation;
diff --git a/sd/source/ui/remotecontrol/Receiver.hxx b/sd/source/ui/remotecontrol/Receiver.hxx
index 0bee508089d5..a4a915c4b3a9 100644
--- a/sd/source/ui/remotecontrol/Receiver.hxx
+++ b/sd/source/ui/remotecontrol/Receiver.hxx
@@ -16,6 +16,8 @@
#include <com/sun/star/presentation/XPresentation2.hpp>
#include <osl/socket.hxx>
#include <stdlib.h>
+#include <vcl/timer.hxx>
+#include <vcl/svapp.hxx>
#include <vector>
@@ -24,12 +26,16 @@
namespace sd
{
-class Receiver
+// Timer is protected by the solar mutex => so are we.
+class Receiver : Timer
{
+ std::deque< std::vector< rtl::OString > > maExecQueue;
public:
Receiver( Transmitter *aTransmitter );
~Receiver();
- void parseCommand( std::vector<rtl::OString> aCommand );
+ virtual void Timeout();
+ void pushCommand( const std::vector<rtl::OString> &rCommand );
+ void executeCommand( const std::vector<rtl::OString> &aCommand );
private:
Transmitter *pTransmitter;