File kdebase-trident-udisks2-dbus.diff of Package kdebase3
--- a/kioslave/media/mediamanager/udisks2backend.cpp
+++ b/kioslave/media/mediamanager/udisks2backend.cpp
@@ -18,6 +18,7 @@
*/
#include <qdict.h>
+#include <qeventloop.h>
#include <dbus/qdbusconnection.h>
#include <dbus/qdbuserror.h>
@@ -31,6 +32,7 @@
#include <klocale.h>
#include <kdebug.h>
+#include <kapplication.h>
#include "udisks2backend.h"
@@ -62,6 +64,9 @@
class Object : public QDBusProxy {
+
+ Q_OBJECT
+
public:
Object(ObjectManager *objectManager, const QDBusObjectPath &objectPath, const QDBusConnection &dbusConnection);
~Object();
@@ -75,6 +80,9 @@
void removeInterfaces(const QValueList<QDBusData> &interfaces);
bool callMethod(const QString &interface, const QString &method, const QValueList<QDBusData> ¶ms, QDBusData &response, QDBusError &error);
+
+private slots:
+ void callMethodCallback(const QDBusMessage &message);
private:
Medium *createLoopMedium();
@@ -113,6 +121,9 @@
bool m_filesystem;
bool m_mounted;
QString m_mountPoint;
+
+ // async method
+ QDBusMessage callbackResponse;
};
@@ -234,7 +245,7 @@
Object::Object(ObjectManager *objectManager, const QDBusObjectPath &objectPath, const QDBusConnection &dbusConnection)
- : QDBusProxy(dbusConnection), m_objectManager(objectManager)
+ : QDBusProxy(dbusConnection, 0, "UDisks2::Object"), m_objectManager(objectManager)
{
setService("org.freedesktop.UDisks2");
setPath(objectPath);
@@ -268,7 +279,7 @@
QDBusData response;
if(!callMethod("org.freedesktop.UDisks2.Filesystem", "Mount", params, response, error))
- return i18n("Unable to mount \"%1\".\nReason: %2").arg(m_device).arg(error.message());
+ return i18n("Unable to mount \"%1\".\nReason: %2").arg(m_device).arg(error.message());
return QString::null;
}
@@ -292,7 +303,7 @@
QDBusData response;
if(!callMethod("org.freedesktop.UDisks2.Filesystem", "Unmount", params, response, error))
- return i18n("Unable to unmount \"%1\".\nReason: %2").arg(m_device).arg(error.message());
+ return i18n("Unable to unmount \"%1\".\nReason: %2").arg(m_device).arg(error.message());
return QString::null;
}
@@ -335,19 +346,41 @@
}
+// this method emulate a blocking function,
+// but it uses asynchronous DBUS calls (with callback)
bool Object::callMethod(const QString &interface, const QString &method, const QValueList<QDBusData> ¶ms, QDBusData &response, QDBusError &error)
{
- QDBusProxy proxy(service(), path(), interface, connection());
-
- QDBusMessage reply = proxy.sendWithReply(method, params);
+ QDBusMessage message = QDBusMessage::methodCall(service(), path(), interface, method);
+ message += params;
+
+ // wait as long as necessary
+ // this is necessary for example for interaction with polkit agent
+ message.setTimeout(QDBusMessage::NoTimeout);
+
+ int id = connection().sendWithAsyncReply(message, this, SLOT(callMethodCallback(const QDBusMessage&)));
+ if(0 == id) {
+ error = connection().lastError();
+ return false;
+ }
+
+ // FIXME: potential race condition?
+ kapp->eventLoop()->enterLoop();
+ QDBusMessage reply = callbackResponse;
+
if(reply.count() != 1 || reply.type() != QDBusMessage::ReplyMessage) {
- error = proxy.lastError();
+ error = reply.error();
if(QDBusError::InvalidError != error.type())
return false;
}
- response = reply.front();
return true;
+}
+
+
+void Object::callMethodCallback(const QDBusMessage &message)
+{
+ callbackResponse = message;
+ kapp->eventLoop()->exitLoop();
}