/**
* This file is part of TelepathyQt
*
* @copyright Copyright (C) 2008-2010 Collabora Ltd.
* @copyright Copyright (C) 2008-2010 Nokia Corporation
* @license LGPL 2.1
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _TelepathyQt_contact_manager_internal_h_HEADER_GUARD_
#define _TelepathyQt_contact_manager_internal_h_HEADER_GUARD_
#include
#include
#include
#include
#include
#include
#include
#include
#include
namespace Tp
{
class TP_QT_NO_EXPORT ContactManager::Roster : public QObject
{
Q_OBJECT
public:
Roster(ContactManager *manager);
~Roster() override;
ContactListState state() const;
PendingOperation *introspect();
PendingOperation *introspectGroups();
void reset();
Contacts allKnownContacts() const;
QStringList allKnownGroups() const;
PendingOperation *addGroup(const QString &group);
PendingOperation *removeGroup(const QString &group);
Contacts groupContacts(const QString &group) const;
PendingOperation *addContactsToGroup(const QString &group,
const QList &contacts);
PendingOperation *removeContactsFromGroup(const QString &group,
const QList &contacts);
bool canRequestPresenceSubscription() const;
bool subscriptionRequestHasMessage() const;
PendingOperation *requestPresenceSubscription(
const QList &contacts, const QString &message);
bool canRemovePresenceSubscription() const;
bool subscriptionRemovalHasMessage() const;
bool canRescindPresenceSubscriptionRequest() const;
bool subscriptionRescindingHasMessage() const;
PendingOperation *removePresenceSubscription(
const QList &contacts, const QString &message);
bool canAuthorizePresencePublication() const;
bool publicationAuthorizationHasMessage() const;
PendingOperation *authorizePresencePublication(
const QList &contacts, const QString &message);
bool publicationRejectionHasMessage() const;
bool canRemovePresencePublication() const;
bool publicationRemovalHasMessage() const;
PendingOperation *removePresencePublication(
const QList &contacts, const QString &message);
PendingOperation *removeContacts(
const QList &contacts, const QString &message);
bool canBlockContacts() const;
bool canReportAbuse() const;
PendingOperation *blockContacts(const QList &contacts, bool value, bool reportAbuse);
private Q_SLOTS:
void gotContactBlockingCapabilities(Tp::PendingOperation *op);
void gotContactBlockingBlockedContacts(QDBusPendingCallWatcher *watcher);
void onContactBlockingBlockedContactsChanged(
const Tp::HandleIdentifierMap &added,
const Tp::HandleIdentifierMap &removed);
void gotContactListProperties(Tp::PendingOperation *op);
void gotContactListContacts(QDBusPendingCallWatcher *watcher);
void setStateSuccess();
void onContactListStateChanged(uint state);
void onContactListContactsChangedWithId(const Tp::ContactSubscriptionMap &changes,
const Tp::HandleIdentifierMap &ids, const Tp::HandleIdentifierMap &removals);
void onContactListContactsChanged(const Tp::ContactSubscriptionMap &changes,
const Tp::UIntList &removals);
void onContactListBlockedContactsConstructed(Tp::PendingOperation *op);
void onContactListNewContactsConstructed(Tp::PendingOperation *op);
void onContactListGroupsChanged(const Tp::UIntList &contacts,
const QStringList &added, const QStringList &removed);
void onContactListGroupsCreated(const QStringList &names);
void onContactListGroupRenamed(const QString &oldName, const QString &newName);
void onContactListGroupsRemoved(const QStringList &names);
void onModifyFinished(Tp::PendingOperation *op);
void onModifyFinishSignaled();
void gotContactListChannelHandle(Tp::PendingOperation *op);
void gotContactListChannel(Tp::PendingOperation *op);
void onContactListChannelReady();
void gotContactListGroupsProperties(Tp::PendingOperation *op);
void onContactListContactsUpgraded(Tp::PendingOperation *op);
void onNewChannels(const Tp::ChannelDetailsList &channelDetailsList);
void onContactListGroupChannelReady(Tp::PendingOperation *op);
void gotChannels(QDBusPendingCallWatcher *watcher);
void onStoredChannelMembersChanged(
const Tp::Contacts &groupMembersAdded,
const Tp::Contacts &groupLocalPendingMembersAdded,
const Tp::Contacts &groupRemotePendingMembersAdded,
const Tp::Contacts &groupMembersRemoved,
const Tp::Channel::GroupMemberChangeDetails &details);
void onSubscribeChannelMembersChanged(
const Tp::Contacts &groupMembersAdded,
const Tp::Contacts &groupLocalPendingMembersAdded,
const Tp::Contacts &groupRemotePendingMembersAdded,
const Tp::Contacts &groupMembersRemoved,
const Tp::Channel::GroupMemberChangeDetails &details);
void onPublishChannelMembersChanged(
const Tp::Contacts &groupMembersAdded,
const Tp::Contacts &groupLocalPendingMembersAdded,
const Tp::Contacts &groupRemotePendingMembersAdded,
const Tp::Contacts &groupMembersRemoved,
const Tp::Channel::GroupMemberChangeDetails &details);
void onDenyChannelMembersChanged(
const Tp::Contacts &groupMembersAdded,
const Tp::Contacts &groupLocalPendingMembersAdded,
const Tp::Contacts &groupRemotePendingMembersAdded,
const Tp::Contacts &groupMembersRemoved,
const Tp::Channel::GroupMemberChangeDetails &details);
void onContactListGroupMembersChanged(
const Tp::Contacts &groupMembersAdded,
const Tp::Contacts &groupLocalPendingMembersAdded,
const Tp::Contacts &groupRemotePendingMembersAdded,
const Tp::Contacts &groupMembersRemoved,
const Tp::Channel::GroupMemberChangeDetails &details);
void onContactListGroupRemoved(Tp::DBusProxy *proxy,
const QString &errorName, const QString &errorMessage);
private:
struct ChannelInfo;
struct BlockedContactsChangedInfo;
struct UpdateInfo;
struct GroupsUpdateInfo;
struct GroupRenamedInfo;
class ModifyFinishOp;
class RemoveGroupOp;
void introspectContactBlocking();
void introspectContactBlockingBlockedContacts();
void introspectContactList();
void introspectContactListContacts();
void processContactListChanges();
void processContactListBlockedContactsChanged();
void processContactListUpdates();
void processContactListGroupsUpdates();
void processContactListGroupsCreated();
void processContactListGroupRenamed();
void processContactListGroupsRemoved();
void processFinishedModify();
PendingOperation *queuedFinishVoid(const QDBusPendingCall &call);
void setContactListChannelsReady();
void updateContactsBlockState();
void updateContactsPresenceState();
void computeKnownContactsChanges(const Contacts &added,
const Contacts &pendingAdded, const Contacts &remotePendingAdded,
const Contacts &removed, const Channel::GroupMemberChangeDetails &details);
void checkContactListGroupsReady();
void setContactListGroupChannelsReady();
QString addContactListGroupChannel(const ChannelPtr &contactListGroupChannel);
ContactManager *contactManager;
Contacts cachedAllKnownContacts;
bool usingFallbackContactList;
bool hasContactBlockingInterface;
PendingOperation *introspectPendingOp;
PendingOperation *introspectGroupsPendingOp;
uint pendingContactListState;
uint contactListState;
bool canReportAbusive;
bool gotContactBlockingInitialBlockedContacts;
bool canChangeContactList;
bool contactListRequestUsesMessage;
bool gotContactListInitialContacts;
bool gotContactListContactsChangedWithId;
bool groupsReintrospectionRequired;
QSet cachedAllKnownGroups;
bool contactListGroupPropertiesReceived;
QQueue contactListChangesQueue;
QQueue contactListBlockedContactsChangedQueue;
QQueue contactListUpdatesQueue;
QQueue contactListGroupsUpdatesQueue;
QQueue contactListGroupsCreatedQueue;
QQueue contactListGroupRenamedQueue;
QQueue contactListGroupsRemovedQueue;
bool processingContactListChanges;
QHash returnedModifyOps;
QQueue modifyFinishQueue;
// old roster API
uint contactListChannelsReady;
QHash contactListChannels;
ChannelPtr subscribeChannel;
ChannelPtr publishChannel;
ChannelPtr storedChannel;
ChannelPtr denyChannel;
// Number of things left to do before the Groups feature is ready
// 1 for Get("Channels") + 1 per channel not ready
uint featureContactListGroupsTodo;
QList pendingContactListGroupChannels;
QHash contactListGroupChannels;
QList removedContactListGroupChannels;
// If RosterGroups introspection completing should advance the ContactManager state to Success
bool groupsSetSuccess;
// Contact list contacts using the Conn.I.ContactList API
Contacts contactListContacts;
// Blocked contacts using the new ContactBlocking API
Contacts blockedContacts;
};
struct TP_QT_NO_EXPORT ContactManager::Roster::ChannelInfo
{
enum Type {
TypeSubscribe = 0,
TypePublish,
TypeStored,
TypeDeny,
LastType
};
ChannelInfo()
: type((Type) -1)
{
}
ChannelInfo(Type type)
: type(type)
{
}
static QString identifierForType(Type type);
static uint typeForIdentifier(const QString &identifier);
Type type;
ReferencedHandles handle;
ChannelPtr channel;
};
struct TP_QT_NO_EXPORT ContactManager::Roster::BlockedContactsChangedInfo
{
BlockedContactsChangedInfo(const HandleIdentifierMap &added,
const HandleIdentifierMap &removed,
bool continueIntrospectionWhenFinished = false)
: added(added),
removed(removed),
continueIntrospectionWhenFinished(continueIntrospectionWhenFinished)
{
}
HandleIdentifierMap added;
HandleIdentifierMap removed;
bool continueIntrospectionWhenFinished;
};
struct TP_QT_NO_EXPORT ContactManager::Roster::UpdateInfo
{
UpdateInfo(const ContactSubscriptionMap &changes, const HandleIdentifierMap &ids,
const HandleIdentifierMap &removals)
: changes(changes),
ids(ids),
removals(removals)
{
}
ContactSubscriptionMap changes;
HandleIdentifierMap ids;
HandleIdentifierMap removals;
};
struct TP_QT_NO_EXPORT ContactManager::Roster::GroupsUpdateInfo
{
GroupsUpdateInfo(const UIntList &contacts,
const QStringList &groupsAdded, const QStringList &groupsRemoved)
: contacts(contacts),
groupsAdded(groupsAdded),
groupsRemoved(groupsRemoved)
{
}
UIntList contacts;
QStringList groupsAdded;
QStringList groupsRemoved;
};
struct TP_QT_NO_EXPORT ContactManager::Roster::GroupRenamedInfo
{
GroupRenamedInfo(const QString &oldName, const QString &newName)
: oldName(oldName),
newName(newName)
{
}
QString oldName;
QString newName;
};
class TP_QT_NO_EXPORT ContactManager::Roster::ModifyFinishOp : public PendingOperation
{
Q_OBJECT
public:
ModifyFinishOp(const ConnectionPtr &conn);
~ModifyFinishOp() override {};
void setError(const QString &errorName, const QString &errorMessage);
void finish();
private:
QString errorName, errorMessage;
};
class TP_QT_NO_EXPORT ContactManager::Roster::RemoveGroupOp : public PendingOperation
{
Q_OBJECT
public:
RemoveGroupOp(const ChannelPtr &channel);
~RemoveGroupOp() override {};
private Q_SLOTS:
void onContactsRemoved(Tp::PendingOperation *);
void onChannelClosed(Tp::PendingOperation *);
};
class TP_QT_NO_EXPORT ContactManager::PendingRefreshContactInfo : public PendingOperation
{
Q_OBJECT
public:
PendingRefreshContactInfo(const ConnectionPtr &conn);
~PendingRefreshContactInfo() override;
void addContact(Contact *contact);
void refreshInfo();
private Q_SLOTS:
void onRefreshInfoFinished(Tp::PendingOperation *op);
private:
ConnectionPtr mConn;
QSet mToRequest;
};
} // Tp
#endif