[Libreoffice-commits] .: android/sdremote officecfg/registry sd/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Tue Aug 28 13:21:40 PDT 2012


 android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java |    3 
 android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java        |   40 +++++-
 officecfg/registry/schema/org/openoffice/Office/Impress.xcs                                |   21 +++
 sd/source/ui/remotecontrol/Server.cxx                                                      |   64 +++++++++-
 4 files changed, 116 insertions(+), 12 deletions(-)

New commits:
commit 9ca3b5366211e998599c2cf7a7818ca38e3d74a0
Author: Andrzej J.R. Hunt <andrzej at ahunt.org>
Date:   Tue Aug 28 22:17:35 2012 +0200

    Saving of authorised remotes.
    
    Change-Id: I4cf6542352ac4213e66e2bbd6cc54d4f9372de62

diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java b/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java
index 89b94dd..214103a 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java
@@ -86,8 +86,7 @@ public class CommunicationService extends Service implements Runnable {
                         mState = State.CONNECTING;
                         switch (mServerDesired.getProtocol()) {
                         case NETWORK:
-                            mClient = new NetworkClient(
-                                            mServerDesired.getAddress(), this);
+                            mClient = new NetworkClient(mServerDesired, this);
                             break;
                         case BLUETOOTH:
                             mClient = new BluetoothClient(
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java b/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java
index 47e0e37..dcb88a5 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java
@@ -17,6 +17,8 @@ import java.util.Random;
 
 import android.content.Context;
 import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
 import android.support.v4.content.LocalBroadcastManager;
 
 /**
@@ -30,20 +32,16 @@ public class NetworkClient extends Client {
 
     private Socket mSocket;
 
-    public NetworkClient(String ipAddress, Context aContext) {
+    public NetworkClient(Server aServer, Context aContext) {
         super(aContext);
         try {
-            mSocket = new Socket(ipAddress, PORT);
+            mSocket = new Socket(aServer.getAddress(), PORT);
             mInputStream = mSocket.getInputStream();
             mReader = new BufferedReader(new InputStreamReader(mInputStream,
                             CHARSET));
             mOutputStream = mSocket.getOutputStream();
             // Pairing.
-            Random aRandom = new Random();
-            String aPin = "" + (aRandom.nextInt(9000) + 1000);
-            while (aPin.length() < 4) {
-                aPin = "0" + aPin; // Add leading zeros if necessary
-            }
+            String aPin = setupPin(aServer);
             Intent aIntent = new Intent(
                             CommunicationService.MSG_PAIRING_STARTED);
             aIntent.putExtra("PIN", aPin);
@@ -82,6 +80,34 @@ public class NetworkClient extends Client {
 
     }
 
+    private String setupPin(Server aServer) {
+        // Get settings
+        SharedPreferences aPreferences = mContext.getSharedPreferences(
+                        "sdremote_authorisedremotes",
+                        android.content.Context.MODE_PRIVATE);
+        if (aPreferences.contains(aServer.getName())) {
+            return aPreferences.getString(aServer.getName(), "");
+        } else {
+            String aPin = generatePin();
+
+            Editor aEdit = aPreferences.edit();
+            aEdit.putString(aServer.getName(), aPin);
+            aEdit.commit();
+
+            return aPin;
+        }
+
+    }
+
+    private String generatePin() {
+        Random aRandom = new Random();
+        String aPin = "" + (aRandom.nextInt(9000) + 1000);
+        while (aPin.length() < 4) {
+            aPin = "0" + aPin; // Add leading zeros if necessary
+        }
+        return aPin;
+    }
+
     @Override
     public void closeConnection() {
         try {
diff --git a/officecfg/registry/schema/org/openoffice/Office/Impress.xcs b/officecfg/registry/schema/org/openoffice/Office/Impress.xcs
index cb8c31a..6ad225f 100644
--- a/officecfg/registry/schema/org/openoffice/Office/Impress.xcs
+++ b/officecfg/registry/schema/org/openoffice/Office/Impress.xcs
@@ -2,7 +2,7 @@
 <!--***********************************************************************
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- * 
+ *
  * Copyright 2000, 2010 Oracle and/or its affiliates.
  *
  * OpenOffice.org - a multi-platform office productivity suite
@@ -90,6 +90,19 @@
         </info>
       </prop>
     </group>
+    <group oor:name="AuthorisedRemote">
+      <info>
+        <author>ajrhunt</author>
+        <desc>
+          A Remote Control Device that has been authorised for connection.
+        </desc>
+      </info>
+      <prop oor:name="PIN" oor:type="xs:string">
+        <info>
+          <desc>The PIN used by the device for authentication.</desc>
+        </info>
+      </prop>
+    </group>
   </templates>
   <component>
     <group oor:name="Layout">
@@ -655,6 +668,12 @@
           <value>5000</value>
         </prop>
       </group>
+      <set oor:name="AuthorisedRemotes" oor:node-type="AuthorisedRemote">
+       <info>
+        <author>ajrhunt</author>
+        <desc>Contains a list of remote control devices that can connect without user confirmation.</desc>
+       </info>
+      </set>
     </group>
     <group oor:name="Snap">
       <info>
diff --git a/sd/source/ui/remotecontrol/Server.cxx b/sd/source/ui/remotecontrol/Server.cxx
index 34f85b3..757a65b 100644
--- a/sd/source/ui/remotecontrol/Server.cxx
+++ b/sd/source/ui/remotecontrol/Server.cxx
@@ -11,7 +11,14 @@
 #include <vector>
 
 #include "officecfg/Office/Common.hxx"
+#include "officecfg/Office/Impress.hxx"
+
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/uno/Sequence.hxx>
+
 #include <comphelper/processfactory.hxx>
+#include <comphelper/configuration.hxx>
 
 #include "sddll.hxx"
 
@@ -25,8 +32,13 @@
 using namespace std;
 using namespace sd;
 using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::lang;
 using rtl::OString;
 using namespace ::osl;
+using namespace ::comphelper;
 
 // struct ClientInfoInternal:
 //     ClientInfo
@@ -89,10 +101,11 @@ void RemoteServer::execute()
             OUString aAddress = aClientAddr.getHostname();
 
             MutexGuard aGuard( mDataMutex );
-            mAvailableClients.push_back( new ClientInfoInternal(
+            ClientInfoInternal* pClient = new ClientInfoInternal(
                     OStringToOUString( aName, RTL_TEXTENCODING_UTF8 ),
                     aAddress, pSocket, OStringToOUString( aPin,
-                    RTL_TEXTENCODING_UTF8 ) ) );
+                    RTL_TEXTENCODING_UTF8 ) );
+            mAvailableClients.push_back( pClient );
 
             // Read off any additional non-empty lines
             do
@@ -100,6 +113,27 @@ void RemoteServer::execute()
                 pSocket->readLine( aLine );
             }
             while ( aLine.getLength() > 0 );
+
+            // Check if we already have this server.
+            Reference< XNameAccess > xConfig = officecfg::Office::Impress::Misc::AuthorisedRemotes::get();
+            Sequence< OUString > aNames = xConfig->getElementNames();
+            for ( int i = 0; i < aNames.getLength(); i++ )
+            {
+                if ( aNames[i].equals( pClient->mName ) )
+                {
+                    Reference<XNameAccess> xSetItem( xConfig->getByName(aNames[i]), UNO_QUERY );
+                    Any axPin(xSetItem->getByName("PIN"));
+                    OUString sPin;
+                    axPin >>= sPin;
+
+                    if ( ! sPin.equals( pClient->mPin ) ) {
+                        break;
+                    }
+                    connectClient( pClient, sPin );
+                    break;
+                }
+
+            }
         } else {
             delete pSocket;
         }
@@ -180,6 +214,32 @@ sal_Bool RemoteServer::connectClient( ClientInfo* pClient, rtl::OUString aPin )
     ClientInfoInternal *apClient = (ClientInfoInternal*) pClient;
     if ( apClient->mPin.equals( aPin ) )
     {
+        // Save in settings first
+        boost::shared_ptr< ConfigurationChanges > aChanges = ConfigurationChanges::create();
+        Reference< XNameContainer > xConfig = officecfg::Office::Impress::Misc::AuthorisedRemotes::get( aChanges );
+
+        Reference<XSingleServiceFactory> xChildFactory (
+            xConfig, UNO_QUERY);
+        Reference<XNameReplace> xChild( xChildFactory->createInstance(), UNO_QUERY);
+                Any aValue;
+        if (xChild.is())
+        {
+            // Check whether the client is already saved
+            Sequence< OUString > aNames = xConfig->getElementNames();
+            for ( int i = 0; i < aNames.getLength(); i++ )
+            {
+                if ( aNames[i].equals( apClient->mName ) )
+                    xConfig->replaceByName( apClient->mName, makeAny( xChild ) );
+                else
+                    xConfig->insertByName( apClient->mName, makeAny( xChild ) );
+            }
+
+            aValue <<= OUString( apClient->mPin );
+            xChild->replaceByName("PIN", aValue);
+            aChanges->commit();
+        }
+
+
         Communicator* pCommunicator = new Communicator( apClient->mpStreamSocket );
         MutexGuard aGuard( spServer->mDataMutex );
 


More information about the Libreoffice-commits mailing list