[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kdeconnect-kde/filetransfer] kded: First and untested implementation of payload transfer in LAN bac
From:       Albert Vaca <albertvaka () gmail ! com>
Date:       2013-09-14 15:32:16
Message-ID: E1VKrpY-0008Od-1h () scm ! kde ! org
[Download RAW message or body]

Git commit 7d4143b944fa3ccd57dc3bea300bcf53e5d7dd15 by Albert Vaca.
Committed on 14/09/2013 at 15:30.
Pushed by albertvaka into branch 'filetransfer'.

First and untested implementation of payload transfer in LAN backend

Encryption not implemented yet for transfers, but should be easy to do

M  +2    -1    kded/backends/lan/CMakeLists.txt
C  +20   -27   kded/backends/lan/downloadjob.cpp [from: \
kded/backends/lan/landevicelink.h - 063% similarity] C  +20   -20   \
kded/backends/lan/downloadjob.h [from: kded/backends/lan/landevicelink.h - 070% \
similarity] M  +27   -0    kded/backends/lan/landevicelink.cpp
M  +1    -0    kded/backends/lan/landevicelink.h
A  +82   -0    kded/backends/lan/uploadjob.cpp     [License: GPL (v2/3)]
C  +21   -20   kded/backends/lan/uploadjob.h [from: kded/backends/lan/landevicelink.h \
- 070% similarity] M  +1    -0    kded/networkpackage.h

http://commits.kde.org/kdeconnect-kde/7d4143b944fa3ccd57dc3bea300bcf53e5d7dd15

diff --git a/kded/backends/lan/CMakeLists.txt b/kded/backends/lan/CMakeLists.txt
index 599675a..5b5cda3 100644
--- a/kded/backends/lan/CMakeLists.txt
+++ b/kded/backends/lan/CMakeLists.txt
@@ -4,7 +4,8 @@ set(kded_kdeconnect_SRCS
 
     backends/lan/lanlinkprovider.cpp
     backends/lan/landevicelink.cpp
-    #landevicelinktransfer.cpp
+    backends/lan/uploadjob.cpp
+    backends/lan/downloadjob.cpp
 
     PARENT_SCOPE
 )
diff --git a/kded/backends/lan/landevicelink.h b/kded/backends/lan/downloadjob.cpp
similarity index 63%
copy from kded/backends/lan/landevicelink.h
copy to kded/backends/lan/downloadjob.cpp
index 1f909bc..3451796 100644
--- a/kded/backends/lan/landevicelink.h
+++ b/kded/backends/lan/downloadjob.cpp
@@ -1,4 +1,4 @@
-/**
+/*
  * Copyright 2013 Albert Vaca <albertvaka@gmail.com>
  *
  * This program is free software; you can redistribute it and/or
@@ -18,34 +18,27 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#ifndef LANDEVICELINK_H
-#define LANDEVICELINK_H
+#include "downloadjob.h"
 
-#include <QObject>
-#include <QString>
-#include <QTcpSocket>
-
-#include "../devicelink.h"
-
-class AvahiTcpLinkProvider;
-
-class LanDeviceLink
-    : public DeviceLink
+DownloadJob::DownloadJob(QHostAddress address, QVariantMap transferInfo): KJob()
 {
-    Q_OBJECT
-
-public:
-    LanDeviceLink(const QString& d, LinkProvider* a, QTcpSocket* socket);
-
-    bool sendPackage(NetworkPackage& np);
-    bool sendPackageEncrypted(QCA::PublicKey& key, NetworkPackage& np);
+    mPort = transferInfo["port"].toInt();
+    mSocket = new QTcpSocket(this);
+    mAddress = address;
+}
 
-private Q_SLOTS:
-    void dataReceived();
-
-private:
-    QTcpSocket* mSocket;
+void DownloadJob::start()
+{
+    mSocket->connectToHost(mAddress, mPort, QIODevice::ReadOnly);
+    connect(mSocket, SIGNAL(disconnected()), this, SLOT(disconnected()));
+}
 
-};
+void DownloadJob::disconnected()
+{
+    emitResult();
+}
 
-#endif // UDPDEVICELINK_H
+QIODevice* DownloadJob::getPayload()
+{
+    return mSocket;
+}
diff --git a/kded/backends/lan/landevicelink.h b/kded/backends/lan/downloadjob.h
similarity index 70%
copy from kded/backends/lan/landevicelink.h
copy to kded/backends/lan/downloadjob.h
index 1f909bc..4cf2879 100644
--- a/kded/backends/lan/landevicelink.h
+++ b/kded/backends/lan/downloadjob.h
@@ -1,4 +1,4 @@
-/**
+/*
  * Copyright 2013 Albert Vaca <albertvaka@gmail.com>
  *
  * This program is free software; you can redistribute it and/or
@@ -18,34 +18,34 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#ifndef LANDEVICELINK_H
-#define LANDEVICELINK_H
+#ifndef DOWNLOADJOB_H
+#define DOWNLOADJOB_H
 
-#include <QObject>
-#include <QString>
-#include <QTcpSocket>
-
-#include "../devicelink.h"
+#include <KJob>
 
-class AvahiTcpLinkProvider;
+#include <QIODevice>
+#include <QVariantMap>
+#include <QHostAddress>
+#include <QTcpSocket>
 
-class LanDeviceLink
-    : public DeviceLink
+class DownloadJob
+    : public KJob
 {
     Q_OBJECT
-
 public:
-    LanDeviceLink(const QString& d, LinkProvider* a, QTcpSocket* socket);
-
-    bool sendPackage(NetworkPackage& np);
-    bool sendPackageEncrypted(QCA::PublicKey& key, NetworkPackage& np);
-
-private Q_SLOTS:
-    void dataReceived();
+    DownloadJob(QHostAddress address, QVariantMap transferInfo);
+    virtual void start();
+    QIODevice* getPayload();
 
 private:
+    QIODevice* mOutput;
     QTcpSocket* mSocket;
+    QHostAddress mAddress;
+    qint16 mPort;
+
+private Q_SLOTS:
+    void disconnected();
 
 };
 
-#endif // UDPDEVICELINK_H
+#endif // UPLOADJOB_H
diff --git a/kded/backends/lan/landevicelink.cpp \
b/kded/backends/lan/landevicelink.cpp index 3688d16..ac764d8 100644
--- a/kded/backends/lan/landevicelink.cpp
+++ b/kded/backends/lan/landevicelink.cpp
@@ -26,6 +26,8 @@
 #include <netdb.h>
 
 #include "../linkprovider.h"
+#include "uploadjob.h"
+#include "downloadjob.h"
 
 LanDeviceLink::LanDeviceLink(const QString& d, LinkProvider* a, QTcpSocket* socket)
     : DeviceLink(d, a)
@@ -53,13 +55,26 @@ LanDeviceLink::LanDeviceLink(const QString& d, LinkProvider* a, \
QTcpSocket* sock  
 bool LanDeviceLink::sendPackageEncrypted(QCA::PublicKey& key, NetworkPackage& np)
 {
+    if (np.hasPayload()) {
+         UploadJob* job = new UploadJob(np.payload());
+         job->start();
+         np.setPayloadTransferInfo(job->getTransferInfo());
+    }
+
     np.encrypt(key);
+
     int written = mSocket->write(np.serialize());
     return (written != -1);
 }
 
 bool LanDeviceLink::sendPackage(NetworkPackage& np)
 {
+    if (np.hasPayload()) {
+         UploadJob* job = new UploadJob(np.payload());
+         job->start();
+         np.setPayloadTransferInfo(job->getTransferInfo());
+    }
+
     int written = mSocket->write(np.serialize());
     return (written != -1);
 }
@@ -85,6 +100,13 @@ void LanDeviceLink::dataReceived()
 
             NetworkPackage decrypted(QString::null);
             np.decrypt(mPrivateKey, &decrypted);
+
+            if (np.hasPayloadTransferInfo()) {
+                DownloadJob* job = new DownloadJob(mSocket->peerAddress(), \
np.payloadTransferInfo()); +                job->start();
+                np.setPayload(job->getPayload());
+            }
+
             Q_EMIT receivedPackage(decrypted);
 
         } else {
@@ -95,3 +117,8 @@ void LanDeviceLink::dataReceived()
 
     }
 }
+
+void LanDeviceLink::readyRead()
+{
+
+}
diff --git a/kded/backends/lan/landevicelink.h b/kded/backends/lan/landevicelink.h
index 1f909bc..f40f259 100644
--- a/kded/backends/lan/landevicelink.h
+++ b/kded/backends/lan/landevicelink.h
@@ -42,6 +42,7 @@ public:
 
 private Q_SLOTS:
     void dataReceived();
+    void readyRead();
 
 private:
     QTcpSocket* mSocket;
diff --git a/kded/backends/lan/uploadjob.cpp b/kded/backends/lan/uploadjob.cpp
new file mode 100644
index 0000000..0aab1cb
--- /dev/null
+++ b/kded/backends/lan/uploadjob.cpp
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2013 Albert Vaca <albertvaka@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License or (at your option) version 3 or any later version
+ * accepted by the membership of KDE e.V. (or its successor approved
+ * by the membership of KDE e.V.), which shall act as a proxy
+ * defined in Section 14 of version 3 of the license.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <qalgorithms.h>
+
+#include "uploadjob.h"
+
+UploadJob::UploadJob(QIODevice* source): KJob()
+{
+    mInput = source;
+    mServer = new QTcpServer(this);
+    mSocket = 0;
+}
+
+void UploadJob::start()
+{
+    mPort = 1739;
+    while(!mServer->listen(QHostAddress::Any, mPort)) {
+        mPort++;
+        if (mPort > 1764) { //No ports available?
+            mPort = 0;
+            return;
+        }
+    }
+    connect(mServer, SIGNAL(newConnection()), this, SLOT(newConnection()));
+}
+
+void UploadJob::newConnection()
+{
+
+    if (mSocket || !mServer->hasPendingConnections()) return;
+
+    mSocket = mServer->nextPendingConnection();
+
+    connect(mInput, SIGNAL(readyRead()), this, SLOT(readyRead()));
+    connect(mInput, SIGNAL(aboutToClose()), this, SLOT(aboutToClose()));
+
+    if (!mInput->open(QIODevice::ReadOnly)) {
+        return; //TODO: Handle error, clean up...
+    }
+
+}
+
+void UploadJob::readyRead()
+{
+    qint64 bytes = qMax(mInput->bytesAvailable(), (qint64)4096);
+    mSocket->write(mInput->read(bytes));
+}
+
+void UploadJob::aboutToClose()
+{
+    mSocket->close();
+    mSocket->disconnectFromHost();
+    emitResult();
+}
+
+QVariantMap UploadJob::getTransferInfo()
+{
+    QVariantMap ret;
+
+    ret["port"] = mPort;
+
+    return ret;
+}
+
diff --git a/kded/backends/lan/landevicelink.h b/kded/backends/lan/uploadjob.h
similarity index 70%
copy from kded/backends/lan/landevicelink.h
copy to kded/backends/lan/uploadjob.h
index 1f909bc..a0a6474 100644
--- a/kded/backends/lan/landevicelink.h
+++ b/kded/backends/lan/uploadjob.h
@@ -1,4 +1,4 @@
-/**
+/*
  * Copyright 2013 Albert Vaca <albertvaka@gmail.com>
  *
  * This program is free software; you can redistribute it and/or
@@ -18,34 +18,35 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#ifndef LANDEVICELINK_H
-#define LANDEVICELINK_H
+#ifndef UPLOADJOB_H
+#define UPLOADJOB_H
 
-#include <QObject>
-#include <QString>
-#include <QTcpSocket>
-
-#include "../devicelink.h"
+#include <KJob>
 
-class AvahiTcpLinkProvider;
+#include <QIODevice>
+#include <QVariantMap>
+#include <QTcpServer>
+#include <QTcpSocket>
 
-class LanDeviceLink
-    : public DeviceLink
+class UploadJob
+    : public KJob
 {
     Q_OBJECT
-
 public:
-    LanDeviceLink(const QString& d, LinkProvider* a, QTcpSocket* socket);
-
-    bool sendPackage(NetworkPackage& np);
-    bool sendPackageEncrypted(QCA::PublicKey& key, NetworkPackage& np);
-
-private Q_SLOTS:
-    void dataReceived();
+    UploadJob(QIODevice* source);
+    virtual void start();
+    QVariantMap getTransferInfo();
 
 private:
+    QIODevice* mInput;
+    QTcpServer* mServer;
     QTcpSocket* mSocket;
+    qint16 mPort;
 
+private Q_SLOTS:
+    void readyRead();
+    void newConnection();
+    void aboutToClose();
 };
 
-#endif // UDPDEVICELINK_H
+#endif // UPLOADJOB_H
diff --git a/kded/networkpackage.h b/kded/networkpackage.h
index 3cc0abe..2f1f627 100644
--- a/kded/networkpackage.h
+++ b/kded/networkpackage.h
@@ -68,6 +68,7 @@ public:
     template<typename T> void set(const QString& key, const T& value) { mBody[key] = \
QVariant(value); }  bool has(const QString& key) const { return mBody.contains(key); \
}  
+    //TODO: Change to a shared pointer
     QIODevice* payload() const { return mPayload; }
     void setPayload(QIODevice* device) { mPayload = device; }
     bool hasPayload() const { return (mPayload != 0); }


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic