/*
 * This file contains D-Bus client proxy classes generated by qt4-client-gen.py.
 *
 * This file can be distributed under the same terms as the specification from
 * which it was generated.
 */

#include <TelepathyQt4/future-internal.h>

#include <QtGlobal>

#include <QString>
#include <QObject>
#include <QVariant>

#include <QDBusPendingReply>

#include <TelepathyQt4/AbstractInterface>
#include <TelepathyQt4/DBusProxy>
#include <TelepathyQt4/Global>

namespace Tp{
class PendingVariant;
class PendingOperation;
}

// FIXME: (API/ABI break) Remove definition of TELEPATHY_GNUC_DEPRECATED

// basically the same as GLib's G_GNUC_DEPRECATED
#ifndef TELEPATHY_GNUC_DEPRECATED
#   if defined(Q_CC_GNUC) && __GNUC__ >= 4
#       define TELEPATHY_GNUC_DEPRECATED __attribute__((__deprecated__))
#   else
#       define TELEPATHY_GNUC_DEPRECATED
#   endif
#endif
namespace TpFuture
{
namespace Client
{

/**
 * \class ChannelInterfaceConferenceInterface
 * \headerfile TelepathyQt4/future-internal.h <TelepathyQt4/future-internal.h>
 *
 * Proxy class providing a 1:1 mapping of the D-Bus interface "org.freedesktop.Telepathy.Channel.Interface.Conference.DRAFT."
 */
class TELEPATHY_QT4_NO_EXPORT ChannelInterfaceConferenceInterface : public Tp::AbstractInterface
{
    Q_OBJECT

public:
    /**
     * Returns the name of the interface "org.freedesktop.Telepathy.Channel.Interface.Conference.DRAFT", which this class
     * represents.
     *
     * \return The D-Bus interface name.
     */
    static inline const char *staticInterfaceName()
    {
        return "org.freedesktop.Telepathy.Channel.Interface.Conference.DRAFT";
    }

    /**
     * Creates a ChannelInterfaceConferenceInterface associated with the given object on the session bus.
     *
     * \param busName Name of the service the object is on.
     * \param objectPath Path to the object on the service.
     * \param parent Passed to the parent class constructor.
     */
    ChannelInterfaceConferenceInterface(
        const QString& busName,
        const QString& objectPath,
        QObject* parent = 0
    );

    /**
     * Creates a ChannelInterfaceConferenceInterface associated with the given object on the given bus.
     *
     * \param connection The bus via which the object can be reached.
     * \param busName Name of the service the object is on.
     * \param objectPath Path to the object on the service.
     * \param parent Passed to the parent class constructor.
     */
    ChannelInterfaceConferenceInterface(
        const QDBusConnection& connection,
        const QString& busName,
        const QString& objectPath,
        QObject* parent = 0
    );

    /**
     * Creates a ChannelInterfaceConferenceInterface associated with the same object as the given proxy.
     *
     * \param proxy The proxy to use. It will also be the QObject::parent()
     *               for this object.
     */
    ChannelInterfaceConferenceInterface(Tp::DBusProxy *proxy);

    /**
     * Creates a ChannelInterfaceConferenceInterface associated with the same object as the given proxy.
     * Additionally, the created proxy will have the same parent as the given
     * proxy.
     *
     * \param mainInterface The proxy to use.
     */
    explicit ChannelInterfaceConferenceInterface(const Tp::Client::ChannelInterface& mainInterface);

    /**
     * Creates a ChannelInterfaceConferenceInterface associated with the same object as the given proxy.
     * However, a different parent object can be specified.
     *
     * \param mainInterface The proxy to use.
     * \param parent Passed to the parent class constructor.
     */
    ChannelInterfaceConferenceInterface(const Tp::Client::ChannelInterface& mainInterface, QObject* parent);

    /**
     * Represents property "Channels" on the remote object.
     * 
     * <p>The individual <tp:dbus-ref namespace="org.freedesktop.Telepathy">Channel</tp:dbus-ref>s that
     *   are continued by this conference, which have the same <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel">ChannelType</tp:dbus-ref> as this one, but with <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel">TargetHandleType</tp:dbus-ref> = CONTACT.</p>
     * 
     * <p>This property MUST NOT be requestable.
     *   <strong>[FIXME: or would it be better for this one, and not IC, to be
     *     requestable?]</strong>
     * </p>
     * 
     * <p>Change notification is via the
     *   <tp:member-ref>ChannelMerged</tp:member-ref> and
     *   <tp:member-ref>ChannelRemoved</tp:member-ref> signals.</p>
     */
    Q_PROPERTY(TpFuture::ObjectPathList Channels READ _deprecated_Channels)

    /**
     * Getter for the remote object property "Channels".
     *
     * Don't use this: it blocks the main loop. Use the asynchronous
     * requestPropertyChannels() instead.
     *
     * \return The value of the property, or a default-constructed value
     *          if the property is not readable.
     */
    inline TELEPATHY_QT4_DEPRECATED TpFuture::ObjectPathList Channels() const
    {
        return _deprecated_Channels();
    }

private:
    inline TpFuture::ObjectPathList _deprecated_Channels() const
    {
        return qvariant_cast<TpFuture::ObjectPathList>(internalPropGet("Channels"));
    }
public:

    /**
     * Asynchronous getter for the remote object property "Channels" of type TpFuture::ObjectPathList.
     *
     * 
     * <p>The individual <tp:dbus-ref namespace="org.freedesktop.Telepathy">Channel</tp:dbus-ref>s that
     *   are continued by this conference, which have the same <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel">ChannelType</tp:dbus-ref> as this one, but with <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel">TargetHandleType</tp:dbus-ref> = CONTACT.</p>
     * 
     * <p>This property MUST NOT be requestable.
     *   <strong>[FIXME: or would it be better for this one, and not IC, to be
     *     requestable?]</strong>
     * </p>
     * 
     * <p>Change notification is via the
     *   <tp:member-ref>ChannelMerged</tp:member-ref> and
     *   <tp:member-ref>ChannelRemoved</tp:member-ref> signals.</p>
     *
     * \return A pending variant which will emit finished when the property has been
     *          retrieved.
     */
    inline Tp::PendingVariant *requestPropertyChannels() const
    {
        return internalRequestProperty(QLatin1String("Channels"));
    }

    /**
     * Represents property "InitialChannels" on the remote object.
     * 
     * <p>The initial value of <tp:member-ref>Channels</tp:member-ref>.</p>
     * 
     * <p>This property SHOULD be requestable. Omitting it from a request is
     *   equivalent to providing it with an empty list as value. Requests
     *   where its value has at least two elements SHOULD be expected to
     *   succeed on any implementation of this interface.</p>
     * 
     * <p>Whether a request with 0 or 1 elements in the list will succeed is
     *   indicated by <tp:member-ref>SupportsNonMerges</tp:member-ref>.</p>
     * 
     * <tp:rationale>
     *   <p>In GSM, a pair of calls can be merged into a conference. In XMPP
     *     and MSN, you can create a new chatroom, or upgrade one 1-1 channel
     *     into a chatroom; however, on these protocols, it is also possible
     *     to fake GSM-style merging by upgrading the first channel, then
     *     inviting the targets of all the other channels into it.</p>
     * </tp:rationale>
     * 
     * <p>If possible, the <tp:member-ref>Channels</tp:member-ref>' states SHOULD
     *   NOT be altered by merging them into a conference. However, depending on
     *   the protocol, the Channels MAY be placed in a &quot;frozen&quot; state by placing
     *   them in this property's value or by calling
     *   <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel.Interface">MergeableConference.DRAFT.Merge</tp:dbus-ref> on them.
     *   <strong>[FIXME: there's nothing in RequestableChannelClasses yet
     *     to say what will happen, see #24906 comment 6]</strong></p>
     * 
     * <tp:rationale>
     *   <p>In Jingle, nothing special will happen to merged calls. UIs MAY
     *     automatically place calls on hold before merging them, if that is
     *     the desired behaviour; this SHOULD always work. Not doing
     *     an implicit hold/unhold seems to preserve least-astonishment.</p>
     * 
     *   <p><strong>[FIXME: check whether ring supports faking Hold on both
     *       channels, as it probably should: see #24906 comment 6]</strong>
     *   </p>
     * 
     *   <p>In GSM, the calls that are merged go into a state similar to
     *     Hold, but they cannot be unheld, only split from the conference
     *     call using <tp:dbus-ref namespace="org.freedesktop.Telepathy">Channel.Interface.Splittable.DRAFT.Split</tp:dbus-ref>.</p>
     * </tp:rationale>
     * 
     * <p>Depending on the protocol, it might be signalled to remote users
     *   that this channel is a continuation of all the requested channels,
     *   or that it is only a continuation of the first channel in the
     *   list.</p>
     * 
     * <tp:rationale>
     *   <p>In MSN, the conference steals the underlying switchboard (protocol
     *     construct) from one of its component channels, so the conference
     *     appears to remote users to be a continuation of that channel and no
     *     other. The connection manager has to make some arbitrary choice, so
     *     we arbitrarily mandate that it SHOULD choose the first channel in
     *     the list as the one to continue.</p>
     * </tp:rationale>
     * 
     * <p>This property is immutable.</p>
     */
    Q_PROPERTY(TpFuture::ObjectPathList InitialChannels READ _deprecated_InitialChannels)

    /**
     * Getter for the remote object property "InitialChannels".
     *
     * Don't use this: it blocks the main loop. Use the asynchronous
     * requestPropertyInitialChannels() instead.
     *
     * \return The value of the property, or a default-constructed value
     *          if the property is not readable.
     */
    inline TELEPATHY_QT4_DEPRECATED TpFuture::ObjectPathList InitialChannels() const
    {
        return _deprecated_InitialChannels();
    }

private:
    inline TpFuture::ObjectPathList _deprecated_InitialChannels() const
    {
        return qvariant_cast<TpFuture::ObjectPathList>(internalPropGet("InitialChannels"));
    }
public:

    /**
     * Asynchronous getter for the remote object property "InitialChannels" of type TpFuture::ObjectPathList.
     *
     * 
     * <p>The initial value of <tp:member-ref>Channels</tp:member-ref>.</p>
     * 
     * <p>This property SHOULD be requestable. Omitting it from a request is
     *   equivalent to providing it with an empty list as value. Requests
     *   where its value has at least two elements SHOULD be expected to
     *   succeed on any implementation of this interface.</p>
     * 
     * <p>Whether a request with 0 or 1 elements in the list will succeed is
     *   indicated by <tp:member-ref>SupportsNonMerges</tp:member-ref>.</p>
     * 
     * <tp:rationale>
     *   <p>In GSM, a pair of calls can be merged into a conference. In XMPP
     *     and MSN, you can create a new chatroom, or upgrade one 1-1 channel
     *     into a chatroom; however, on these protocols, it is also possible
     *     to fake GSM-style merging by upgrading the first channel, then
     *     inviting the targets of all the other channels into it.</p>
     * </tp:rationale>
     * 
     * <p>If possible, the <tp:member-ref>Channels</tp:member-ref>' states SHOULD
     *   NOT be altered by merging them into a conference. However, depending on
     *   the protocol, the Channels MAY be placed in a &quot;frozen&quot; state by placing
     *   them in this property's value or by calling
     *   <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel.Interface">MergeableConference.DRAFT.Merge</tp:dbus-ref> on them.
     *   <strong>[FIXME: there's nothing in RequestableChannelClasses yet
     *     to say what will happen, see #24906 comment 6]</strong></p>
     * 
     * <tp:rationale>
     *   <p>In Jingle, nothing special will happen to merged calls. UIs MAY
     *     automatically place calls on hold before merging them, if that is
     *     the desired behaviour; this SHOULD always work. Not doing
     *     an implicit hold/unhold seems to preserve least-astonishment.</p>
     * 
     *   <p><strong>[FIXME: check whether ring supports faking Hold on both
     *       channels, as it probably should: see #24906 comment 6]</strong>
     *   </p>
     * 
     *   <p>In GSM, the calls that are merged go into a state similar to
     *     Hold, but they cannot be unheld, only split from the conference
     *     call using <tp:dbus-ref namespace="org.freedesktop.Telepathy">Channel.Interface.Splittable.DRAFT.Split</tp:dbus-ref>.</p>
     * </tp:rationale>
     * 
     * <p>Depending on the protocol, it might be signalled to remote users
     *   that this channel is a continuation of all the requested channels,
     *   or that it is only a continuation of the first channel in the
     *   list.</p>
     * 
     * <tp:rationale>
     *   <p>In MSN, the conference steals the underlying switchboard (protocol
     *     construct) from one of its component channels, so the conference
     *     appears to remote users to be a continuation of that channel and no
     *     other. The connection manager has to make some arbitrary choice, so
     *     we arbitrarily mandate that it SHOULD choose the first channel in
     *     the list as the one to continue.</p>
     * </tp:rationale>
     * 
     * <p>This property is immutable.</p>
     *
     * \return A pending variant which will emit finished when the property has been
     *          retrieved.
     */
    inline Tp::PendingVariant *requestPropertyInitialChannels() const
    {
        return internalRequestProperty(QLatin1String("InitialChannels"));
    }

    /**
     * Represents property "InitialInviteeHandles" on the remote object.
     * 
     * <p>A list of additional contacts invited to this conference when it
     *   was created.</p>
     * 
     * <p>This property SHOULD be requestable, and appear in the allowed
     *   properties in <tp:dbus-ref namespace="org.freedesktop.Telepathy.Connection.Interface.Requests">RequestableChannelClasses</tp:dbus-ref>, in all connection
     *   managers that can implement its semantics (in practice, this is
     *   likely to mean exactly those connection managers where
     *   <tp:member-ref>SupportsNonMerges</tp:member-ref> will be true).</p>
     * 
     * <p>If included in a request, the given contacts are automatically
     *   invited into the new channel, as if they had been added with
     *   <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel.Interface">Group.AddMembers</tp:dbus-ref>(InitialInviteeHandles,
     *   <tp:member-ref>InvitationMessage</tp:member-ref>) immediately after
     *   the channel was created.</p>
     * 
     * <tp:rationale>
     *   <p>This is a simple convenience API for the common case that a UI
     *     upgrades a 1-1 chat to a multi-user chat solely in order to invite
     *     someone else to participate.</p>
     * </tp:rationale>
     * 
     * <p>If the local user was not the initiator of this channel, the
     *   <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel.Interface">Group.SelfHandle</tp:dbus-ref> SHOULD appear in the value of this
     *   property, together with any other contacts invited at the same time
     *   (if that information is known).</p>
     * 
     * <p>This property is immutable.</p>
     * 
     * <p>InitialInviteeHandles, InitialInviteeIDs and InitialChannels MAY be
     *   combined in a single request.</p>
     * 
     * <tp:rationale>
     *   <p>For example, if you have a 1-1 channel C1 with Rob, and you want
     *     to invite Sjoerd to join the discussion, you can do so by
     *     requesting a channel with InitialChannels=[C1] and
     *     InitialInviteeHandles=[sjoerd],
     *     or InitialChannels=[C1] and
     *     InitialInviteeIDs=[&quot;sjoerd@example.com&quot;].</p>
     * </tp:rationale>
     * 
     * <p>If a request includes some combination of InitialInviteeHandles,
     *   InitialInviteeIDs and InitialChannels, then the value of
     *   InitialInviteeHandles on the resulting channel SHOULD be the union of
     *   the handles from InitialInviteeHandles, the handles corresponding
     *   to the InitialInviteeIDs, and the target handles of the
     *   InitialChannels, with any duplicate handles removed. Because this
     *   property is immutable, its value SHOULD be computed before the
     *   channel is announced via the NewChannels signal.</p>
     * 
     * <tp:rationale>
     *   <p>This simplifies identification of new channels in clients - they
     *     only have to look at one of the properties, not both. For example,
     *     after either of the requests mentioned above, the NewChannels
     *     signal would announce the channel with InitialChannels=[C1],
     *     InitialInviteeHandles=[rob, sjoerd], and
     *     InitialInviteeIDs=[&quot;rob@example.net&quot;, &quot;sjoerd.example.com&quot;].</p>
     * </tp:rationale>
     */
    Q_PROPERTY(TpFuture::UIntList InitialInviteeHandles READ _deprecated_InitialInviteeHandles)

    /**
     * Getter for the remote object property "InitialInviteeHandles".
     *
     * Don't use this: it blocks the main loop. Use the asynchronous
     * requestPropertyInitialInviteeHandles() instead.
     *
     * \return The value of the property, or a default-constructed value
     *          if the property is not readable.
     */
    inline TELEPATHY_QT4_DEPRECATED TpFuture::UIntList InitialInviteeHandles() const
    {
        return _deprecated_InitialInviteeHandles();
    }

private:
    inline TpFuture::UIntList _deprecated_InitialInviteeHandles() const
    {
        return qvariant_cast<TpFuture::UIntList>(internalPropGet("InitialInviteeHandles"));
    }
public:

    /**
     * Asynchronous getter for the remote object property "InitialInviteeHandles" of type TpFuture::UIntList.
     *
     * 
     * <p>A list of additional contacts invited to this conference when it
     *   was created.</p>
     * 
     * <p>This property SHOULD be requestable, and appear in the allowed
     *   properties in <tp:dbus-ref namespace="org.freedesktop.Telepathy.Connection.Interface.Requests">RequestableChannelClasses</tp:dbus-ref>, in all connection
     *   managers that can implement its semantics (in practice, this is
     *   likely to mean exactly those connection managers where
     *   <tp:member-ref>SupportsNonMerges</tp:member-ref> will be true).</p>
     * 
     * <p>If included in a request, the given contacts are automatically
     *   invited into the new channel, as if they had been added with
     *   <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel.Interface">Group.AddMembers</tp:dbus-ref>(InitialInviteeHandles,
     *   <tp:member-ref>InvitationMessage</tp:member-ref>) immediately after
     *   the channel was created.</p>
     * 
     * <tp:rationale>
     *   <p>This is a simple convenience API for the common case that a UI
     *     upgrades a 1-1 chat to a multi-user chat solely in order to invite
     *     someone else to participate.</p>
     * </tp:rationale>
     * 
     * <p>If the local user was not the initiator of this channel, the
     *   <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel.Interface">Group.SelfHandle</tp:dbus-ref> SHOULD appear in the value of this
     *   property, together with any other contacts invited at the same time
     *   (if that information is known).</p>
     * 
     * <p>This property is immutable.</p>
     * 
     * <p>InitialInviteeHandles, InitialInviteeIDs and InitialChannels MAY be
     *   combined in a single request.</p>
     * 
     * <tp:rationale>
     *   <p>For example, if you have a 1-1 channel C1 with Rob, and you want
     *     to invite Sjoerd to join the discussion, you can do so by
     *     requesting a channel with InitialChannels=[C1] and
     *     InitialInviteeHandles=[sjoerd],
     *     or InitialChannels=[C1] and
     *     InitialInviteeIDs=[&quot;sjoerd@example.com&quot;].</p>
     * </tp:rationale>
     * 
     * <p>If a request includes some combination of InitialInviteeHandles,
     *   InitialInviteeIDs and InitialChannels, then the value of
     *   InitialInviteeHandles on the resulting channel SHOULD be the union of
     *   the handles from InitialInviteeHandles, the handles corresponding
     *   to the InitialInviteeIDs, and the target handles of the
     *   InitialChannels, with any duplicate handles removed. Because this
     *   property is immutable, its value SHOULD be computed before the
     *   channel is announced via the NewChannels signal.</p>
     * 
     * <tp:rationale>
     *   <p>This simplifies identification of new channels in clients - they
     *     only have to look at one of the properties, not both. For example,
     *     after either of the requests mentioned above, the NewChannels
     *     signal would announce the channel with InitialChannels=[C1],
     *     InitialInviteeHandles=[rob, sjoerd], and
     *     InitialInviteeIDs=[&quot;rob@example.net&quot;, &quot;sjoerd.example.com&quot;].</p>
     * </tp:rationale>
     *
     * \return A pending variant which will emit finished when the property has been
     *          retrieved.
     */
    inline Tp::PendingVariant *requestPropertyInitialInviteeHandles() const
    {
        return internalRequestProperty(QLatin1String("InitialInviteeHandles"));
    }

    /**
     * Represents property "InitialInviteeIDs" on the remote object.
     * 
     * <p>A list of additional contacts invited to this conference when it
     *   was created.</p>
     * 
     * <p>This property SHOULD be requestable as an alternative to, or
     *   combined with, <tp:member-ref>InitialInviteeHandles</tp:member-ref>.
     *   Its semantics are the same, except that it takes a list of the
     *   string representations of contact handles; invitations are sent to
     *   any contact present in either or both of these properties.</p>
     * 
     * <p>When a channel is created, the values of InitialInviteeHandles and
     *   InitialInviteeIDs MUST correspond to each other. In particular, this
     *   means that the value of InitialInviteeIDs will include the TargetID
     *   of each channel in InitialChannels, and the ID corresponding to each
     *   handle in InitialInviteeHandles.</p>
     * 
     * <p>This property is immutable.</p>
     */
    Q_PROPERTY(QStringList InitialInviteeIDs READ _deprecated_InitialInviteeIDs)

    /**
     * Getter for the remote object property "InitialInviteeIDs".
     *
     * Don't use this: it blocks the main loop. Use the asynchronous
     * requestPropertyInitialInviteeIDs() instead.
     *
     * \return The value of the property, or a default-constructed value
     *          if the property is not readable.
     */
    inline TELEPATHY_QT4_DEPRECATED QStringList InitialInviteeIDs() const
    {
        return _deprecated_InitialInviteeIDs();
    }

private:
    inline QStringList _deprecated_InitialInviteeIDs() const
    {
        return qvariant_cast<QStringList>(internalPropGet("InitialInviteeIDs"));
    }
public:

    /**
     * Asynchronous getter for the remote object property "InitialInviteeIDs" of type QStringList.
     *
     * 
     * <p>A list of additional contacts invited to this conference when it
     *   was created.</p>
     * 
     * <p>This property SHOULD be requestable as an alternative to, or
     *   combined with, <tp:member-ref>InitialInviteeHandles</tp:member-ref>.
     *   Its semantics are the same, except that it takes a list of the
     *   string representations of contact handles; invitations are sent to
     *   any contact present in either or both of these properties.</p>
     * 
     * <p>When a channel is created, the values of InitialInviteeHandles and
     *   InitialInviteeIDs MUST correspond to each other. In particular, this
     *   means that the value of InitialInviteeIDs will include the TargetID
     *   of each channel in InitialChannels, and the ID corresponding to each
     *   handle in InitialInviteeHandles.</p>
     * 
     * <p>This property is immutable.</p>
     *
     * \return A pending variant which will emit finished when the property has been
     *          retrieved.
     */
    inline Tp::PendingVariant *requestPropertyInitialInviteeIDs() const
    {
        return internalRequestProperty(QLatin1String("InitialInviteeIDs"));
    }

    /**
     * Represents property "InvitationMessage" on the remote object.
     * 
     * <p>The message that was sent to the
     *   <tp:member-ref>InitialInviteeHandles</tp:member-ref> when they were
     *   invited.</p>
     * 
     * <p>This property SHOULD be requestable, and appear in the allowed
     *   properties in <tp:dbus-ref namespace="org.freedesktop.Telepathy.Connection.Interface.Requests">RequestableChannelClasses</tp:dbus-ref>, in protocols where
     *   invitations can have an accompanying text message.</p>
     * 
     * <tp:rationale>
     *   <p>This allows invitations with a message to be sent when using
     *     <tp:member-ref>InitialInviteeHandles</tp:member-ref> or
     *     <tp:member-ref>InitialInviteeIDs</tp:member-ref>.</p>
     * </tp:rationale>
     * 
     * <p>If the local user was not the initiator of this channel, the
     *   message with which they were invited (if any) SHOULD appear in the
     *   value of this property.</p>
     * 
     * <p>This property is immutable.</p>
     */
    Q_PROPERTY(QString InvitationMessage READ _deprecated_InvitationMessage)

    /**
     * Getter for the remote object property "InvitationMessage".
     *
     * Don't use this: it blocks the main loop. Use the asynchronous
     * requestPropertyInvitationMessage() instead.
     *
     * \return The value of the property, or a default-constructed value
     *          if the property is not readable.
     */
    inline TELEPATHY_QT4_DEPRECATED QString InvitationMessage() const
    {
        return _deprecated_InvitationMessage();
    }

private:
    inline QString _deprecated_InvitationMessage() const
    {
        return qvariant_cast<QString>(internalPropGet("InvitationMessage"));
    }
public:

    /**
     * Asynchronous getter for the remote object property "InvitationMessage" of type QString.
     *
     * 
     * <p>The message that was sent to the
     *   <tp:member-ref>InitialInviteeHandles</tp:member-ref> when they were
     *   invited.</p>
     * 
     * <p>This property SHOULD be requestable, and appear in the allowed
     *   properties in <tp:dbus-ref namespace="org.freedesktop.Telepathy.Connection.Interface.Requests">RequestableChannelClasses</tp:dbus-ref>, in protocols where
     *   invitations can have an accompanying text message.</p>
     * 
     * <tp:rationale>
     *   <p>This allows invitations with a message to be sent when using
     *     <tp:member-ref>InitialInviteeHandles</tp:member-ref> or
     *     <tp:member-ref>InitialInviteeIDs</tp:member-ref>.</p>
     * </tp:rationale>
     * 
     * <p>If the local user was not the initiator of this channel, the
     *   message with which they were invited (if any) SHOULD appear in the
     *   value of this property.</p>
     * 
     * <p>This property is immutable.</p>
     *
     * \return A pending variant which will emit finished when the property has been
     *          retrieved.
     */
    inline Tp::PendingVariant *requestPropertyInvitationMessage() const
    {
        return internalRequestProperty(QLatin1String("InvitationMessage"));
    }

    /**
     * Represents property "SupportsNonMerges" on the remote object.
     * 
     * <p><strong>[FIXME: needs a better name; or perhaps it could be implied
     *     by InitialInviteeHandles being requestable in XMPP/MSN but not in
     *     GSM?]</strong></p>
     * 
     * <p>If true, requests with <tp:member-ref>InitialChannels</tp:member-ref>
     *   omitted, empty, or one element long should be expected to succeed.</p>
     * 
     * <p>This property SHOULD appear in <tp:dbus-ref namespace="org.freedesktop.Telepathy.Connection.Interface.Requests">RequestableChannelClasses</tp:dbus-ref> for
     *   conference channels if and only if its value on those channels will
     *   be true.</p>
     * 
     * <tp:rationale>
     *   <p>Putting this in <tp:dbus-ref namespace="org.freedesktop.Telepathy.Connection.Interface.Requests">RequestableChannelClasses</tp:dbus-ref> means clients can find
     *     out whether their request will succeed early enough to do
     *     something about it.</p>
     * 
     *   <p>In XMPP, you can request a channel of type ROOM without
     *     incorporating any 1-1 chats at all - indeed, this is the normal
     *     way to do it - or as a continuation of a single 1-1 chat, and then
     *     invite other people in later.</p>
     * 
     *   <p>The sense of this property is a bit awkward, but it avoids making it
     *     an anti-capability. If the sense were inverted, then its presence in
     *     RequestableChannelClasses would imply that the protocol <em>lacks</em>
     *     a feature; as it stands, it is additive. (Contrast with
     *     <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel.Type.StreamedMedia">ImmutableStreams</tp:dbus-ref>, which is the wrong way around for
     *     backwards-compatibility reasons.)</p>
     * </tp:rationale>
     * 
     * <p>If false, <tp:member-ref>InitialChannels</tp:member-ref> SHOULD be
     *   supplied in all requests for this channel class, and contain at least
     *   two channels. Requests where this requirement is not met SHOULD fail
     *   with NotImplemented.
     * </p>
     * 
     * <tp:rationale>
     *   <p>In GSM, you can only make a conference call by merging at least
     *     two channels.
     *     <strong>[FIXME: the CM could conceivably fake it, but that would be
     *       rather nasty]</strong>
     *   </p>
     * </tp:rationale>
     */
    Q_PROPERTY(bool SupportsNonMerges READ _deprecated_SupportsNonMerges)

    /**
     * Getter for the remote object property "SupportsNonMerges".
     *
     * Don't use this: it blocks the main loop. Use the asynchronous
     * requestPropertySupportsNonMerges() instead.
     *
     * \return The value of the property, or a default-constructed value
     *          if the property is not readable.
     */
    inline TELEPATHY_QT4_DEPRECATED bool SupportsNonMerges() const
    {
        return _deprecated_SupportsNonMerges();
    }

private:
    inline bool _deprecated_SupportsNonMerges() const
    {
        return qvariant_cast<bool>(internalPropGet("SupportsNonMerges"));
    }
public:

    /**
     * Asynchronous getter for the remote object property "SupportsNonMerges" of type bool.
     *
     * 
     * <p><strong>[FIXME: needs a better name; or perhaps it could be implied
     *     by InitialInviteeHandles being requestable in XMPP/MSN but not in
     *     GSM?]</strong></p>
     * 
     * <p>If true, requests with <tp:member-ref>InitialChannels</tp:member-ref>
     *   omitted, empty, or one element long should be expected to succeed.</p>
     * 
     * <p>This property SHOULD appear in <tp:dbus-ref namespace="org.freedesktop.Telepathy.Connection.Interface.Requests">RequestableChannelClasses</tp:dbus-ref> for
     *   conference channels if and only if its value on those channels will
     *   be true.</p>
     * 
     * <tp:rationale>
     *   <p>Putting this in <tp:dbus-ref namespace="org.freedesktop.Telepathy.Connection.Interface.Requests">RequestableChannelClasses</tp:dbus-ref> means clients can find
     *     out whether their request will succeed early enough to do
     *     something about it.</p>
     * 
     *   <p>In XMPP, you can request a channel of type ROOM without
     *     incorporating any 1-1 chats at all - indeed, this is the normal
     *     way to do it - or as a continuation of a single 1-1 chat, and then
     *     invite other people in later.</p>
     * 
     *   <p>The sense of this property is a bit awkward, but it avoids making it
     *     an anti-capability. If the sense were inverted, then its presence in
     *     RequestableChannelClasses would imply that the protocol <em>lacks</em>
     *     a feature; as it stands, it is additive. (Contrast with
     *     <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel.Type.StreamedMedia">ImmutableStreams</tp:dbus-ref>, which is the wrong way around for
     *     backwards-compatibility reasons.)</p>
     * </tp:rationale>
     * 
     * <p>If false, <tp:member-ref>InitialChannels</tp:member-ref> SHOULD be
     *   supplied in all requests for this channel class, and contain at least
     *   two channels. Requests where this requirement is not met SHOULD fail
     *   with NotImplemented.
     * </p>
     * 
     * <tp:rationale>
     *   <p>In GSM, you can only make a conference call by merging at least
     *     two channels.
     *     <strong>[FIXME: the CM could conceivably fake it, but that would be
     *       rather nasty]</strong>
     *   </p>
     * </tp:rationale>
     *
     * \return A pending variant which will emit finished when the property has been
     *          retrieved.
     */
    inline Tp::PendingVariant *requestPropertySupportsNonMerges() const
    {
        return internalRequestProperty(QLatin1String("SupportsNonMerges"));
    }

    /**
     * Request all of the DBus properties on the interface.
     *
     * \return A pending variant map which will emit finished when the properties have
     *          been retrieved.
     */
    Tp::PendingVariantMap *requestAllProperties() const
    {
        return internalRequestAllProperties();
    }

Q_SIGNALS:
    /**
     * Represents the signal "ChannelMerged" on the remote object.
     * 
     * <p>Emitted when a new channel is added to the value of
     *   <tp:member-ref>Channels</tp:member-ref>.</p>
     *
     * \param channel
     *     
     *     The channel that was added to Channels.
     */
    void ChannelMerged(const QDBusObjectPath& channel);

    /**
     * Represents the signal "ChannelRemoved" on the remote object.
     * 
     * <p>Emitted when a channel is removed from the value of
     *   <tp:member-ref>Channels</tp:member-ref>, either because it closed
     *   or because it was split using the <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel.Interface">Splittable.DRAFT.Split</tp:dbus-ref> method.</p>
     * 
     * <p><strong>[FIXME: relative ordering of this vs. Closed? Do we
     *     care?]</strong></p>
     *
     * \param channel
     *     
     *     The channel that was removed from Channels.
     */
    void ChannelRemoved(const QDBusObjectPath& channel);

protected:
    virtual void invalidate(Tp::DBusProxy *, const QString &, const QString &);
};

/**
 * \class ChannelInterfaceMergeableConferenceInterface
 * \headerfile TelepathyQt4/future-internal.h <TelepathyQt4/future-internal.h>
 *
 * Proxy class providing a 1:1 mapping of the D-Bus interface "org.freedesktop.Telepathy.Channel.Interface.MergeableConference.DRAFT."
 */
class TELEPATHY_QT4_NO_EXPORT ChannelInterfaceMergeableConferenceInterface : public Tp::AbstractInterface
{
    Q_OBJECT

public:
    /**
     * Returns the name of the interface "org.freedesktop.Telepathy.Channel.Interface.MergeableConference.DRAFT", which this class
     * represents.
     *
     * \return The D-Bus interface name.
     */
    static inline const char *staticInterfaceName()
    {
        return "org.freedesktop.Telepathy.Channel.Interface.MergeableConference.DRAFT";
    }

    /**
     * Creates a ChannelInterfaceMergeableConferenceInterface associated with the given object on the session bus.
     *
     * \param busName Name of the service the object is on.
     * \param objectPath Path to the object on the service.
     * \param parent Passed to the parent class constructor.
     */
    ChannelInterfaceMergeableConferenceInterface(
        const QString& busName,
        const QString& objectPath,
        QObject* parent = 0
    );

    /**
     * Creates a ChannelInterfaceMergeableConferenceInterface associated with the given object on the given bus.
     *
     * \param connection The bus via which the object can be reached.
     * \param busName Name of the service the object is on.
     * \param objectPath Path to the object on the service.
     * \param parent Passed to the parent class constructor.
     */
    ChannelInterfaceMergeableConferenceInterface(
        const QDBusConnection& connection,
        const QString& busName,
        const QString& objectPath,
        QObject* parent = 0
    );

    /**
     * Creates a ChannelInterfaceMergeableConferenceInterface associated with the same object as the given proxy.
     *
     * \param proxy The proxy to use. It will also be the QObject::parent()
     *               for this object.
     */
    ChannelInterfaceMergeableConferenceInterface(Tp::DBusProxy *proxy);

    /**
     * Creates a ChannelInterfaceMergeableConferenceInterface associated with the same object as the given proxy.
     * Additionally, the created proxy will have the same parent as the given
     * proxy.
     *
     * \param mainInterface The proxy to use.
     */
    explicit ChannelInterfaceMergeableConferenceInterface(const Tp::Client::ChannelInterface& mainInterface);

    /**
     * Creates a ChannelInterfaceMergeableConferenceInterface associated with the same object as the given proxy.
     * However, a different parent object can be specified.
     *
     * \param mainInterface The proxy to use.
     * \param parent Passed to the parent class constructor.
     */
    ChannelInterfaceMergeableConferenceInterface(const Tp::Client::ChannelInterface& mainInterface, QObject* parent);

    /**
     * Request all of the DBus properties on the interface.
     *
     * \return A pending variant map which will emit finished when the properties have
     *          been retrieved.
     */
    Tp::PendingVariantMap *requestAllProperties() const
    {
        return internalRequestAllProperties();
    }

public Q_SLOTS:
    /**
     * Begins a call to the D-Bus method "Merge" on the remote object.
     * 
     * <p>Request that the given channel be incorporated into this
     *   channel.</p>
     * 
     * <p>The given channel SHOULD be added to <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel.Interface">Conference.Channels</tp:dbus-ref> if and only if the
     *   underlying protocol signals the merge in some way. It MUST NOT be
     *   added to <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel.Interface">Conference.InitialChannels</tp:dbus-ref> (to preserve
     *   immutability).</p>
     * 
     * <tp:rationale>
     *   <p>In GSM it is possible to merge additional calls into an ongoing
     *     conference.</p>
     * 
     *   <p>In XMPP this method could be implemented to merge a 1-1 Text
     *     channel into a MUC Text channel by inviting the peer from the Text
     *     channel into the MUC, or to merge a 1-1 Jingle call into a Muji
     *     call by inviting the peer from the Jingle call into the Muji call.
     *     (MUC and Muji channels are both implemented by XMPP MUCs, with
     *     Handle_Type_Room.)</p>
     * </tp:rationale>
     *
     * \param channel
     *     
     *     <p>A channel with the same <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel">ChannelType</tp:dbus-ref>
     *       as this one, but with <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel">TargetHandleType</tp:dbus-ref> = CONTACT.</p>
     */
    inline QDBusPendingReply<> Merge(const QDBusObjectPath& channel)
    {
        if (!invalidationReason().isEmpty()) {
            return QDBusPendingReply<>(QDBusMessage::createError(
                invalidationReason(),
                invalidationMessage()
            ));
        }

        QList<QVariant> argumentList;
        argumentList << QVariant::fromValue(channel);
        return asyncCallWithArgumentList(QLatin1String("Merge"), argumentList);
    }

protected:
    virtual void invalidate(Tp::DBusProxy *, const QString &, const QString &);
};

/**
 * \class ChannelInterfaceSplittableInterface
 * \headerfile TelepathyQt4/future-internal.h <TelepathyQt4/future-internal.h>
 *
 * Proxy class providing a 1:1 mapping of the D-Bus interface "org.freedesktop.Telepathy.Channel.Interface.Splittable.DRAFT."
 */
class TELEPATHY_QT4_NO_EXPORT ChannelInterfaceSplittableInterface : public Tp::AbstractInterface
{
    Q_OBJECT

public:
    /**
     * Returns the name of the interface "org.freedesktop.Telepathy.Channel.Interface.Splittable.DRAFT", which this class
     * represents.
     *
     * \return The D-Bus interface name.
     */
    static inline const char *staticInterfaceName()
    {
        return "org.freedesktop.Telepathy.Channel.Interface.Splittable.DRAFT";
    }

    /**
     * Creates a ChannelInterfaceSplittableInterface associated with the given object on the session bus.
     *
     * \param busName Name of the service the object is on.
     * \param objectPath Path to the object on the service.
     * \param parent Passed to the parent class constructor.
     */
    ChannelInterfaceSplittableInterface(
        const QString& busName,
        const QString& objectPath,
        QObject* parent = 0
    );

    /**
     * Creates a ChannelInterfaceSplittableInterface associated with the given object on the given bus.
     *
     * \param connection The bus via which the object can be reached.
     * \param busName Name of the service the object is on.
     * \param objectPath Path to the object on the service.
     * \param parent Passed to the parent class constructor.
     */
    ChannelInterfaceSplittableInterface(
        const QDBusConnection& connection,
        const QString& busName,
        const QString& objectPath,
        QObject* parent = 0
    );

    /**
     * Creates a ChannelInterfaceSplittableInterface associated with the same object as the given proxy.
     *
     * \param proxy The proxy to use. It will also be the QObject::parent()
     *               for this object.
     */
    ChannelInterfaceSplittableInterface(Tp::DBusProxy *proxy);

    /**
     * Creates a ChannelInterfaceSplittableInterface associated with the same object as the given proxy.
     * Additionally, the created proxy will have the same parent as the given
     * proxy.
     *
     * \param mainInterface The proxy to use.
     */
    explicit ChannelInterfaceSplittableInterface(const Tp::Client::ChannelInterface& mainInterface);

    /**
     * Creates a ChannelInterfaceSplittableInterface associated with the same object as the given proxy.
     * However, a different parent object can be specified.
     *
     * \param mainInterface The proxy to use.
     * \param parent Passed to the parent class constructor.
     */
    ChannelInterfaceSplittableInterface(const Tp::Client::ChannelInterface& mainInterface, QObject* parent);

    /**
     * Request all of the DBus properties on the interface.
     *
     * \return A pending variant map which will emit finished when the properties have
     *          been retrieved.
     */
    Tp::PendingVariantMap *requestAllProperties() const
    {
        return internalRequestAllProperties();
    }

public Q_SLOTS:
    /**
     * Begins a call to the D-Bus method "Split" on the remote object.
     * 
     * <p>Request that this channel is removed from any
     * <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel.Interface">Conference</tp:dbus-ref> of which it is a part.</p>
     * 
     * <p>This implies that the media streams within the conference are put on
     *   hold and the media streams within the member channel leaving the
     *   conference are unheld.</p>
     */
    inline QDBusPendingReply<> Split()
    {
        if (!invalidationReason().isEmpty()) {
            return QDBusPendingReply<>(QDBusMessage::createError(
                invalidationReason(),
                invalidationMessage()
            ));
        }

        return asyncCall(QLatin1String("Split"));
    }

protected:
    virtual void invalidate(Tp::DBusProxy *, const QString &, const QString &);
};

/**
 * \class ChannelTypeCallInterface
 * \headerfile TelepathyQt4/future-internal.h <TelepathyQt4/future-internal.h>
 *
 * Proxy class providing a 1:1 mapping of the D-Bus interface "org.freedesktop.Telepathy.Channel.Type.Call.DRAFT."
 */
class TELEPATHY_QT4_NO_EXPORT ChannelTypeCallInterface : public Tp::AbstractInterface
{
    Q_OBJECT

public:
    /**
     * Returns the name of the interface "org.freedesktop.Telepathy.Channel.Type.Call.DRAFT", which this class
     * represents.
     *
     * \return The D-Bus interface name.
     */
    static inline const char *staticInterfaceName()
    {
        return "org.freedesktop.Telepathy.Channel.Type.Call.DRAFT";
    }

    /**
     * Creates a ChannelTypeCallInterface associated with the given object on the session bus.
     *
     * \param busName Name of the service the object is on.
     * \param objectPath Path to the object on the service.
     * \param parent Passed to the parent class constructor.
     */
    ChannelTypeCallInterface(
        const QString& busName,
        const QString& objectPath,
        QObject* parent = 0
    );

    /**
     * Creates a ChannelTypeCallInterface associated with the given object on the given bus.
     *
     * \param connection The bus via which the object can be reached.
     * \param busName Name of the service the object is on.
     * \param objectPath Path to the object on the service.
     * \param parent Passed to the parent class constructor.
     */
    ChannelTypeCallInterface(
        const QDBusConnection& connection,
        const QString& busName,
        const QString& objectPath,
        QObject* parent = 0
    );

    /**
     * Creates a ChannelTypeCallInterface associated with the same object as the given proxy.
     *
     * \param proxy The proxy to use. It will also be the QObject::parent()
     *               for this object.
     */
    ChannelTypeCallInterface(Tp::DBusProxy *proxy);

    /**
     * Creates a ChannelTypeCallInterface associated with the same object as the given proxy.
     * Additionally, the created proxy will have the same parent as the given
     * proxy.
     *
     * \param mainInterface The proxy to use.
     */
    explicit ChannelTypeCallInterface(const Tp::Client::ChannelInterface& mainInterface);

    /**
     * Creates a ChannelTypeCallInterface associated with the same object as the given proxy.
     * However, a different parent object can be specified.
     *
     * \param mainInterface The proxy to use.
     * \param parent Passed to the parent class constructor.
     */
    ChannelTypeCallInterface(const Tp::Client::ChannelInterface& mainInterface, QObject* parent);

    /**
     * Represents property "Contents" on the remote object.
     * 
     * <p>The list of
     *   <tp:dbus-ref namespace="org.freedesktop.Telepathy.Call">Content.DRAFT</tp:dbus-ref>
     *   objects  that are part of this call. Change notification
     *   is via the <tp:member-ref>ContentAdded</tp:member-ref> and
     *   <tp:member-ref>ContentRemoved</tp:member-ref> signals.
     * </p>
     */
    Q_PROPERTY(TpFuture::ObjectPathList Contents READ _deprecated_Contents)

    /**
     * Getter for the remote object property "Contents".
     *
     * Don't use this: it blocks the main loop. Use the asynchronous
     * requestPropertyContents() instead.
     *
     * \return The value of the property, or a default-constructed value
     *          if the property is not readable.
     */
    inline TELEPATHY_QT4_DEPRECATED TpFuture::ObjectPathList Contents() const
    {
        return _deprecated_Contents();
    }

private:
    inline TpFuture::ObjectPathList _deprecated_Contents() const
    {
        return qvariant_cast<TpFuture::ObjectPathList>(internalPropGet("Contents"));
    }
public:

    /**
     * Asynchronous getter for the remote object property "Contents" of type TpFuture::ObjectPathList.
     *
     * 
     * <p>The list of
     *   <tp:dbus-ref namespace="org.freedesktop.Telepathy.Call">Content.DRAFT</tp:dbus-ref>
     *   objects  that are part of this call. Change notification
     *   is via the <tp:member-ref>ContentAdded</tp:member-ref> and
     *   <tp:member-ref>ContentRemoved</tp:member-ref> signals.
     * </p>
     *
     * \return A pending variant which will emit finished when the property has been
     *          retrieved.
     */
    inline Tp::PendingVariant *requestPropertyContents() const
    {
        return internalRequestProperty(QLatin1String("Contents"));
    }

    /**
     * Represents property "CallStateDetails" on the remote object.
     * 
     * <p>A map used to provide optional extensible details for the
     *   <tp:member-ref>CallState</tp:member-ref>,
     *   <tp:member-ref>CallFlags</tp:member-ref> and/or
     *   <tp:member-ref>CallStateReason</tp:member-ref>.</p>
     * 
     * <p>Well-known keys and their corresponding value types include:</p>
     * 
     * <dl>
     *   <dt>hangup-message - s</dt>
     *   <dd>An optional human-readable message sent when the call was ended,
     *     corresponding to the Message argument to the
     *     <tp:member-ref>Hangup</tp:member-ref> method. This is only
     *     applicable when the call state is Call_State_Ended.
     *     <tp:rationale>
     *       XMPP Jingle can send such messages.
     *     </tp:rationale>
     *   </dd>
     * 
     *   <dt>queue-message - s</dt>
     *   <dd>An optional human-readable message sent when the local contact
     *     is being held in a queue. This is only applicable when
     *     Call_Flag_Queued is in the call flags.
     *     <tp:rationale>
     *       SIP 182 notifications can have human-readable messages attached.
     *     </tp:rationale>
     *   </dd>
     * 
     *   <dt>debug-message - s</dt>
     *   <dd>A message giving further details of any error indicated by the
     *     <tp:member-ref>CallStateReason</tp:member-ref>. This will not
     *     normally be localized or suitable for display to users, and is only
     *     applicable when the call state is Call_State_Ended.</dd>
     * </dl>
     */
    Q_PROPERTY(QVariantMap CallStateDetails READ _deprecated_CallStateDetails)

    /**
     * Getter for the remote object property "CallStateDetails".
     *
     * Don't use this: it blocks the main loop. Use the asynchronous
     * requestPropertyCallStateDetails() instead.
     *
     * \return The value of the property, or a default-constructed value
     *          if the property is not readable.
     */
    inline TELEPATHY_QT4_DEPRECATED QVariantMap CallStateDetails() const
    {
        return _deprecated_CallStateDetails();
    }

private:
    inline QVariantMap _deprecated_CallStateDetails() const
    {
        return qvariant_cast<QVariantMap>(internalPropGet("CallStateDetails"));
    }
public:

    /**
     * Asynchronous getter for the remote object property "CallStateDetails" of type QVariantMap.
     *
     * 
     * <p>A map used to provide optional extensible details for the
     *   <tp:member-ref>CallState</tp:member-ref>,
     *   <tp:member-ref>CallFlags</tp:member-ref> and/or
     *   <tp:member-ref>CallStateReason</tp:member-ref>.</p>
     * 
     * <p>Well-known keys and their corresponding value types include:</p>
     * 
     * <dl>
     *   <dt>hangup-message - s</dt>
     *   <dd>An optional human-readable message sent when the call was ended,
     *     corresponding to the Message argument to the
     *     <tp:member-ref>Hangup</tp:member-ref> method. This is only
     *     applicable when the call state is Call_State_Ended.
     *     <tp:rationale>
     *       XMPP Jingle can send such messages.
     *     </tp:rationale>
     *   </dd>
     * 
     *   <dt>queue-message - s</dt>
     *   <dd>An optional human-readable message sent when the local contact
     *     is being held in a queue. This is only applicable when
     *     Call_Flag_Queued is in the call flags.
     *     <tp:rationale>
     *       SIP 182 notifications can have human-readable messages attached.
     *     </tp:rationale>
     *   </dd>
     * 
     *   <dt>debug-message - s</dt>
     *   <dd>A message giving further details of any error indicated by the
     *     <tp:member-ref>CallStateReason</tp:member-ref>. This will not
     *     normally be localized or suitable for display to users, and is only
     *     applicable when the call state is Call_State_Ended.</dd>
     * </dl>
     *
     * \return A pending variant which will emit finished when the property has been
     *          retrieved.
     */
    inline Tp::PendingVariant *requestPropertyCallStateDetails() const
    {
        return internalRequestProperty(QLatin1String("CallStateDetails"));
    }

    /**
     * Represents property "CallState" on the remote object.
     * 
     * <p>The current high-level state of this call. The
     *   <tp:member-ref>CallFlags</tp:member-ref> provide additional
     *   information, and the <tp:member-ref>CallStateReason</tp:member-ref>
     *   and <tp:member-ref>CallStateDetails</tp:member-ref> explain the
     *   reason for the current values for those properties.</p>
     * 
     * <p>Clients MAY consider unknown values in this property to be an
     *   error.</p>
     */
    Q_PROPERTY(uint CallState READ _deprecated_CallState)

    /**
     * Getter for the remote object property "CallState".
     *
     * Don't use this: it blocks the main loop. Use the asynchronous
     * requestPropertyCallState() instead.
     *
     * \return The value of the property, or a default-constructed value
     *          if the property is not readable.
     */
    inline TELEPATHY_QT4_DEPRECATED uint CallState() const
    {
        return _deprecated_CallState();
    }

private:
    inline uint _deprecated_CallState() const
    {
        return qvariant_cast<uint>(internalPropGet("CallState"));
    }
public:

    /**
     * Asynchronous getter for the remote object property "CallState" of type uint.
     *
     * 
     * <p>The current high-level state of this call. The
     *   <tp:member-ref>CallFlags</tp:member-ref> provide additional
     *   information, and the <tp:member-ref>CallStateReason</tp:member-ref>
     *   and <tp:member-ref>CallStateDetails</tp:member-ref> explain the
     *   reason for the current values for those properties.</p>
     * 
     * <p>Clients MAY consider unknown values in this property to be an
     *   error.</p>
     *
     * \return A pending variant which will emit finished when the property has been
     *          retrieved.
     */
    inline Tp::PendingVariant *requestPropertyCallState() const
    {
        return internalRequestProperty(QLatin1String("CallState"));
    }

    /**
     * Represents property "CallFlags" on the remote object.
     * 
     * <p>Flags representing the status of the call as a whole,
     *   providing more specific information than the
     *   <tp:member-ref>CallState</tp:member-ref>.</p>
     * 
     * <p>Clients are expected to ignore unknown flags in this property,
     *   without error.</p>
     */
    Q_PROPERTY(uint CallFlags READ _deprecated_CallFlags)

    /**
     * Getter for the remote object property "CallFlags".
     *
     * Don't use this: it blocks the main loop. Use the asynchronous
     * requestPropertyCallFlags() instead.
     *
     * \return The value of the property, or a default-constructed value
     *          if the property is not readable.
     */
    inline TELEPATHY_QT4_DEPRECATED uint CallFlags() const
    {
        return _deprecated_CallFlags();
    }

private:
    inline uint _deprecated_CallFlags() const
    {
        return qvariant_cast<uint>(internalPropGet("CallFlags"));
    }
public:

    /**
     * Asynchronous getter for the remote object property "CallFlags" of type uint.
     *
     * 
     * <p>Flags representing the status of the call as a whole,
     *   providing more specific information than the
     *   <tp:member-ref>CallState</tp:member-ref>.</p>
     * 
     * <p>Clients are expected to ignore unknown flags in this property,
     *   without error.</p>
     *
     * \return A pending variant which will emit finished when the property has been
     *          retrieved.
     */
    inline Tp::PendingVariant *requestPropertyCallFlags() const
    {
        return internalRequestProperty(QLatin1String("CallFlags"));
    }

    /**
     * Represents property "CallStateReason" on the remote object.
     * 
     * <p>The reason for the last change to the
     *   <tp:member-ref>CallState</tp:member-ref> and/or
     *   <tp:member-ref>CallFlags</tp:member-ref>. The
     *   <tp:member-ref>CallStateDetails</tp:member-ref> MAY provide additional
     *   information.</p>
     */
    Q_PROPERTY(TpFuture::CallStateReason CallStateReason READ _deprecated_CallStateReason)

    /**
     * Getter for the remote object property "CallStateReason".
     *
     * Don't use this: it blocks the main loop. Use the asynchronous
     * requestPropertyCallStateReason() instead.
     *
     * \return The value of the property, or a default-constructed value
     *          if the property is not readable.
     */
    inline TELEPATHY_QT4_DEPRECATED TpFuture::CallStateReason CallStateReason() const
    {
        return _deprecated_CallStateReason();
    }

private:
    inline TpFuture::CallStateReason _deprecated_CallStateReason() const
    {
        return qvariant_cast<TpFuture::CallStateReason>(internalPropGet("CallStateReason"));
    }
public:

    /**
     * Asynchronous getter for the remote object property "CallStateReason" of type TpFuture::CallStateReason.
     *
     * 
     * <p>The reason for the last change to the
     *   <tp:member-ref>CallState</tp:member-ref> and/or
     *   <tp:member-ref>CallFlags</tp:member-ref>. The
     *   <tp:member-ref>CallStateDetails</tp:member-ref> MAY provide additional
     *   information.</p>
     *
     * \return A pending variant which will emit finished when the property has been
     *          retrieved.
     */
    inline Tp::PendingVariant *requestPropertyCallStateReason() const
    {
        return internalRequestProperty(QLatin1String("CallStateReason"));
    }

    /**
     * Represents property "HardwareStreaming" on the remote object.
     * 
     * <p>If this property is TRUE, all of the media streaming is done by some
     *   mechanism outside the scope of Telepathy.</p>
     * 
     * <tp:rationale>
     *   <p>A connection manager might be intended for a specialized hardware
     *     device, which will take care of the audio streaming (e.g.
     *     telepathy-yafono, which uses GSM hardware which does the actual
     *     audio streaming for the call).</p>
     * </tp:rationale>
     * 
     * <p>If this is FALSE, the handler is responsible for doing the actual
     *   media streaming for at least some contents itself. Those contents
     *   will have the <tp:dbus-ref namespace="org.freedesktop.Telepathy.Call.Content.Interface">Media.DRAFT</tp:dbus-ref> interface, to communicate the necessary
     *   information to a streaming implementation. Connection managers SHOULD
     *   operate like this, if possible.</p>
     * 
     * <tp:rationale>
     *   <p>Many connection managers (such as telepathy-gabble) only do the
     *     call signalling, and expect the client to do the actual streaming
     *     using something like
     *     <a href="http://farsight.freedesktop.org/">Farsight</a>, to improve
     *     latency and allow better UI integration.</p>
     * </tp:rationale>
     */
    Q_PROPERTY(bool HardwareStreaming READ _deprecated_HardwareStreaming)

    /**
     * Getter for the remote object property "HardwareStreaming".
     *
     * Don't use this: it blocks the main loop. Use the asynchronous
     * requestPropertyHardwareStreaming() instead.
     *
     * \return The value of the property, or a default-constructed value
     *          if the property is not readable.
     */
    inline TELEPATHY_QT4_DEPRECATED bool HardwareStreaming() const
    {
        return _deprecated_HardwareStreaming();
    }

private:
    inline bool _deprecated_HardwareStreaming() const
    {
        return qvariant_cast<bool>(internalPropGet("HardwareStreaming"));
    }
public:

    /**
     * Asynchronous getter for the remote object property "HardwareStreaming" of type bool.
     *
     * 
     * <p>If this property is TRUE, all of the media streaming is done by some
     *   mechanism outside the scope of Telepathy.</p>
     * 
     * <tp:rationale>
     *   <p>A connection manager might be intended for a specialized hardware
     *     device, which will take care of the audio streaming (e.g.
     *     telepathy-yafono, which uses GSM hardware which does the actual
     *     audio streaming for the call).</p>
     * </tp:rationale>
     * 
     * <p>If this is FALSE, the handler is responsible for doing the actual
     *   media streaming for at least some contents itself. Those contents
     *   will have the <tp:dbus-ref namespace="org.freedesktop.Telepathy.Call.Content.Interface">Media.DRAFT</tp:dbus-ref> interface, to communicate the necessary
     *   information to a streaming implementation. Connection managers SHOULD
     *   operate like this, if possible.</p>
     * 
     * <tp:rationale>
     *   <p>Many connection managers (such as telepathy-gabble) only do the
     *     call signalling, and expect the client to do the actual streaming
     *     using something like
     *     <a href="http://farsight.freedesktop.org/">Farsight</a>, to improve
     *     latency and allow better UI integration.</p>
     * </tp:rationale>
     *
     * \return A pending variant which will emit finished when the property has been
     *          retrieved.
     */
    inline Tp::PendingVariant *requestPropertyHardwareStreaming() const
    {
        return internalRequestProperty(QLatin1String("HardwareStreaming"));
    }

    /**
     * Represents property "CallMembers" on the remote object.
     * 
     * A mapping from the remote contacts that are part of this call to flags
     * discribing their status. This mapping never has the local user's handle
     * as a key.
     */
    Q_PROPERTY(TpFuture::CallMemberMap CallMembers READ _deprecated_CallMembers)

    /**
     * Getter for the remote object property "CallMembers".
     *
     * Don't use this: it blocks the main loop. Use the asynchronous
     * requestPropertyCallMembers() instead.
     *
     * \return The value of the property, or a default-constructed value
     *          if the property is not readable.
     */
    inline TELEPATHY_QT4_DEPRECATED TpFuture::CallMemberMap CallMembers() const
    {
        return _deprecated_CallMembers();
    }

private:
    inline TpFuture::CallMemberMap _deprecated_CallMembers() const
    {
        return qvariant_cast<TpFuture::CallMemberMap>(internalPropGet("CallMembers"));
    }
public:

    /**
     * Asynchronous getter for the remote object property "CallMembers" of type TpFuture::CallMemberMap.
     *
     * 
     * A mapping from the remote contacts that are part of this call to flags
     * discribing their status. This mapping never has the local user's handle
     * as a key.
     *
     * \return A pending variant which will emit finished when the property has been
     *          retrieved.
     */
    inline Tp::PendingVariant *requestPropertyCallMembers() const
    {
        return internalRequestProperty(QLatin1String("CallMembers"));
    }

    /**
     * Represents property "InitialTransport" on the remote object.
     * 
     * <p>
     *   If set on a requested channel this indicates the transport that
     *   should be used for this call.
     *   <tp:rationale>
     *     When implementing a voip gateway one wants the outgoing leg of the
     *     gatewayed to have the same transport as the incoming leg. This
     *     property allows the gateway to request a Call with the right
     *     transport from the CM.
     *   </tp:rationale>
     * </p>
     */
    Q_PROPERTY(QString InitialTransport READ _deprecated_InitialTransport)

    /**
     * Getter for the remote object property "InitialTransport".
     *
     * Don't use this: it blocks the main loop. Use the asynchronous
     * requestPropertyInitialTransport() instead.
     *
     * \return The value of the property, or a default-constructed value
     *          if the property is not readable.
     */
    inline TELEPATHY_QT4_DEPRECATED QString InitialTransport() const
    {
        return _deprecated_InitialTransport();
    }

private:
    inline QString _deprecated_InitialTransport() const
    {
        return qvariant_cast<QString>(internalPropGet("InitialTransport"));
    }
public:

    /**
     * Asynchronous getter for the remote object property "InitialTransport" of type QString.
     *
     * 
     * <p>
     *   If set on a requested channel this indicates the transport that
     *   should be used for this call.
     *   <tp:rationale>
     *     When implementing a voip gateway one wants the outgoing leg of the
     *     gatewayed to have the same transport as the incoming leg. This
     *     property allows the gateway to request a Call with the right
     *     transport from the CM.
     *   </tp:rationale>
     * </p>
     *
     * \return A pending variant which will emit finished when the property has been
     *          retrieved.
     */
    inline Tp::PendingVariant *requestPropertyInitialTransport() const
    {
        return internalRequestProperty(QLatin1String("InitialTransport"));
    }

    /**
     * Represents property "InitialAudio" on the remote object.
     * 
     * <p>If set to true in a channel request that will create a new channel,
     *   the connection manager should immediately attempt to establish an
     *   audio stream to the remote contact, making it unnecessary for the
     *   client to call
     *   <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel.Type.Call.DRAFT">AddContent</tp:dbus-ref>.
     *   </p>
     * 
     * <p>If this property, or InitialVideo, is passed to EnsureChannel
     *   (as opposed to CreateChannel), the connection manager SHOULD ignore
     *   these properties when checking whether it can return an existing
     *   channel as suitable; these properties only become significant when
     *   the connection manager has decided to create a new channel.</p>
     * 
     * <p>If true on a requested channel, this indicates that the audio
     *   stream has already been requested and the client does not need to
     *   call RequestStreams, although it MAY still do so.</p>
     * 
     * <p>If true on an unrequested (incoming) channel, this indicates that
     *   the remote contact initially requested an audio stream; this does
     *   not imply that that audio stream is still active (as indicated by
     *   <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel.Type.Call.DRAFT">Contents</tp:dbus-ref>).</p>
     * 
     * <p>This property is immutable (cannot change), and therefore SHOULD
     *   appear wherever immutable properties are reported, e.g. <tp:dbus-ref namespace="org.freedesktop.Telepathy.Connection.Interface.Requests">NewChannels</tp:dbus-ref>
     *   signals.</p>
     * 
     * <tp:rationale><p>This reduces D-Bus round trips.</p></tp:rationale>
     * 
     * <p>Connection managers that support the <tp:dbus-ref namespace="org.freedesktop.Telepathy.Connection.Interface">ContactCapabilities</tp:dbus-ref>
     *   interface SHOULD represent the capabilities of receiving audio
     *   and/or video calls by including a channel class in
     *   a contact's capabilities with ChannelType = Call
     *   in the fixed properties dictionary, and InitialAudio and/or
     *   InitialVideo in the allowed properties list. Clients wishing to
     *   discover whether a particular contact is likely to be able to
     *   receive audio and/or video calls SHOULD use this information.</p>
     * 
     * <tp:rationale>
     *   <p>Not all clients support video calls, and it would also be
     *     possible (although unlikely) to have a client which could only
     *     stream video, not audio.</p>
     * </tp:rationale>
     * 
     * <p>Clients that are willing to receive audio and/or video calls
     *   SHOULD include the following among their channel classes if
     *   calling <tp:dbus-ref namespace="org.freedesktop.Telepathy.Connection.Interface.ContactCapabilities">UpdateCapabilities</tp:dbus-ref>
     *   (clients of a <tp:dbus-ref namespace="org.freedesktop.Telepathy">ChannelDispatcher</tp:dbus-ref>
     *   SHOULD instead arrange for the ChannelDispatcher to do this,
     *   by including the filters in their <tp:dbus-ref namespace="org.freedesktop.Telepathy.Client.Handler">HandlerChannelFilter</tp:dbus-ref>
     *   properties):</p>
     * 
     * <ul>
     *   <li>{ ChannelType = Call }</li>
     *   <li>{ ChannelType = Call, InitialAudio = true }
     *     if receiving calls with audio is supported</li>
     *   <li>{ ChannelType = Call, InitialVideo = true }
     *     if receiving calls with video is supported</li>
     * </ul>
     * 
     * <tp:rationale>
     *   <p>Connection managers for protocols with capability discovery,
     *     like XMPP, need this information to advertise the appropriate
     *     capabilities for their protocol.</p>
     * </tp:rationale>
     */
    Q_PROPERTY(bool InitialAudio READ _deprecated_InitialAudio)

    /**
     * Getter for the remote object property "InitialAudio".
     *
     * Don't use this: it blocks the main loop. Use the asynchronous
     * requestPropertyInitialAudio() instead.
     *
     * \return The value of the property, or a default-constructed value
     *          if the property is not readable.
     */
    inline TELEPATHY_QT4_DEPRECATED bool InitialAudio() const
    {
        return _deprecated_InitialAudio();
    }

private:
    inline bool _deprecated_InitialAudio() const
    {
        return qvariant_cast<bool>(internalPropGet("InitialAudio"));
    }
public:

    /**
     * Asynchronous getter for the remote object property "InitialAudio" of type bool.
     *
     * 
     * <p>If set to true in a channel request that will create a new channel,
     *   the connection manager should immediately attempt to establish an
     *   audio stream to the remote contact, making it unnecessary for the
     *   client to call
     *   <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel.Type.Call.DRAFT">AddContent</tp:dbus-ref>.
     *   </p>
     * 
     * <p>If this property, or InitialVideo, is passed to EnsureChannel
     *   (as opposed to CreateChannel), the connection manager SHOULD ignore
     *   these properties when checking whether it can return an existing
     *   channel as suitable; these properties only become significant when
     *   the connection manager has decided to create a new channel.</p>
     * 
     * <p>If true on a requested channel, this indicates that the audio
     *   stream has already been requested and the client does not need to
     *   call RequestStreams, although it MAY still do so.</p>
     * 
     * <p>If true on an unrequested (incoming) channel, this indicates that
     *   the remote contact initially requested an audio stream; this does
     *   not imply that that audio stream is still active (as indicated by
     *   <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel.Type.Call.DRAFT">Contents</tp:dbus-ref>).</p>
     * 
     * <p>This property is immutable (cannot change), and therefore SHOULD
     *   appear wherever immutable properties are reported, e.g. <tp:dbus-ref namespace="org.freedesktop.Telepathy.Connection.Interface.Requests">NewChannels</tp:dbus-ref>
     *   signals.</p>
     * 
     * <tp:rationale><p>This reduces D-Bus round trips.</p></tp:rationale>
     * 
     * <p>Connection managers that support the <tp:dbus-ref namespace="org.freedesktop.Telepathy.Connection.Interface">ContactCapabilities</tp:dbus-ref>
     *   interface SHOULD represent the capabilities of receiving audio
     *   and/or video calls by including a channel class in
     *   a contact's capabilities with ChannelType = Call
     *   in the fixed properties dictionary, and InitialAudio and/or
     *   InitialVideo in the allowed properties list. Clients wishing to
     *   discover whether a particular contact is likely to be able to
     *   receive audio and/or video calls SHOULD use this information.</p>
     * 
     * <tp:rationale>
     *   <p>Not all clients support video calls, and it would also be
     *     possible (although unlikely) to have a client which could only
     *     stream video, not audio.</p>
     * </tp:rationale>
     * 
     * <p>Clients that are willing to receive audio and/or video calls
     *   SHOULD include the following among their channel classes if
     *   calling <tp:dbus-ref namespace="org.freedesktop.Telepathy.Connection.Interface.ContactCapabilities">UpdateCapabilities</tp:dbus-ref>
     *   (clients of a <tp:dbus-ref namespace="org.freedesktop.Telepathy">ChannelDispatcher</tp:dbus-ref>
     *   SHOULD instead arrange for the ChannelDispatcher to do this,
     *   by including the filters in their <tp:dbus-ref namespace="org.freedesktop.Telepathy.Client.Handler">HandlerChannelFilter</tp:dbus-ref>
     *   properties):</p>
     * 
     * <ul>
     *   <li>{ ChannelType = Call }</li>
     *   <li>{ ChannelType = Call, InitialAudio = true }
     *     if receiving calls with audio is supported</li>
     *   <li>{ ChannelType = Call, InitialVideo = true }
     *     if receiving calls with video is supported</li>
     * </ul>
     * 
     * <tp:rationale>
     *   <p>Connection managers for protocols with capability discovery,
     *     like XMPP, need this information to advertise the appropriate
     *     capabilities for their protocol.</p>
     * </tp:rationale>
     *
     * \return A pending variant which will emit finished when the property has been
     *          retrieved.
     */
    inline Tp::PendingVariant *requestPropertyInitialAudio() const
    {
        return internalRequestProperty(QLatin1String("InitialAudio"));
    }

    /**
     * Represents property "InitialVideo" on the remote object.
     * 
     * <p>The same as <tp:member-ref>InitialAudio</tp:member-ref>, but for
     *   a video stream. This property is immutable (cannot change).</p>
     * 
     * <p>In particular, note that if this property is false, this does not
     *   imply that an active video stream has not been added, only that no
     *   video stream was active at the time the channel appeared.</p>
     * 
     * <p>This property is the correct way to discover whether connection
     *   managers, contacts etc. support video calls; it appears in
     *   capabilities structures in the same way as InitialAudio.</p>
     */
    Q_PROPERTY(bool InitialVideo READ _deprecated_InitialVideo)

    /**
     * Getter for the remote object property "InitialVideo".
     *
     * Don't use this: it blocks the main loop. Use the asynchronous
     * requestPropertyInitialVideo() instead.
     *
     * \return The value of the property, or a default-constructed value
     *          if the property is not readable.
     */
    inline TELEPATHY_QT4_DEPRECATED bool InitialVideo() const
    {
        return _deprecated_InitialVideo();
    }

private:
    inline bool _deprecated_InitialVideo() const
    {
        return qvariant_cast<bool>(internalPropGet("InitialVideo"));
    }
public:

    /**
     * Asynchronous getter for the remote object property "InitialVideo" of type bool.
     *
     * 
     * <p>The same as <tp:member-ref>InitialAudio</tp:member-ref>, but for
     *   a video stream. This property is immutable (cannot change).</p>
     * 
     * <p>In particular, note that if this property is false, this does not
     *   imply that an active video stream has not been added, only that no
     *   video stream was active at the time the channel appeared.</p>
     * 
     * <p>This property is the correct way to discover whether connection
     *   managers, contacts etc. support video calls; it appears in
     *   capabilities structures in the same way as InitialAudio.</p>
     *
     * \return A pending variant which will emit finished when the property has been
     *          retrieved.
     */
    inline Tp::PendingVariant *requestPropertyInitialVideo() const
    {
        return internalRequestProperty(QLatin1String("InitialVideo"));
    }

    /**
     * Represents property "MutableContents" on the remote object.
     * 
     * <p>If <tt>True</tt>, a stream of a different content type can be added
     * after the Channel has been requested </p>
     * 
     * <p>If this property is missing, clients SHOULD assume that it is false,
     *   and thus that the channel's streams cannot be changed once the call
     *   has started.</p>
     * 
     * <p>If this property isn't present in the &quot;allowed&quot; set in any of the
     *   Call entries contact capabilities, then user interfaces MAY choose to
     *   show a separate &quot;call&quot; option for each class of call.</p>
     * 
     *   <tp:rationale>
     *     <p>For example, once an audio-only Google Talk call has started,
     *       it is not possible to add a video stream; both audio and video
     *       must be requested at the start of the call if video is desired.
     *       User interfaces may use this pseudo-capability as a hint to
     *       display separate &quot;Audio call&quot; and &quot;Video call&quot; buttons, rather
     *       than a single &quot;Call&quot; button with the option to add and remove
     *       video once the call has started for contacts without this flag.
     *     </p>
     *   </tp:rationale>
     * 
     * <p>This property is immutable, and therefore SHOULD be announced
     *   in <tp:dbus-ref namespace="org.freedesktop.Telepathy.Connection.Interface.Requests">NewChannels</tp:dbus-ref>,
     *   etc.</p>
     */
    Q_PROPERTY(bool MutableContents READ _deprecated_MutableContents)

    /**
     * Getter for the remote object property "MutableContents".
     *
     * Don't use this: it blocks the main loop. Use the asynchronous
     * requestPropertyMutableContents() instead.
     *
     * \return The value of the property, or a default-constructed value
     *          if the property is not readable.
     */
    inline TELEPATHY_QT4_DEPRECATED bool MutableContents() const
    {
        return _deprecated_MutableContents();
    }

private:
    inline bool _deprecated_MutableContents() const
    {
        return qvariant_cast<bool>(internalPropGet("MutableContents"));
    }
public:

    /**
     * Asynchronous getter for the remote object property "MutableContents" of type bool.
     *
     * 
     * <p>If <tt>True</tt>, a stream of a different content type can be added
     * after the Channel has been requested </p>
     * 
     * <p>If this property is missing, clients SHOULD assume that it is false,
     *   and thus that the channel's streams cannot be changed once the call
     *   has started.</p>
     * 
     * <p>If this property isn't present in the &quot;allowed&quot; set in any of the
     *   Call entries contact capabilities, then user interfaces MAY choose to
     *   show a separate &quot;call&quot; option for each class of call.</p>
     * 
     *   <tp:rationale>
     *     <p>For example, once an audio-only Google Talk call has started,
     *       it is not possible to add a video stream; both audio and video
     *       must be requested at the start of the call if video is desired.
     *       User interfaces may use this pseudo-capability as a hint to
     *       display separate &quot;Audio call&quot; and &quot;Video call&quot; buttons, rather
     *       than a single &quot;Call&quot; button with the option to add and remove
     *       video once the call has started for contacts without this flag.
     *     </p>
     *   </tp:rationale>
     * 
     * <p>This property is immutable, and therefore SHOULD be announced
     *   in <tp:dbus-ref namespace="org.freedesktop.Telepathy.Connection.Interface.Requests">NewChannels</tp:dbus-ref>,
     *   etc.</p>
     *
     * \return A pending variant which will emit finished when the property has been
     *          retrieved.
     */
    inline Tp::PendingVariant *requestPropertyMutableContents() const
    {
        return internalRequestProperty(QLatin1String("MutableContents"));
    }

    /**
     * Request all of the DBus properties on the interface.
     *
     * \return A pending variant map which will emit finished when the properties have
     *          been retrieved.
     */
    Tp::PendingVariantMap *requestAllProperties() const
    {
        return internalRequestAllProperties();
    }

public Q_SLOTS:
    /**
     * Begins a call to the D-Bus method "Ringing" on the remote object.
     * 
     * <p>Indicate that the local user has been alerted about the incoming
     *   call.</p>
     * 
     * <p>This method is only useful if the channel's
     *   <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel">Requested</tp:dbus-ref> property is false, and the
     *   <tp:member-ref>CallState</tp:member-ref> is
     *   Call_State_Pending_Receiver. While this is the case,
     *   this method SHOULD change the
     *   <tp:member-ref>CallFlags</tp:member-ref> to include
     *   Call_Flag_Ringing, and notify the remote contact that the local
     *   user has been alerted (if the protocol implements this); repeated
     *   calls to this method SHOULD succeed, but have no further effect.</p>
     * 
     * <p>In all other states, this method SHOULD fail with the error
     *   NotAvailable.</p>
     */
    inline QDBusPendingReply<> Ringing()
    {
        if (!invalidationReason().isEmpty()) {
            return QDBusPendingReply<>(QDBusMessage::createError(
                invalidationReason(),
                invalidationMessage()
            ));
        }

        return asyncCall(QLatin1String("Ringing"));
    }

    /**
     * Begins a call to the D-Bus method "Accept" on the remote object.
     * 
     * <p>For incoming calls in state Call_State_Pending_Receiver, accept the
     *   incoming call; this changes the
     *   <tp:member-ref>CallState</tp:member-ref> to Call_State_Accepted.</p>
     * 
     * <p>For outgoing calls in state Call_State_Pending_Initiator, actually
     *   call the remote contact; this changes the
     *   <tp:member-ref>CallState</tp:member-ref> to
     *   Call_State_Pending_Receiver.</p>
     * 
     * <p>Otherwise, this method SHOULD fail with the error NotAvailable.</p>
     * 
     * <p>This method should be called exactly once per Call, by whatever
     *   client (user interface) is handling the channel.</p>
     * 
     * <p>When this method is called, for each <tp:dbus-ref namespace="org.freedesktop.Telepathy.Call">Content.DRAFT</tp:dbus-ref> whose <tp:dbus-ref namespace="org.freedesktop.Telepathy.Call.Content.DRAFT">Disposition</tp:dbus-ref> is Call_Content_Disposition_Initial,
     *   any streams where the self-handle's sending state in <tp:dbus-ref namespace="org.freedesktop.Telepathy.Call.Stream.DRAFT">Senders</tp:dbus-ref> is Sending_State_Pending_Send
     *   will be moved to Sending_State_Sending as if <tp:dbus-ref namespace="org.freedesktop.Telepathy.Call.Stream.DRAFT">SetSending</tp:dbus-ref>(TRUE) had been called.</p>
     */
    inline QDBusPendingReply<> Accept()
    {
        if (!invalidationReason().isEmpty()) {
            return QDBusPendingReply<>(QDBusMessage::createError(
                invalidationReason(),
                invalidationMessage()
            ));
        }

        return asyncCall(QLatin1String("Accept"));
    }

    /**
     * Begins a call to the D-Bus method "Hangup" on the remote object.
     * 
     * Request that the call is ended.
     *
     * \param reason
     *     
     *     A generic hangup reason.
     *
     * \param detailedHangupReason
     *     
     *     A more specific reason for the call hangup, if one is available, or 
     *     an empty string otherwise.
     *
     * \param message
     *     
     *     A human-readable message to be sent to the remote contact(s). XMPP 
     *     Jingle allows calls to be terminated with a human-readable message.
     */
    inline QDBusPendingReply<> Hangup(uint reason, const QString& detailedHangupReason, const QString& message)
    {
        if (!invalidationReason().isEmpty()) {
            return QDBusPendingReply<>(QDBusMessage::createError(
                invalidationReason(),
                invalidationMessage()
            ));
        }

        QList<QVariant> argumentList;
        argumentList << QVariant::fromValue(reason) << QVariant::fromValue(detailedHangupReason) << QVariant::fromValue(message);
        return asyncCallWithArgumentList(QLatin1String("Hangup"), argumentList);
    }

    /**
     * Begins a call to the D-Bus method "AddContent" on the remote object.
     * 
     * [FIXME]
     *
     * \param contentName
     *     
     *     The suggested name of the content to add [FIXME: rationale]
     *
     * \param contentType
     *     
     *     The media type of the content to add
     *
     * \return
     *     
     *     Path to the newly-created Call.Content.DRAFT object.
     */
    inline QDBusPendingReply<QDBusObjectPath> AddContent(const QString& contentName, uint contentType)
    {
        if (!invalidationReason().isEmpty()) {
            return QDBusPendingReply<QDBusObjectPath>(QDBusMessage::createError(
                invalidationReason(),
                invalidationMessage()
            ));
        }

        QList<QVariant> argumentList;
        argumentList << QVariant::fromValue(contentName) << QVariant::fromValue(contentType);
        return asyncCallWithArgumentList(QLatin1String("AddContent"), argumentList);
    }

Q_SIGNALS:
    /**
     * Represents the signal "ContentAdded" on the remote object.
     * 
     * <p>Emitted when a new <tp:dbus-ref namespace="org.freedesktop.Telepathy.Call">Content.DRAFT</tp:dbus-ref> is added to the call.</p>
     *
     * \param content
     *     
     *     Path to the newly-created Content.DRAFT object.
     *
     * \param contentType
     *     
     *     The media type of the content which was added
     */
    void ContentAdded(const QDBusObjectPath& content, uint contentType);

    /**
     * Represents the signal "ContentRemoved" on the remote object.
     * 
     * <p>Emitted when a <tp:dbus-ref namespace="org.freedesktop.Telepathy.Call">Content.DRAFT</tp:dbus-ref> is removed from the call.</p>
     *
     * \param content
     *     
     *     The Content.DRAFT which was removed.
     */
    void ContentRemoved(const QDBusObjectPath& content);

    /**
     * Represents the signal "CallStateChanged" on the remote object.
     * 
     * <p>Emitted when the state of the call as a whole changes.</p>
     * 
     * <p>This signal is emitted for any change in the properties
     *   corresponding to its arguments, even if the other properties
     *   referenced remain unchanged.</p>
     *
     * \param callState
     *     
     *     The new value of the CallState property.
     *
     * \param callFlags
     *     
     *     The new value of the CallFlags property.
     *
     * \param callStateReason
     *     
     *     The new value of the CallStateReason property.
     *
     * \param callStateDetails
     *     
     *     The new value of the CallStateDetails property.
     */
    void CallStateChanged(uint callState, uint callFlags, const TpFuture::CallStateReason& callStateReason, const QVariantMap& callStateDetails);

    /**
     * Represents the signal "CallMembersChanged" on the remote object.
     * 
     * Emitted when the CallMembers property changes in any way, either 
     * because contacts have been added to the call, contacts have been 
     * removed from the call, or contacts&apos; flags have changed.
     *
     * \param flagsChanged
     *     
     *     A map from members of the call to their new call member flags, 
     *     including at least the members who have been added to CallMembers, 
     *     and the members whose flags have changed.
     *
     * \param removed
     *     
     *     A list of members who have left the call, i.e. keys to be removed 
     *     from CallMembers.
     */
    void CallMembersChanged(const TpFuture::CallMemberMap& flagsChanged, const TpFuture::UIntList& removed);

protected:
    virtual void invalidate(Tp::DBusProxy *, const QString &, const QString &);
};
}
}
Q_DECLARE_METATYPE(TpFuture::Client::ChannelInterfaceConferenceInterface*)
Q_DECLARE_METATYPE(TpFuture::Client::ChannelInterfaceMergeableConferenceInterface*)
Q_DECLARE_METATYPE(TpFuture::Client::ChannelInterfaceSplittableInterface*)
Q_DECLARE_METATYPE(TpFuture::Client::ChannelTypeCallInterface*)
