[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