[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