/**
* This file is part of TelepathyQt4
*
* @copyright Copyright (C) 2010 Collabora Ltd.
* @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
*/
#include
#include "TelepathyQt4/_gen/future-constants.h"
#include "TelepathyQt4/debug-internal.h"
namespace Tp
{
struct TELEPATHY_QT4_NO_EXPORT ChannelClassSpec::Private : public QSharedData
{
QVariantMap props;
};
/**
* \class ChannelClassSpec
* \ingroup wrappers
* \headerfile TelepathyQt4/channel-class-spec.h
*
* \brief The ChannelClassSpec class represents a Telepathy channel class.
*/
ChannelClassSpec::ChannelClassSpec()
{
}
ChannelClassSpec::ChannelClassSpec(const ChannelClass &cc)
: mPriv(new Private)
{
foreach (QString key, cc.keys()) {
setProperty(key, cc.value(key).variant());
}
}
ChannelClassSpec::ChannelClassSpec(const QVariantMap &props)
: mPriv(new Private)
{
setChannelType(qdbus_cast(
props.value(TP_QT4_IFACE_CHANNEL + QLatin1String(".ChannelType"))));
setTargetHandleType((HandleType) qdbus_cast(
props.value(TP_QT4_IFACE_CHANNEL + QLatin1String(".TargetHandleType"))));
foreach (QString propName, props.keys()) {
setProperty(propName, props.value(propName));
}
}
ChannelClassSpec::ChannelClassSpec(const QString &channelType, HandleType targetHandleType,
const QVariantMap &otherProperties)
: mPriv(new Private)
{
setChannelType(channelType);
setTargetHandleType(targetHandleType);
foreach (QString key, otherProperties.keys()) {
setProperty(key, otherProperties.value(key));
}
}
ChannelClassSpec::ChannelClassSpec(const QString &channelType, HandleType targetHandleType,
bool requested, const QVariantMap &otherProperties)
: mPriv(new Private)
{
setChannelType(channelType);
setTargetHandleType(targetHandleType);
setRequested(requested);
foreach (QString key, otherProperties.keys()) {
setProperty(key, otherProperties.value(key));
}
}
ChannelClassSpec::ChannelClassSpec(const ChannelClassSpec &other,
const QVariantMap &additionalProperties)
: mPriv(other.mPriv)
{
if (!additionalProperties.isEmpty()) {
foreach (QString key, additionalProperties.keys()) {
setProperty(key, additionalProperties.value(key));
}
}
}
ChannelClassSpec::~ChannelClassSpec()
{
}
bool ChannelClassSpec::isValid() const
{
return mPriv.constData() != 0 &&
!(qdbus_cast(
mPriv->props.value(QLatin1String(TELEPATHY_INTERFACE_CHANNEL ".ChannelType")))
.isEmpty()) &&
mPriv->props.contains(QLatin1String(TELEPATHY_INTERFACE_CHANNEL ".TargetHandleType"));
}
ChannelClassSpec &ChannelClassSpec::operator=(const ChannelClassSpec &other)
{
if (this == &other) {
return *this;
}
this->mPriv = other.mPriv;
return *this;
}
bool ChannelClassSpec::isSubsetOf(const ChannelClassSpec &other) const
{
if (!mPriv) {
// Invalid instances have no properties - hence they're subset of anything
return true;
}
foreach (QString propName, mPriv->props.keys()) {
if (!other.hasProperty(propName)) {
return false;
} else if (property(propName) != other.property(propName)) {
return false;
}
}
// other had all of the properties we have and they all had the same values
return true;
}
bool ChannelClassSpec::matches(const QVariantMap &immutableProperties) const
{
// We construct a ChannelClassSpec for comparison so the StreamedMedia props are normalized
// consistently etc
return this->isSubsetOf(ChannelClassSpec(immutableProperties));
}
bool ChannelClassSpec::hasProperty(const QString &qualifiedName) const
{
return mPriv.constData() != 0 ? mPriv->props.contains(qualifiedName) : false;
}
QVariant ChannelClassSpec::property(const QString &qualifiedName) const
{
return mPriv.constData() != 0 ? mPriv->props.value(qualifiedName) : QVariant();
}
void ChannelClassSpec::setProperty(const QString &qualifiedName, const QVariant &value)
{
if (mPriv.constData() == 0) {
mPriv = new Private;
}
mPriv->props.insert(qualifiedName, value);
}
void ChannelClassSpec::unsetProperty(const QString &qualifiedName)
{
if (mPriv.constData() == 0) {
// No properties set for sure, so don't have to unset any
return;
}
mPriv->props.remove(qualifiedName);
}
QVariantMap ChannelClassSpec::allProperties() const
{
return mPriv.constData() != 0 ? mPriv->props : QVariantMap();
}
ChannelClass ChannelClassSpec::bareClass() const
{
ChannelClass cc;
if (!isValid()) {
warning() << "Tried to convert an invalid ChannelClassSpec to a ChannelClass";
return ChannelClass();
}
QVariantMap props = mPriv->props;
foreach (QString propName, props.keys()) {
QVariant value = props.value(propName);
cc.insert(propName, QDBusVariant(value));
}
return cc;
}
ChannelClassSpec ChannelClassSpec::textChat(const QVariantMap &additionalProperties)
{
static ChannelClassSpec spec;
if (!spec.mPriv.constData()) {
spec = ChannelClassSpec(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_TEXT),
HandleTypeContact);
}
if (additionalProperties.isEmpty()) {
return spec;
} else {
return ChannelClassSpec(spec, additionalProperties);
}
}
ChannelClassSpec ChannelClassSpec::textChatroom(const QVariantMap &additionalProperties)
{
static ChannelClassSpec spec;
if (!spec.mPriv.constData()) {
spec = ChannelClassSpec(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_TEXT),
HandleTypeRoom);
}
if (additionalProperties.isEmpty()) {
return spec;
} else {
return ChannelClassSpec(spec, additionalProperties);
}
}
ChannelClassSpec ChannelClassSpec::unnamedTextChat(const QVariantMap &additionalProperties)
{
static ChannelClassSpec spec;
if (!spec.mPriv.constData()) {
spec = ChannelClassSpec(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_TEXT),
HandleTypeNone);
}
if (additionalProperties.isEmpty()) {
return spec;
} else {
return ChannelClassSpec(spec, additionalProperties);
}
}
ChannelClassSpec ChannelClassSpec::streamedMediaCall(const QVariantMap &additionalProperties)
{
static ChannelClassSpec spec;
if (!spec.mPriv.constData()) {
spec = ChannelClassSpec(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAMED_MEDIA),
HandleTypeContact);
}
if (additionalProperties.isEmpty()) {
return spec;
} else {
return ChannelClassSpec(spec, additionalProperties);
}
}
ChannelClassSpec ChannelClassSpec::streamedMediaAudioCall(const QVariantMap &additionalProperties)
{
static ChannelClassSpec spec;
if (!spec.mPriv.constData()) {
spec = ChannelClassSpec(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAMED_MEDIA),
HandleTypeContact);
spec.setStreamedMediaInitialAudioFlag();
}
if (additionalProperties.isEmpty()) {
return spec;
} else {
return ChannelClassSpec(spec, additionalProperties);
}
}
ChannelClassSpec ChannelClassSpec::streamedMediaVideoCall(const QVariantMap &additionalProperties)
{
static ChannelClassSpec spec;
if (!spec.mPriv.constData()) {
spec = ChannelClassSpec(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAMED_MEDIA),
HandleTypeContact);
spec.setStreamedMediaInitialVideoFlag();
}
if (additionalProperties.isEmpty()) {
return spec;
} else {
return ChannelClassSpec(spec, additionalProperties);
}
}
ChannelClassSpec ChannelClassSpec::streamedMediaVideoCallWithAudio(const QVariantMap &additionalProperties)
{
static ChannelClassSpec spec;
if (!spec.mPriv.constData()) {
spec = ChannelClassSpec(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAMED_MEDIA),
HandleTypeContact);
spec.setStreamedMediaInitialAudioFlag();
spec.setStreamedMediaInitialVideoFlag();
}
if (additionalProperties.isEmpty()) {
return spec;
} else {
return ChannelClassSpec(spec, additionalProperties);
}
}
ChannelClassSpec ChannelClassSpec::unnamedStreamedMediaCall(const QVariantMap &additionalProperties)
{
static ChannelClassSpec spec;
if (!spec.mPriv.constData()) {
spec = ChannelClassSpec(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAMED_MEDIA),
HandleTypeNone);
}
if (additionalProperties.isEmpty()) {
return spec;
} else {
return ChannelClassSpec(spec, additionalProperties);
}
}
ChannelClassSpec ChannelClassSpec::unnamedStreamedMediaAudioCall(const QVariantMap &additionalProperties)
{
static ChannelClassSpec spec;
if (!spec.mPriv.constData()) {
spec = ChannelClassSpec(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAMED_MEDIA),
HandleTypeNone);
spec.setStreamedMediaInitialAudioFlag();
}
if (additionalProperties.isEmpty()) {
return spec;
} else {
return ChannelClassSpec(spec, additionalProperties);
}
}
ChannelClassSpec ChannelClassSpec::unnamedStreamedMediaVideoCall(const QVariantMap &additionalProperties)
{
static ChannelClassSpec spec;
if (!spec.mPriv.constData()) {
spec = ChannelClassSpec(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAMED_MEDIA),
HandleTypeNone);
spec.setStreamedMediaInitialVideoFlag();
}
if (additionalProperties.isEmpty()) {
return spec;
} else {
return ChannelClassSpec(spec, additionalProperties);
}
}
ChannelClassSpec ChannelClassSpec::unnamedStreamedMediaVideoCallWithAudio(const QVariantMap &additionalProperties)
{
static ChannelClassSpec spec;
if (!spec.mPriv.constData()) {
spec = ChannelClassSpec(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAMED_MEDIA),
HandleTypeNone);
spec.setStreamedMediaInitialAudioFlag();
spec.setStreamedMediaInitialVideoFlag();
}
if (additionalProperties.isEmpty()) {
return spec;
} else {
return ChannelClassSpec(spec, additionalProperties);
}
}
ChannelClassSpec ChannelClassSpec::roomList(const QVariantMap &additionalProperties)
{
static ChannelClassSpec spec;
if (!spec.mPriv.constData()) {
spec = ChannelClassSpec(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_ROOM_LIST),
HandleTypeNone);
}
if (additionalProperties.isEmpty()) {
return spec;
} else {
return ChannelClassSpec(spec, additionalProperties);
}
}
ChannelClassSpec ChannelClassSpec::outgoingFileTransfer(const QVariantMap &additionalProperties)
{
static ChannelClassSpec spec;
if (!spec.mPriv.constData()) {
spec = ChannelClassSpec(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_FILE_TRANSFER),
HandleTypeContact, true);
}
if (additionalProperties.isEmpty()) {
return spec;
} else {
return ChannelClassSpec(spec, additionalProperties);
}
}
ChannelClassSpec ChannelClassSpec::incomingFileTransfer(const QVariantMap &additionalProperties)
{
static ChannelClassSpec spec;
if (!spec.mPriv.constData()) {
spec = ChannelClassSpec(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_FILE_TRANSFER),
HandleTypeContact, false);
}
if (additionalProperties.isEmpty()) {
return spec;
} else {
return ChannelClassSpec(spec, additionalProperties);
}
}
ChannelClassSpec ChannelClassSpec::outgoingStreamTube(const QString &service,
const QVariantMap &additionalProperties)
{
static ChannelClassSpec spec;
if (!spec.mPriv.constData()) {
spec = ChannelClassSpec(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAM_TUBE),
HandleTypeContact, true);
}
QVariantMap props = additionalProperties;
if (!service.isEmpty()) {
props.insert(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAM_TUBE ".Service"),
service);
}
if (props.isEmpty()) {
return spec;
} else {
return ChannelClassSpec(spec, props);
}
}
ChannelClassSpec ChannelClassSpec::incomingStreamTube(const QString &service,
const QVariantMap &additionalProperties)
{
static ChannelClassSpec spec;
if (!spec.mPriv.constData()) {
spec = ChannelClassSpec(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAM_TUBE),
HandleTypeContact, false);
}
QVariantMap props = additionalProperties;
if (!service.isEmpty()) {
props.insert(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAM_TUBE ".Service"),
service);
}
if (props.isEmpty()) {
return spec;
} else {
return ChannelClassSpec(spec, props);
}
}
ChannelClassSpec ChannelClassSpec::outgoingRoomStreamTube(const QString &service,
const QVariantMap &additionalProperties)
{
static ChannelClassSpec spec;
if (!spec.mPriv.constData()) {
spec = ChannelClassSpec(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAM_TUBE),
HandleTypeRoom, true);
}
QVariantMap props = additionalProperties;
if (!service.isEmpty()) {
props.insert(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAM_TUBE ".Service"),
service);
}
if (props.isEmpty()) {
return spec;
} else {
return ChannelClassSpec(spec, props);
}
}
ChannelClassSpec ChannelClassSpec::incomingRoomStreamTube(const QString &service,
const QVariantMap &additionalProperties)
{
static ChannelClassSpec spec;
if (!spec.mPriv.constData()) {
spec = ChannelClassSpec(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAM_TUBE),
HandleTypeRoom, false);
}
QVariantMap props = additionalProperties;
if (!service.isEmpty()) {
props.insert(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAM_TUBE ".Service"),
service);
}
if (props.isEmpty()) {
return spec;
} else {
return ChannelClassSpec(spec, props);
}
}
ChannelClassSpec ChannelClassSpec::contactSearch(const QVariantMap &additionalProperties)
{
static ChannelClassSpec spec;
if (!spec.mPriv.constData()) {
spec = ChannelClassSpec(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_CONTACT_SEARCH),
HandleTypeNone);
}
if (additionalProperties.isEmpty()) {
return spec;
} else {
return ChannelClassSpec(spec, additionalProperties);
}
}
/**
* \class ChannelClassSpecList
* \ingroup wrappers
* \headerfile TelepathyQt4/channel-class-spec.h
*
* \brief The ChannelClassSpecList class represents a list of ChannelClassSpec.
*/
} // Tp