[Pkg-owncloud-commits] [owncloud-client] 169/219: SocketApi: Use QLocalSocket after all for windows and linux

Sandro Knauß hefee-guest at moszumanska.debian.org
Sat Oct 11 14:43:23 UTC 2014


This is an automated email from the git hooks/post-receive script.

hefee-guest pushed a commit to branch master
in repository owncloud-client.

commit 9acd3a58ee03cc41c33adb4172387f82b149a9a2
Author: Olivier Goffart <ogoffart at woboq.com>
Date:   Mon Sep 29 12:19:33 2014 +0200

    SocketApi: Use QLocalSocket after all for windows and linux
    
    Relates issue #2189
---
 src/mirall/socketapi.cpp | 47 +++++++++++++++++++++++++++++++++--------------
 src/mirall/socketapi.h   | 28 ++++++++++++++++++++++------
 2 files changed, 55 insertions(+), 20 deletions(-)

diff --git a/src/mirall/socketapi.cpp b/src/mirall/socketapi.cpp
index fbfeda2..127c51f 100644
--- a/src/mirall/socketapi.cpp
+++ b/src/mirall/socketapi.cpp
@@ -33,6 +33,7 @@
 #include <QFile>
 #include <QDir>
 #include <QApplication>
+#include <QLocalSocket>
 
 // This is the version that is returned when the client asks for the VERSION.
 // The first number should be changed if there is an incompatible change that breaks old clients.
@@ -220,15 +221,33 @@ SyncFileStatus fileStatus(Folder *folder, const QString& systemFileName, c_strli
 
 SocketApi::SocketApi(QObject* parent)
     : QObject(parent)
-    , _localServer(new QTcpServer(this))
     , _excludes(0)
 {
+
+#ifdef SOCKETAPI_TCP
     // setup socket
     DEBUG << "Establishing SocketAPI server at" << PORT;
-    if (!_localServer->listen(QHostAddress::LocalHost, PORT)) {
+    if (!_localServer.listen(QHostAddress::LocalHost, PORT)) {
         DEBUG << "Failed to bind to port" << PORT;
     }
-    connect(_localServer, SIGNAL(newConnection()), this, SLOT(slotNewConnection()));
+#else
+    QString socketPath;
+    if (Utility::isWindows()) {
+        socketPath = QLatin1String("\\\\.\\pipe\\")
+                + Theme::instance()->appName();
+    } else {
+        socketPath = MirallConfigFile().configPathWithAppName().append(QLatin1String("socket"));
+    }
+
+    QLocalServer::removeServer(socketPath);
+    if(!_localServer.listen(socketPath)) {
+        DEBUG << "can't start server" << socketPath;
+    } else {
+        DEBUG << "server started, listening at " << socketPath;
+    }
+
+#endif
+    connect(&_localServer, SIGNAL(newConnection()), this, SLOT(slotNewConnection()));
 
     // folder watcher
     connect(FolderMan::instance(), SIGNAL(folderSyncStateChange(QString)), this, SLOT(slotUpdateFolderView(QString)));
@@ -241,7 +260,7 @@ SocketApi::SocketApi(QObject* parent)
 SocketApi::~SocketApi()
 {
     DEBUG << "dtor";
-    _localServer->close();
+    _localServer.close();
     slotClearExcludesList();
 }
 
@@ -268,7 +287,7 @@ void SocketApi::slotReadExcludes()
 
 void SocketApi::slotNewConnection()
 {
-    QTcpSocket* socket = _localServer->nextPendingConnection();
+    SocketType* socket = _localServer.nextPendingConnection();
 
     if( ! socket ) {
         return;
@@ -300,14 +319,14 @@ void SocketApi::onLostConnection()
 {
     DEBUG << "Lost connection " << sender();
 
-    QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());
+    SocketType* socket = qobject_cast<SocketType*>(sender());
     _listeners.removeAll(socket);
 }
 
 
 void SocketApi::slotReadSocket()
 {
-    QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());
+    SocketType* socket = qobject_cast<SocketType*>(sender());
     Q_ASSERT(socket);
 
     while(socket->canReadLine()) {
@@ -315,12 +334,12 @@ void SocketApi::slotReadSocket()
         QString command = line.split(":").first();
         QString function = QString(QLatin1String("command_")).append(command);
 
-        QString functionWithArguments = function + QLatin1String("(QString,QTcpSocket*)");
+        QString functionWithArguments = function + QLatin1String("(QString,SocketType*)");
         int indexOfMethod = this->metaObject()->indexOfMethod(functionWithArguments.toAscii());
 
         QString argument = line.remove(0, command.length()+1).trimmed();
         if(indexOfMethod != -1) {
-            QMetaObject::invokeMethod(this, function.toAscii(), Q_ARG(QString, argument), Q_ARG(QTcpSocket*, socket));
+            QMetaObject::invokeMethod(this, function.toAscii(), Q_ARG(QString, argument), Q_ARG(SocketType*, socket));
         } else {
             DEBUG << "The command is not supported by this version of the client:" << command << "with argument:" << argument;
         }
@@ -398,7 +417,7 @@ void SocketApi::slotSyncItemDiscovered(const QString &folder, const SyncFileItem
 
 
 
-void SocketApi::sendMessage(QTcpSocket *socket, const QString& message, bool doWait)
+void SocketApi::sendMessage(SocketType *socket, const QString& message, bool doWait)
 {
     DEBUG << "Sending message: " << message;
     QString localMessage = message;
@@ -429,12 +448,12 @@ void SocketApi::broadcastMessage( const QString& verb, const QString& path, cons
     }
 
     DEBUG << "Broadcasting to" << _listeners.count() << "listeners: " << msg;
-    foreach(QTcpSocket *socket, _listeners) {
+    foreach(SocketType *socket, _listeners) {
         sendMessage(socket, msg, doWait);
     }
 }
 
-void SocketApi::command_RETRIEVE_FOLDER_STATUS(const QString& argument, QTcpSocket* socket)
+void SocketApi::command_RETRIEVE_FOLDER_STATUS(const QString& argument, SocketType* socket)
 {
     // This command is the same as RETRIEVE_FILE_STATUS
 
@@ -442,7 +461,7 @@ void SocketApi::command_RETRIEVE_FOLDER_STATUS(const QString& argument, QTcpSock
     command_RETRIEVE_FILE_STATUS(argument, socket);
 }
 
-void SocketApi::command_RETRIEVE_FILE_STATUS(const QString& argument, QTcpSocket* socket)
+void SocketApi::command_RETRIEVE_FILE_STATUS(const QString& argument, SocketType* socket)
 {
     if( !socket ) {
         qDebug() << "No valid socket object.";
@@ -470,7 +489,7 @@ void SocketApi::command_RETRIEVE_FILE_STATUS(const QString& argument, QTcpSocket
     sendMessage(socket, message);
 }
 
-void SocketApi::command_VERSION(const QString&, QTcpSocket* socket)
+void SocketApi::command_VERSION(const QString&, SocketType* socket)
 {
     sendMessage(socket, QLatin1String("VERSION:" MIRALL_VERSION_STRING ":" MIRALL_SOCKET_API_VERSION));
 }
diff --git a/src/mirall/socketapi.h b/src/mirall/socketapi.h
index c909223..61156b3 100644
--- a/src/mirall/socketapi.h
+++ b/src/mirall/socketapi.h
@@ -23,6 +23,7 @@ extern "C" {
 #include <QWeakPointer>
 #include <QTcpSocket>
 #include <QTcpServer>
+#include <QLocalServer>
 
 #include "mirall/syncfileitem.h"
 
@@ -32,6 +33,17 @@ class QStringList;
 
 namespace Mirall {
 
+#if defined(Q_OS_MAC)
+// There is no easy way to use the socket API from non Qt mac applications
+#define SOCKETAPI_TCP
+#endif
+
+#ifdef SOCKETAPI_TCP
+typedef QTcpSocket SocketType;
+#else
+typedef QLocalSocket SocketType;
+#endif
+
 class SocketApi : public QObject
 {
 Q_OBJECT
@@ -54,17 +66,21 @@ private slots:
     void slotSyncItemDiscovered(const QString &, const SyncFileItem &);
 
 private:
-    void sendMessage(QTcpSocket* socket, const QString& message, bool doWait = false);
+    void sendMessage(SocketType* socket, const QString& message, bool doWait = false);
     void broadcastMessage(const QString& verb, const QString &path, const QString &status = QString::null, bool doWait = false);
 
-    Q_INVOKABLE void command_RETRIEVE_FOLDER_STATUS(const QString& argument, QTcpSocket* socket);
-    Q_INVOKABLE void command_RETRIEVE_FILE_STATUS(const QString& argument, QTcpSocket* socket);
+    Q_INVOKABLE void command_RETRIEVE_FOLDER_STATUS(const QString& argument, SocketType* socket);
+    Q_INVOKABLE void command_RETRIEVE_FILE_STATUS(const QString& argument, SocketType* socket);
 
-    Q_INVOKABLE void command_VERSION(const QString& argument, QTcpSocket* socket);
+    Q_INVOKABLE void command_VERSION(const QString& argument, SocketType* socket);
 
 private:
-    QTcpServer *_localServer;
-    QList<QTcpSocket*> _listeners;
+#ifdef SOCKETAPI_TCP
+    QTcpServer _localServer;
+#else
+    QLocalServer _localServer;
+#endif
+    QList<SocketType*> _listeners;
     c_strlist_t *_excludes;
 };
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud-client.git



More information about the Pkg-owncloud-commits mailing list