[Telepathy-commits] [telepathy-qt4/master] ReadinessHelper: Make operations fail if proxy object gets deleted.

Andre Moreira Magalhaes (andrunko) andre.magalhaes at collabora.co.uk
Thu Feb 19 06:18:13 PST 2009


---
 TelepathyQt4/Client/connection.cpp       |    2 +-
 TelepathyQt4/Client/readiness-helper.cpp |   53 +++++++++++++++++++++++++++---
 TelepathyQt4/Client/readiness-helper.h   |    8 ++++-
 3 files changed, 56 insertions(+), 7 deletions(-)

diff --git a/TelepathyQt4/Client/connection.cpp b/TelepathyQt4/Client/connection.cpp
index 387b6cd..c2777d8 100644
--- a/TelepathyQt4/Client/connection.cpp
+++ b/TelepathyQt4/Client/connection.cpp
@@ -191,7 +191,7 @@ Connection::Private::Private(Connection *parent)
         this);
     introspectables[FeatureSimplePresence] = introspectableSimplePresence;
 
-    readinessHelper = new ReadinessHelper(status,
+    readinessHelper = new ReadinessHelper(parent, status,
             introspectables, parent);
     parent->connect(readinessHelper,
             SIGNAL(statusReady(uint)),
diff --git a/TelepathyQt4/Client/readiness-helper.cpp b/TelepathyQt4/Client/readiness-helper.cpp
index 1392691..02c6acd 100644
--- a/TelepathyQt4/Client/readiness-helper.cpp
+++ b/TelepathyQt4/Client/readiness-helper.cpp
@@ -26,6 +26,7 @@
 #include "TelepathyQt4/debug-internal.h"
 
 #include <TelepathyQt4/Client/PendingReady>
+#include <TelepathyQt4/Constants>
 
 #include <QTimer>
 
@@ -37,6 +38,7 @@ namespace Client
 struct ReadinessHelper::Private
 {
     Private(ReadinessHelper *parent,
+            DBusProxy *proxy,
             uint currentStatus,
             const QMap<uint, Introspectable> &introspectables);
     ~Private();
@@ -46,7 +48,10 @@ struct ReadinessHelper::Private
     void setIntrospectCompleted(uint feature, bool success);
     void iterateIntrospection();
 
+    void abortOperations(const QString &errorName, const QString &errorMessage);
+
     ReadinessHelper *parent;
+    DBusProxy *proxy;
     uint currentStatus;
     QStringList interfaces;
     QMap<uint, Introspectable> introspectables;
@@ -64,9 +69,11 @@ struct ReadinessHelper::Private
 
 ReadinessHelper::Private::Private(
         ReadinessHelper *parent,
+        DBusProxy *proxy,
         uint currentStatus,
         const QMap<uint, Introspectable> &introspectables)
     : parent(parent),
+      proxy(proxy),
       currentStatus(currentStatus),
       introspectables(introspectables),
       pendingStatusChange(false),
@@ -87,7 +94,7 @@ ReadinessHelper::Private::Private(
 
 ReadinessHelper::Private::~Private()
 {
-    // TODO finish all pending operations
+    abortOperations(TELEPATHY_ERROR_CANCELLED, "Destroyed");
 }
 
 void ReadinessHelper::Private::setCurrentStatus(uint newStatus)
@@ -157,6 +164,10 @@ void ReadinessHelper::Private::setIntrospectCompleted(uint feature, bool success
 
 void ReadinessHelper::Private::iterateIntrospection()
 {
+    if (!proxy->isValid()) {
+        return;
+    }
+
     if (!supportedStatuses.contains(currentStatus)) {
         debug() << "ignoring iterate introspection for status" << currentStatus;
         // don't do anything just now to avoid spurious becomeReady finishes
@@ -245,12 +256,24 @@ void ReadinessHelper::Private::iterateIntrospection()
     }
 }
 
-ReadinessHelper::ReadinessHelper(uint currentStatus,
+void ReadinessHelper::Private::abortOperations(const QString &errorName,
+        const QString &errorMessage)
+{
+    foreach (PendingReady *operation, pendingOperations) {
+        operation->setFinishedWithError(errorName, errorMessage);
+    }
+}
+
+ReadinessHelper::ReadinessHelper(DBusProxy *proxy,
+        uint currentStatus,
         const QMap<uint, Introspectable> &introspectables,
         QObject *parent)
     : QObject(parent),
-      mPriv(new Private(this, currentStatus, introspectables))
+      mPriv(new Private(this, proxy, currentStatus, introspectables))
 {
+    connect(proxy,
+            SIGNAL(invalidated(Telepathy::Client::DBusProxy *, const QString &, const QString &)),
+            SLOT(onProxyInvalidated(Telepathy::Client::DBusProxy *, const QString &, const QString &)));
 }
 
 ReadinessHelper::~ReadinessHelper()
@@ -295,6 +318,10 @@ QSet<uint> ReadinessHelper::missingFeatures() const
 
 bool ReadinessHelper::isReady(QSet<uint> features) const
 {
+    if (!mPriv->proxy->isValid()) {
+        return false;
+    }
+
     if (features.isEmpty()) {
         features << 0; // it is empty, consider core
     }
@@ -310,13 +337,19 @@ bool ReadinessHelper::isReady(QSet<uint> features) const
 PendingReady *ReadinessHelper::becomeReady(QSet<uint> requestedFeatures)
 {
     // TODO check if requestedFeatures does not contain any invalid feature
-    //      check if parent object is valid - this would need the parent object
-    //      to be of type DBusProxy
 
     if (requestedFeatures.isEmpty()) {
         requestedFeatures << 0; // it is empty, consider core
     }
 
+    if (!mPriv->proxy->isValid()) {
+        PendingReady *operation =
+            new PendingReady(requestedFeatures, this);
+        operation->setFinishedWithError(TELEPATHY_ERROR_NOT_AVAILABLE,
+                "Proxy is invalid");
+        return operation;
+    }
+
     PendingReady *operation;
     foreach (operation, mPriv->pendingOperations) {
         if (operation->requestedFeatures() == requestedFeatures) {
@@ -338,6 +371,10 @@ PendingReady *ReadinessHelper::becomeReady(QSet<uint> requestedFeatures)
 
 void ReadinessHelper::setIntrospectCompleted(uint feature, bool success)
 {
+    if (!mPriv->proxy->isValid()) {
+        // proxy became invalid, ignore here
+        return;
+    }
     mPriv->setIntrospectCompleted(feature, success);
 }
 
@@ -346,5 +383,11 @@ void ReadinessHelper::iterateIntrospection()
     mPriv->iterateIntrospection();
 }
 
+void ReadinessHelper::onProxyInvalidated(Telepathy::Client::DBusProxy *proxy,
+        const QString &errorName, const QString &errorMessage)
+{
+    mPriv->abortOperations(errorName, errorMessage);
+}
+
 }
 }
diff --git a/TelepathyQt4/Client/readiness-helper.h b/TelepathyQt4/Client/readiness-helper.h
index 49ad36c..028e4ff 100644
--- a/TelepathyQt4/Client/readiness-helper.h
+++ b/TelepathyQt4/Client/readiness-helper.h
@@ -26,6 +26,8 @@
 #error IN_TELEPATHY_QT4_HEADER
 #endif
 
+#include <TelepathyQt4/Client/DBusProxy>
+
 #include <QMap>
 #include <QSet>
 #include <QStringList>
@@ -75,7 +77,8 @@ public:
         void *introspectFuncData;
     };
 
-    ReadinessHelper(uint currentStatus,
+    ReadinessHelper(DBusProxy *proxy,
+            uint currentStatus,
             const QMap<uint, Introspectable> &introspectables,
             QObject *parent = 0);
     ~ReadinessHelper();
@@ -101,6 +104,9 @@ Q_SIGNALS:
 private Q_SLOTS:
     void iterateIntrospection();
 
+    void onProxyInvalidated(Telepathy::Client::DBusProxy *proxy,
+        const QString &errorName, const QString &errorMessage);
+
 private:
     struct Private;
     friend struct Private;
-- 
1.5.6.5




More information about the telepathy-commits mailing list