[Telepathy-commits] [telepathy-qt4/master] ReadinessHelper: Make becomeReady fail if requestedFeatures contains an invalid feature.

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


---
 TelepathyQt4/Client/readiness-helper.cpp |   25 +++++++++++++++++++++----
 1 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/TelepathyQt4/Client/readiness-helper.cpp b/TelepathyQt4/Client/readiness-helper.cpp
index bd25689..a7ca9ae 100644
--- a/TelepathyQt4/Client/readiness-helper.cpp
+++ b/TelepathyQt4/Client/readiness-helper.cpp
@@ -56,6 +56,7 @@ struct ReadinessHelper::Private
     QStringList interfaces;
     QMap<uint, Introspectable> introspectables;
     QSet<uint> supportedStatuses;
+    QSet<uint> supportedFeatures;
     QSet<uint> satisfiedFeatures;
     QSet<uint> requestedFeatures;
     QSet<uint> missingFeatures;
@@ -82,11 +83,19 @@ ReadinessHelper::Private::Private(
     // we must have an introspectable for core
     Q_ASSERT(introspectables.contains(0));
 
-    foreach (const ReadinessHelper::Introspectable &introspectable, introspectables) {
+    QMap<uint, Introspectable>::const_iterator i = introspectables.constBegin();
+    while (i != introspectables.constEnd()) {
+        uint feature = i.key();
+        Introspectable introspectable = i.value();
         Q_ASSERT(introspectable.introspectFunc != 0);
         supportedStatuses += introspectable.makesSenseForStatuses;
+        supportedFeatures += feature;
+        ++i;
     }
 
+    debug() << "ReadinessHelper: supportedStatuses =" << supportedStatuses;
+    debug() << "ReadinessHelper: supportedFeatures =" << supportedFeatures;
+
     if (supportedStatuses.contains(currentStatus)) {
         introspectCore();
     }
@@ -192,7 +201,6 @@ void ReadinessHelper::Private::iterateIntrospection()
     // satisfiedFeatures + missingFeatures has
     foreach (PendingReady *operation, pendingOperations) {
         if ((operation->requestedFeatures() - (satisfiedFeatures + missingFeatures)).isEmpty()) {
-            // TODO should we finish with error if requestedFeatures is on missingFeatures?
             operation->setFinished();
             pendingOperations.removeOne(operation);
         }
@@ -337,12 +345,21 @@ bool ReadinessHelper::isReady(QSet<uint> features) const
 
 PendingReady *ReadinessHelper::becomeReady(QSet<uint> requestedFeatures)
 {
-    // TODO check if requestedFeatures does not contain any invalid feature
-
     if (requestedFeatures.isEmpty()) {
         requestedFeatures << 0; // it is empty, consider core
     }
 
+    QSet<uint> supportedFeatures = mPriv->supportedFeatures;
+    if (supportedFeatures.intersect(requestedFeatures) != requestedFeatures) {
+        debug() << "ReadinessHelper::becomeReady called with invalid features: requestedFeatures =" <<
+            requestedFeatures << "- supportedFeatures =" << mPriv->supportedFeatures;
+        PendingReady *operation =
+            new PendingReady(requestedFeatures, this);
+        operation->setFinishedWithError(TELEPATHY_ERROR_INVALID_ARGUMENT,
+                "Requested features contains invalid feature");
+        return operation;
+    }
+
     if (!mPriv->proxy->isValid()) {
         PendingReady *operation =
             new PendingReady(requestedFeatures, this);
-- 
1.5.6.5




More information about the telepathy-commits mailing list