From 8299b66a1a56e7abc950728a07b2327e34dd6111 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Wed, 21 Jul 2021 02:43:37 +0300 Subject: [PATCH] soliuduiserver: move code from solid Signed-off-by: Ivailo Monev --- soliduiserver/soliduiserver.cpp | 76 ++++++++++++++++++++++++++++++++- soliduiserver/soliduiserver.h | 2 + 2 files changed, 76 insertions(+), 2 deletions(-) diff --git a/soliduiserver/soliduiserver.cpp b/soliduiserver/soliduiserver.cpp index b0879721..81866a9d 100644 --- a/soliduiserver/soliduiserver.cpp +++ b/soliduiserver/soliduiserver.cpp @@ -26,15 +26,20 @@ #include #include #include +#include +#include +#include #include +#include +#include #include "deviceactionsdialog.h" #include "deviceaction.h" #include "deviceserviceaction.h" #include "devicenothingaction.h" -#include -#include +#include +#include K_PLUGIN_FACTORY(SolidUiServerFactory, registerPlugin(); @@ -115,4 +120,71 @@ void SolidUiServer::onActionDialogFinished() } } +int SolidUiServer::mountDevice(const QString &udi) +{ + Solid::Device device(udi); + Solid::StorageVolume *storagevolume = device.as(); + Solid::Block *block = device.as(); + if (!storagevolume || !block) { + return int(Solid::ErrorType::InvalidOption); + } + + // permission denied on /run/mount so.. using base directory that is writable + const QString mountbase = KGlobal::dirs()->saveLocation("tmp"); + const QString deviceuuid(storagevolume->uuid()); + QString mountpoint = mountbase + QLatin1Char('/') + deviceuuid; + QDir mountdir(mountbase); + if (!mountdir.exists(deviceuuid) && !mountdir.mkdir(deviceuuid)) { + kWarning() << "could not create" << mountpoint; + return int(Solid::ErrorType::OperationFailed); + } + + const QStringList mountargs = QStringList() << "mount" << block->device() << mountpoint; + QProcess mountproc; + mountproc.start("kdesudo", mountargs); + mountproc.waitForStarted(); + while (mountproc.state() == QProcess::Running) { + QCoreApplication::processEvents(); + } + + if (mountproc.exitCode() == 0) { + return int(Solid::ErrorType::NoError); + } + + QString mounterror = mountproc.readAllStandardError(); + if (mounterror.isEmpty()) { + mounterror = mountproc.readAllStandardOutput(); + } + kWarning() << "mount error" << mounterror; + return int(Solid::ErrorType::OperationFailed); +} + +int SolidUiServer::unmountDevice(const QString &udi) +{ + Solid::Device device(udi); + Solid::StorageAccess *storageaccess = device.as(); + if (!storageaccess) { + return int(Solid::ErrorType::InvalidOption); + } + + const QStringList umountargs = QStringList() << "umount" << storageaccess->filePath(); + QProcess umountproc; + umountproc.start("kdesudo", umountargs); + umountproc.waitForStarted(); + while (umountproc.state() == QProcess::Running) { + QCoreApplication::processEvents(); + } + + if (umountproc.exitCode() == 0) { + return int(Solid::ErrorType::NoError); + } + + QString umounterror = umountproc.readAllStandardError(); + if (umounterror.isEmpty()) { + umounterror = umountproc.readAllStandardOutput(); + } + kWarning() << "unmount error" << umounterror; + return int(Solid::ErrorType::OperationFailed); +} + #include "moc_soliduiserver.cpp" diff --git a/soliduiserver/soliduiserver.h b/soliduiserver/soliduiserver.h index 2707e117..e2d0fa2d 100644 --- a/soliduiserver/soliduiserver.h +++ b/soliduiserver/soliduiserver.h @@ -39,6 +39,8 @@ public Q_SLOTS: Q_SCRIPTABLE void showActionsDialog(const QString &udi, const QStringList &desktopFiles); + Q_SCRIPTABLE int mountDevice(const QString &udi); + Q_SCRIPTABLE int unmountDevice(const QString &udi); private Q_SLOTS: void onActionDialogFinished();