[telepathy-qt4/master] ClientRegistrar: Added initial Approver support.

Andre Moreira Magalhaes (andrunko) andre.magalhaes at collabora.co.uk
Mon May 25 07:59:52 PDT 2009


---
 TelepathyQt4/abstract-client.h           |    5 ++-
 TelepathyQt4/client-registrar-internal.h |   41 +++++++++++++++++++++++++
 TelepathyQt4/client-registrar.cpp        |   49 +++++++++++++++++++++++++++++-
 3 files changed, 93 insertions(+), 2 deletions(-)

diff --git a/TelepathyQt4/abstract-client.h b/TelepathyQt4/abstract-client.h
index f9e5f72..4d8dafa 100644
--- a/TelepathyQt4/abstract-client.h
+++ b/TelepathyQt4/abstract-client.h
@@ -81,7 +81,10 @@ public:
 
     ChannelClassList approverChannelFilter() const;
 
-    /* TODO add more methods */
+    virtual void addDispatchOperation(const MethodInvocationContextPtr<> &context,
+            const QList<ChannelPtr> &channels,
+            const QString &dispatchOperationPath,
+            const QVariantMap &dispatchOperationProperties) = 0;
 
 protected:
     AbstractClientApprover(const ChannelClassList &channelFilter);
diff --git a/TelepathyQt4/client-registrar-internal.h b/TelepathyQt4/client-registrar-internal.h
index 5c86c25..b47524c 100644
--- a/TelepathyQt4/client-registrar-internal.h
+++ b/TelepathyQt4/client-registrar-internal.h
@@ -107,6 +107,47 @@ private:
     AbstractClientObserver *mClient;
 };
 
+class ClientApproverAdaptor : public QDBusAbstractAdaptor
+{
+    Q_OBJECT
+    Q_CLASSINFO("D-Bus Interface", "org.freedesktop.Telepathy.Client.Approver")
+    Q_CLASSINFO("D-Bus Introspection", ""
+"  <interface name=\"org.freedesktop.Telepathy.Client.Approver\" >\n"
+"    <property name=\"ApproverChannelFilter\" type=\"aa{sv}\" access=\"read\" />\n"
+"    <method name=\"AddDispatchOperation\" >\n"
+"      <arg name=\"Channels\" type=\"a(oa{sv})\" direction=\"in\" />\n"
+"      <arg name=\"Dispatch_Operation\" type=\"o\" direction=\"in\" />\n"
+"      <arg name=\"Properties\" type=\"a{sv}\" direction=\"in\" />\n"
+"    </method>\n"
+"  </interface>\n"
+        "")
+
+    Q_PROPERTY(Tp::ChannelClassList ApproverChannelFilter READ ApproverChannelFilter)
+
+public:
+    ClientApproverAdaptor(
+            const QDBusConnection &bus,
+            AbstractClientApprover *client,
+            QObject *parent);
+    virtual ~ClientApproverAdaptor();
+
+public: // Properties
+    inline Tp::ChannelClassList ApproverChannelFilter() const
+    {
+        return mClient->approverChannelFilter();
+    }
+
+public Q_SLOTS: // Methods
+    void AddDispatchOperation(const Tp::ChannelDetailsList &channels,
+            const QDBusObjectPath &dispatchOperation,
+            const QVariantMap &properties,
+            const QDBusMessage &message);
+
+private:
+    QDBusConnection mBus;
+    AbstractClientApprover *mClient;
+};
+
 class ClientHandlerAdaptor : public QDBusAbstractAdaptor
 {
     Q_OBJECT
diff --git a/TelepathyQt4/client-registrar.cpp b/TelepathyQt4/client-registrar.cpp
index e1f5977..ad90c52 100644
--- a/TelepathyQt4/client-registrar.cpp
+++ b/TelepathyQt4/client-registrar.cpp
@@ -147,6 +147,46 @@ void ClientObserverAdaptor::ObserveChannels(const QDBusObjectPath &accountPath,
             dispatchOperationPath.path(), channelRequests, observerInfo);
 }
 
+ClientApproverAdaptor::ClientApproverAdaptor(const QDBusConnection &bus,
+        AbstractClientApprover *client,
+        QObject *parent)
+    : QDBusAbstractAdaptor(parent),
+      mBus(bus),
+      mClient(client)
+{
+}
+
+ClientApproverAdaptor::~ClientApproverAdaptor()
+{
+}
+
+void ClientApproverAdaptor::AddDispatchOperation(const Tp::ChannelDetailsList &channelDetailsList,
+        const QDBusObjectPath &dispatchOperationPath,
+        const QVariantMap &properties,
+        const QDBusMessage &message)
+{
+    QDBusObjectPath connectionPath = qdbus_cast<QDBusObjectPath>(
+            properties.value("Connection"));
+    QString connectionBusName = connectionPath.path().mid(1).replace('/', '.');
+    ConnectionPtr connection = Connection::create(mBus, connectionBusName,
+            connectionPath.path());
+
+    QList<ChannelPtr> channels;
+    ChannelPtr channel;
+    foreach (const ChannelDetails &channelDetails, channelDetailsList) {
+        channel = Channel::create(connection, channelDetails.channel.path(),
+                channelDetails.properties);
+        channels.append(channel);
+    }
+
+    MethodInvocationContextPtr<> context =
+        MethodInvocationContextPtr<>(
+                new MethodInvocationContext<>(mBus, message));
+
+    mClient->addDispatchOperation(context, channels,
+            dispatchOperationPath.path(), properties);
+}
+
 QHash<QPair<QString, QString>, QList<ClientHandlerAdaptor *> > ClientHandlerAdaptor::mAdaptorsForConnection;
 
 ClientHandlerAdaptor::ClientHandlerAdaptor(const QDBusConnection &bus,
@@ -500,7 +540,14 @@ bool ClientRegistrar::registerClient(const AbstractClientPtr &client,
                 QLatin1String("org.freedesktop.Telepathy.Client.Observer"));
     }
 
-    // TODO add more adaptors when they exist
+    AbstractClientApprover *approver =
+        dynamic_cast<AbstractClientApprover*>(client.data());
+    if (approver) {
+        // export o.f.T.Client.Approver
+        new ClientApproverAdaptor(mPriv->bus, approver, object);
+        interfaces.append(
+                QLatin1String("org.freedesktop.Telepathy.Client.Approver"));
+    }
 
     if (interfaces.isEmpty()) {
         warning() << "Client does not implement any known interface";
-- 
1.5.6.5




More information about the telepathy-commits mailing list