[telepathy-qt4/master] ClientRegistrar: HandledChannels is now handled internally by the library.

Andre Moreira Magalhaes (andrunko) andre.magalhaes at collabora.co.uk
Thu May 7 08:01:00 PDT 2009


Note that this is not spec compliant, as HandledChannels is not returning
the same for all Client instances that share a unique bus name. This will be
implemented in a later patch.
---
 TelepathyQt4/abstract-client.h           |    1 -
 TelepathyQt4/client-registrar-internal.h |   17 +++++++---
 TelepathyQt4/client-registrar.cpp        |   49 +++++++++++++++++++++++++----
 tests/dbus/client-handler.cpp            |   20 +++++-------
 4 files changed, 63 insertions(+), 24 deletions(-)

diff --git a/TelepathyQt4/abstract-client.h b/TelepathyQt4/abstract-client.h
index b26a6f9..52f2359 100644
--- a/TelepathyQt4/abstract-client.h
+++ b/TelepathyQt4/abstract-client.h
@@ -48,7 +48,6 @@ public:
 
     ChannelClassList channelFilter() const;
     virtual bool bypassApproval() const = 0;
-    virtual QList<ChannelPtr> handledChannels() const = 0;
 
     virtual void handleChannels(PendingClientOperation *operation,
             const AccountPtr &account,
diff --git a/TelepathyQt4/client-registrar-internal.h b/TelepathyQt4/client-registrar-internal.h
index b504f07..ff5f894 100644
--- a/TelepathyQt4/client-registrar-internal.h
+++ b/TelepathyQt4/client-registrar-internal.h
@@ -104,11 +104,11 @@ public: // Properties
 
     inline Tp::ObjectPathList HandledChannels() const
     {
-        Tp::ObjectPathList paths;
-        foreach (const ChannelPtr &channel, mClient->handledChannels()) {
-            paths.append(QDBusObjectPath(channel->objectPath()));
+        Tp::ObjectPathList ret;
+        foreach (const ChannelPtr &channel, mHandledChannels) {
+            ret.append(QDBusObjectPath(channel->objectPath()));
         }
-        return paths;
+        return ret;
     }
 
 public Q_SLOTS: // Methods
@@ -121,7 +121,9 @@ public Q_SLOTS: // Methods
             const QDBusMessage &message);
 
 private Q_SLOTS:
+    void onOperationFinished(Tp::PendingOperation *op);
     void onHandleChannelsCallFinished();
+    void onChannelInvalidated(Tp::DBusProxy *proxy);
 
 private:
     void processHandleChannelsQueue();
@@ -130,8 +132,10 @@ private:
 
     QDBusConnection mBus;
     AbstractClientHandlerPtr mClient;
+    QHash<PendingClientOperation *, HandleChannelsCall *> mOperations;
     QQueue<HandleChannelsCall*> mHandleChannelsQueue;
     bool mProcessingHandleChannels;
+    QSet<ChannelPtr> mHandledChannels;
 };
 
 class ClientHandlerAdaptor::HandleChannelsCall : public QObject
@@ -140,6 +144,7 @@ class ClientHandlerAdaptor::HandleChannelsCall : public QObject
 
 public:
     HandleChannelsCall(const AbstractClientHandlerPtr &client,
+            PendingClientOperation *op,
             const QDBusObjectPath &account,
             const QDBusObjectPath &connection,
             const ChannelDetailsList &channels,
@@ -151,6 +156,8 @@ public:
             QObject *parent);
     virtual ~HandleChannelsCall();
 
+    QList<ChannelPtr> channels() const { return mChannels; };
+
     void process();
 
 Q_SIGNALS:
@@ -166,6 +173,7 @@ private:
             const QString &errorMessage);
 
     AbstractClientHandlerPtr mClient;
+    PendingClientOperation *mOperation;
     QDBusObjectPath mAccountPath;
     QDBusObjectPath mConnectionPath;
     ChannelDetailsList mChannelDetailsList;
@@ -174,7 +182,6 @@ private:
     QVariantMap mHandlerInfo;
     QDBusConnection mBus;
     QDBusMessage mMessage;
-    PendingClientOperation *mOperation;
     AccountPtr mAccount;
     ConnectionPtr mConnection;
     QList<ChannelPtr> mChannels;
diff --git a/TelepathyQt4/client-registrar.cpp b/TelepathyQt4/client-registrar.cpp
index c55e638..66e9461 100644
--- a/TelepathyQt4/client-registrar.cpp
+++ b/TelepathyQt4/client-registrar.cpp
@@ -73,12 +73,42 @@ void ClientHandlerAdaptor::HandleChannels(const QDBusObjectPath &account,
 {
     debug() << "HandleChannels: account:" << account.path() << ", connection:"
         << connection.path();
-    mHandleChannelsQueue.enqueue(new HandleChannelsCall(mClient, account,
-                connection, channels, requestsSatisfied,
-                userActionTime, handlerInfo, mBus, message, this));
+
+    PendingClientOperation *op = new PendingClientOperation(mBus,
+            message, this);
+    HandleChannelsCall *call = new HandleChannelsCall(mClient, op,
+            account, connection, channels, requestsSatisfied,
+            userActionTime, handlerInfo, mBus, message, this);
+    connect(op,
+            SIGNAL(finished(Tp::PendingOperation*)),
+            SLOT(onOperationFinished(Tp::PendingOperation*)));
+    mOperations.insert(op, call);
+
+    mHandleChannelsQueue.enqueue(call);
     processHandleChannelsQueue();
 }
 
+void ClientHandlerAdaptor::onOperationFinished(PendingOperation *op)
+{
+    HandleChannelsCall *call =
+        mOperations.value(dynamic_cast<PendingClientOperation*>(op));
+    if (!op->isError()) {
+        debug() << "HandleChannels operation finished successfully, "
+            "updating handled channels";
+        foreach (const ChannelPtr &channel, call->channels()) {
+            mHandledChannels.insert(channel);
+            connect(channel.data(),
+                    SIGNAL(invalidated(Tp::DBusProxy *,
+                                       const QString &, const QString &)),
+                    SLOT(onChannelInvalidated(Tp::DBusProxy *)));
+        }
+    }
+
+    mOperations.remove(dynamic_cast<PendingClientOperation*>(op));
+    // op will delete itself, so no need to delete it
+    delete call;
+}
+
 void ClientHandlerAdaptor::onHandleChannelsCallFinished()
 {
     mHandleChannelsQueue.dequeue();
@@ -86,6 +116,12 @@ void ClientHandlerAdaptor::onHandleChannelsCallFinished()
     processHandleChannelsQueue();
 }
 
+void ClientHandlerAdaptor::onChannelInvalidated(DBusProxy *proxy)
+{
+    ChannelPtr channel(dynamic_cast<Channel*>(proxy));
+    mHandledChannels.remove(channel);
+}
+
 void ClientHandlerAdaptor::processHandleChannelsQueue()
 {
     if (mProcessingHandleChannels || mHandleChannelsQueue.isEmpty()) {
@@ -102,6 +138,7 @@ void ClientHandlerAdaptor::processHandleChannelsQueue()
 
 ClientHandlerAdaptor::HandleChannelsCall::HandleChannelsCall(
         const AbstractClientHandlerPtr &client,
+        PendingClientOperation *op,
         const QDBusObjectPath &account,
         const QDBusObjectPath &connection,
         const ChannelDetailsList &channels,
@@ -113,6 +150,7 @@ ClientHandlerAdaptor::HandleChannelsCall::HandleChannelsCall(
         QObject *parent)
     : QObject(parent),
       mClient(client),
+      mOperation(op),
       mAccountPath(account),
       mConnectionPath(connection),
       mChannelDetailsList(channels),
@@ -120,8 +158,7 @@ ClientHandlerAdaptor::HandleChannelsCall::HandleChannelsCall(
       mUserActionTime(userActionTime),
       mHandlerInfo(handlerInfo),
       mBus(bus),
-      mMessage(message),
-      mOperation(new PendingClientOperation(bus, message, this))
+      mMessage(message)
 {
 }
 
@@ -207,7 +244,6 @@ void ClientHandlerAdaptor::HandleChannelsCall::checkFinished()
     mClient->handleChannels(mOperation, mAccount, mConnection, mChannels,
             mChannelRequests, userActionTime, mHandlerInfo);
     emit finished();
-    deleteLater();
 }
 
 void ClientHandlerAdaptor::HandleChannelsCall::setFinishedWithError(const QString &errorName,
@@ -215,7 +251,6 @@ void ClientHandlerAdaptor::HandleChannelsCall::setFinishedWithError(const QStrin
 {
     mOperation->setFinishedWithError(errorName, errorMessage);
     emit finished();
-    deleteLater();
 }
 
 ClientHandlerRequestsAdaptor::ClientHandlerRequestsAdaptor(
diff --git a/tests/dbus/client-handler.cpp b/tests/dbus/client-handler.cpp
index c0218cd..207480b 100644
--- a/tests/dbus/client-handler.cpp
+++ b/tests/dbus/client-handler.cpp
@@ -157,11 +157,6 @@ public:
         return mBypassApproval;
     }
 
-    QList<ChannelPtr> handledChannels() const
-    {
-        return mHandledChannels;
-    }
-
     void handleChannels(PendingClientOperation *operation,
             const AccountPtr &account,
             const ConnectionPtr &connection,
@@ -176,9 +171,11 @@ public:
         mHandleChannelsRequestsSatisfied = requestsSatisfied;
         mHandleChannelsUserActionTime = userActionTime;
         mHandleChannelsHandlerInfo = handlerInfo;
-        mHandledChannels.append(channels);
-        emit handleChannelsFinished();
+
         operation->setFinished();
+        connect(operation,
+                SIGNAL(finished(Tp::PendingOperation*)),
+                SIGNAL(handleChannelsFinished()));
     }
 
     void addRequest(const ChannelRequestPtr &request)
@@ -203,7 +200,6 @@ public:
     QList<ChannelRequestPtr> mHandleChannelsRequestsSatisfied;
     QDateTime mHandleChannelsUserActionTime;
     QVariantMap mHandleChannelsHandlerInfo;
-    QList<ChannelPtr> mHandledChannels;
     ChannelRequestPtr mAddRequestRequest;
     ChannelRequestPtr mRemoveRequestRequest;
     QString mRemoveRequestErrorName;
@@ -450,16 +446,18 @@ void TestClientHandler::testHandleChannels()
             ObjectPathList() << QDBusObjectPath(mChannelRequestPath),
             mUserActionTime,
             QVariantMap());
-    if (!handler->mHandleChannelsAccount) {
-        QCOMPARE(mLoop->exec(), 0);
-    }
+    QCOMPARE(mLoop->exec(), 0);
 
     QCOMPARE(handler->mHandleChannelsAccount->objectPath(), mAccount->objectPath());
     QCOMPARE(handler->mHandleChannelsConnection->objectPath(), mConn->objectPath());
     QCOMPARE(handler->mHandleChannelsChannels.first()->objectPath(), mTextChanPath);
     QCOMPARE(handler->mHandleChannelsRequestsSatisfied.first()->objectPath(), mChannelRequestPath);
     QCOMPARE(handler->mHandleChannelsUserActionTime.toTime_t(), mUserActionTime);
+
+    Tp::ObjectPathList handledChannels = handlerIface->HandledChannels();
+    QVERIFY(handledChannels.contains(QDBusObjectPath(mTextChanPath)));
 }
+
 void TestClientHandler::cleanup()
 {
     cleanupImpl();
-- 
1.5.6.5




More information about the telepathy-commits mailing list