[Telepathy-commits] [telepathy-qt4/master] Channel: Simplified contacts code.

Andre Moreira Magalhaes (andrunko) andre.magalhaes at collabora.co.uk
Fri Feb 6 14:19:39 PST 2009


Simplified contacts code by creating updateContacts that gets called whenever
membersChanged signal is processed or when initial contacts are built.
---
 TelepathyQt4/Client/channel.cpp |  198 +++++++++++++++++----------------------
 1 files changed, 84 insertions(+), 114 deletions(-)

diff --git a/TelepathyQt4/Client/channel.cpp b/TelepathyQt4/Client/channel.cpp
index a9f2d7b..ec99db7 100644
--- a/TelepathyQt4/Client/channel.cpp
+++ b/TelepathyQt4/Client/channel.cpp
@@ -83,6 +83,8 @@ struct Channel::Private
 
     void buildContacts();
     void processMembersChanged();
+    void updateContacts(const QList<QSharedPointer<Contact> > &contacts =
+            QList<QSharedPointer<Contact> >());
     void setReady();
 
     class PendingReady;
@@ -525,54 +527,89 @@ void Channel::Private::processMembersChanged()
     {
         // no member added, just remove the members to be removed and signal
         // membersChanged
-        QList<QSharedPointer<Contact> > groupContactsRemoved;
-        QSharedPointer<Contact> contactToRemove;
-        foreach (uint handle, groupMembersToRemove) {
-            if (groupContacts.contains(handle)) {
-                contactToRemove = groupContacts[handle];
-                groupContacts.remove(handle);
-            } else if (groupLocalPendingContacts.contains(handle)) {
-                contactToRemove = groupLocalPendingContacts[handle];
-                groupLocalPendingContacts.remove(handle);
-            } else if (groupRemotePendingContacts.contains(handle)) {
-                contactToRemove = groupRemotePendingContacts[handle];
-                groupRemotePendingContacts.remove(handle);
-            }
-
-            if (contactToRemove) {
-                groupContactsRemoved.append(contactToRemove);
-            }
+        updateContacts();
+    } else {
+        buildContacts();
+    }
+}
+
+void Channel::Private::updateContacts(const QList<QSharedPointer<Contact> > &contacts)
+{
+    QList<QSharedPointer<Contact> > groupContactsAdded;
+    QList<QSharedPointer<Contact> > groupLocalPendingContactsAdded;
+    QList<QSharedPointer<Contact> > groupRemotePendingContactsAdded;
+
+    foreach (QSharedPointer<Contact> contact, contacts) {
+        uint handle = contact->handle()[0];
+        if (pendingGroupMembers.contains(handle)) {
+            groupContactsAdded.append(contact);
+            groupContacts[handle] = contact;
+        } else if (pendingGroupLocalPendingMembers.contains(handle)) {
+            groupLocalPendingContactsAdded.append(contact);
+            groupLocalPendingContacts[handle] = contact;
+        } else if (pendingGroupRemotePendingMembers.contains(handle)) {
+            groupRemotePendingContactsAdded.append(contact);
+            groupRemotePendingContacts[handle] = contact;
         }
+    }
 
-        foreach (uint handle, groupLocalPendingMembersToRemove) {
-            groupLocalPendingContacts.remove(handle);
+    pendingGroupMembers.clear();
+    pendingGroupLocalPendingMembers.clear();
+    pendingGroupRemotePendingMembers.clear();
+
+    if (buildingInitialContacts) {
+        buildingInitialContacts = false;
+        if (introspectQueue.isEmpty()) {
+            // if we were building the initial contacts from handles and the
+            // introspect queue is empty it means we are ready now, so signal it
+            setReady();
         }
+        processMembersChanged();
+        return;
+    }
 
-        foreach (uint handle, groupRemotePendingMembersToRemove) {
+    QList<QSharedPointer<Contact> > groupContactsRemoved;
+    QSharedPointer<Contact> contactToRemove;
+    foreach (uint handle, groupMembersToRemove) {
+        if (groupContacts.contains(handle)) {
+            contactToRemove = groupContacts[handle];
+            groupContacts.remove(handle);
+        } else if (groupLocalPendingContacts.contains(handle)) {
+            contactToRemove = groupLocalPendingContacts[handle];
+            groupLocalPendingContacts.remove(handle);
+        } else if (groupRemotePendingContacts.contains(handle)) {
+            contactToRemove = groupRemotePendingContacts[handle];
             groupRemotePendingContacts.remove(handle);
         }
 
-        groupMembersToRemove.clear();
-        groupLocalPendingMembersToRemove.clear();
-        groupRemotePendingMembersToRemove.clear();
-
-        // TODO represent actor as a contact object also
-        emit parent->groupMembersChanged(
-                QList<QSharedPointer<Contact> >(), // current added
-                QList<QSharedPointer<Contact> >(), // local pending added
-                QList<QSharedPointer<Contact> >(), // local pending removed
-                groupContactsRemoved,
-                currentGroupMembersChangedInfo->actor,
-                currentGroupMembersChangedInfo->reason,
-                currentGroupMembersChangedInfo->message);
-        delete currentGroupMembersChangedInfo;
-
-        // TODO should processMembersChanged be a slot and fired with singleShot
-        //      so we avoid blocking here
-        processMembersChanged();
-    } else {
-        buildContacts();
+        if (contactToRemove) {
+            groupContactsRemoved.append(contactToRemove);
+        }
+    }
+    groupMembersToRemove.clear();
+
+    foreach (uint handle, groupLocalPendingMembersToRemove) {
+        groupLocalPendingContacts.remove(handle);
     }
+    groupLocalPendingMembersToRemove.clear();
+
+    foreach (uint handle, groupRemotePendingMembersToRemove) {
+        groupRemotePendingContacts.remove(handle);
+    }
+    groupRemotePendingMembersToRemove.clear();
+
+    // TODO represent actor as a contact object also
+    emit parent->groupMembersChanged(
+            groupContactsAdded,
+            groupLocalPendingContactsAdded,
+            groupRemotePendingContactsAdded,
+            groupContactsRemoved,
+            currentGroupMembersChangedInfo->actor,
+            currentGroupMembersChangedInfo->reason,
+            currentGroupMembersChangedInfo->message);
+    delete currentGroupMembersChangedInfo;
+
+    processMembersChanged();
 }
 
 void Channel::Private::setReady()
@@ -1543,87 +1580,20 @@ void Channel::gotContacts(PendingOperation *op)
 
     mPriv->buildingContacts = false;
 
-    QList<QSharedPointer<Contact> > groupContactsAdded;
-    QList<QSharedPointer<Contact> > groupLocalPendingContactsAdded;
-    QList<QSharedPointer<Contact> > groupRemotePendingContactsAdded;
-
+    QList<QSharedPointer<Contact> > contacts;
     if (pending->isValid()) {
-        QList<QSharedPointer<Contact> > contacts = pending->contacts();
-        foreach (QSharedPointer<Contact> contact, contacts) {
-            uint handle = contact->handle()[0];
-            if (mPriv->pendingGroupMembers.contains(handle)) {
-                groupContactsAdded.append(contact);
-                mPriv->groupContacts[handle] = contact;
-            } else if (mPriv->pendingGroupLocalPendingMembers.contains(handle)) {
-                groupLocalPendingContactsAdded.append(contact);
-                mPriv->groupLocalPendingContacts[handle] = contact;
-            } else if (mPriv->pendingGroupRemotePendingMembers.contains(handle)) {
-                groupRemotePendingContactsAdded.append(contact);
-                mPriv->groupRemotePendingContacts[handle] = contact;
-            }
-        }
+        contacts = pending->contacts();
 
+        if (!pending->invalidHandles().isEmpty()) {
+            warning() << "Unable to construct Contact objects for handles:" <<
+                pending->invalidHandles();
+        }
     } else {
         warning().nospace() << "Getting contacts failed with " <<
             pending->errorName() << ":" << pending->errorMessage();
     }
 
-    mPriv->pendingGroupMembers.clear();
-    mPriv->pendingGroupLocalPendingMembers.clear();
-    mPriv->pendingGroupRemotePendingMembers.clear();
-
-    if (mPriv->buildingInitialContacts) {
-        mPriv->buildingInitialContacts = false;
-        // if we were building the initial contacts from handles and the
-        // introspect queue is empty it means we are ready now, so signal it
-        if (mPriv->introspectQueue.isEmpty()) {
-            mPriv->setReady();
-        }
-    } else {
-        QList<QSharedPointer<Contact> > groupContactsRemoved;
-        QSharedPointer<Contact> contactToRemove;
-        foreach (uint handle, mPriv->groupMembersToRemove) {
-            if (mPriv->groupContacts.contains(handle)) {
-                contactToRemove = mPriv->groupContacts[handle];
-                mPriv->groupContacts.remove(handle);
-            } else if (mPriv->groupLocalPendingContacts.contains(handle)) {
-                contactToRemove = mPriv->groupLocalPendingContacts[handle];
-                mPriv->groupLocalPendingContacts.remove(handle);
-            } else if (mPriv->groupRemotePendingContacts.contains(handle)) {
-                contactToRemove = mPriv->groupRemotePendingContacts[handle];
-                mPriv->groupRemotePendingContacts.remove(handle);
-            }
-
-            if (contactToRemove) {
-                groupContactsRemoved.append(contactToRemove);
-            }
-        }
-
-        foreach (uint handle, mPriv->groupLocalPendingMembersToRemove) {
-            mPriv->groupLocalPendingContacts.remove(handle);
-        }
-
-        foreach (uint handle, mPriv->groupRemotePendingMembersToRemove) {
-            mPriv->groupRemotePendingContacts.remove(handle);
-        }
-
-        mPriv->groupMembersToRemove.clear();
-        mPriv->groupLocalPendingMembersToRemove.clear();
-        mPriv->groupRemotePendingMembersToRemove.clear();
-
-        // TODO represent actor as a contact object also
-        emit groupMembersChanged(
-                groupContactsAdded,
-                groupLocalPendingContactsAdded,
-                groupRemotePendingContactsAdded,
-                groupContactsRemoved,
-                mPriv->currentGroupMembersChangedInfo->actor,
-                mPriv->currentGroupMembersChangedInfo->reason,
-                mPriv->currentGroupMembersChangedInfo->message);
-        delete mPriv->currentGroupMembersChangedInfo;
-    }
-
-    mPriv->processMembersChanged();
+    mPriv->updateContacts(contacts);
 }
 
 void Channel::onGroupFlagsChanged(uint added, uint removed)
-- 
1.5.6.5




More information about the telepathy-commits mailing list