diff --git a/src/solid/devices/backends/fakehw/fakestorageaccess.h b/src/solid/devices/backends/fakehw/fakestorageaccess.h --- a/src/solid/devices/backends/fakehw/fakestorageaccess.h +++ b/src/solid/devices/backends/fakehw/fakestorageaccess.h @@ -45,13 +45,16 @@ public Q_SLOTS: bool setup() override; bool teardown() override; + bool changeLabel(const QString &label) override; Q_SIGNALS: void accessibilityChanged(bool accessible, const QString &udi) override; void setupDone(Solid::ErrorType error, QVariant errorData, const QString &udi) override; void teardownDone(Solid::ErrorType error, QVariant errorData, const QString &udi) override; + void labelChanged(Solid::ErrorType error, QVariant errorData, const QString &udi) override; void setupRequested(const QString &udi) override; void teardownRequested(const QString &udi) override; + void changeLabelRequested(const QString &udi) override; private Q_SLOTS: void onPropertyChanged(const QMap &changes); diff --git a/src/solid/devices/backends/fakehw/fakestorageaccess.cpp b/src/solid/devices/backends/fakehw/fakestorageaccess.cpp --- a/src/solid/devices/backends/fakehw/fakestorageaccess.cpp +++ b/src/solid/devices/backends/fakehw/fakestorageaccess.cpp @@ -69,6 +69,12 @@ } } +bool FakeStorageAccess::changeLabel(const QString &label) +{ + Q_UNUSED(label); + return false; +} + void Solid::Backends::Fake::FakeStorageAccess::onPropertyChanged(const QMap &changes) { Q_FOREACH (const QString &property, changes.keys()) { diff --git a/src/solid/devices/backends/fstab/fstabstorageaccess.h b/src/solid/devices/backends/fstab/fstabstorageaccess.h --- a/src/solid/devices/backends/fstab/fstabstorageaccess.h +++ b/src/solid/devices/backends/fstab/fstabstorageaccess.h @@ -53,6 +53,8 @@ bool teardown() override; + bool changeLabel(const QString &label) override; + public: const Solid::Backends::Fstab::FstabDevice *fstabDevice() const; @@ -63,10 +65,14 @@ void teardownDone(Solid::ErrorType error, QVariant data, const QString &udi) override; + void labelChanged(Solid::ErrorType error, QVariant data, const QString &udi) override; + void setupRequested(const QString &udi) override; void teardownRequested(const QString &udi) override; + void changeLabelRequested(const QString &udi) override; + private Q_SLOTS: void onMtabChanged(const QString &device); void connectDBusSignals(); diff --git a/src/solid/devices/backends/fstab/fstabstorageaccess.cpp b/src/solid/devices/backends/fstab/fstabstorageaccess.cpp --- a/src/solid/devices/backends/fstab/fstabstorageaccess.cpp +++ b/src/solid/devices/backends/fstab/fstabstorageaccess.cpp @@ -150,3 +150,9 @@ emit accessibilityChanged(true, QString(FSTAB_UDI_PREFIX) + "/" + device); } } + +bool FstabStorageAccess::changeLabel(const QString &label) +{ + Q_UNUSED(label); + return false; +} diff --git a/src/solid/devices/backends/udisks2/udisksstorageaccess.h b/src/solid/devices/backends/udisks2/udisksstorageaccess.h --- a/src/solid/devices/backends/udisks2/udisksstorageaccess.h +++ b/src/solid/devices/backends/udisks2/udisksstorageaccess.h @@ -48,13 +48,16 @@ bool isIgnored() const override; bool setup() override; bool teardown() override; + bool changeLabel(const QString &label) override; Q_SIGNALS: void accessibilityChanged(bool accessible, const QString &udi) override; void setupDone(Solid::ErrorType error, QVariant errorData, const QString &udi) override; void teardownDone(Solid::ErrorType error, QVariant errorData, const QString &udi) override; + void labelChanged(Solid::ErrorType error, QVariant errorData, const QString &udi) override; void setupRequested(const QString &udi) override; void teardownRequested(const QString &udi) override; + void changeLabelRequested(const QString &udi) override; public Q_SLOTS: Q_SCRIPTABLE Q_NOREPLY void passphraseReply(const QString &passphrase); @@ -69,6 +72,8 @@ void slotSetupDone(int error, const QString &errorString); void slotTeardownRequested(); void slotTeardownDone(int error, const QString &errorString); + void slotChangeLabelRequested(); + void slotLabelChanged(int error, const QString &errorString); void checkAccessibility(); @@ -88,11 +93,14 @@ QString generateReturnObjectPath(); QString clearTextPath() const; + bool setLabel(const QString &label); + private: bool m_isAccessible; bool m_setupInProgress; bool m_teardownInProgress; bool m_passphraseRequested; + bool m_changingLabel; QString m_lastReturnObject; static const int s_unmountTimeout = 0x7fffffff; diff --git a/src/solid/devices/backends/udisks2/udisksstorageaccess.cpp b/src/solid/devices/backends/udisks2/udisksstorageaccess.cpp --- a/src/solid/devices/backends/udisks2/udisksstorageaccess.cpp +++ b/src/solid/devices/backends/udisks2/udisksstorageaccess.cpp @@ -32,7 +32,7 @@ using namespace Solid::Backends::UDisks2; StorageAccess::StorageAccess(Device *device) - : DeviceInterface(device), m_setupInProgress(false), m_teardownInProgress(false), m_passphraseRequested(false) + : DeviceInterface(device), m_setupInProgress(false), m_teardownInProgress(false), m_passphraseRequested(false), m_changingLabel(false) { connect(device, SIGNAL(changed()), this, SLOT(checkAccessibility())); updateCache(); @@ -55,6 +55,10 @@ m_device->registerAction("teardown", this, SLOT(slotTeardownRequested()), SLOT(slotTeardownDone(int,QString))); + + m_device->registerAction("changeLabel", this, + SLOT(slotChangeLabelRequested()), + SLOT(slotLabelChanged(int,QString))); } bool StorageAccess::isLuksDevice() const @@ -144,6 +148,17 @@ return unmount(); } +bool StorageAccess::changeLabel(const QString &label) +{ + if (isLuksDevice() || m_changingLabel) { + return false; + } + m_changingLabel = true; + m_device->broadcastActionRequested("changeLabel"); + + return setLabel(label); +} + void StorageAccess::updateCache() { m_isAccessible = isAccessible(); @@ -206,6 +221,9 @@ checkAccessibility(); } + } else if (m_changingLabel) { + m_changingLabel = false; + m_device->broadcastActionDone("changeLabel"); } } @@ -224,6 +242,11 @@ m_device->broadcastActionDone("teardown", m_device->errorToSolidError(error.name()), m_device->errorToString(error.name()) + ": " + error.message()); checkAccessibility(); + } else if (m_changingLabel) { + m_changingLabel = false; + m_device->broadcastActionDone("changeLabel", m_device->errorToSolidError(error.name()), + m_device->errorToString(error.name()) + ": " + error.message()); + } } @@ -255,6 +278,18 @@ emit teardownDone(static_cast(error), errorString, m_device->udi()); } +void StorageAccess::slotChangeLabelRequested() +{ + m_changingLabel = true; + emit changeLabelRequested(m_device->udi()); +} + +void StorageAccess::slotLabelChanged(int error, const QString &errorString) +{ + m_changingLabel = false; + emit labelChanged(static_cast(error), errorString, m_device->udi()); +} + bool StorageAccess::mount() { QString path = m_device->udi(); @@ -402,3 +437,15 @@ SLOT(slotDBusReply(QDBusMessage)), SLOT(slotDBusError(QDBusError))); } + +bool StorageAccess::setLabel(const QString &label) +{ + const QString path = m_device->udi(); + QDBusConnection c = QDBusConnection::systemBus(); + QDBusMessage msg = QDBusMessage::createMethodCall(UD2_DBUS_SERVICE, path, UD2_DBUS_INTERFACE_FILESYSTEM, "SetLabel"); + msg << label << QVariantMap(); // options unused + + return c.callWithCallback(msg, this, + SLOT(slotDBusReply(QDBusMessage)), + SLOT(slotDBusError(QDBusError))); +} diff --git a/src/solid/devices/ifaces/storageaccess.h b/src/solid/devices/ifaces/storageaccess.h --- a/src/solid/devices/ifaces/storageaccess.h +++ b/src/solid/devices/ifaces/storageaccess.h @@ -82,6 +82,13 @@ */ virtual bool teardown() = 0; + /** + * Changes volume label. + * + * @return the job handling the operation + */ + virtual bool changeLabel(const QString &label) = 0; + protected: //Q_SIGNALS: /** @@ -111,6 +118,11 @@ */ virtual void teardownDone(Solid::ErrorType error, QVariant resultData, const QString &udi) = 0; + /** + * This signal is emitted when the volume label is successfully changed. + */ + virtual void labelChanged(Solid::ErrorType error, QVariant resultData, const QString &udi) = 0; + /** * This signal is emitted when a setup of this device is requested. * The signal might be spontaneous i.e. it can be triggered by @@ -128,6 +140,13 @@ * @param udi the UDI of the volume */ virtual void teardownRequested(const QString &udi) = 0; + + /** + * This signal is emitted when a label change is requested. + * + * @param udi the UDI of the volume + */ + virtual void changeLabelRequested(const QString &udi) = 0; }; } } diff --git a/src/solid/devices/ifaces/storageaccess.cpp b/src/solid/devices/ifaces/storageaccess.cpp --- a/src/solid/devices/ifaces/storageaccess.cpp +++ b/src/solid/devices/ifaces/storageaccess.cpp @@ -23,4 +23,3 @@ Solid::Ifaces::StorageAccess::~StorageAccess() { } -