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     bool hasConferenceInterface() const;
00156     Contacts conferenceInitialInviteeContacts() const;
00157     bool conferenceSupportsNonMerges() const;
00158     QList<ChannelPtr> conferenceChannels() const;
00159     QList<ChannelPtr> conferenceInitialChannels() const;
00160 
00161     bool hasMergeableConferenceInterface() const;
00162     PendingOperation *conferenceMergeChannel(const ChannelPtr &channel);
00163 
00164     bool hasSplittableInterface() const;
00165     PendingOperation *splitChannel();
00166 
00167     inline Client::DBus::PropertiesInterface *propertiesInterface() const
00168     {
00169         return optionalInterface<Client::DBus::PropertiesInterface>(BypassInterfaceCheck);
00170     }
00171 
00172     inline Client::ChannelInterfaceAnonymityInterface *anonymityInterface(
00173             InterfaceSupportedChecking check = CheckInterfaceSupported) const
00174     {
00175         return optionalInterface<Client::ChannelInterfaceAnonymityInterface>(check);
00176     }
00177 
00178     inline Client::ChannelInterfaceCallStateInterface *callStateInterface(
00179             InterfaceSupportedChecking check = CheckInterfaceSupported) const
00180     {
00181         return optionalInterface<Client::ChannelInterfaceCallStateInterface>(check);
00182     }
00183 
00184     inline Client::ChannelInterfaceChatStateInterface *chatStateInterface(
00185             InterfaceSupportedChecking check = CheckInterfaceSupported) const
00186     {
00187         return optionalInterface<Client::ChannelInterfaceChatStateInterface>(check);
00188     }
00189 
00190     inline Client::ChannelInterfaceDTMFInterface *DTMFInterface(
00191             InterfaceSupportedChecking check = CheckInterfaceSupported) const
00192     {
00193         return optionalInterface<Client::ChannelInterfaceDTMFInterface>(check);
00194     }
00195 
00196     inline Client::ChannelInterfaceHoldInterface *holdInterface(
00197             InterfaceSupportedChecking check = CheckInterfaceSupported) const
00198     {
00199         return optionalInterface<Client::ChannelInterfaceHoldInterface>(check);
00200     }
00201 
00202     inline Client::ChannelInterfaceMediaSignallingInterface *mediaSignallingInterface(
00203             InterfaceSupportedChecking check = CheckInterfaceSupported) const
00204     {
00205         return optionalInterface<Client::ChannelInterfaceMediaSignallingInterface>(check);
00206     }
00207 
00208     inline Client::ChannelInterfaceMessagesInterface *messagesInterface(
00209             InterfaceSupportedChecking check = CheckInterfaceSupported) const
00210     {
00211         return optionalInterface<Client::ChannelInterfaceMessagesInterface>(check);
00212     }
00213 
00214     inline Client::ChannelInterfacePasswordInterface *passwordInterface(
00215             InterfaceSupportedChecking check = CheckInterfaceSupported) const
00216     {
00217         return optionalInterface<Client::ChannelInterfacePasswordInterface>(check);
00218     }
00219 
00220     inline Client::ChannelInterfaceServicePointInterface *servicePointInterface(
00221             InterfaceSupportedChecking check = CheckInterfaceSupported) const
00222     {
00223         return optionalInterface<Client::ChannelInterfaceServicePointInterface>(check);
00224     }
00225 
00226     inline Client::ChannelInterfaceTubeInterface *tubeInterface(
00227             InterfaceSupportedChecking check = CheckInterfaceSupported) const
00228     {
00229         return optionalInterface<Client::ChannelInterfaceTubeInterface>(check);
00230     }
00231 
00232     template <class Interface>
00233     inline Interface *typeInterface(
00234             InterfaceSupportedChecking check = CheckInterfaceSupported) const
00235     {
00236         // Check for the remote object having the correct channel type
00237         QString name(QLatin1String(Interface::staticInterfaceName()));
00238         if (check == CheckInterfaceSupported && channelType() != name)
00239             return 0;
00240 
00241         // If correct type or check bypassed, delegate to OIF
00242         return OptionalInterfaceFactory<Channel>::interface<Interface>();
00243     }
00244 
00245     inline Client::ChannelTypeContactSearchInterface *contactSearchInterface(
00246             InterfaceSupportedChecking check = CheckInterfaceSupported) const
00247     {
00248         return typeInterface<Client::ChannelTypeContactSearchInterface>(check);
00249     }
00250 
00251     inline Client::ChannelTypeRoomListInterface *roomListInterface(
00252             InterfaceSupportedChecking check = CheckInterfaceSupported) const
00253     {
00254         return typeInterface<Client::ChannelTypeRoomListInterface>(check);
00255     }
00256 
00257     inline Client::ChannelTypeStreamedMediaInterface *streamedMediaInterface(
00258             InterfaceSupportedChecking check = CheckInterfaceSupported) const
00259     {
00260         return typeInterface<Client::ChannelTypeStreamedMediaInterface>(check);
00261     }
00262 
00263     inline Client::ChannelTypeTextInterface *textInterface(
00264             InterfaceSupportedChecking check = CheckInterfaceSupported) const
00265     {
00266         return typeInterface<Client::ChannelTypeTextInterface>(check);
00267     }
00268 
00269     inline Client::ChannelTypeFileTransferInterface *fileTransferInterface(
00270             InterfaceSupportedChecking check = CheckInterfaceSupported) const
00271     {
00272         return typeInterface<Client::ChannelTypeFileTransferInterface>(check);
00273     }
00274 
00275     inline Client::ChannelTypeTubesInterface *tubesInterface(
00276             InterfaceSupportedChecking check = CheckInterfaceSupported) const
00277     {
00278         return typeInterface<Client::ChannelTypeTubesInterface>(check);
00279     }
00280 
00281     inline Client::ChannelTypeStreamTubeInterface *streamTubeInterface(
00282             InterfaceSupportedChecking check = CheckInterfaceSupported) const
00283     {
00284         return typeInterface<Client::ChannelTypeStreamTubeInterface>(check);
00285     }
00286 
00287 Q_SIGNALS:
00288     void groupFlagsChanged(uint flags, uint added, uint removed);
00289 
00290     void groupCanAddContactsChanged(bool canAddContacts);
00291     void groupCanRemoveContactsChanged(bool canRemoveContacts);
00292     void groupCanRescindContactsChanged(bool canRescindContacts);
00293 
00294     void groupMembersChanged(
00295             const Tp::Contacts &groupMembersAdded,
00296             const Tp::Contacts &groupLocalPendingMembersAdded,
00297             const Tp::Contacts &groupRemotePendingMembersAdded,
00298             const Tp::Contacts &groupMembersRemoved,
00299             const Tp::Channel::GroupMemberChangeDetails &details);
00300 
00301     void groupHandleOwnersChanged(const Tp::HandleOwnerMap &owners,
00302             const Tp::UIntList &added, const Tp::UIntList &removed);
00303 
00304     void groupSelfContactChanged();
00305 
00306     void conferenceChannelMerged(const Tp::ChannelPtr &channel);
00307     void conferenceChannelRemoved(const Tp::ChannelPtr &channel);
00308 
00309 protected:
00310     Channel(const ConnectionPtr &connection,const QString &objectPath,
00311             const QVariantMap &immutableProperties);
00312 
00313     Client::ChannelInterface *baseInterface() const;
00314 
00315     inline Client::ChannelInterfaceGroupInterface *groupInterface(
00316             InterfaceSupportedChecking check = CheckInterfaceSupported) const
00317     {
00318         return optionalInterface<Client::ChannelInterfaceGroupInterface>(check);
00319     }
00320 
00321     bool groupSelfHandleIsLocalPending() const;
00322 
00323 protected Q_SLOTS:
00324     PendingOperation *groupAddSelfHandle();
00325 
00326 private Q_SLOTS:
00327     void gotMainProperties(QDBusPendingCallWatcher *watcher);
00328     void gotChannelType(QDBusPendingCallWatcher *watcher);
00329     void gotHandle(QDBusPendingCallWatcher *watcher);
00330     void gotInterfaces(QDBusPendingCallWatcher *watcher);
00331     void onClosed();
00332 
00333     void onConnectionReady(Tp::PendingOperation *op);
00334     void onConnectionInvalidated();
00335     void onConnectionDestroyed();
00336 
00337     void gotGroupProperties(QDBusPendingCallWatcher *watcher);
00338     void gotGroupFlags(QDBusPendingCallWatcher *watcher);
00339     void gotAllMembers(QDBusPendingCallWatcher *watcher);
00340     void gotLocalPendingMembersWithInfo(QDBusPendingCallWatcher *watcher);
00341     void gotSelfHandle(QDBusPendingCallWatcher *watcher);
00342     void gotContacts(Tp::PendingOperation *op);
00343 
00344     void onGroupFlagsChanged(uint, uint);
00345     void onMembersChanged(const QString&,
00346             const Tp::UIntList&, const Tp::UIntList&,
00347             const Tp::UIntList&, const Tp::UIntList&, uint, uint);
00348     void onMembersChangedDetailed(
00349         const Tp::UIntList &added, const Tp::UIntList &removed,
00350         const Tp::UIntList &localPending, const Tp::UIntList &remotePending,
00351         const QVariantMap &details);
00352     void onHandleOwnersChanged(const Tp::HandleOwnerMap&, const Tp::UIntList&);
00353     void onSelfHandleChanged(uint);
00354 
00355     void gotConferenceProperties(QDBusPendingCallWatcher *watcher);
00356     void gotConferenceInitialInviteeContacts(Tp::PendingOperation *op);
00357     void onConferenceChannelMerged(const QDBusObjectPath &channel);
00358     void onConferenceChannelRemoved(const QDBusObjectPath &channel);
00359 
00360 private:
00361     struct Private;
00362     friend struct Private;
00363     Private *mPriv;
00364 };
00365 
00366 } // Tp
00367 
00368 Q_DECLARE_METATYPE(Tp::Channel::GroupMemberChangeDetails);
00369 
00370 #endif


Copyright © 2008-2010 Collabora Ltd. and Nokia Corporation
Telepathy-Qt4 0.3.11