summaryrefslogtreecommitdiff
path: root/TelepathyQt/abstract-client.h
diff options
context:
space:
mode:
Diffstat (limited to 'TelepathyQt/abstract-client.h')
-rw-r--r--TelepathyQt/abstract-client.h323
1 files changed, 323 insertions, 0 deletions
diff --git a/TelepathyQt/abstract-client.h b/TelepathyQt/abstract-client.h
new file mode 100644
index 00000000..aef615f6
--- /dev/null
+++ b/TelepathyQt/abstract-client.h
@@ -0,0 +1,323 @@
+/**
+ * This file is part of TelepathyQt
+ *
+ * @copyright Copyright (C) 2009-2010 Collabora Ltd. <http://www.collabora.co.uk/>
+ * @copyright Copyright (C) 2009-2010 Nokia Corporation
+ * @license LGPL 2.1
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef _TelepathyQt_abstract_client_h_HEADER_GUARD_
+#define _TelepathyQt_abstract_client_h_HEADER_GUARD_
+
+#ifndef IN_TP_QT_HEADER
+#error IN_TP_QT_HEADER
+#endif
+
+#include <TelepathyQt/Constants>
+#include <TelepathyQt/SharedPtr>
+#include <TelepathyQt/Types>
+
+#include <QList>
+#include <QObject>
+#include <QSharedDataPointer>
+#include <QString>
+#include <QVariantMap>
+
+namespace Tp
+{
+
+class ClientRegistrar;
+class ChannelClassSpecList;
+
+class TP_QT_EXPORT AbstractClient : public RefCounted
+{
+ Q_DISABLE_COPY(AbstractClient)
+
+public:
+ AbstractClient();
+ virtual ~AbstractClient();
+};
+
+class TP_QT_EXPORT AbstractClientObserver : public virtual AbstractClient
+{
+ Q_DISABLE_COPY(AbstractClientObserver)
+
+public:
+ class ObserverInfo
+ {
+ public:
+ ObserverInfo(const QVariantMap &info = QVariantMap());
+ ObserverInfo(const ObserverInfo &other);
+ ~ObserverInfo();
+
+ ObserverInfo &operator=(const ObserverInfo &other);
+
+ bool isRecovering() const { return qdbus_cast<bool>(allInfo().value(QLatin1String("recovering"))); }
+
+ QVariantMap allInfo() const;
+
+ private:
+ struct Private;
+ QSharedDataPointer<Private> mPriv;
+ };
+
+ virtual ~AbstractClientObserver();
+
+ ChannelClassSpecList observerFilter() const;
+
+ bool shouldRecover() const;
+
+ virtual void observeChannels(const MethodInvocationContextPtr<> &context,
+ const AccountPtr &account,
+ const ConnectionPtr &connection,
+ const QList<ChannelPtr> &channels,
+ const ChannelDispatchOperationPtr &dispatchOperation,
+ const QList<ChannelRequestPtr> &requestsSatisfied,
+ const ObserverInfo &observerInfo) = 0;
+
+protected:
+ AbstractClientObserver(const ChannelClassSpecList &channelFilter, bool shouldRecover = false);
+
+private:
+ struct Private;
+ friend struct Private;
+ Private *mPriv;
+};
+
+class TP_QT_EXPORT AbstractClientApprover : public virtual AbstractClient
+{
+ Q_DISABLE_COPY(AbstractClientApprover)
+
+public:
+ virtual ~AbstractClientApprover();
+
+ ChannelClassSpecList approverFilter() const;
+
+ virtual void addDispatchOperation(const MethodInvocationContextPtr<> &context,
+ const ChannelDispatchOperationPtr &dispatchOperation) = 0;
+
+protected:
+ AbstractClientApprover(const ChannelClassSpecList &channelFilter);
+
+private:
+ struct Private;
+ friend struct Private;
+ Private *mPriv;
+};
+
+/*
+ * TODO: use case specific subclasses:
+ * - StreamTubeHandler(QString(List) protocol(s))
+ * - handleTube(DBusTubeChannelPtr, userActionTime)
+ * - DBusTubeHandler(QString(List) serviceName(s))
+ * - handleTube(DBusTubeChannelPtr, userActionTime)
+ */
+class TP_QT_EXPORT AbstractClientHandler : public virtual AbstractClient
+{
+ Q_DISABLE_COPY(AbstractClientHandler)
+
+public:
+ class Capabilities
+ {
+ public:
+ Capabilities(const QStringList &tokens = QStringList());
+ Capabilities(const Capabilities &other);
+ ~Capabilities();
+
+ Capabilities &operator=(const Capabilities &other);
+
+ bool hasGTalkP2PNATTraversalToken() const
+ {
+ return hasToken(TP_QT_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
+ QLatin1String("/gtalk-p2p"));
+ }
+
+ void setGTalkP2PNATTraversalToken()
+ {
+ setToken(TP_QT_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
+ QLatin1String("/gtalk-p2p"));
+ }
+
+ void unsetGTalkP2PNATTraversalToken()
+ {
+ unsetToken(TP_QT_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
+ QLatin1String("/gtalk-p2p"));
+ }
+
+ bool hasICEUDPNATTraversalToken() const
+ {
+ return hasToken(TP_QT_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
+ QLatin1String("/ice-udp"));
+ }
+
+ void setICEUDPNATTraversalToken()
+ {
+ setToken(TP_QT_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
+ QLatin1String("/ice-udp"));
+ }
+
+ void unsetICEUDPNATTraversalToken()
+ {
+ unsetToken(TP_QT_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
+ QLatin1String("/ice-udp"));
+ }
+
+ bool hasWLM85NATTraversalToken() const
+ {
+ return hasToken(TP_QT_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
+ QLatin1String("/wlm-8.5"));
+ }
+
+ void setWLM85NATTraversalToken()
+ {
+ setToken(TP_QT_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
+ QLatin1String("/wlm-8.5"));
+ }
+
+ void unsetWLM85NATTraversalToken()
+ {
+ unsetToken(TP_QT_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
+ QLatin1String("/wlm-8.5"));
+ }
+
+ bool hasWLM2009NATTraversalToken() const
+ {
+ return hasToken(TP_QT_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
+ QLatin1String("/wlm-2009"));
+ }
+
+ void setWLM2009NATTraversalToken()
+ {
+ setToken(TP_QT_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
+ QLatin1String("/wlm-2009"));
+ }
+
+ void unsetWLM2009NATTraversalToken()
+ {
+ unsetToken(TP_QT_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
+ QLatin1String("/wlm-2009"));
+ }
+
+ bool hasAudioCodecToken(const QString &mimeSubType) const
+ {
+ return hasToken(TP_QT_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
+ QLatin1String("/audio/") + mimeSubType.toLower());
+ }
+
+ void setAudioCodecToken(const QString &mimeSubType)
+ {
+ setToken(TP_QT_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
+ QLatin1String("/audio/") + mimeSubType.toLower());
+ }
+
+ void unsetAudioCodecToken(const QString &mimeSubType)
+ {
+ unsetToken(TP_QT_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
+ QLatin1String("/audio/") + mimeSubType.toLower());
+ }
+
+ bool hasVideoCodecToken(const QString &mimeSubType) const
+ {
+ return hasToken(TP_QT_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
+ QLatin1String("/video/") + mimeSubType.toLower());
+ }
+
+ void setVideoCodecToken(const QString &mimeSubType)
+ {
+ setToken(TP_QT_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
+ QLatin1String("/video/") + mimeSubType.toLower());
+ }
+
+ void unsetVideoCodecToken(const QString &mimeSubType)
+ {
+ unsetToken(TP_QT_IFACE_CHANNEL_INTERFACE_MEDIA_SIGNALLING +
+ QLatin1String("/video/") + mimeSubType.toLower());
+ }
+
+ bool hasToken(const QString &token) const;
+ void setToken(const QString &token);
+ void unsetToken(const QString &token);
+
+ QStringList allTokens() const;
+
+ private:
+ struct Private;
+ QSharedDataPointer<Private> mPriv;
+ };
+
+ class HandlerInfo
+ {
+ public:
+ HandlerInfo(const QVariantMap &info = QVariantMap());
+ HandlerInfo(const HandlerInfo &other);
+ ~HandlerInfo();
+
+ HandlerInfo &operator=(const HandlerInfo &other);
+
+ QVariantMap allInfo() const;
+
+ private:
+ struct Private;
+ QSharedDataPointer<Private> mPriv;
+ };
+
+ virtual ~AbstractClientHandler();
+
+ // FIXME (API/ABI break) Move isRegistered/setRegistered to AbstractClient
+ bool isRegistered() const;
+
+ ChannelClassSpecList handlerFilter() const;
+
+ Capabilities handlerCapabilities() const;
+
+ virtual bool bypassApproval() const = 0;
+
+ virtual void handleChannels(const MethodInvocationContextPtr<> &context,
+ const AccountPtr &account,
+ const ConnectionPtr &connection,
+ const QList<ChannelPtr> &channels,
+ const QList<ChannelRequestPtr> &requestsSatisfied,
+ const QDateTime &userActionTime,
+ const HandlerInfo &handlerInfo) = 0;
+
+ bool wantsRequestNotification() const;
+ virtual void addRequest(const ChannelRequestPtr &request);
+ virtual void removeRequest(const ChannelRequestPtr &request,
+ const QString &errorName, const QString &errorMessage);
+
+protected:
+ AbstractClientHandler(const ChannelClassSpecList &channelFilter,
+ const Capabilities &capabilities = Capabilities(),
+ bool wantsRequestNotification = false);
+
+private:
+ friend class ClientRegistrar;
+
+ void setRegistered(bool registered);
+
+ struct Private;
+ friend struct Private;
+ Private *mPriv;
+};
+
+} // Tp
+
+Q_DECLARE_METATYPE(Tp::AbstractClientObserver::ObserverInfo);
+Q_DECLARE_METATYPE(Tp::AbstractClientHandler::Capabilities);
+Q_DECLARE_METATYPE(Tp::AbstractClientHandler::HandlerInfo);
+
+#endif