00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _TelepathyQt4_cli_contact_manager_h_HEADER_GUARD_
00023 #define _TelepathyQt4_cli_contact_manager_h_HEADER_GUARD_
00024
00025 #ifndef IN_TELEPATHY_QT4_HEADER
00026 #error IN_TELEPATHY_QT4_HEADER
00027 #endif
00028
00029 #include <QObject>
00030
00031 #include <QList>
00032 #include <QSet>
00033 #include <QSharedPointer>
00034
00035 #include <TelepathyQt4/Types>
00036 #include <TelepathyQt4/Client/Contact>
00037 #include <TelepathyQt4/Client/Channel>
00038 #include <TelepathyQt4/Client/ReferencedHandles>
00039
00040 namespace Telepathy
00041 {
00042 namespace Client
00043 {
00044
00045 class Connection;
00046 class PendingContacts;
00047 class PendingOperation;
00048
00049 class ContactManager : public QObject
00050 {
00051 Q_OBJECT
00052
00053 public:
00054
00055 Connection *connection() const;
00056
00057 bool isSupported() const;
00058 QSet<Contact::Feature> supportedFeatures() const;
00059
00060 Contacts allKnownContacts() const;
00061
00062 bool canRequestPresenceSubscription() const;
00063 bool subscriptionRequestHasMessage() const;
00064 PendingOperation *requestPresenceSubscription(
00065 const QList<QSharedPointer<Contact> > &contacts, const QString &message = QString());
00066 bool canRemovePresenceSubscription() const;
00067 bool subscriptionRemovalHasMessage() const;
00068 bool canRescindPresenceSubscriptionRequest() const;
00069 bool subscriptionRescindingHasMessage() const;
00070 PendingOperation *removePresenceSubscription(
00071 const QList<QSharedPointer<Contact> > &contacts, const QString &message = QString());
00072 bool canAuthorizePresencePublication() const;
00073 bool publicationAuthorizationHasMessage() const;
00074 PendingOperation *authorizePresencePublication(
00075 const QList<QSharedPointer<Contact> > &contacts, const QString &message = QString());
00076 bool publicationRejectionHasMessage() const;
00077 bool canRemovePresencePublication() const;
00078 bool publicationRemovalHasMessage() const;
00079 PendingOperation *removePresencePublication(
00080 const QList<QSharedPointer<Contact> > &contacts, const QString &message = QString());
00081
00082 bool canBlockContacts() const;
00083 PendingOperation *blockContacts(
00084 const QList<QSharedPointer<Contact> > &contacts, bool value = true);
00085
00086 PendingContacts *contactsForHandles(const UIntList &handles,
00087 const QSet<Contact::Feature> &features = QSet<Contact::Feature>());
00088 PendingContacts *contactsForHandles(const ReferencedHandles &handles,
00089 const QSet<Contact::Feature> &features = QSet<Contact::Feature>());
00090
00091 PendingContacts *contactsForIdentifiers(const QStringList &identifiers,
00092 const QSet<Contact::Feature> &features = QSet<Contact::Feature>());
00093
00094 PendingContacts *upgradeContacts(const QList<QSharedPointer<Contact> > &contacts,
00095 const QSet<Contact::Feature> &features);
00096
00097 Q_SIGNALS:
00098 void presencePublicationRequested(const Telepathy::Client::Contacts &contacts);
00099
00100 private Q_SLOTS:
00101 void onAliasesChanged(const Telepathy::AliasPairList &);
00102 void onAvatarUpdated(uint, const QString &);
00103 void onPresencesChanged(const Telepathy::SimpleContactPresences &);
00104
00105 void onSubscribeChannelMembersChanged(
00106 const Telepathy::Client::Contacts &groupMembersAdded,
00107 const Telepathy::Client::Contacts &groupLocalPendingMembersAdded,
00108 const Telepathy::Client::Contacts &groupRemotePendingMembersAdded,
00109 const Telepathy::Client::Contacts &groupMembersRemoved,
00110 const Telepathy::Client::Channel::GroupMemberChangeDetails &details);
00111 void onPublishChannelMembersChanged(
00112 const Telepathy::Client::Contacts &groupMembersAdded,
00113 const Telepathy::Client::Contacts &groupLocalPendingMembersAdded,
00114 const Telepathy::Client::Contacts &groupRemotePendingMembersAdded,
00115 const Telepathy::Client::Contacts &groupMembersRemoved,
00116 const Telepathy::Client::Channel::GroupMemberChangeDetails &details);
00117 void onDenyChannelMembersChanged(
00118 const Telepathy::Client::Contacts &groupMembersAdded,
00119 const Telepathy::Client::Contacts &groupLocalPendingMembersAdded,
00120 const Telepathy::Client::Contacts &groupRemotePendingMembersAdded,
00121 const Telepathy::Client::Contacts &groupMembersRemoved,
00122 const Telepathy::Client::Channel::GroupMemberChangeDetails &details);
00123
00124 private:
00125 struct ContactListChannel
00126 {
00127 enum Type {
00128 TypeSubscribe = 0,
00129 TypePublish,
00130 TypeStored,
00131 TypeDeny,
00132 LastType
00133 };
00134
00135 ContactListChannel()
00136 : type((Type) -1)
00137 {
00138 }
00139
00140 ContactListChannel(Type type)
00141 : type(type)
00142 {
00143 }
00144
00145 ~ContactListChannel()
00146 {
00147 }
00148
00149 static QString identifierForType(Type type);
00150 static uint typeForIdentifier(const QString &identifier);
00151
00152 Type type;
00153 ReferencedHandles handle;
00154 QSharedPointer<Channel> channel;
00155 };
00156
00157 ContactManager(Connection *parent);
00158 ~ContactManager();
00159
00160 QSharedPointer<Contact> ensureContact(const ReferencedHandles &handle,
00161 const QSet<Contact::Feature> &features, const QVariantMap &attributes);
00162
00163 void setContactListChannels(const QMap<uint, ContactListChannel> &contactListsChannels);
00164
00165 QSharedPointer<Contact> lookupContactByHandle(uint handle);
00166
00167 struct Private;
00168 friend struct Private;
00169 friend class Connection;
00170 friend class PendingContacts;
00171 friend class Contact;
00172 Private *mPriv;
00173 };
00174
00175 }
00176 }
00177
00178 #endif