/** * Copyright 2014 Samoilenko Yuri * * 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 . */ #include "sftpplugin.h" #include "sftp_debug.h" #include #include #include #include #include #include #include #include #include "mounter.h" K_PLUGIN_FACTORY( KdeConnectPluginFactory, registerPlugin< SftpPlugin >(); ) Q_LOGGING_CATEGORY(KDECONNECT_PLUGIN_SFTP, "kdeconnect.plugin.sftp") static const QSet fields_c = QSet() << "ip" << "port" << "user" << "port" << "path"; struct SftpPlugin::Pimpl { Pimpl() : mounter(0) {} //Add KIO entry to Dolphin's Places KFilePlacesModel placesModel; Mounter* mounter; }; SftpPlugin::SftpPlugin(QObject *parent, const QVariantList &args) : KdeConnectPlugin(parent, args) , m_d(new Pimpl()) { deviceId = device()->id(); addToDolphin(); qCDebug(KDECONNECT_PLUGIN_SFTP) << "Created device:" << device()->name(); } SftpPlugin::~SftpPlugin() { QDBusConnection::sessionBus().unregisterObject(dbusPath(), QDBusConnection::UnregisterTree); removeFromDolphin(); unmount(); } void SftpPlugin::addToDolphin() { removeFromDolphin(); QUrl kioUrl("kdeconnect://"+deviceId+"/"); m_d->placesModel.addPlace(device()->name(), kioUrl, "kdeconnect"); qCDebug(KDECONNECT_PLUGIN_SFTP) << "add to dolphin"; } void SftpPlugin::removeFromDolphin() { QUrl kioUrl("kdeconnect://"+deviceId+"/"); QModelIndex index = m_d->placesModel.closestItem(kioUrl); while (index.row() != -1) { m_d->placesModel.removePlace(index); index = m_d->placesModel.closestItem(kioUrl); } } void SftpPlugin::connected() { bool state = QDBusConnection::sessionBus().registerObject(dbusPath(), this, QDBusConnection::ExportScriptableContents); qCDebug(KDECONNECT_PLUGIN_SFTP) << "Exposing DBUS interface: " << state; } void SftpPlugin::mount() { qCDebug(KDECONNECT_PLUGIN_SFTP) << "Mount device:" << device()->name(); if (m_d->mounter) { return; } m_d->mounter = new Mounter(this); connect(m_d->mounter, SIGNAL(mounted()), this, SLOT(onMounted())); connect(m_d->mounter, SIGNAL(unmounted()), this, SLOT(onUnmounted())); connect(m_d->mounter, SIGNAL(failed(QString)), this, SLOT(onFailed(QString))); } void SftpPlugin::unmount() { if (m_d->mounter) { m_d->mounter->deleteLater(); m_d->mounter = 0; } } bool SftpPlugin::mountAndWait() { mount(); return m_d->mounter->wait(); } bool SftpPlugin::isMounted() const { return m_d->mounter && m_d->mounter->isMounted(); } bool SftpPlugin::startBrowsing() { if (mountAndWait()) { //return new KRun(QUrl::fromLocalFile(mountPoint()), 0); return new KRun(QUrl("kdeconnect://"+deviceId), 0); } return false; } bool SftpPlugin::receivePackage(const NetworkPackage& np) { if (!(fields_c - np.body().keys().toSet()).isEmpty()) { // package is invalid return false; } Q_EMIT packageReceived(np); remoteDirectories.clear(); if (np.has("multiPaths")) { QStringList paths = np.get("multiPaths",QStringList()); QStringList names = np.get("pathNames",QStringList()); int size = qMin(names.size(), paths.size()); for (int i = 0; i < size; i++) { remoteDirectories.insert(mountPoint() + paths.at(i), names.at(i)); } } else { remoteDirectories.insert(mountPoint(), i18n("All files")); remoteDirectories.insert(mountPoint() + "/DCIM/Camera", i18n("Camera pictures")); } return true; } QString SftpPlugin::mountPoint() { QDir mountDir = config()->privateDirectory(); return mountDir.absoluteFilePath(deviceId); } void SftpPlugin::onMounted() { qCDebug(KDECONNECT_PLUGIN_SFTP) << device()->name() << QString("Remote filesystem mounted at %1").arg(mountPoint()); Q_EMIT mounted(); } void SftpPlugin::onUnmounted() { qCDebug(KDECONNECT_PLUGIN_SFTP) << device()->name() << "Remote filesystem unmounted"; unmount(); Q_EMIT unmounted(); } void SftpPlugin::onFailed(const QString& message) { KNotification::event(KNotification::Error, device()->name(), message); unmount(); Q_EMIT unmounted(); } QVariantMap SftpPlugin::getDirectories() { return remoteDirectories; } #include "sftpplugin.moc"