[telepathy-qt4/master] ClientRegistrar: Handler::HandledChannels is now spec compliant.
Andre Moreira Magalhaes (andrunko)
andre.magalhaes at collabora.co.uk
Thu May 7 09:01:43 PDT 2009
Handler::HandledChannels now returns the same for all Client instances that
share a unique bus name.
---
TelepathyQt4/client-registrar-internal.h | 15 +++++++++-
TelepathyQt4/client-registrar.cpp | 42 ++++++++++++++++++++++-------
2 files changed, 45 insertions(+), 12 deletions(-)
diff --git a/TelepathyQt4/client-registrar-internal.h b/TelepathyQt4/client-registrar-internal.h
index ff5f894..824b6b0 100644
--- a/TelepathyQt4/client-registrar-internal.h
+++ b/TelepathyQt4/client-registrar-internal.h
@@ -86,7 +86,8 @@ class ClientHandlerAdaptor : public QDBusAbstractAdaptor
Q_PROPERTY(Tp::ObjectPathList HandledChannels READ HandledChannels)
public:
- ClientHandlerAdaptor(const QDBusConnection &bus,
+ ClientHandlerAdaptor(
+ const QDBusConnection &bus,
const AbstractClientHandlerPtr &client,
QObject *parent);
virtual ~ClientHandlerAdaptor();
@@ -104,8 +105,16 @@ public: // Properties
inline Tp::ObjectPathList HandledChannels() const
{
+ // mAdaptorsForConnection includes this, so no need to start the set
+ // with this->mHandledChannels
+ QSet<ChannelPtr> handledChannels;
+ foreach (ClientHandlerAdaptor *handlerAdaptor,
+ mAdaptorsForConnection.value(mBus.baseService())) {
+ handledChannels.unite(handlerAdaptor->mHandledChannels);
+ }
+
Tp::ObjectPathList ret;
- foreach (const ChannelPtr &channel, mHandledChannels) {
+ foreach (const ChannelPtr &channel, handledChannels) {
ret.append(QDBusObjectPath(channel->objectPath()));
}
return ret;
@@ -136,6 +145,8 @@ private:
QQueue<HandleChannelsCall*> mHandleChannelsQueue;
bool mProcessingHandleChannels;
QSet<ChannelPtr> mHandledChannels;
+
+ static QHash<QString, QList<ClientHandlerAdaptor *> > mAdaptorsForConnection;
};
class ClientHandlerAdaptor::HandleChannelsCall : public QObject
diff --git a/TelepathyQt4/client-registrar.cpp b/TelepathyQt4/client-registrar.cpp
index eae75bd..64d8497 100644
--- a/TelepathyQt4/client-registrar.cpp
+++ b/TelepathyQt4/client-registrar.cpp
@@ -49,6 +49,8 @@ ClientAdaptor::~ClientAdaptor()
{
}
+QHash<QString, QList<ClientHandlerAdaptor *> > ClientHandlerAdaptor::mAdaptorsForConnection;
+
ClientHandlerAdaptor::ClientHandlerAdaptor(const QDBusConnection &bus,
const AbstractClientHandlerPtr &client,
QObject *parent)
@@ -57,10 +59,19 @@ ClientHandlerAdaptor::ClientHandlerAdaptor(const QDBusConnection &bus,
mClient(client),
mProcessingHandleChannels(false)
{
+ QList<ClientHandlerAdaptor *> &handlerAdaptors =
+ mAdaptorsForConnection[mBus.baseService()];
+ handlerAdaptors.append(this);
}
ClientHandlerAdaptor::~ClientHandlerAdaptor()
{
+ QList<ClientHandlerAdaptor *> &handlerAdaptors =
+ mAdaptorsForConnection[mBus.baseService()];
+ handlerAdaptors.removeOne(this);
+ if (handlerAdaptors.isEmpty()) {
+ mAdaptorsForConnection.remove(mBus.baseService());
+ }
}
void ClientHandlerAdaptor::HandleChannels(const QDBusObjectPath &account,
@@ -368,6 +379,7 @@ struct ClientRegistrar::Private
QString clientName;
QHash<ClientObjectPtr, QString> clients;
QSet<QString> services;
+ QHash<ClientObjectPtr, QList<QDBusAbstractAdaptor*> > adaptorsForClient;
};
QHash<QString, ClientRegistrar*> ClientRegistrar::registrarForConnection;
@@ -454,15 +466,19 @@ bool ClientRegistrar::registerClient(const ClientObjectPtr &client,
ClientHandlerAdaptor *clientHandlerAdaptor = 0;
ClientHandlerRequestsAdaptor *clientHandlerRequestsAdaptor = 0;
AbstractClientHandlerPtr handler = client->clientHandler();
+
+ QList<QDBusAbstractAdaptor *> &adaptors = mPriv->adaptorsForClient[client];
if (handler) {
// export o.f.T.Client.Handler
clientHandlerAdaptor = new ClientHandlerAdaptor(mPriv->bus, handler, object);
+ adaptors.append(clientHandlerAdaptor);
interfaces.append(
QLatin1String("org.freedesktop.Telepathy.Client.Handler"));
if (handler->wantsRequestNotification()) {
// export o.f.T.Client.Interface.Requests
clientHandlerRequestsAdaptor =
new ClientHandlerRequestsAdaptor(mPriv->bus, handler, object);
+ adaptors.append(clientHandlerRequestsAdaptor);
interfaces.append(
QLatin1String(
"org.freedesktop.Telepathy.Client.Interface.Requests"));
@@ -480,6 +496,7 @@ bool ClientRegistrar::registerClient(const ClientObjectPtr &client,
// export o.f,T,Client interface
ClientAdaptor *clientAdaptor = new ClientAdaptor(interfaces, object);
+ adaptors.append(clientAdaptor);
QString objectPath = QString("/%1").arg(busName);
objectPath.replace('.', '/');
@@ -488,6 +505,7 @@ bool ClientRegistrar::registerClient(const ClientObjectPtr &client,
warning() << "Unable to register client: objectPath" <<
objectPath << "already registered";
// cleanup
+ mPriv->adaptorsForClient.remove(client);
delete clientHandlerAdaptor;
delete clientHandlerRequestsAdaptor;
delete clientAdaptor;
@@ -519,6 +537,14 @@ bool ClientRegistrar::unregisterClient(const ClientObjectPtr &client)
mPriv->bus.unregisterService(busName);
mPriv->services.remove(busName);
+ QList<QDBusAbstractAdaptor*> &adaptors = mPriv->adaptorsForClient[client];
+ foreach (QDBusAbstractAdaptor *adaptor, adaptors) {
+ // delete adaptor here, to make sure if adaptor is keeping a static list
+ // of adaptors per connection, the list is updated.
+ delete adaptor;
+ }
+ mPriv->adaptorsForClient.remove(client);
+
debug() << "Client unregistered - busName:" << busName <<
"objectPath:" << objectPath;
@@ -527,21 +553,17 @@ bool ClientRegistrar::unregisterClient(const ClientObjectPtr &client)
void ClientRegistrar::unregisterClients()
{
+ // copy the hash as it will be modified
+ QHash<ClientObjectPtr, QString> clients = mPriv->clients;
+
QHash<ClientObjectPtr, QString>::const_iterator end =
- mPriv->clients.constEnd();
+ clients.constEnd();
QHash<ClientObjectPtr, QString>::const_iterator it =
- mPriv->clients.constBegin();
+ clients.constBegin();
while (it != end) {
- mPriv->bus.unregisterObject(it.value());
+ unregisterClient(it.key());
++it;
}
-
- foreach (const QString &service, mPriv->services) {
- mPriv->bus.unregisterService(service);
- }
-
- mPriv->clients.clear();
- mPriv->services.clear();
}
} // Tp
--
1.5.6.5
More information about the telepathy-commits
mailing list