File indexing completed on 2024-04-28 08:49:03

0001 /*
0002  * SPDX-FileCopyrightText: 2011 Alejandro Fiestas Olivares <afiestas@kde.org>
0003  * SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@kde.org>
0004  *
0005  * SPDX-License-Identifier: GPL-2.0-or-later
0006  */
0007 
0008 #include "sendfileitemaction.h"
0009 
0010 #include <QAction>
0011 #include <QIcon>
0012 #include <QList>
0013 #include <QMenu>
0014 #include <QUrl>
0015 #include <QVariantList>
0016 #include <QWidget>
0017 
0018 #include <KLocalizedString>
0019 #include <KPluginFactory>
0020 
0021 #include <interfaces/dbusinterfaces.h>
0022 #include <interfaces/devicesmodel.h>
0023 
0024 #include <dbushelper.h>
0025 
0026 #include "kdeconnect_fileitemaction_debug.h"
0027 
0028 K_PLUGIN_CLASS_WITH_JSON(SendFileItemAction, "kdeconnectsendfile.json")
0029 
0030 SendFileItemAction::SendFileItemAction(QObject *parent, const QVariantList &)
0031     : KAbstractFileItemActionPlugin(parent)
0032 {
0033 }
0034 
0035 QList<QAction *> SendFileItemAction::actions(const KFileItemListProperties &fileItemInfos, QWidget *parentWidget)
0036 {
0037     QList<QAction *> actions;
0038 
0039     DaemonDbusInterface iface;
0040     if (!iface.isValid()) {
0041         return actions;
0042     }
0043 
0044     QDBusPendingReply<QStringList> reply = iface.devices(true, true);
0045     reply.waitForFinished();
0046     const QStringList devices = reply.value();
0047     for (const QString &id : devices) {
0048         DeviceDbusInterface deviceIface(id);
0049         if (!deviceIface.isValid()) {
0050             continue;
0051         }
0052         if (!deviceIface.hasPlugin(QStringLiteral("kdeconnect_share"))) {
0053             continue;
0054         }
0055         QAction *action = new QAction(QIcon::fromTheme(deviceIface.iconName()), deviceIface.name(), parentWidget);
0056         action->setProperty("id", id);
0057         const QList<QUrl> urls = fileItemInfos.urlList();
0058         connect(action, &QAction::triggered, this, [id, urls]() {
0059             for (const QUrl &url : urls) {
0060                 QDBusMessage msg = QDBusMessage::createMethodCall(QStringLiteral("org.kde.kdeconnect"),
0061                                                                   QLatin1String("/modules/kdeconnect/devices/%1/share").arg(id),
0062                                                                   QStringLiteral("org.kde.kdeconnect.device.share"),
0063                                                                   QStringLiteral("shareUrl"));
0064                 msg.setArguments(QVariantList{url.toString()});
0065                 QDBusConnection::sessionBus().asyncCall(msg);
0066             }
0067         });
0068         actions += action;
0069     }
0070 
0071     if (actions.count() > 1) {
0072         QAction *menuAction = new QAction(QIcon::fromTheme(QStringLiteral("kdeconnect")), i18n("Send via KDE Connect"), parentWidget);
0073         QMenu *menu = new QMenu(parentWidget);
0074         menu->addActions(actions);
0075         menuAction->setMenu(menu);
0076         return QList<QAction *>() << menuAction;
0077     } else {
0078         if (actions.count() == 1) {
0079             actions.first()->setText(i18n("Send to '%1' via KDE Connect", actions.first()->text()));
0080         }
0081         return actions;
0082     }
0083 }
0084 
0085 #include "moc_sendfileitemaction.cpp"
0086 #include "sendfileitemaction.moc"