[Libreoffice-commits] .: Branch 'feature/remote' - android/sdremote sd/Library_sd.mk sd/source
Andrzej J.R. Hunt
ajrhunt at kemper.freedesktop.org
Fri Jul 13 09:40:58 PDT 2012
android/sdremote/src/org/libreoffice/impressremote/TestClient.java | 17 +-
sd/Library_sd.mk | 1
sd/source/ui/remotecontrol/Receiver.cxx | 33 ++--
sd/source/ui/remotecontrol/Receiver.hxx | 9 -
sd/source/ui/remotecontrol/Server.cxx | 43 ++---
sd/source/ui/remotecontrol/Server.hxx | 5
sd/source/ui/remotecontrol/Transmitter.cxx | 82 ++++++++++
sd/source/ui/remotecontrol/Transmitter.hxx | 47 +++++
8 files changed, 191 insertions(+), 46 deletions(-)
New commits:
commit fe02a263c6515e64f291c52f0fe187b098f73bcf
Author: Andrzej J. R. Hunt <andrzej at ahunt.org>
Date: Fri Jul 13 17:34:49 2012 +0100
Transmitter for queuing of messages (Client->Server), fixed protocol.
Change-Id: I Idcf6cf33b75dde2f921bec6c64e394e91994aba0
diff --git a/android/sdremote/src/org/libreoffice/impressremote/TestClient.java b/android/sdremote/src/org/libreoffice/impressremote/TestClient.java
index 83f4c71..1b0f749 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/TestClient.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/TestClient.java
@@ -1,6 +1,5 @@
package org.libreoffice.impressremote;
-import java.util.ArrayList;
import java.util.HashMap;
import org.libreoffice.impressremote.communication.CommunicationService;
@@ -24,7 +23,8 @@ import android.widget.TextView;
public class TestClient extends Activity {
- HashMap<Integer, Bitmap> aPreviewImages = new HashMap<Integer, Bitmap>();
+ private HashMap<Integer, Bitmap> mPreviewImages = new HashMap<Integer, Bitmap>();
+ private boolean mCurrentPreviewImageMissing = false;
private boolean mIsBound = false;
@@ -141,14 +141,23 @@ public class TestClient extends Activity {
case CommunicationService.MSG_SLIDE_CHANGED:
int newSlide = aData.getInt("slide_number");
mSlideLabel.setText("Slide " + newSlide);
- // TODO: set slide;
+ if (mPreviewImages.containsKey(newSlide)) {
+ mImageView.setImageBitmap(mPreviewImages.get(newSlide));
+ mCurrentPreviewImageMissing = false;
+ } else {
+ mCurrentPreviewImageMissing = true;
+ }
break;
case CommunicationService.MSG_SLIDE_PREVIEW:
int aSlideNumber = aData.getInt("slide_number");
byte[] aPreviewImage = aData.getByteArray("preview_image");
Bitmap aBitmap = BitmapFactory.decodeByteArray(aPreviewImage,
0, aPreviewImage.length);
- aPreviewImages.put(aSlideNumber, aBitmap);
+ mPreviewImages.put(aSlideNumber, aBitmap);
+ if (mCurrentPreviewImageMissing) {
+ mImageView.setImageBitmap(aBitmap);
+ mCurrentPreviewImageMissing = false;
+ }
mImageView.setImageBitmap(aBitmap);
// TODO: remove above line, use slide changed to show image.
break;
diff --git a/sd/Library_sd.mk b/sd/Library_sd.mk
index 9deaefb..2b43a36 100644
--- a/sd/Library_sd.mk
+++ b/sd/Library_sd.mk
@@ -323,6 +323,7 @@ $(eval $(call gb_Library_add_exception_objects,sd,\
sd/source/ui/remotecontrol/Server \
sd/source/ui/remotecontrol/Receiver \
sd/source/ui/remotecontrol/Listener \
+ sd/source/ui/remotecontrol/Transmitter \
sd/source/ui/slideshow/PaneHider \
sd/source/ui/slideshow/SlideShowRestarter \
sd/source/ui/slideshow/showwin \
diff --git a/sd/source/ui/remotecontrol/Receiver.cxx b/sd/source/ui/remotecontrol/Receiver.cxx
index 7b527ac..87eee7f 100644
--- a/sd/source/ui/remotecontrol/Receiver.cxx
+++ b/sd/source/ui/remotecontrol/Receiver.cxx
@@ -19,6 +19,7 @@
#include <xmlsec/base64.h>
#include <rtl/ustrbuf.hxx>
#include <sax/tools/converter.hxx>
+#include <rtl/strbuf.hxx>
using namespace sd;
using namespace ::com::sun::star;
@@ -27,16 +28,22 @@ using rtl::OString;
using namespace ::osl;
using namespace std;
-Receiver::Receiver()
+Receiver::Receiver( Transmitter *aTransmitter )
{
+ mTransmitter = aTransmitter;
}
Receiver::~Receiver()
{
}
-void Receiver::parseCommand( std::vector<OString> aCommand, osl::StreamSocket &aStreamSocket )
+void Receiver::parseCommand( std::vector<OString> aCommand )
{
+ fprintf( stderr, "Parsing:\n");
+ for (int i = 0; i < aCommand.size(); i++)
+ {
+ fprintf( stderr, "%s\n", aCommand[i].getStr() );}
+ fprintf( stderr, "End parse\n" );
uno::Reference<presentation::XSlideShowController> xSlideShowController;
try {
uno::Reference< lang::XMultiServiceFactory > xServiceManager(
@@ -49,8 +56,6 @@ void Receiver::parseCommand( std::vector<OString> aCommand, osl::StreamSocket &a
// Throws an exception if now slideshow running
xSlideShowController = uno::Reference<presentation::XSlideShowController>(
xPresentation->getController(), uno::UNO_QUERY_THROW );
- // FIXME: remove later, this is just to test functionality
- sendPreview( 0, xSlideShowController, aStreamSocket );
}
catch ( com::sun::star::uno::RuntimeException &e )
{
@@ -72,16 +77,18 @@ void Receiver::parseCommand( std::vector<OString> aCommand, osl::StreamSocket &a
xSlideShowController->gotoSlideIndex( aSlide );
}
+ // FIXME: remove later, this is just to test functionality
+ //sendPreview( 0, xSlideShowController, mTransmitter );
+
}
void sendPreview(sal_uInt32 aSlideNumber,
- uno::Reference<presentation::XSlideShowController> xSlideShowController, osl::StreamSocket &mStreamSocket )
+ uno::Reference<presentation::XSlideShowController> xSlideShowController, Transmitter *aTransmitter )
{
sal_uInt64 aSize; // Unused
uno::Sequence<sal_Int8> aImageData = preparePreview( aSlideNumber, xSlideShowController, 320, 240, aSize );
-
rtl::OUStringBuffer aStrBuffer;
::sax::Converter::encodeBase64( aStrBuffer, aImageData );
@@ -89,15 +96,17 @@ void sendPreview(sal_uInt32 aSlideNumber,
aStrBuffer.makeStringAndClear(), RTL_TEXTENCODING_UTF8 );
// Start the writing
- mStreamSocket.write( "slide_preview\n", strlen( "slide_preview\n" ) );
+ rtl::OStringBuffer aBuffer;
- rtl::OString aSlideNumberString( rtl::OString::valueOf( 2 ) ); // FIXME get number
- mStreamSocket.write( aSlideNumberString.getStr(), aSlideNumberString.getLength() );
- mStreamSocket.write( "\n", 1 );
+ aBuffer.append( "slide_preview\n" );
- mStreamSocket.write( aEncodedShortString.getStr(), aEncodedShortString.getLength() );
- mStreamSocket.write( "\n\n", 2 );
+ rtl::OString aSlideNumberString( rtl::OString::valueOf( 2 ) ); // FIXME get number
+ aBuffer.append( aSlideNumberString.getStr() );
+ aBuffer.append( "\n" );
+ aBuffer.append( aEncodedShortString.getStr() );
+ aBuffer.append( "\n\n" );
+ aTransmitter->addMessage( aBuffer.makeStringAndClear(), Transmitter::Priority::LOW );
}
diff --git a/sd/source/ui/remotecontrol/Receiver.hxx b/sd/source/ui/remotecontrol/Receiver.hxx
index d74a039..df736ad 100644
--- a/sd/source/ui/remotecontrol/Receiver.hxx
+++ b/sd/source/ui/remotecontrol/Receiver.hxx
@@ -19,6 +19,8 @@
#include <vector>
+#include "Transmitter.hxx"
+
namespace css = ::com::sun::star;
namespace sd
@@ -27,18 +29,19 @@ namespace sd
class Receiver
{
public:
- Receiver();
+ Receiver( Transmitter *aTransmitter );
~Receiver();
- void parseCommand( std::vector<rtl::OString> aCommand, osl::StreamSocket &aStreamSocket );
+ void parseCommand( std::vector<rtl::OString> aCommand );
private:
+ Transmitter *mTransmitter;
};
}
css::uno::Sequence<sal_Int8> preparePreview(sal_uInt32 aSlideNumber, css::uno::Reference<css::presentation::XSlideShowController> xSlideShowController, sal_uInt32 aWidth, sal_uInt32 aHeight, sal_uInt64 &aSize );
-void sendPreview(sal_uInt32 aSlideNumber, css::uno::Reference<css::presentation::XSlideShowController> xSlideShowController, osl::StreamSocket &mStreamSocket );
+void sendPreview(sal_uInt32 aSlideNumber, css::uno::Reference<css::presentation::XSlideShowController> xSlideShowController, sd::Transmitter *aTransmitter );
#endif // _SD_IMPRESSREMOTE_RECEIVER_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sd/source/ui/remotecontrol/Server.cxx b/sd/source/ui/remotecontrol/Server.cxx
index 0a8f875..f858a36 100644
--- a/sd/source/ui/remotecontrol/Server.cxx
+++ b/sd/source/ui/remotecontrol/Server.cxx
@@ -19,7 +19,7 @@ using namespace sd;
using rtl::OString;
Server::Server()
-: Thread( "ServerThread" ), mSocket(), mReceiver()
+: Thread( "ServerThread" ), mSocket()
{
}
@@ -30,15 +30,16 @@ Server::~Server()
// Run as a thread
void Server::listenThread()
{
+ Transmitter aTransmitter( mStreamSocket );
+ Receiver aReceiver( &aTransmitter );
// TODO: decryption
while (true)
{
sal_uInt64 aRet, aRead;
vector<char> aBuffer;
vector<OString> aCommand;
- sal_Bool finished = false;
aRead = 0;
- while ( !finished )
+ while ( true )
{
aBuffer.resize( aRead + 100 );
aRet = mStreamSocket.recv( &aBuffer[aRead], 100 );
@@ -46,29 +47,23 @@ void Server::listenThread()
{
return; // closed
}
- vector<char>::iterator aIt;
- aIt = find( aBuffer.begin(), aBuffer.end(), '\n' ); // add aRead
aRead += aRet;
- if ( aIt == aBuffer.end() )
- {
- fprintf( stderr, "Continuing\n" );
- continue;
- }
- fprintf( stderr, "parsing\n" );
- sal_uInt64 aLocation = aIt - aBuffer.begin();
-
- vector<char> aTemp( aLocation );
- memcpy( &(*aTemp.begin()), &(*aBuffer.begin()), aLocation );
- aTemp.push_back( 0 );
-
- aBuffer.erase( aBuffer.begin(), aBuffer.begin() + aLocation + 1 ); // Also delete the newline
- aRead -= aLocation;
-
- aCommand.push_back( OString( &(*aTemp.begin()) ) );
- if ( (*aTemp.begin()) == 0 )
+ vector<char>::iterator aIt;
+ while ( (aIt = find( aBuffer.begin() + aRead - aRet, aBuffer.end(), '\n' ))
+ != aBuffer.end() )
{
- mReceiver.parseCommand( aCommand, mStreamSocket );
- aCommand.clear();
+ fprintf( stderr, "we have string\n" );
+ sal_uInt64 aLocation = aIt - aBuffer.begin();
+
+ aCommand.push_back( OString( &(*aBuffer.begin()), aLocation ) );
+
+ if ( aIt == aBuffer.begin() )
+ {
+ aReceiver.parseCommand( aCommand );
+ aCommand.clear();
+ }
+ aBuffer.erase( aBuffer.begin(), aIt + 1 ); // Also delete the newline
+ aRead -= (aLocation + 1);
}
}
diff --git a/sd/source/ui/remotecontrol/Server.hxx b/sd/source/ui/remotecontrol/Server.hxx
index e953ff5..2b3c706 100644
--- a/sd/source/ui/remotecontrol/Server.hxx
+++ b/sd/source/ui/remotecontrol/Server.hxx
@@ -20,7 +20,7 @@
#include <com/sun/star/presentation/XSlideShowListener.hpp>
-#include "Receiver.hxx"
+
/**
* The port for use for the main communication between LibO and remote control app.
@@ -35,7 +35,7 @@ namespace sd
class Server : public salhelper::Thread
{
public:
- static void setup();
+ static void setup();
private:
Server();
~Server();
@@ -43,7 +43,6 @@ namespace sd
osl::AcceptorSocket mSocket;
osl::StreamSocket mStreamSocket;
void listenThread();
- Receiver mReceiver;
void execute();
};
}
diff --git a/sd/source/ui/remotecontrol/Transmitter.cxx b/sd/source/ui/remotecontrol/Transmitter.cxx
new file mode 100644
index 0000000..276fc89
--- /dev/null
+++ b/sd/source/ui/remotecontrol/Transmitter.cxx
@@ -0,0 +1,82 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+#include "Transmitter.hxx"
+
+using rtl::OString;
+using namespace std;
+using namespace osl; // Sockets etc.
+using namespace sd;
+
+Transmitter::Transmitter( StreamSocket &aSocket )
+ : Thread( "TransmitterThread" ),
+ mStreamSocket( aSocket ),
+ mQueuesNotEmpty(),
+ mQueueMutex()
+{
+ launch();
+ // Start a thread
+}
+
+void
+Transmitter::execute()
+{
+ while( mQueuesNotEmpty.wait() )
+ {
+ while ( true )
+ {
+ osl::MutexGuard aQueueGuard( mQueueMutex );
+ while ( mHighPriority.size() )
+ {
+ OString aMessage = mHighPriority.front();
+ mHighPriority.pop();
+ mStreamSocket.write( aMessage.getStr(), aMessage.getLength() );
+ }
+
+ if( mLowPriority.size() )
+ {
+ OString aMessage = mLowPriority.front();
+ mLowPriority.pop();
+ mStreamSocket.write( aMessage.getStr(), aMessage.getLength() );
+ }
+
+ //fprintf( stderr, "Lowsize:%i, Highsize:%i\n", mLowPriority.size(), mHighPriority.size() );
+ if ( (mLowPriority.size() == 0) && (mHighPriority.size() == 0) )
+ {
+ mQueuesNotEmpty.reset();
+ break;
+ }
+ }
+
+ }
+
+}
+
+Transmitter::~Transmitter()
+{
+
+}
+
+void Transmitter::addMessage( OString aMessage, Priority aPriority )
+{
+ osl::MutexGuard aQueueGuard( mQueueMutex );
+ switch ( aPriority )
+ {
+ case Priority::LOW:
+ mLowPriority.push( aMessage );
+ break;
+ case Priority::HIGH:
+ mHighPriority.push( aMessage );
+ break;
+ }
+ mQueuesNotEmpty.set();
+
+}
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file
diff --git a/sd/source/ui/remotecontrol/Transmitter.hxx b/sd/source/ui/remotecontrol/Transmitter.hxx
new file mode 100644
index 0000000..38f0534
--- /dev/null
+++ b/sd/source/ui/remotecontrol/Transmitter.hxx
@@ -0,0 +1,47 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+#ifndef _SD_IMPRESSREMOTE_TRANSMITTER_HXX
+#define _SD_IMPRESSREMOTE_TRANSMITTER_HXX
+
+#include <osl/conditn.hxx>
+#include <osl/mutex.hxx>
+#include <osl/socket.hxx>
+#include <salhelper/thread.hxx>
+#include <rtl/string.hxx>
+
+#include <queue>
+
+namespace sd
+{
+
+class Transmitter
+: public salhelper::Thread
+{
+public:
+ enum Priority { LOW = 1, HIGH };
+ Transmitter( osl::StreamSocket &aSocket );
+ ~Transmitter();
+ void addMessage( rtl::OString aMessage, Priority aPriority );
+
+private:
+ void execute();
+
+ osl::StreamSocket mStreamSocket;
+
+ osl::Condition mQueuesNotEmpty;
+
+ osl::Mutex mQueueMutex;
+
+ std::queue<rtl::OString> mLowPriority;
+ std::queue<rtl::OString> mHighPriority;
+};
+
+}
+#endif // _SD_IMPRESSREMOTE_TRANSMITTER_HXX
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file
More information about the Libreoffice-commits
mailing list