First iteration of filetransfer plugin
Now it just downloads to the user desktop payloads received in packages with type kdeconnect.filetransfer. Added the package type define. Created an an auxiliar QFile-like class with a small needed modification. Added a commented test in the filetransfer plugin code (to be moved).
This commit is contained in:
parent
5837fa15db
commit
111ee7f054
10 changed files with 290 additions and 9 deletions
|
@ -30,13 +30,12 @@ LoopbackDeviceLink::LoopbackDeviceLink(const QString& deviceId, LoopbackLinkProv
|
||||||
|
|
||||||
bool LoopbackDeviceLink::sendPackage(const NetworkPackage& input)
|
bool LoopbackDeviceLink::sendPackage(const NetworkPackage& input)
|
||||||
{
|
{
|
||||||
NetworkPackage output("");
|
NetworkPackage output(QString::null);
|
||||||
NetworkPackage::unserialize(input.serialize(), &output);
|
NetworkPackage::unserialize(input.serialize(), &output);
|
||||||
|
|
||||||
//LoopbackDeviceLink does not need deviceTransferInfo
|
//LoopbackDeviceLink does not need deviceTransferInfo
|
||||||
if (input.hasPayload()) {
|
if (input.hasPayload()) {
|
||||||
QIODevice* device = input.payload();
|
QIODevice* device = input.payload();
|
||||||
device->open(QIODevice::ReadOnly);
|
|
||||||
output.setPayload(device);
|
output.setPayload(device);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#define PACKAGE_TYPE_TELEPHONY QString("kdeconnect.telephony")
|
#define PACKAGE_TYPE_TELEPHONY QString("kdeconnect.telephony")
|
||||||
#define PACKAGE_TYPE_CLIPBOARD QString("kdeconnect.clipboard")
|
#define PACKAGE_TYPE_CLIPBOARD QString("kdeconnect.clipboard")
|
||||||
#define PACKAGE_TYPE_MPRIS QString("kdeconnect.mpris")
|
#define PACKAGE_TYPE_MPRIS QString("kdeconnect.mpris")
|
||||||
|
#define PACKAGE_TYPE_FILETRANSFER QString("kdeconnect.filetransfer")
|
||||||
|
|
||||||
|
|
||||||
#endif // NETWORKPACKAGETYPES_H
|
#endif // NETWORKPACKAGETYPES_H
|
||||||
|
|
|
@ -4,6 +4,7 @@ find_package(QCA2 REQUIRED)
|
||||||
|
|
||||||
include_directories(
|
include_directories(
|
||||||
${QJSON_INCLUDE_DIR}
|
${QJSON_INCLUDE_DIR}
|
||||||
|
${KIO_INCLUDE_DIR}
|
||||||
${QCA2_INCLUDE_DIR}
|
${QCA2_INCLUDE_DIR}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -12,6 +13,8 @@ include_directories(${KDE4_INCLUDES})
|
||||||
|
|
||||||
set(kdeconnect_filetransfer_SRCS
|
set(kdeconnect_filetransfer_SRCS
|
||||||
filetransferplugin.cpp
|
filetransferplugin.cpp
|
||||||
|
filetransferjob.cpp
|
||||||
|
autoclosingqfile.cpp
|
||||||
../kdeconnectplugin.cpp
|
../kdeconnectplugin.cpp
|
||||||
../pluginloader.cpp
|
../pluginloader.cpp
|
||||||
../../networkpackage.cpp
|
../../networkpackage.cpp
|
||||||
|
@ -23,6 +26,7 @@ kde4_add_plugin(kdeconnect_filetransfer ${kdeconnect_filetransfer_SRCS})
|
||||||
target_link_libraries(kdeconnect_filetransfer
|
target_link_libraries(kdeconnect_filetransfer
|
||||||
${KDE4_KDECORE_LIBS}
|
${KDE4_KDECORE_LIBS}
|
||||||
${KDE4_KDEUI_LIBS}
|
${KDE4_KDEUI_LIBS}
|
||||||
|
${KDE4_KIO_LIBS}
|
||||||
${QT_QTNETWORK_LIBRARY}
|
${QT_QTNETWORK_LIBRARY}
|
||||||
${QJSON_LIBRARIES}
|
${QJSON_LIBRARIES}
|
||||||
${QCA2_LIBRARIES}
|
${QCA2_LIBRARIES}
|
||||||
|
|
27
kded/plugins/filetransfer/autoclosingqfile.cpp
Normal file
27
kded/plugins/filetransfer/autoclosingqfile.cpp
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
/*
|
||||||
|
* 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 "autoclosingqfile.h"
|
||||||
|
|
||||||
|
AutoClosingQFile::AutoClosingQFile(const QString& name)
|
||||||
|
: QFile(name)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
43
kded/plugins/filetransfer/autoclosingqfile.h
Normal file
43
kded/plugins/filetransfer/autoclosingqfile.h
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AUTOCLOSINGQFILE_H
|
||||||
|
#define AUTOCLOSINGQFILE_H
|
||||||
|
|
||||||
|
#include <QFile>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
class AutoClosingQFile : public QFile
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
|
||||||
|
AutoClosingQFile(const QString &name);
|
||||||
|
virtual qint64 readData(char* data, qint64 maxlen) {
|
||||||
|
qint64 read = QFile::readData(data, maxlen);
|
||||||
|
if (read == -1 || read == bytesAvailable()) {
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
return read;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // AUTOCLOSINGQFILE_H
|
96
kded/plugins/filetransfer/filetransferjob.cpp
Normal file
96
kded/plugins/filetransfer/filetransferjob.cpp
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
/*
|
||||||
|
* 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 "filetransferjob.h"
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
|
#include <qalgorithms.h>
|
||||||
|
|
||||||
|
FileTransferJob::FileTransferJob(QIODevice* origin, const KUrl& destination): KJob()
|
||||||
|
{
|
||||||
|
mDestination = destination;
|
||||||
|
mOrigin = origin;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileTransferJob::start()
|
||||||
|
{
|
||||||
|
//Open destination file
|
||||||
|
|
||||||
|
QTemporaryFile tmp;
|
||||||
|
tmp.setAutoRemove(false);
|
||||||
|
tmp.open();
|
||||||
|
|
||||||
|
mTempDestination = KIO::open(tmp.fileName(), QIODevice::WriteOnly);
|
||||||
|
connect(mTempDestination, SIGNAL(open(KIO::Job*)), this, SLOT(open(KIO::Job*)));
|
||||||
|
mTempDestination->start();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileTransferJob::open(KIO::Job* job)
|
||||||
|
{
|
||||||
|
Q_UNUSED(job);
|
||||||
|
|
||||||
|
//Open source file
|
||||||
|
|
||||||
|
mOrigin->open(QIODevice::ReadOnly);
|
||||||
|
|
||||||
|
Q_ASSERT(mOrigin->isOpen());
|
||||||
|
|
||||||
|
connect(mOrigin, SIGNAL(readyRead()),this, SLOT(readyRead()));
|
||||||
|
connect(mOrigin, SIGNAL(aboutToClose()),this, SLOT(sourceFinished()));
|
||||||
|
if (mOrigin->bytesAvailable() > 0) readyRead();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileTransferJob::readyRead()
|
||||||
|
{
|
||||||
|
//Copy a chunk of data
|
||||||
|
|
||||||
|
int bytes = qMin(qint64(4096), mOrigin->bytesAvailable());
|
||||||
|
QByteArray data = mOrigin->read(bytes);
|
||||||
|
mTempDestination->write(data);
|
||||||
|
|
||||||
|
if(!mOrigin->atEnd())
|
||||||
|
QMetaObject::invokeMethod(this, "readyRead", Qt::QueuedConnection);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileTransferJob::sourceFinished()
|
||||||
|
{
|
||||||
|
qDebug() << "sourceFinished";
|
||||||
|
|
||||||
|
readyRead(); //Read the last chunk of data, if any
|
||||||
|
|
||||||
|
qDebug() << "Finished" << mTempDestination->url();
|
||||||
|
KIO::FileCopyJob* job = KIO::file_move(mTempDestination->url(), mDestination);
|
||||||
|
connect(job, SIGNAL(result(KJob*)), this, SLOT(moveResult(KJob*)));
|
||||||
|
job->start();
|
||||||
|
|
||||||
|
delete mOrigin; //TODO: Use shared pointers
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileTransferJob::moveResult(KJob* job)
|
||||||
|
{
|
||||||
|
//TODO: Error handling, cleanup
|
||||||
|
qDebug() << "Move result";
|
||||||
|
qDebug() << job->errorString();
|
||||||
|
qDebug() << job->errorText();
|
||||||
|
emitResult();
|
||||||
|
}
|
||||||
|
|
55
kded/plugins/filetransfer/filetransferjob.h
Normal file
55
kded/plugins/filetransfer/filetransferjob.h
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FILETRANSFERJOB_H
|
||||||
|
#define FILETRANSFERJOB_H
|
||||||
|
|
||||||
|
#include <QIODevice>
|
||||||
|
#include <QTemporaryFile>
|
||||||
|
|
||||||
|
#include <KJob>
|
||||||
|
#include <KUrl>
|
||||||
|
#include <KIO/FileJob>
|
||||||
|
#include <KIO/Job>
|
||||||
|
#include <KSharedPtr>
|
||||||
|
|
||||||
|
class FileTransferJob : public KJob
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
FileTransferJob(QIODevice* origin, const KUrl& destination);
|
||||||
|
virtual void start();
|
||||||
|
KUrl destination() { return mDestination; }
|
||||||
|
|
||||||
|
public Q_SLOTS:
|
||||||
|
void readyRead();
|
||||||
|
void moveResult(KJob*);
|
||||||
|
void open(KIO::Job*);
|
||||||
|
void sourceFinished();
|
||||||
|
|
||||||
|
private:
|
||||||
|
KIO::FileJob* mTempDestination;
|
||||||
|
KUrl mDestination;
|
||||||
|
QIODevice* mOrigin;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // FILETRANSFERJOB_H
|
|
@ -20,21 +20,72 @@
|
||||||
|
|
||||||
#include "filetransferplugin.h"
|
#include "filetransferplugin.h"
|
||||||
|
|
||||||
|
#include <KIcon>
|
||||||
|
#include <KLocalizedString>
|
||||||
|
#include <KStandardDirs>
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QDesktopServices>
|
||||||
|
|
||||||
|
#include "filetransferjob.h"
|
||||||
|
#include "autoclosingqfile.h"
|
||||||
|
|
||||||
K_PLUGIN_FACTORY( KdeConnectPluginFactory, registerPlugin< FileTransferPlugin >(); )
|
K_PLUGIN_FACTORY( KdeConnectPluginFactory, registerPlugin< FileTransferPlugin >(); )
|
||||||
K_EXPORT_PLUGIN( KdeConnectPluginFactory("kdeconnect_filetransfer", "kdeconnect_filetransfer") )
|
K_EXPORT_PLUGIN( KdeConnectPluginFactory("kdeconnect_filetransfer", "kdeconnect_filetransfer") )
|
||||||
|
|
||||||
|
|
||||||
FileTransferPlugin::FileTransferPlugin(QObject* parent, const QVariantList& args)
|
FileTransferPlugin::FileTransferPlugin(QObject* parent, const QVariantList& args)
|
||||||
: KdeConnectPlugin(parent, args)
|
: KdeConnectPlugin(parent, args)
|
||||||
{
|
{
|
||||||
|
//TODO: Use downloads user path
|
||||||
|
//TODO: Be able to change this from config
|
||||||
|
mDestinationDir = QDesktopServices::DesktopLocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FileTransferPlugin::receivePackage(const NetworkPackage& np)
|
bool FileTransferPlugin::receivePackage(const NetworkPackage& np)
|
||||||
{
|
{
|
||||||
Q_UNUSED(np);
|
|
||||||
|
|
||||||
return false;
|
//TODO: Move this code to a test and do a diff between files
|
||||||
|
/*
|
||||||
|
if (np.type() == PACKAGE_TYPE_PING) {
|
||||||
|
|
||||||
|
NetworkPackage np(PACKAGE_TYPE_FILETRANSFER);
|
||||||
|
np.set("filename", mDestinationDir + "/itworks.txt");
|
||||||
|
//TODO: Use shared pointers
|
||||||
|
AutoClosingQFile* file = new AutoClosingQFile("/home/vaka/KdeConnect.apk"); //Test file to transfer
|
||||||
|
|
||||||
|
np.setPayload(file);
|
||||||
|
|
||||||
|
device()->sendPackage(np);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (np.type() != PACKAGE_TYPE_FILETRANSFER) return false;
|
||||||
|
|
||||||
|
if (np.hasPayload()) {
|
||||||
|
QString filename = np.get<QString>("filename");
|
||||||
|
QIODevice* incoming = np.payload();
|
||||||
|
FileTransferJob* job = new FileTransferJob(incoming,filename);
|
||||||
|
connect(job,SIGNAL(result(KJob*)), this, SLOT(finished(KJob*)));
|
||||||
|
job->start();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileTransferPlugin::finished(KJob* job)
|
||||||
|
{
|
||||||
|
qDebug() << "File transfer finished";
|
||||||
|
|
||||||
|
FileTransferJob* transferJob = (FileTransferJob*)job;
|
||||||
|
KNotification* notification = new KNotification("pingReceived"); //KNotification::Persistent
|
||||||
|
notification->setPixmap(KIcon("dialog-ok").pixmap(48, 48));
|
||||||
|
notification->setComponentData(KComponentData("kdeconnect", "kdeconnect"));
|
||||||
|
notification->setTitle(i18n("Transfer finished"));
|
||||||
|
notification->setText(transferJob->destination().fileName());
|
||||||
|
//TODO: Add action "open destination folder"
|
||||||
|
notification->sendEvent();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,8 @@
|
||||||
#ifndef FILETRANFERPLUGIN_H
|
#ifndef FILETRANFERPLUGIN_H
|
||||||
#define FILETRANFERPLUGIN_H
|
#define FILETRANFERPLUGIN_H
|
||||||
|
|
||||||
#include <knotification.h>
|
#include <KNotification>
|
||||||
|
#include <KIO/Job>
|
||||||
|
|
||||||
#include "../kdeconnectplugin.h"
|
#include "../kdeconnectplugin.h"
|
||||||
|
|
||||||
|
@ -36,6 +37,10 @@ public:
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
virtual bool receivePackage(const NetworkPackage& np);
|
virtual bool receivePackage(const NetworkPackage& np);
|
||||||
virtual void connected() { }
|
virtual void connected() { }
|
||||||
|
void finished(KJob*);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString mDestinationDir;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -11,5 +11,5 @@ X-KDE-PluginInfo-Website=http://albertvaka.wordpress.com
|
||||||
X-KDE-PluginInfo-License=GPL
|
X-KDE-PluginInfo-License=GPL
|
||||||
X-KDE-PluginInfo-EnabledByDefault=true
|
X-KDE-PluginInfo-EnabledByDefault=true
|
||||||
Icon=folder-downloads
|
Icon=folder-downloads
|
||||||
Name=(Stub) File transfer
|
Name=File transfer
|
||||||
Comment=Send and receive files from dolphin
|
Comment=Send and receive files from dolphin
|
||||||
|
|
Loading…
Reference in a new issue