summaryrefslogtreecommitdiff
path: root/qt4/TelepathyQt4/channel-class-spec.h
diff options
context:
space:
mode:
Diffstat (limited to 'qt4/TelepathyQt4/channel-class-spec.h')
-rw-r--r--qt4/TelepathyQt4/channel-class-spec.h277
1 files changed, 277 insertions, 0 deletions
diff --git a/qt4/TelepathyQt4/channel-class-spec.h b/qt4/TelepathyQt4/channel-class-spec.h
new file mode 100644
index 000000000..5a9595524
--- /dev/null
+++ b/qt4/TelepathyQt4/channel-class-spec.h
@@ -0,0 +1,277 @@
+/**
+ * This file is part of TelepathyQt4
+ *
+ * @copyright Copyright (C) 2010 Collabora Ltd. <http://www.collabora.co.uk/>
+ * @copyright Copyright (C) 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 _TelepathyQt4_channel_class_spec_h_HEADER_GUARD_
+#define _TelepathyQt4_channel_class_spec_h_HEADER_GUARD_
+
+#ifndef IN_TELEPATHY_QT4_HEADER
+#error IN_TELEPATHY_QT4_HEADER
+#endif
+
+#include <TelepathyQt4/Constants>
+#include <TelepathyQt4/Global>
+#include <TelepathyQt4/Types>
+
+#include <QSharedDataPointer>
+#include <QVariant>
+#include <QVariantMap>
+#include <QPair>
+
+namespace Tp
+{
+
+class TELEPATHY_QT4_EXPORT ChannelClassSpec
+{
+public:
+ ChannelClassSpec();
+ ChannelClassSpec(const ChannelClass &cc);
+ ChannelClassSpec(const QVariantMap &props);
+ ChannelClassSpec(const QString &channelType, HandleType targetHandleType,
+ const QVariantMap &otherProperties = QVariantMap());
+ ChannelClassSpec(const QString &channelType, HandleType targetHandleType, bool requested,
+ const QVariantMap &otherProperties = QVariantMap());
+ ChannelClassSpec(const ChannelClassSpec &other,
+ const QVariantMap &additionalProperties = QVariantMap());
+ ~ChannelClassSpec();
+
+ bool isValid() const;
+
+ ChannelClassSpec &operator=(const ChannelClassSpec &other);
+
+ bool operator==(const ChannelClassSpec &other) const
+ {
+ return this->allProperties() == other.allProperties();
+ }
+
+ bool isSubsetOf(const ChannelClassSpec &other) const;
+ bool matches(const QVariantMap &immutableProperties) const;
+
+ // TODO: Use new TP_QT4_... constants
+ QString channelType() const
+ {
+ return qdbus_cast<QString>(
+ property(QLatin1String(TELEPATHY_INTERFACE_CHANNEL ".ChannelType")));
+ }
+
+ void setChannelType(const QString &type)
+ {
+ setProperty(QLatin1String(TELEPATHY_INTERFACE_CHANNEL ".ChannelType"),
+ QVariant::fromValue(type));
+ }
+
+ HandleType targetHandleType() const
+ {
+ return (HandleType) qdbus_cast<uint>(
+ property(
+ QLatin1String(TELEPATHY_INTERFACE_CHANNEL ".TargetHandleType")));
+ }
+
+ void setTargetHandleType(HandleType type)
+ {
+ setProperty(QLatin1String(TELEPATHY_INTERFACE_CHANNEL ".TargetHandleType"),
+ QVariant::fromValue((uint) type));
+ }
+
+ bool hasRequested() const
+ {
+ return hasProperty(QLatin1String(TELEPATHY_INTERFACE_CHANNEL ".Requested"));
+ }
+
+ bool isRequested() const
+ {
+ return qdbus_cast<bool>(
+ property(QLatin1String(TELEPATHY_INTERFACE_CHANNEL ".Requested")));
+ }
+
+ void setRequested(bool requested)
+ {
+ setProperty(QLatin1String(TELEPATHY_INTERFACE_CHANNEL ".Requested"),
+ QVariant::fromValue(requested));
+ }
+
+ void unsetRequested()
+ {
+ unsetProperty(QLatin1String(TELEPATHY_INTERFACE_CHANNEL ".Requested"));
+ }
+
+ bool hasStreamedMediaInitialAudioFlag() const
+ {
+ return qdbus_cast<bool>(
+ property(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAMED_MEDIA
+ ".InitialAudio")));
+ }
+
+ void setStreamedMediaInitialAudioFlag()
+ {
+ setProperty(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAMED_MEDIA ".InitialAudio"),
+ QVariant::fromValue(true));
+ }
+
+ void unsetStreamedMediaInitialAudioFlag()
+ {
+ unsetProperty(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAMED_MEDIA
+ ".InitialAudio"));
+ }
+
+ bool hasStreamedMediaInitialVideoFlag() const
+ {
+ return qdbus_cast<bool>(
+ property(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAMED_MEDIA
+ ".InitialVideo")));
+ }
+
+ void setStreamedMediaInitialVideoFlag()
+ {
+ setProperty(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAMED_MEDIA ".InitialVideo"),
+ QVariant::fromValue(true));
+ }
+
+ void unsetStreamedMediaInitialVideoFlag()
+ {
+ unsetProperty(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAMED_MEDIA
+ ".InitialVideo"));
+ }
+
+ bool hasProperty(const QString &qualifiedName) const;
+ QVariant property(const QString &qualifiedName) const;
+
+ void setProperty(const QString &qualifiedName, const QVariant &value);
+ void unsetProperty(const QString &qualifiedName);
+
+ QVariantMap allProperties() const;
+ ChannelClass bareClass() const;
+
+ static ChannelClassSpec textChat(const QVariantMap &additionalProperties = QVariantMap());
+ static ChannelClassSpec textChatroom(const QVariantMap &additionalProperties = QVariantMap());
+ static ChannelClassSpec unnamedTextChat(const QVariantMap &additionalProperties = QVariantMap());
+
+ static ChannelClassSpec streamedMediaCall(const QVariantMap &additionalProperties = QVariantMap());
+ static ChannelClassSpec streamedMediaAudioCall(const QVariantMap &additionalProperties =
+ QVariantMap());
+ static ChannelClassSpec streamedMediaVideoCall(const QVariantMap &additionalProperties =
+ QVariantMap());
+ static ChannelClassSpec streamedMediaVideoCallWithAudio(const QVariantMap &additionalProperties =
+ QVariantMap());
+
+ static ChannelClassSpec unnamedStreamedMediaCall(const QVariantMap &additionalProperties =
+ QVariantMap());
+ static ChannelClassSpec unnamedStreamedMediaAudioCall(const QVariantMap &additionalProperties =
+ QVariantMap());
+ static ChannelClassSpec unnamedStreamedMediaVideoCall(const QVariantMap &additionalProperties =
+ QVariantMap());
+ static ChannelClassSpec unnamedStreamedMediaVideoCallWithAudio(const QVariantMap &additionalProperties =
+ QVariantMap());
+
+ // TODO: add Call when it's undrafted
+ static ChannelClassSpec roomList(const QVariantMap &additionalProperties = QVariantMap());
+ static ChannelClassSpec outgoingFileTransfer(const QVariantMap &additionalProperties = QVariantMap());
+ static ChannelClassSpec incomingFileTransfer(const QVariantMap &additionalProperties = QVariantMap());
+ static ChannelClassSpec outgoingStreamTube(const QString &service = QString(),
+ const QVariantMap &additionalProperties = QVariantMap());
+ static ChannelClassSpec incomingStreamTube(const QString &service = QString(),
+ const QVariantMap &additionalProperties = QVariantMap());
+ static ChannelClassSpec outgoingRoomStreamTube(const QString &service = QString(),
+ const QVariantMap &additionalProperties = QVariantMap());
+ static ChannelClassSpec incomingRoomStreamTube(const QString &service = QString(),
+ const QVariantMap &additionalProperties = QVariantMap());
+ // TODO: add dbus tubes when they're implemented
+ static ChannelClassSpec contactSearch(const QVariantMap &additionalProperties = QVariantMap());
+
+private:
+ struct Private;
+ friend struct Private;
+ QSharedDataPointer<Private> mPriv;
+};
+
+class TELEPATHY_QT4_EXPORT ChannelClassSpecList :
+ public QList<ChannelClassSpec>
+{
+public:
+ ChannelClassSpecList() { }
+
+ ChannelClassSpecList(const ChannelClassSpec &spec)
+ {
+ append(spec);
+ }
+
+ ChannelClassSpecList(const QList<ChannelClassSpec> &other)
+ : QList<ChannelClassSpec>(other)
+ {
+ }
+
+ ChannelClassSpecList(const ChannelClassList &classes)
+ {
+ // Why doesn't Qt have range constructors like STL... stupid, so stupid.
+ Q_FOREACH (const ChannelClass &cc, classes) {
+ append(cc);
+ }
+ }
+
+ ChannelClassList bareClasses() const
+ {
+ ChannelClassList list;
+ Q_FOREACH (const ChannelClassSpec &spec, *this) {
+ list.append(spec.bareClass());
+ }
+ return list;
+ }
+};
+
+inline uint qHash(const ChannelClassSpec &spec)
+{
+ uint ret = 0;
+ QVariantMap::const_iterator it = spec.allProperties().constBegin();
+ QVariantMap::const_iterator end = spec.allProperties().constEnd();
+ int i = spec.allProperties().size() + 1;
+ for (; it != end; ++it) {
+ // all D-Bus types should be convertible to QString
+ QPair<QString, QString> p(it.key(), it.value().toString());
+ int h = qHash(p);
+ ret ^= ((h << (2 << i)) | (h >> (2 >> i)));
+ i--;
+ }
+ return ret;
+}
+
+inline uint qHash(const QSet<ChannelClassSpec> &specSet)
+{
+ int ret = 0;
+ Q_FOREACH (const ChannelClassSpec &spec, specSet) {
+ int h = qHash(spec);
+ ret ^= h;
+ }
+ return ret;
+}
+
+inline uint qHash(const ChannelClassSpecList &specList)
+{
+ // Make it unique by converting to QSet
+ QSet<ChannelClassSpec> uniqueSet = specList.toSet();
+ return qHash(uniqueSet);
+}
+
+} // Tp
+
+Q_DECLARE_METATYPE(Tp::ChannelClassSpec);
+Q_DECLARE_METATYPE(Tp::ChannelClassSpecList);
+
+#endif