[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