From kde-commits Tue Nov 24 20:51:24 2009 From: Kevin Ottens Date: Tue, 24 Nov 2009 20:51:24 +0000 To: kde-commits Subject: KDE/kdelibs/solid/solid/backends/hal Message-Id: <1259095884.987622.18975.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=125909589617574 SVN commit 1053814 by ervin: If calling the command line tool eject failed, trigger an Eject request through HAL. M +9 -2 halfstabhandling.cpp M +3 -0 halfstabhandling.h M +35 -2 halstorageaccess.cpp M +3 -1 halstorageaccess.h --- trunk/KDE/kdelibs/solid/solid/backends/hal/halfstabhandling.cpp #1053813:1053814 @@ -162,7 +162,7 @@ } QProcess *Solid::Backends::Hal::FstabHandling::callSystemCommand(const QString &commandName, - const QString &device, + const QStringList &args, QObject *obj, const char *slot) { QStringList env = QProcess::systemEnvironment(); @@ -174,7 +174,7 @@ obj, slot); process->setEnvironment(env); - process->start(commandName, QStringList() << device); + process->start(commandName, args); if (process->waitForStarted()) { return process; @@ -184,3 +184,10 @@ } } +QProcess *Solid::Backends::Hal::FstabHandling::callSystemCommand(const QString &commandName, + const QString &device, + QObject *obj, const char *slot) +{ + return callSystemCommand(commandName, QStringList() << device, obj, slot); +} + --- trunk/KDE/kdelibs/solid/solid/backends/hal/halfstabhandling.h #1053813:1053814 @@ -37,6 +37,9 @@ static bool isInFstab(const QString &device); static QStringList possibleMountPoints(const QString &device); static QProcess *callSystemCommand(const QString &commandName, + const QStringList &args, + QObject *obj, const char *slot); + static QProcess *callSystemCommand(const QString &commandName, const QString &device, QObject *obj, const char *slot); }; --- trunk/KDE/kdelibs/solid/solid/backends/hal/halstorageaccess.cpp #1053813:1053814 @@ -40,7 +40,7 @@ using namespace Solid::Backends::Hal; StorageAccess::StorageAccess(HalDevice *device) - : DeviceInterface(device), m_setupInProgress(false), m_teardownInProgress(false), + : DeviceInterface(device), m_setupInProgress(false), m_teardownInProgress(false), m_ejectInProgress(false), m_passphraseRequested(false) { connect(device, SIGNAL(propertyChanged(const QMap &)), @@ -163,8 +163,13 @@ args << devnode; #endif - QProcess::startDetached(program, args); + m_ejectInProgress = true; + m_process = FstabHandling::callSystemCommand("eject", args, + this, SLOT(slotProcessFinished(int, QProcess::ExitStatus))); } + } else if (m_ejectInProgress) { + m_ejectInProgress = false; + emit ejectDone(Solid::NoError, QVariant(), m_device->udi()); } } @@ -181,6 +186,11 @@ emit teardownDone(Solid::UnauthorizedOperation, QString(error.name()+": "+error.message()), m_device->udi()); + } else if (m_ejectInProgress) { + m_ejectInProgress = false; + emit ejectDone(Solid::UnauthorizedOperation, + QString(error.name()+": "+error.message()), + m_device->udi()); } } @@ -206,6 +216,13 @@ m_process->readAllStandardError(), m_device->udi()); } + } else if (m_ejectInProgress) { + if (exitCode==0) { + m_ejectInProgress = false; + emit ejectDone(Solid::NoError, QVariant(), m_device->udi()); + } else { + callHalVolumeEject(); + } } delete m_process; @@ -352,6 +369,22 @@ SLOT(slotDBusError(const QDBusError &))); } +bool StorageAccess::callHalVolumeEject() +{ + QString udi = m_device->udi(); + QString interface = "org.freedesktop.Hal.Device.Volume"; + + QDBusConnection c = QDBusConnection::systemBus(); + QDBusMessage msg = QDBusMessage::createMethodCall("org.freedesktop.Hal", udi, + interface, "Eject"); + + msg << QStringList(); + + return c.callWithCallback(msg, this, + SLOT(slotDBusReply(const QDBusMessage &)), + SLOT(slotDBusError(const QDBusError &))); +} + bool Solid::Backends::Hal::StorageAccess::callSystemMount() { const QString device = m_device->property("block.device").toString(); --- trunk/KDE/kdelibs/solid/solid/backends/hal/halstorageaccess.h #1053813:1053814 @@ -51,6 +51,7 @@ void accessibilityChanged(bool accessible, const QString &udi); void setupDone(Solid::ErrorType error, QVariant errorData, const QString &udi); void teardownDone(Solid::ErrorType error, QVariant errorData, const QString &udi); + void ejectDone(Solid::ErrorType error, QVariant errorData, const QString &udi); private Q_SLOTS: void slotPropertyChanged(const QMap &changes); @@ -58,13 +59,13 @@ void slotDBusError(const QDBusError &error); void slotProcessFinished(int exitCode, QProcess::ExitStatus exitStatus); - public Q_SLOTS: Q_SCRIPTABLE Q_NOREPLY void passphraseReply(const QString &passphrase); private: bool callHalVolumeMount(); bool callHalVolumeUnmount(); + bool callHalVolumeEject(); bool callSystemMount(); bool callSystemUnmount(); @@ -76,6 +77,7 @@ private: bool m_setupInProgress; bool m_teardownInProgress; + bool m_ejectInProgress; bool m_passphraseRequested; QString m_lastReturnObject; QProcess *m_process;