summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Moreira Magalhaes (andrunko) <andre.magalhaes@collabora.co.uk>2010-12-20 09:51:07 -0200
committerAndre Moreira Magalhaes (andrunko) <andre.magalhaes@collabora.co.uk>2010-12-20 09:51:07 -0200
commit8f19b7c7440225d65d1ca07be7061f5df3a0153f (patch)
tree777517ebda312c3efea5d6fd5a7e289d3cb22858
parent9b9d19ecb985a0dfb3530a559008811e8c5e3cf8 (diff)
ContactManager: Guarantee that contact list/group events are ordered using the same queue for all events.
-rw-r--r--TelepathyQt4/contact-manager.cpp75
1 files changed, 64 insertions, 11 deletions
diff --git a/TelepathyQt4/contact-manager.cpp b/TelepathyQt4/contact-manager.cpp
index c8ea21a7..604e829e 100644
--- a/TelepathyQt4/contact-manager.cpp
+++ b/TelepathyQt4/contact-manager.cpp
@@ -62,6 +62,9 @@ struct TELEPATHY_QT4_NO_EXPORT ContactManager::Private
void processContactListChanges();
void processContactListUpdates();
void processContactListGroupsUpdates();
+ void processContactListGroupsCreated();
+ void processContactListGroupRenamed();
+ void processContactListGroupsRemoved();
Contacts allKnownContactsFallback() const;
void computeKnownContactsChangesFallback(const Contacts &added,
@@ -95,6 +98,7 @@ struct TELEPATHY_QT4_NO_EXPORT ContactManager::Private
struct ContactListUpdateInfo;
struct ContactListGroupsUpdateInfo;
+ struct ContactListGroupRenamedInfo;
ContactManager *parent;
QWeakPointer<Connection> connection;
@@ -115,6 +119,9 @@ struct TELEPATHY_QT4_NO_EXPORT ContactManager::Private
QQueue<void (Private::*)()> contactListChangesQueue;
QQueue<ContactListUpdateInfo> contactListUpdatesQueue;
QQueue<ContactListGroupsUpdateInfo> contactListGroupsUpdatesQueue;
+ QQueue<QStringList> contactListGroupsCreatedQueue;
+ QQueue<ContactListGroupRenamedInfo> contactListGroupRenamedQueue;
+ QQueue<QStringList> contactListGroupsRemovedQueue;
bool processingContactListChanges;
// old roster API
@@ -157,6 +164,18 @@ struct ContactManager::Private::ContactListGroupsUpdateInfo
QStringList groupsRemoved;
};
+struct ContactManager::Private::ContactListGroupRenamedInfo
+{
+ ContactListGroupRenamedInfo(const QString &oldName, const QString &newName)
+ : oldName(oldName),
+ newName(newName)
+ {
+ }
+
+ QString oldName;
+ QString newName;
+};
+
ContactManager::Private::Private(ContactManager *parent, Connection *connection)
: parent(parent),
connection(connection),
@@ -319,6 +338,41 @@ void ContactManager::Private::processContactListGroupsUpdates()
processContactListChanges();
}
+void ContactManager::Private::processContactListGroupsCreated()
+{
+ QStringList names = contactListGroupsCreatedQueue.dequeue();
+ foreach (const QString &name, names) {
+ allKnownGroups.insert(name);
+ emit parent->groupAdded(name);
+ }
+
+ processingContactListChanges = false;
+ processContactListChanges();
+}
+
+void ContactManager::Private::processContactListGroupRenamed()
+{
+ Private::ContactListGroupRenamedInfo info = contactListGroupRenamedQueue.dequeue();
+ allKnownGroups.remove(info.oldName);
+ allKnownGroups.insert(info.newName);
+ emit parent->groupRenamed(info.oldName, info.newName);
+
+ processingContactListChanges = false;
+ processContactListChanges();
+}
+
+void ContactManager::Private::processContactListGroupsRemoved()
+{
+ QStringList names = contactListGroupsRemovedQueue.dequeue();
+ foreach (const QString &name, names) {
+ allKnownGroups.remove(name);
+ emit parent->groupRemoved(name);
+ }
+
+ processingContactListChanges = false;
+ processContactListChanges();
+}
+
Contacts ContactManager::Private::allKnownContactsFallback() const
{
Contacts contacts;
@@ -1836,29 +1890,28 @@ void ContactManager::onContactListGroupsCreated(const QStringList &names)
{
Q_ASSERT(mPriv->fallbackContactList == false);
- foreach (const QString &name, names) {
- mPriv->allKnownGroups.insert(name);
- emit groupAdded(name);
- }
+ mPriv->contactListGroupsCreatedQueue.enqueue(names);
+ mPriv->contactListChangesQueue.enqueue(&Private::processContactListGroupsCreated);
+ mPriv->processContactListChanges();
}
void ContactManager::onContactListGroupRenamed(const QString &oldName, const QString &newName)
{
Q_ASSERT(mPriv->fallbackContactList == false);
- mPriv->allKnownGroups.remove(oldName);
- mPriv->allKnownGroups.insert(newName);
- emit groupRenamed(oldName, newName);
+ mPriv->contactListGroupRenamedQueue.enqueue(
+ Private::ContactListGroupRenamedInfo(oldName, newName));
+ mPriv->contactListChangesQueue.enqueue(&Private::processContactListGroupRenamed);
+ mPriv->processContactListChanges();
}
void ContactManager::onContactListGroupsRemoved(const QStringList &names)
{
Q_ASSERT(mPriv->fallbackContactList == false);
- foreach (const QString &name, names) {
- mPriv->allKnownGroups.remove(name);
- emit groupRemoved(name);
- }
+ mPriv->contactListGroupsRemovedQueue.enqueue(names);
+ mPriv->contactListChangesQueue.enqueue(&Private::processContactListGroupsRemoved);
+ mPriv->processContactListChanges();
}
void ContactManager::onStoredChannelMembersChangedFallback(