| Home · All Classes · All Namespaces · Modules · Functions · Files

# channel.h

    00001 /*
    00002  * This file is part of TelepathyQt4
    00003  *
    00004  * Copyright (C) 2008 Collabora Ltd. <http://www.collabora.co.uk/>
    00005  * Copyright (C) 2008 Nokia Corporation
    00006  *
    00007  * This library is free software; you can redistribute it and/or
    00008  * modify it under the terms of the GNU Lesser General Public
    00009  * License as published by the Free Software Foundation; either
    00010  * version 2.1 of the License, or (at your option) any later version.
    00011  *
    00012  * This library is distributed in the hope that it will be useful,
    00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    00015  * Lesser General Public License for more details.
    00016  *
    00017  * You should have received a copy of the GNU Lesser General Public
    00018  * License along with this library; if not, write to the Free Software
    00019  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    00020  */
    00021
    00022 #ifndef _TelepathyQt4_channel_h_HEADER_GUARD_
    00023 #define _TelepathyQt4_channel_h_HEADER_GUARD_
    00024
    00025 #ifndef IN_TELEPATHY_QT4_HEADER
    00026 #error IN_TELEPATHY_QT4_HEADER
    00027 #endif
    00028
    00029 #include <TelepathyQt4/_gen/cli-channel.h>
    00030
    00031 #include <TelepathyQt4/Constants>
    00032 #include <TelepathyQt4/Contact>
    00033 #include <TelepathyQt4/DBus>
    00034 #include <TelepathyQt4/DBusProxy>
    00035 #include <TelepathyQt4/OptionalInterfaceFactory>
    00036 #include <TelepathyQt4/ReadinessHelper>
    00037 #include <TelepathyQt4/ReadyObject>
    00038 #include <TelepathyQt4/Types>
    00039 #include <TelepathyQt4/SharedPtr>
    00040
    00041 #include <QSet>
    00042 #include <QSharedDataPointer>
    00043 #include <QVariantMap>
    00044
    00045 namespace Tp
    00046 {
    00047
    00048 class Connection;
    00049 class PendingOperation;
    00050 class PendingReady;
    00051
    00052 class TELEPATHY_QT4_EXPORT Channel : public StatefulDBusProxy,
    00053                 public OptionalInterfaceFactory<Channel>,
    00054                 public ReadyObject,
    00055                 public RefCounted
    00056 {
    00057     Q_OBJECT
    00058     Q_DISABLE_COPY(Channel)
    00059
    00060 public:
    00061     static const Feature FeatureCore;
    00062     static const Feature FeatureConferenceInitialInviteeContacts;
    00063
    00064     static ChannelPtr create(const ConnectionPtr &connection,
    00065             const QString &objectPath, const QVariantMap &immutableProperties);
    00066
    00067     virtual ~Channel();
    00068
    00069     ConnectionPtr connection() const;
    00070
    00071     QVariantMap immutableProperties() const;
    00072
    00073     QString channelType() const;
    00074
    00075     uint targetHandleType() const;
    00076     uint targetHandle() const;
    00077
    00078     bool isRequested() const;
    00079     ContactPtr initiatorContact() const;
    00080
    00081     PendingOperation *requestClose();
    00082
    00083     uint groupFlags() const;
    00084
    00085     bool groupCanAddContacts() const;
    00086     bool groupCanAddContactsWithMessage() const;
    00087     bool groupCanAcceptContactsWithMessage() const;
    00088     PendingOperation *groupAddContacts(const QList<ContactPtr> &contacts,
    00089             const QString &message = QString());
    00090     bool groupCanRescindContacts() const;
    00091     bool groupCanRescindContactsWithMessage() const;
    00092     bool groupCanRemoveContacts() const;
    00093     bool groupCanRemoveContactsWithMessage() const;
    00094     bool groupCanRejectContactsWithMessage() const;
    00095     bool groupCanDepartWithMessage() const;
    00096     PendingOperation *groupRemoveContacts(const QList<ContactPtr> &contacts,
    00097             const QString &message = QString(),
    00098             uint reason = ChannelGroupChangeReasonNone);
    00099
    00104     Contacts groupContacts() const;
    00105     Contacts groupLocalPendingContacts() const;
    00106     Contacts groupRemotePendingContacts() const;
    00107
    00108     class GroupMemberChangeDetails
    00109     {
    00110     public:
    00111         GroupMemberChangeDetails();
    00112         GroupMemberChangeDetails(const GroupMemberChangeDetails &other);
    00113         ~GroupMemberChangeDetails();
    00114
    00115         GroupMemberChangeDetails &operator=(const GroupMemberChangeDetails &other);
    00116
    00117         bool isValid() const { return mPriv.constData() != 0; }
    00118
    00119         bool hasActor() const;
    00120         ContactPtr actor() const;
    00121
    00122         bool hasReason() const { return allDetails().contains(QLatin1String("change-reason")); }
    00123         uint reason() const { return qdbus_cast<uint>(allDetails().value(QLatin1String("change-reason"))); }
    00124
    00125         bool hasMessage() const { return allDetails().contains(QLatin1String("message")); }
    00126         QString message () const { return qdbus_cast<QString>(allDetails().value(QLatin1String("message"))); }
    00127
    00128         bool hasError() const { return allDetails().contains(QLatin1String("error")); }
    00129         QString error() const { return qdbus_cast<QString>(allDetails().value(QLatin1String("error"))); }
    00130
    00131         bool hasDebugMessage() const { return allDetails().contains(QLatin1String("debug-message")); }
    00132         QString debugMessage() const { return qdbus_cast<QString>(allDetails().value(QLatin1String("debug-message"))); }
    00133
    00134         QVariantMap allDetails() const;
    00135
    00136     private:
    00137         friend class Channel;
    00138
    00139         GroupMemberChangeDetails(const ContactPtr &actor, const QVariantMap &details);
    00140
    00141         struct Private;
    00142         friend struct Private;
    00143         QSharedDataPointer<Private> mPriv;
    00144     };
    00145
    00146     GroupMemberChangeDetails groupLocalPendingContactChangeInfo(const ContactPtr &contact) const;
    00147     GroupMemberChangeDetails groupSelfContactRemoveInfo() const;
    00148
    00149     bool groupAreHandleOwnersAvailable() const;
    00150     HandleOwnerMap groupHandleOwners() const;
    00151
    00152     bool groupIsSelfContactTracked() const;
    00153     ContactPtr groupSelfContact() const;
    00154
    00155     TELEPATHY_QT4_DEPRECATED bool hasConferenceInterface() const;
    00156     bool isConference() const;
    00157     Contacts conferenceInitialInviteeContacts() const;
    00158     TELEPATHY_QT4_DEPRECATED bool conferenceSupportsNonMerges() const;
    00159     QList<ChannelPtr> conferenceChannels() const;
    00160     QList<ChannelPtr> conferenceInitialChannels() const;
    00161     QHash<uint, ChannelPtr> conferenceOriginalChannels() const;
    00162
    00163     TELEPATHY_QT4_DEPRECATED bool hasMergeableConferenceInterface() const;
    00164     bool supportsConferenceMerging() const;
    00165     PendingOperation *conferenceMergeChannel(const ChannelPtr &channel);
    00166
    00167     TELEPATHY_QT4_DEPRECATED bool hasSplittableInterface() const;
    00168     bool supportsConferenceSplitting() const;
    00169     TELEPATHY_QT4_DEPRECATED PendingOperation *splitChannel();
    00170     PendingOperation *conferenceSplitChannel();
    00171
    00172     TELEPATHY_QT4_DEPRECATED inline Client::DBus::PropertiesInterface *propertiesInterface() const
    00173     {
    00174         return optionalInterface<Client::DBus::PropertiesInterface>(BypassInterfaceCheck);
    00175     }
    00176
    00177     TELEPATHY_QT4_DEPRECATED inline Client::ChannelInterfaceAnonymityInterface *anonymityInterface(
    00178             InterfaceSupportedChecking check = CheckInterfaceSupported) const
    00179     {
    00180         return optionalInterface<Client::ChannelInterfaceAnonymityInterface>(check);
    00181     }
    00182
    00183     TELEPATHY_QT4_DEPRECATED inline Client::ChannelInterfaceCallStateInterface *callStateInterface(
    00184             InterfaceSupportedChecking check = CheckInterfaceSupported) const
    00185     {
    00186         return optionalInterface<Client::ChannelInterfaceCallStateInterface>(check);
    00187     }
    00188
    00189     TELEPATHY_QT4_DEPRECATED inline Client::ChannelInterfaceChatStateInterface *chatStateInterface(
    00190             InterfaceSupportedChecking check = CheckInterfaceSupported) const
    00191     {
    00192         return optionalInterface<Client::ChannelInterfaceChatStateInterface>(check);
    00193     }
    00194
    00195     TELEPATHY_QT4_DEPRECATED inline Client::ChannelInterfaceConferenceInterface *conferenceInterface(
    00196             InterfaceSupportedChecking check = CheckInterfaceSupported) const
    00197     {
    00198         return optionalInterface<Client::ChannelInterfaceConferenceInterface>(check);
    00199     }
    00200
    00201     TELEPATHY_QT4_DEPRECATED inline Client::ChannelInterfaceDTMFInterface *DTMFInterface(
    00202             InterfaceSupportedChecking check = CheckInterfaceSupported) const
    00203     {
    00204         return optionalInterface<Client::ChannelInterfaceDTMFInterface>(check);
    00205     }
    00206
    00207     TELEPATHY_QT4_DEPRECATED inline Client::ChannelInterfaceHoldInterface *holdInterface(
    00208             InterfaceSupportedChecking check = CheckInterfaceSupported) const
    00209     {
    00210         return optionalInterface<Client::ChannelInterfaceHoldInterface>(check);
    00211     }
    00212
    00213     TELEPATHY_QT4_DEPRECATED inline Client::ChannelInterfaceMediaSignallingInterface *mediaSignallingInterface(
    00214             InterfaceSupportedChecking check = CheckInterfaceSupported) const
    00215     {
    00216         return optionalInterface<Client::ChannelInterfaceMediaSignallingInterface>(check);
    00217     }
    00218
    00219     TELEPATHY_QT4_DEPRECATED inline Client::ChannelInterfaceMessagesInterface *messagesInterface(
    00220             InterfaceSupportedChecking check = CheckInterfaceSupported) const
    00221     {
    00222         return optionalInterface<Client::ChannelInterfaceMessagesInterface>(check);
    00223     }
    00224
    00225     TELEPATHY_QT4_DEPRECATED inline Client::ChannelInterfacePasswordInterface *passwordInterface(
    00226             InterfaceSupportedChecking check = CheckInterfaceSupported) const
    00227     {
    00228         return optionalInterface<Client::ChannelInterfacePasswordInterface>(check);
    00229     }
    00230
    00231     TELEPATHY_QT4_DEPRECATED inline Client::ChannelInterfaceServicePointInterface *servicePointInterface(
    00232             InterfaceSupportedChecking check = CheckInterfaceSupported) const
    00233     {
    00234         return optionalInterface<Client::ChannelInterfaceServicePointInterface>(check);
    00235     }
    00236
    00237     TELEPATHY_QT4_DEPRECATED inline Client::ChannelInterfaceTubeInterface *tubeInterface(
    00238             InterfaceSupportedChecking check = CheckInterfaceSupported) const
    00239     {
    00240         return optionalInterface<Client::ChannelInterfaceTubeInterface>(check);
    00241     }
    00242
    00243     // FIXME: (API/ABI break) Remove once all deprecated methods using it are removed.
    00244     template <class Interface>
    00245     inline Interface *typeInterface(
    00246             InterfaceSupportedChecking check = CheckInterfaceSupported) const
    00247     {
    00248         // Check for the remote object having the correct channel type
    00249         QString name(QLatin1String(Interface::staticInterfaceName()));
    00250         if (check == CheckInterfaceSupported && channelType() != name)
    00251             return 0;
    00252
    00253         // If correct type or check bypassed, delegate to OIF
    00254         return OptionalInterfaceFactory<Channel>::interface<Interface>();
    00255     }
    00256
    00257     TELEPATHY_QT4_DEPRECATED inline Client::ChannelTypeContactSearchInterface *contactSearchInterface(
    00258             InterfaceSupportedChecking check = CheckInterfaceSupported) const
    00259     {
    00260         return typeInterface<Client::ChannelTypeContactSearchInterface>(check);
    00261     }
    00262
    00263     TELEPATHY_QT4_DEPRECATED inline Client::ChannelTypeRoomListInterface *roomListInterface(
    00264             InterfaceSupportedChecking check = CheckInterfaceSupported) const
    00265     {
    00266         return typeInterface<Client::ChannelTypeRoomListInterface>(check);
    00267     }
    00268
    00269     TELEPATHY_QT4_DEPRECATED inline Client::ChannelTypeServerTLSConnectionInterface *serverTLSConnectionInterface(
    00270             InterfaceSupportedChecking check = CheckInterfaceSupported) const
    00271     {
    00272         return typeInterface<Client::ChannelTypeServerTLSConnectionInterface>(check);
    00273     }
    00274
    00275     TELEPATHY_QT4_DEPRECATED inline Client::ChannelTypeStreamedMediaInterface *streamedMediaInterface(
    00276             InterfaceSupportedChecking check = CheckInterfaceSupported) const
    00277     {
    00278         return typeInterface<Client::ChannelTypeStreamedMediaInterface>(check);
    00279     }
    00280
    00281     TELEPATHY_QT4_DEPRECATED inline Client::ChannelTypeTextInterface *textInterface(
    00282             InterfaceSupportedChecking check = CheckInterfaceSupported) const
    00283     {
    00284         return typeInterface<Client::ChannelTypeTextInterface>(check);
    00285     }
    00286
    00287     TELEPATHY_QT4_DEPRECATED inline Client::ChannelTypeFileTransferInterface *fileTransferInterface(
    00288             InterfaceSupportedChecking check = CheckInterfaceSupported) const
    00289     {
    00290         return typeInterface<Client::ChannelTypeFileTransferInterface>(check);
    00291     }
    00292
    00293     TELEPATHY_QT4_DEPRECATED inline Client::ChannelTypeTubesInterface *tubesInterface(
    00294             InterfaceSupportedChecking check = CheckInterfaceSupported) const
    00295     {
    00296         return typeInterface<Client::ChannelTypeTubesInterface>(check);
    00297     }
    00298
    00299     TELEPATHY_QT4_DEPRECATED inline Client::ChannelTypeStreamTubeInterface *streamTubeInterface(
    00300             InterfaceSupportedChecking check = CheckInterfaceSupported) const
    00301     {
    00302         return typeInterface<Client::ChannelTypeStreamTubeInterface>(check);
    00303     }
    00304
    00305 Q_SIGNALS:
    00306     void groupFlagsChanged(uint flags, uint added, uint removed);
    00307
    00308     void groupCanAddContactsChanged(bool canAddContacts);
    00309     void groupCanRemoveContactsChanged(bool canRemoveContacts);
    00310     void groupCanRescindContactsChanged(bool canRescindContacts);
    00311
    00312     void groupMembersChanged(
    00313             const Tp::Contacts &groupMembersAdded,
    00314             const Tp::Contacts &groupLocalPendingMembersAdded,
    00315             const Tp::Contacts &groupRemotePendingMembersAdded,
    00316             const Tp::Contacts &groupMembersRemoved,
    00317             const Tp::Channel::GroupMemberChangeDetails &details);
    00318
    00319     void groupHandleOwnersChanged(const Tp::HandleOwnerMap &owners,
    00320             const Tp::UIntList &added, const Tp::UIntList &removed);
    00321
    00322     void groupSelfContactChanged();
    00323
    00324     void conferenceChannelMerged(const Tp::ChannelPtr &channel);
    00325     // FIXME: (API/ABI break) Remove conferenceChannelRemoved that does not take details as param.
    00326     void conferenceChannelRemoved(const Tp::ChannelPtr &channel);
    00327     void conferenceChannelRemoved(const Tp::ChannelPtr &channel,
    00328             const Tp::Channel::GroupMemberChangeDetails &details);
    00329
    00330 protected:
    00331     Channel(const ConnectionPtr &connection,const QString &objectPath,
    00332             const QVariantMap &immutableProperties);
    00333
    00334     Client::ChannelInterface *baseInterface() const;
    00335
    00336     TELEPATHY_QT4_DEPRECATED inline Client::ChannelInterfaceGroupInterface *groupInterface(
    00337             InterfaceSupportedChecking check = CheckInterfaceSupported) const
    00338     {
    00339         return optionalInterface<Client::ChannelInterfaceGroupInterface>(check);
    00340     }
    00341
    00342     bool groupSelfHandleIsLocalPending() const;
    00343
    00344     // FIXME: (API/ABI break) Remove connectNotify
    00345     void connectNotify(const char *);
    00346
    00347 protected Q_SLOTS:
    00348     PendingOperation *groupAddSelfHandle();
    00349
    00350 private Q_SLOTS:
    00351     void gotMainProperties(QDBusPendingCallWatcher *watcher);
    00352     void gotChannelType(QDBusPendingCallWatcher *watcher);
    00353     void gotHandle(QDBusPendingCallWatcher *watcher);
    00354     void gotInterfaces(QDBusPendingCallWatcher *watcher);
    00355     void onClosed();
    00356
    00357     void onConnectionReady(Tp::PendingOperation *op);
    00358     void onConnectionInvalidated();
    00359     void onConnectionDestroyed();
    00360
    00361     void gotGroupProperties(QDBusPendingCallWatcher *watcher);
    00362     void gotGroupFlags(QDBusPendingCallWatcher *watcher);
    00363     void gotAllMembers(QDBusPendingCallWatcher *watcher);
    00364     void gotLocalPendingMembersWithInfo(QDBusPendingCallWatcher *watcher);
    00365     void gotSelfHandle(QDBusPendingCallWatcher *watcher);
    00366     void gotContacts(Tp::PendingOperation *op);
    00367
    00368     void onGroupFlagsChanged(uint, uint);
    00369     void onMembersChanged(const QString&,
    00370             const Tp::UIntList&, const Tp::UIntList&,
    00371             const Tp::UIntList&, const Tp::UIntList&, uint, uint);
    00372     void onMembersChangedDetailed(
    00373         const Tp::UIntList &added, const Tp::UIntList &removed,
    00374         const Tp::UIntList &localPending, const Tp::UIntList &remotePending,
    00375         const QVariantMap &details);
    00376     void onHandleOwnersChanged(const Tp::HandleOwnerMap&, const Tp::UIntList&);
    00377     void onSelfHandleChanged(uint);
    00378
    00379     void gotConferenceProperties(QDBusPendingCallWatcher *watcher);
    00380     void gotConferenceInitialInviteeContacts(Tp::PendingOperation *op);
    00381     void onConferenceChannelMerged(const QDBusObjectPath &channel, uint channelSpecificHandle,
    00382             const QVariantMap &properties);
    00383     void onConferenceChannelMerged(const QDBusObjectPath &channel);
    00384     void onConferenceChannelRemoved(const QDBusObjectPath &channel, const QVariantMap &details);
    00385     void onConferenceChannelRemoved(const QDBusObjectPath &channel);
    00386     void gotConferenceChannelRemovedActorContact(Tp::PendingOperation *op);
    00387
    00388 private:
    00389     struct Private;
    00390     friend struct Private;
    00391     Private *mPriv;
    00392 };
    00393
    00394 } // Tp
    00395
    00396 Q_DECLARE_METATYPE(Tp::Channel::GroupMemberChangeDetails);
    00397
    00398 #endif