[Telepathy-commits] [telepathy-qt4/master] Channel: Simplified membersChanged signal and fixed bug when a contact was added to current members and not removed from local/pending lists.

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


Simplified membersChanged signal to signal who was actually removed from the channel,
(it's not in any of the lists (current/local/remote)).
Fixed bug when a contact was added to current members and not removed from local/pending lists.
---
 TelepathyQt4/Client/channel.cpp |   70 +++++++++++++++++++++++---------------
 TelepathyQt4/Client/channel.h   |    4 +--
 2 files changed, 43 insertions(+), 31 deletions(-)

diff --git a/TelepathyQt4/Client/channel.cpp b/TelepathyQt4/Client/channel.cpp
index bd817e3..a9f2d7b 100644
--- a/TelepathyQt4/Client/channel.cpp
+++ b/TelepathyQt4/Client/channel.cpp
@@ -493,6 +493,14 @@ void Channel::Private::processMembersChanged()
         if (!groupContacts.contains(handle)) {
             pendingGroupMembers.insert(handle);
         }
+
+        // the member was added to current members, check if it was in the
+        // local/pending lists and if true, schedule for removal from that list
+        if (groupLocalPendingContacts.contains(handle)) {
+            groupLocalPendingMembersToRemove.append(handle);
+        } else if(groupRemotePendingContacts.contains(handle)) {
+            groupRemotePendingMembersToRemove.append(handle);
+        }
     }
 
     foreach (uint handle, currentGroupMembersChangedInfo->localPending) {
@@ -508,15 +516,7 @@ void Channel::Private::processMembersChanged()
     }
 
     foreach (uint handle, currentGroupMembersChangedInfo->removed) {
-        // just remove contacts that are known, if the handle was removed but we
-        // don't have a contact object for it, ignore
-        if (groupContacts.contains(handle)) {
-            groupMembersToRemove.append(handle);
-        } else if (groupLocalPendingContacts.contains(handle)) {
-            groupLocalPendingMembersToRemove.append(handle);
-        } else if (groupRemotePendingContacts.contains(handle)) {
-            groupRemotePendingMembersToRemove.append(handle);
-        }
+        groupMembersToRemove.append(handle);
     }
 
     if (pendingGroupMembers.isEmpty() &&
@@ -526,20 +526,29 @@ 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) {
-            groupContactsRemoved.append(groupContacts[handle]);
-            groupContacts.remove(handle);
+            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);
+            }
         }
 
-        QList<QSharedPointer<Contact> > groupLocalPendingContactsRemoved;
         foreach (uint handle, groupLocalPendingMembersToRemove) {
-            groupLocalPendingContactsRemoved.append(groupLocalPendingContacts[handle]);
             groupLocalPendingContacts.remove(handle);
         }
 
-        QList<QSharedPointer<Contact> > groupRemotePendingContactsRemoved;
         foreach (uint handle, groupRemotePendingMembersToRemove) {
-            groupRemotePendingContactsRemoved.append(groupRemotePendingContacts[handle]);
             groupRemotePendingContacts.remove(handle);
         }
 
@@ -550,11 +559,9 @@ void Channel::Private::processMembersChanged()
         // TODO represent actor as a contact object also
         emit parent->groupMembersChanged(
                 QList<QSharedPointer<Contact> >(), // current added
-                groupContactsRemoved,
                 QList<QSharedPointer<Contact> >(), // local pending added
-                groupLocalPendingContactsRemoved,
                 QList<QSharedPointer<Contact> >(), // local pending removed
-                groupRemotePendingContactsRemoved,
+                groupContactsRemoved,
                 currentGroupMembersChangedInfo->actor,
                 currentGroupMembersChangedInfo->reason,
                 currentGroupMembersChangedInfo->message);
@@ -1568,26 +1575,35 @@ void Channel::gotContacts(PendingOperation *op)
     if (mPriv->buildingInitialContacts) {
         mPriv->buildingInitialContacts = false;
         // if we were building the initial contacts from handles and the
-        // introspect queue is empty it means we ready now, so signal it
+        // 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) {
-            groupContactsRemoved.append(mPriv->groupContacts[handle]);
-            mPriv->groupContacts.remove(handle);
+            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);
+            }
         }
 
-        QList<QSharedPointer<Contact> > groupLocalPendingContactsRemoved;
         foreach (uint handle, mPriv->groupLocalPendingMembersToRemove) {
-            groupLocalPendingContactsRemoved.append(mPriv->groupLocalPendingContacts[handle]);
             mPriv->groupLocalPendingContacts.remove(handle);
         }
 
-        QList<QSharedPointer<Contact> > groupRemotePendingContactsRemoved;
         foreach (uint handle, mPriv->groupRemotePendingMembersToRemove) {
-            groupRemotePendingContactsRemoved.append(mPriv->groupRemotePendingContacts[handle]);
             mPriv->groupRemotePendingContacts.remove(handle);
         }
 
@@ -1598,11 +1614,9 @@ void Channel::gotContacts(PendingOperation *op)
         // TODO represent actor as a contact object also
         emit groupMembersChanged(
                 groupContactsAdded,
-                groupContactsRemoved,
                 groupLocalPendingContactsAdded,
-                groupLocalPendingContactsRemoved,
                 groupRemotePendingContactsAdded,
-                groupRemotePendingContactsRemoved,
+                groupContactsRemoved,
                 mPriv->currentGroupMembersChangedInfo->actor,
                 mPriv->currentGroupMembersChangedInfo->reason,
                 mPriv->currentGroupMembersChangedInfo->message);
diff --git a/TelepathyQt4/Client/channel.h b/TelepathyQt4/Client/channel.h
index 99b1492..e2d470f 100644
--- a/TelepathyQt4/Client/channel.h
+++ b/TelepathyQt4/Client/channel.h
@@ -127,11 +127,9 @@ Q_SIGNALS:
 
     void groupMembersChanged(
             const QList<QSharedPointer<Contact> > &groupMembersAdded,
-            const QList<QSharedPointer<Contact> > &groupMembersRemoved,
             const QList<QSharedPointer<Contact> > &groupLocalPendingMembersAdded,
             const QList<QSharedPointer<Contact> > &groupLocalPendingMembersRemoved,
-            const QList<QSharedPointer<Contact> > &groupRemotePendingMembersAdded,
-            const QList<QSharedPointer<Contact> > &groupRemotePendingMembersRemoved,
+            const QList<QSharedPointer<Contact> > &groupMembersRemoved,
             uint actor, uint reason, const QString &message);
 
     void groupHandleOwnersChanged(const HandleOwnerMap &owners,
-- 
1.5.6.5




More information about the telepathy-commits mailing list