Added KIO slave and icon in Dolphin's places for file browsing
This commit is contained in:
parent
781c41da5b
commit
90e9ded926
11 changed files with 395 additions and 32 deletions
|
@ -15,7 +15,7 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
||||||
add_subdirectory(kded)
|
add_subdirectory(kded)
|
||||||
add_subdirectory(libkdeconnect)
|
add_subdirectory(libkdeconnect)
|
||||||
add_subdirectory(kcm)
|
add_subdirectory(kcm)
|
||||||
#add_subdirectory(kioslave)
|
add_subdirectory(kio)
|
||||||
add_subdirectory(plasmoid)
|
add_subdirectory(plasmoid)
|
||||||
|
|
||||||
add_subdirectory(tests)
|
add_subdirectory(tests)
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
#include "clipboardplugin.h"
|
#include "clipboardplugin.h"
|
||||||
|
|
||||||
#include <QClipboard>
|
#include <QClipboard>
|
||||||
#include <KDebug>
|
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
|
|
||||||
K_PLUGIN_FACTORY( KdeConnectPluginFactory, registerPlugin< ClipboardPlugin >(); )
|
K_PLUGIN_FACTORY( KdeConnectPluginFactory, registerPlugin< ClipboardPlugin >(); )
|
||||||
|
|
|
@ -27,6 +27,7 @@ target_link_libraries(kdeconnect_sftp
|
||||||
${KDE4_KDECORE_LIBS}
|
${KDE4_KDECORE_LIBS}
|
||||||
${KDE4_KDEUI_LIBS}
|
${KDE4_KDEUI_LIBS}
|
||||||
${KDE4_KIO_LIBS}
|
${KDE4_KIO_LIBS}
|
||||||
|
${KDE4_KFILE_LIBS}
|
||||||
${QT_QTNETWORK_LIBRARY}
|
${QT_QTNETWORK_LIBRARY}
|
||||||
${QJSON_LIBRARIES}
|
${QJSON_LIBRARIES}
|
||||||
${QCA2_LIBRARIES}
|
${QCA2_LIBRARIES}
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include <KRun>
|
#include <KRun>
|
||||||
#include <KStandardDirs>
|
#include <KStandardDirs>
|
||||||
#include <kde_file.h>
|
#include <kde_file.h>
|
||||||
|
#include <kfileplacesmodel.h>
|
||||||
|
|
||||||
#include "sftp_config.h"
|
#include "sftp_config.h"
|
||||||
#include "../../kdebugnamespace.h"
|
#include "../../kdebugnamespace.h"
|
||||||
|
@ -43,10 +44,7 @@ K_EXPORT_PLUGIN( KdeConnectPluginFactory("kdeconnect_sftp", "kdeconnect_sftp") )
|
||||||
static const char* passwd_c = "sftppassword";
|
static const char* passwd_c = "sftppassword";
|
||||||
static const char* mountpoint_c = "sftpmountpoint";
|
static const char* mountpoint_c = "sftpmountpoint";
|
||||||
static const char* timestamp_c = "timestamp";
|
static const char* timestamp_c = "timestamp";
|
||||||
|
static const QSet<QString> fields_c = QSet<QString>() << "ip" << "port" << "user" << "port" << "password" << "path";
|
||||||
static const QSet<QString> fields_c = QSet<QString>() <<
|
|
||||||
"ip" << "port" << "user" << "port" << "password" << "path";
|
|
||||||
|
|
||||||
|
|
||||||
inline bool isTimeout(QObject* o, const KConfigGroup& cfg)
|
inline bool isTimeout(QObject* o, const KConfigGroup& cfg)
|
||||||
{
|
{
|
||||||
|
@ -54,11 +52,6 @@ inline bool isTimeout(QObject* o, const KConfigGroup& cfg)
|
||||||
return cfg.readEntry("idle", true) && duration > (cfg.readEntry("idletimeout", 60) * 60);
|
return cfg.readEntry("idle", true) && duration > (cfg.readEntry("idletimeout", 60) * 60);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline QString mountpoint(QObject* o)
|
|
||||||
{
|
|
||||||
return o->property(mountpoint_c).toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
struct SftpPlugin::Pimpl
|
struct SftpPlugin::Pimpl
|
||||||
{
|
{
|
||||||
Pimpl() : waitForMount(false)
|
Pimpl() : waitForMount(false)
|
||||||
|
@ -67,6 +60,7 @@ struct SftpPlugin::Pimpl
|
||||||
};
|
};
|
||||||
|
|
||||||
QPointer<KProcess> mountProc;
|
QPointer<KProcess> mountProc;
|
||||||
|
KFilePlacesModel* m_placesModel;
|
||||||
QTimer mountTimer;
|
QTimer mountTimer;
|
||||||
int idleTimer;
|
int idleTimer;
|
||||||
bool waitForMount;
|
bool waitForMount;
|
||||||
|
@ -81,16 +75,41 @@ SftpPlugin::SftpPlugin(QObject *parent, const QVariantList &args)
|
||||||
m_d->idleTimer = startTimer(20 * 1000);
|
m_d->idleTimer = startTimer(20 * 1000);
|
||||||
|
|
||||||
connect(&m_d->mountTimer, SIGNAL(timeout()), this, SLOT(mountTimeout()));
|
connect(&m_d->mountTimer, SIGNAL(timeout()), this, SLOT(mountTimeout()));
|
||||||
|
|
||||||
|
//Add KIO entry to Dolphin's Places
|
||||||
|
m_d->m_placesModel = new KFilePlacesModel();
|
||||||
|
addToDolphin();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SftpPlugin::addToDolphin()
|
||||||
|
{
|
||||||
|
removeFromDolphin();
|
||||||
|
KUrl kioUrl("kdeconnect://"+device()->id()+"/");
|
||||||
|
m_d->m_placesModel->addPlace(device()->name(), kioUrl, "smartphone");
|
||||||
|
kDebug(kdeconnect_kded()) << "add to dolphin";
|
||||||
|
}
|
||||||
|
|
||||||
|
void SftpPlugin::removeFromDolphin()
|
||||||
|
{
|
||||||
|
KUrl kioUrl("kdeconnect://"+device()->id()+"/");
|
||||||
|
QModelIndex index = m_d->m_placesModel->closestItem(kioUrl);
|
||||||
|
while (index.row() != -1) {
|
||||||
|
m_d->m_placesModel->removePlace(index);
|
||||||
|
index = m_d->m_placesModel->closestItem(kioUrl);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SftpPlugin::connected()
|
void SftpPlugin::connected()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SftpPlugin::~SftpPlugin()
|
SftpPlugin::~SftpPlugin()
|
||||||
{
|
{
|
||||||
QDBusConnection::sessionBus().unregisterObject(dbusPath(), QDBusConnection::UnregisterTree);
|
QDBusConnection::sessionBus().unregisterObject(dbusPath(), QDBusConnection::UnregisterTree);
|
||||||
umount();
|
umount();
|
||||||
|
removeFromDolphin();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SftpPlugin::mount()
|
void SftpPlugin::mount()
|
||||||
|
@ -113,7 +132,7 @@ void SftpPlugin::umount()
|
||||||
{
|
{
|
||||||
if (m_d->mountProc)
|
if (m_d->mountProc)
|
||||||
{
|
{
|
||||||
cleanMountPoint(m_d->mountProc);
|
cleanMountPoint();
|
||||||
if (m_d->mountProc)
|
if (m_d->mountProc)
|
||||||
{
|
{
|
||||||
m_d->mountProc->terminate();
|
m_d->mountProc->terminate();
|
||||||
|
@ -127,7 +146,7 @@ void SftpPlugin::startBrowsing()
|
||||||
{
|
{
|
||||||
if (m_d->mountProc)
|
if (m_d->mountProc)
|
||||||
{
|
{
|
||||||
new KRun(KUrl::fromLocalFile(mountpoint(m_d->mountProc)), 0);
|
new KRun(KUrl::fromLocalFile(mountPoint()), 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -159,8 +178,7 @@ bool SftpPlugin::receivePackage(const NetworkPackage& np)
|
||||||
connect(m_d->mountProc, SIGNAL(finished(int,QProcess::ExitStatus)), SLOT(onFinished(int,QProcess::ExitStatus)));
|
connect(m_d->mountProc, SIGNAL(finished(int,QProcess::ExitStatus)), SLOT(onFinished(int,QProcess::ExitStatus)));
|
||||||
connect(m_d->mountProc, SIGNAL(finished(int,QProcess::ExitStatus)), m_d->mountProc, SLOT(deleteLater()));
|
connect(m_d->mountProc, SIGNAL(finished(int,QProcess::ExitStatus)), m_d->mountProc, SLOT(deleteLater()));
|
||||||
|
|
||||||
const QString mpoint = KConfig("kdeconnect/plugins/sftp").group("main").readEntry("mountpoint"
|
const QString mpoint = mountPoint();
|
||||||
, KStandardDirs::locateLocal("appdata", "", true, componentData())) + "/" + device()->name() + "/";
|
|
||||||
QDir().mkpath(mpoint);
|
QDir().mkpath(mpoint);
|
||||||
|
|
||||||
const QString program = "sshfs";
|
const QString program = "sshfs";
|
||||||
|
@ -177,14 +195,20 @@ bool SftpPlugin::receivePackage(const NetworkPackage& np)
|
||||||
|
|
||||||
m_d->mountProc->setProgram(program, arguments);
|
m_d->mountProc->setProgram(program, arguments);
|
||||||
m_d->mountProc->setProperty(passwd_c, np.get<QString>("password"));
|
m_d->mountProc->setProperty(passwd_c, np.get<QString>("password"));
|
||||||
m_d->mountProc->setProperty(mountpoint_c, mpoint);
|
|
||||||
|
|
||||||
cleanMountPoint(m_d->mountProc);
|
cleanMountPoint();
|
||||||
m_d->mountProc->start();
|
m_d->mountProc->start();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString SftpPlugin::mountPoint()
|
||||||
|
{
|
||||||
|
const QString defaultMountDir = KStandardDirs::locateLocal("appdata", "", true, componentData());
|
||||||
|
const QString mountDir = KConfig("kdeconnect/plugins/sftp").group("main").readEntry("mountpoint", defaultMountDir);
|
||||||
|
return mountDir + "/" + device()->id() + "/";
|
||||||
|
}
|
||||||
|
|
||||||
void SftpPlugin::timerEvent(QTimerEvent* event)
|
void SftpPlugin::timerEvent(QTimerEvent* event)
|
||||||
{
|
{
|
||||||
if (event->timerId() == m_d->idleTimer)
|
if (event->timerId() == m_d->idleTimer)
|
||||||
|
@ -206,14 +230,14 @@ void SftpPlugin::onStarted()
|
||||||
m_d->mountProc->closeWriteChannel();
|
m_d->mountProc->closeWriteChannel();
|
||||||
|
|
||||||
knotify(KNotification::Notification
|
knotify(KNotification::Notification
|
||||||
, i18n("Filesystem mounted at %1").arg(mountpoint(sender()))
|
, i18n("Filesystem mounted at %1").arg(mountPoint())
|
||||||
, KIconLoader::global()->loadIcon("drive-removable-media", KIconLoader::Desktop)
|
, KIconLoader::global()->loadIcon("drive-removable-media", KIconLoader::Desktop)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (m_d->waitForMount)
|
if (m_d->waitForMount)
|
||||||
{
|
{
|
||||||
m_d->waitForMount = false;
|
m_d->waitForMount = false;
|
||||||
new KRun(KUrl::fromLocalFile(mountpoint(sender())), 0);
|
new KRun(KUrl::fromLocalFile(mountPoint()), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -226,7 +250,7 @@ void SftpPlugin::onError(QProcess::ProcessError error)
|
||||||
, i18n("Failed to start sshfs")
|
, i18n("Failed to start sshfs")
|
||||||
, KIconLoader::global()->loadIcon("dialog-error", KIconLoader::Desktop)
|
, KIconLoader::global()->loadIcon("dialog-error", KIconLoader::Desktop)
|
||||||
);
|
);
|
||||||
cleanMountPoint(sender());
|
cleanMountPoint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -259,7 +283,7 @@ void SftpPlugin::onFinished(int exitCode, QProcess::ExitStatus exitStatus)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanMountPoint(sender());
|
cleanMountPoint();
|
||||||
m_d->mountProc = 0;
|
m_d->mountProc = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -270,16 +294,9 @@ void SftpPlugin::knotify(int type, const QString& text, const QPixmap& icon) con
|
||||||
, KNotification::CloseOnTimeout);
|
, KNotification::CloseOnTimeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SftpPlugin::cleanMountPoint(QObject* mounter)
|
void SftpPlugin::cleanMountPoint()
|
||||||
{
|
{
|
||||||
if (!mounter || mountpoint(mounter).isEmpty())
|
KProcess::execute(QStringList() << "fusermount" << "-u" << mountPoint(), 10000);
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
KProcess::execute(QStringList()
|
|
||||||
<< "fusermount" << "-u"
|
|
||||||
<< mountpoint(mounter), 10000);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SftpPlugin::mountTimeout()
|
void SftpPlugin::mountTimeout()
|
||||||
|
|
|
@ -53,6 +53,8 @@ public Q_SLOTS:
|
||||||
|
|
||||||
Q_SCRIPTABLE void startBrowsing();
|
Q_SCRIPTABLE void startBrowsing();
|
||||||
|
|
||||||
|
Q_SCRIPTABLE QString mountPoint();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void timerEvent(QTimerEvent *event);
|
void timerEvent(QTimerEvent *event);
|
||||||
|
|
||||||
|
@ -65,7 +67,9 @@ private Q_SLOTS:
|
||||||
private:
|
private:
|
||||||
QString dbusPath() const { return "/modules/kdeconnect/devices/" + device()->id() + "/sftp"; }
|
QString dbusPath() const { return "/modules/kdeconnect/devices/" + device()->id() + "/sftp"; }
|
||||||
void knotify(int type, const QString& text, const QPixmap& icon) const;
|
void knotify(int type, const QString& text, const QPixmap& icon) const;
|
||||||
void cleanMountPoint(QObject* mounter);
|
void cleanMountPoint();
|
||||||
|
void addToDolphin();
|
||||||
|
void removeFromDolphin();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct Pimpl;
|
struct Pimpl;
|
||||||
|
|
20
kio/CMakeLists.txt
Normal file
20
kio/CMakeLists.txt
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
set(kio_kdeconnect_PART_SRCS
|
||||||
|
kiokdeconnect.cpp
|
||||||
|
kdebugnamespace.cpp)
|
||||||
|
|
||||||
|
kde4_add_plugin(kio_kdeconnect ${kio_kdeconnect_PART_SRCS})
|
||||||
|
|
||||||
|
add_dependencies(kio_kdeconnect libkdeconnect)
|
||||||
|
|
||||||
|
target_link_libraries(kio_kdeconnect
|
||||||
|
${KDE4_KDECORE_LIBS}
|
||||||
|
${KDE4_KIO_LIBRARY}
|
||||||
|
${KDE4_KDEUI_LIBRARY}
|
||||||
|
${QT_QTCORE_LIBRARY}
|
||||||
|
${QT_QTGUI_LIBRARY}
|
||||||
|
kdeconnect
|
||||||
|
)
|
||||||
|
|
||||||
|
########### install files ###############
|
||||||
|
install(TARGETS kio_kdeconnect DESTINATION ${PLUGIN_INSTALL_DIR})
|
||||||
|
install(FILES kdeconnect.protocol DESTINATION ${SERVICES_INSTALL_DIR})
|
26
kio/kdebugnamespace.cpp
Normal file
26
kio/kdebugnamespace.cpp
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
/**
|
||||||
|
* 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 "kdebugnamespace.h"
|
||||||
|
|
||||||
|
int kdeconnect_kio() {
|
||||||
|
static int s_area = KDebug::registerArea("kdeconnect_kio", true);
|
||||||
|
return s_area;
|
||||||
|
}
|
29
kio/kdebugnamespace.h
Normal file
29
kio/kdebugnamespace.h
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
/**
|
||||||
|
* 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 KDEBUG_KDECONNECT_KCM_H
|
||||||
|
#define KDEBUG_KDECONNECT_KCM_H
|
||||||
|
|
||||||
|
#include <KDebug>
|
||||||
|
|
||||||
|
int kdeconnect_kio();
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
16
kio/kdeconnect.protocol
Normal file
16
kio/kdeconnect.protocol
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
[Protocol]
|
||||||
|
exec=kio_kdeconnect
|
||||||
|
protocol=kdeconnect
|
||||||
|
input=none
|
||||||
|
output=filesystem
|
||||||
|
copyToFile=false
|
||||||
|
copyFromFile=false
|
||||||
|
listing=Name,Type,Access
|
||||||
|
reading=true
|
||||||
|
writing=false
|
||||||
|
makedir=false
|
||||||
|
deleting=false
|
||||||
|
moving=false
|
||||||
|
Icon=smartphone
|
||||||
|
maxInstances=2
|
||||||
|
|
190
kio/kiokdeconnect.cpp
Normal file
190
kio/kiokdeconnect.cpp
Normal file
|
@ -0,0 +1,190 @@
|
||||||
|
/**
|
||||||
|
* 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 "kiokdeconnect.h"
|
||||||
|
|
||||||
|
#include <QtCore/QThread>
|
||||||
|
#include <QDBusMetaType>
|
||||||
|
|
||||||
|
#include <KDebug>
|
||||||
|
#include <KComponentData>
|
||||||
|
#include <KCmdLineArgs>
|
||||||
|
#include <KAboutData>
|
||||||
|
#include <KProcess>
|
||||||
|
#include <KApplication>
|
||||||
|
#include <KLocale>
|
||||||
|
|
||||||
|
#include "kdebugnamespace.h"
|
||||||
|
|
||||||
|
extern "C" int KDE_EXPORT kdemain(int argc, char **argv)
|
||||||
|
{
|
||||||
|
KAboutData about("kiokdeconnect", "kdeconnect", ki18n("kiokdeconnect"), "1.0");
|
||||||
|
KCmdLineArgs::init(&about);
|
||||||
|
|
||||||
|
KApplication app;
|
||||||
|
|
||||||
|
if (argc != 4) {
|
||||||
|
fprintf(stderr, "Usage: kio_kdeconnect protocol pool app\n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
KioKdeconnect slave(argv[2], argv[3]);
|
||||||
|
slave.dispatchLoop();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
KioKdeconnect::KioKdeconnect(const QByteArray &pool, const QByteArray &app)
|
||||||
|
: SlaveBase("kdeconnect", pool, app),
|
||||||
|
m_dbusInterface(new DaemonDbusInterface(this))
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void KioKdeconnect::listAllDevices()
|
||||||
|
{
|
||||||
|
infoMessage(i18n("Listing devices..."));
|
||||||
|
|
||||||
|
QStringList devices = m_dbusInterface->devices(true, true); //TODO: Change to all devices and show different icons for connected and disconnected?
|
||||||
|
|
||||||
|
totalSize(devices.length());
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
Q_FOREACH(const QString& deviceId, devices) {
|
||||||
|
|
||||||
|
DeviceDbusInterface interface(deviceId);
|
||||||
|
|
||||||
|
if (!interface.hasPlugin("kdeconnect_sftp")) continue;
|
||||||
|
|
||||||
|
const QString target = QString("kdeconnect://").append(deviceId).append("/");
|
||||||
|
const QString name = interface.name();
|
||||||
|
const QString icon = "smartphone";
|
||||||
|
|
||||||
|
KIO::UDSEntry entry;
|
||||||
|
entry.insert(KIO::UDSEntry::UDS_NAME, name);
|
||||||
|
entry.insert(KIO::UDSEntry::UDS_ICON_NAME, icon);
|
||||||
|
entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
|
||||||
|
entry.insert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IRGRP | S_IROTH);
|
||||||
|
entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, "");
|
||||||
|
entry.insert(KIO::UDSEntry::UDS_URL, target);
|
||||||
|
listEntry(entry, false);
|
||||||
|
|
||||||
|
processedSize(i++);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
listEntry(KIO::UDSEntry(), true);
|
||||||
|
infoMessage("");
|
||||||
|
finished();
|
||||||
|
}
|
||||||
|
|
||||||
|
void KioKdeconnect::listDevice()
|
||||||
|
{
|
||||||
|
infoMessage(i18n("Accessing device..."));
|
||||||
|
|
||||||
|
kDebug(kdeconnect_kio()) << "ListDevice" << m_currentDevice;
|
||||||
|
|
||||||
|
SftpDbusInterface interface(m_currentDevice);
|
||||||
|
interface.mount(); //Since this does not happen immediately, we mount it here
|
||||||
|
QString url = interface.mountPoint();
|
||||||
|
|
||||||
|
KIO::UDSEntry entry;
|
||||||
|
entry.insert(KIO::UDSEntry::UDS_NAME, "files");
|
||||||
|
entry.insert(KIO::UDSEntry::UDS_DISPLAY_NAME, "Browse images");
|
||||||
|
entry.insert(KIO::UDSEntry::UDS_ICON_NAME, "folder");
|
||||||
|
entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
|
||||||
|
entry.insert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IRGRP | S_IROTH);
|
||||||
|
entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, "");
|
||||||
|
entry.insert(KIO::UDSEntry::UDS_URL, url + "/DCIM/Camera");
|
||||||
|
listEntry(entry, false);
|
||||||
|
|
||||||
|
entry.insert(KIO::UDSEntry::UDS_NAME, "files");
|
||||||
|
entry.insert(KIO::UDSEntry::UDS_DISPLAY_NAME, "Browse all files");
|
||||||
|
entry.insert(KIO::UDSEntry::UDS_ICON_NAME, "folder");
|
||||||
|
entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
|
||||||
|
entry.insert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IRGRP | S_IROTH);
|
||||||
|
entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, "");
|
||||||
|
entry.insert(KIO::UDSEntry::UDS_URL, url);
|
||||||
|
listEntry(entry, false);
|
||||||
|
|
||||||
|
listEntry(KIO::UDSEntry(), true);
|
||||||
|
infoMessage("");
|
||||||
|
finished();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void KioKdeconnect::listDir(const KUrl &url)
|
||||||
|
{
|
||||||
|
kDebug(kdeconnect_kio()) << "Listing..." << url;
|
||||||
|
|
||||||
|
/// Url is not used here becuase all we could care about the url is the host, and that's already
|
||||||
|
/// handled in @p setHost
|
||||||
|
Q_UNUSED(url);
|
||||||
|
|
||||||
|
if (!m_dbusInterface->isValid()) {
|
||||||
|
infoMessage(i18n("Could not contact background service."));
|
||||||
|
listEntry(KIO::UDSEntry(), true);
|
||||||
|
finished();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_currentDevice.isEmpty()) {
|
||||||
|
listAllDevices();
|
||||||
|
} else {
|
||||||
|
listDevice();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void KioKdeconnect::stat(const KUrl &url)
|
||||||
|
{
|
||||||
|
kDebug(kdeconnect_kio()) << "Stat: " << url;
|
||||||
|
|
||||||
|
KIO::UDSEntry entry;
|
||||||
|
entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
|
||||||
|
statEntry(entry);
|
||||||
|
|
||||||
|
finished();
|
||||||
|
}
|
||||||
|
|
||||||
|
void KioKdeconnect::get(const KUrl &url)
|
||||||
|
{
|
||||||
|
kDebug(kdeconnect_kio()) << "Get: " << url;
|
||||||
|
mimeType("");
|
||||||
|
finished();
|
||||||
|
}
|
||||||
|
|
||||||
|
void KioKdeconnect::setHost(const QString &hostName, quint16 port, const QString &user, const QString &pass)
|
||||||
|
{
|
||||||
|
|
||||||
|
//This is called before everything else to set the file we want to show
|
||||||
|
|
||||||
|
kDebug(kdeconnect_kio()) << "Setting host: " << hostName;
|
||||||
|
|
||||||
|
// In this kio only the hostname is used
|
||||||
|
Q_UNUSED(port)
|
||||||
|
Q_UNUSED(user)
|
||||||
|
Q_UNUSED(pass)
|
||||||
|
|
||||||
|
m_currentDevice = hostName;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
61
kio/kiokdeconnect.h
Normal file
61
kio/kiokdeconnect.h
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
/**
|
||||||
|
* 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 KIOKDECONNECT_H
|
||||||
|
#define KIOKDECONNECT_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
#include <kio/slavebase.h>
|
||||||
|
|
||||||
|
#include "../libkdeconnect/dbusinterfaces.h"
|
||||||
|
|
||||||
|
class KioKdeconnect : public QObject, public KIO::SlaveBase
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
KioKdeconnect(const QByteArray &pool, const QByteArray &app);
|
||||||
|
|
||||||
|
void get(const KUrl &url);
|
||||||
|
void listDir(const KUrl &url);
|
||||||
|
void stat(const KUrl &url);
|
||||||
|
|
||||||
|
void setHost(const QString &constHostname, quint16 port, const QString &user, const QString &pass);
|
||||||
|
|
||||||
|
void listAllDevices(); //List all devices exported by m_dbusInterface
|
||||||
|
void listDevice(); //List m_currentDevice
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains the ID of the current device or is empty when no device is set.
|
||||||
|
*/
|
||||||
|
QString m_currentDevice;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* KDED DBus interface, used to communicate to the daemon since we need some status (like connected)
|
||||||
|
*/
|
||||||
|
DaemonDbusInterface *m_dbusInterface;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue