diff --git a/plugins/share/shareplugin.h b/plugins/share/shareplugin.h --- a/plugins/share/shareplugin.h +++ b/plugins/share/shareplugin.h @@ -39,6 +39,7 @@ ///Helper method, QDBus won't recognize QUrl Q_SCRIPTABLE void shareUrl(const QString& url) { shareUrl(QUrl(url)); } Q_SCRIPTABLE void shareText(const QString& text); + Q_SCRIPTABLE void openFile(const QString& file) { openFile(QUrl(file)); } bool receivePacket(const NetworkPacket& np) override; void connected() override {} @@ -53,6 +54,8 @@ private: void shareUrl(const QUrl& url); + void openFile(const QUrl& url); + QUrl destinationDir() const; diff --git a/plugins/share/shareplugin.cpp b/plugins/share/shareplugin.cpp --- a/plugins/share/shareplugin.cpp +++ b/plugins/share/shareplugin.cpp @@ -173,6 +173,18 @@ sendPacket(packet); } +void SharePlugin::openFile(const QUrl& url) +{ + NetworkPacket packet(PACKET_TYPE_SHARE_REQUEST); + if(url.isLocalFile()) { + QSharedPointer ioFile(new QFile(url.toLocalFile())); + packet.setPayload(ioFile, ioFile->size()); + packet.set(QStringLiteral("filename"), QUrl(url).fileName()); + packet.set(QStringLiteral("open"), true); + } + sendPacket(packet); +} + QString SharePlugin::dbusPath() const { return "/modules/kdeconnect/devices/" + device()->id() + "/share"; diff --git a/urlhandler/kdeconnect-handler.cpp b/urlhandler/kdeconnect-handler.cpp --- a/urlhandler/kdeconnect-handler.cpp +++ b/urlhandler/kdeconnect-handler.cpp @@ -64,9 +64,11 @@ KAboutData::setApplicationData(about); QUrl urlToShare; + bool open; { QCommandLineParser parser; parser.addPositionalArgument(QStringLiteral("url"), i18n("URL to share")); + parser.addOption(QCommandLineOption(QStringLiteral("open"), QStringLiteral("Open the file on the remote device"))); parser.addHelpOption(); about.setupCommandLine(&parser); parser.process(app); @@ -77,6 +79,7 @@ } urlToShare = QUrl::fromUserInput(parser.positionalArguments().constFirst()); + open = parser.isSet(QStringLiteral("open")); } DevicesModel model; @@ -95,7 +98,7 @@ if (urlToShare.scheme() == QLatin1String("tel")) { displayUrl = urlToShare.toDisplayString(QUrl::RemoveScheme); uidialog.label->setText(i18n("Device to call %1 with:", displayUrl)); - } else if (urlToShare.isLocalFile()) { + } else if (urlToShare.isLocalFile() && open) { displayUrl = urlToShare.toDisplayString(QUrl::PreferLocalFile); uidialog.label->setText(i18n("Device to send %1 to:", displayUrl)); } else { @@ -110,8 +113,9 @@ const int currentDeviceIndex = uidialog.devicePicker->currentIndex(); if(!url.isEmpty() && currentDeviceIndex >= 0) { const QString device = proxyModel.index(currentDeviceIndex, 0).data(DevicesModel::IdModelRole).toString(); + const QString action = open && url.isLocalFile() ? QStringLiteral("openFile") : QStringLiteral("shareUrl"); - QDBusMessage msg = QDBusMessage::createMethodCall(QStringLiteral("org.kde.kdeconnect"), "/modules/kdeconnect/devices/"+device+"/share", QStringLiteral("org.kde.kdeconnect.device.share"), QStringLiteral("shareUrl")); + QDBusMessage msg = QDBusMessage::createMethodCall(QStringLiteral("org.kde.kdeconnect"), "/modules/kdeconnect/devices/"+device+"/share", QStringLiteral("org.kde.kdeconnect.device.share"), action); msg.setArguments({ url.toString() }); blockOnReply(QDBusConnection::sessionBus().asyncCall(msg)); return 0;