File indexing completed on 2024-05-19 04:03:02
0001 /* 0002 SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com> 0003 0004 SPDX-License-Identifier: LGPL-2.1-or-later 0005 */ 0006 0007 #include <KPluginFactory> 0008 #include <QDebug> 0009 #include <QJsonArray> 0010 #include <QProcess> 0011 #include <QUrl> 0012 #include <purpose/pluginbase.h> 0013 0014 class BluetoothJob : public Purpose::Job 0015 { 0016 Q_OBJECT 0017 public: 0018 BluetoothJob(QObject *parent) 0019 : Purpose::Job(parent) 0020 { 0021 } 0022 0023 void start() override 0024 { 0025 QProcess *process = new QProcess(this); 0026 process->setProgram(QStringLiteral("bluedevil-sendfile")); 0027 const QJsonArray urlsJson = data().value(QLatin1String("urls")).toArray(); 0028 0029 QStringList args{QStringLiteral("-u"), data().value(QLatin1String("device")).toString()}; 0030 0031 for (const QJsonValue &val : urlsJson) { 0032 const QUrl url(val.toString()); 0033 if (url.isLocalFile()) { 0034 args << QStringLiteral("-f") << url.toLocalFile(); 0035 } 0036 } 0037 0038 process->setArguments(args); 0039 0040 connect(process, &QProcess::errorOccurred, this, &BluetoothJob::processError); 0041 connect(process, &QProcess::finished, this, &BluetoothJob::jobFinished); 0042 connect(process, &QProcess::readyRead, this, [process]() { 0043 qDebug() << "bluedevil-sendfile output:" << process->readAll(); 0044 }); 0045 0046 process->start(); 0047 } 0048 0049 void processError(QProcess::ProcessError error) 0050 { 0051 QProcess *process = qobject_cast<QProcess *>(sender()); 0052 qWarning() << "bluetooth share error:" << error << process->errorString(); 0053 setError(1 + error); 0054 setErrorText(process->errorString()); 0055 emitResult(); 0056 } 0057 0058 void jobFinished(int code, QProcess::ExitStatus status) 0059 { 0060 if (status != QProcess::NormalExit) 0061 qWarning() << "bluedevil-sendfile crashed"; 0062 0063 setError(code); 0064 setOutput({{QStringLiteral("url"), QString()}}); 0065 emitResult(); 0066 } 0067 0068 private: 0069 }; 0070 0071 class BluetoothPlugin : public Purpose::PluginBase 0072 { 0073 Q_OBJECT 0074 public: 0075 using PluginBase::PluginBase; 0076 Purpose::Job *createJob() const override 0077 { 0078 return new BluetoothJob(nullptr); 0079 } 0080 }; 0081 0082 K_PLUGIN_CLASS_WITH_JSON(BluetoothPlugin, "bluetoothplugin.json") 0083 0084 #include "bluetoothplugin.moc"