[Telepathy-commits] [telepathy-gabble/master] don't change presence when a buddy from who we received a presence is removed from a view

Guillaume Desmottes guillaume.desmottes at collabora.co.uk
Wed Oct 15 10:09:09 PDT 2008


---
 src/presence-cache.c                |   12 +---------
 src/presence.c                      |   38 +++++++++++++++++++++++++++++++++++
 src/presence.h                      |    4 ++-
 tests/twisted/olpc/view-presence.py |   14 ++++++++++++
 4 files changed, 57 insertions(+), 11 deletions(-)

diff --git a/src/presence-cache.c b/src/presence-cache.c
index 9baa61e..4a3bc38 100644
--- a/src/presence-cache.c
+++ b/src/presence-cache.c
@@ -1497,11 +1497,8 @@ gabble_presence_cache_contacts_added_to_olpc_view (GabblePresenceCache *self,
           presence = _cache_insert (self, handle);
         }
 
-      presence->olpc_views++;
-
-      if (presence->status <= GABBLE_PRESENCE_HIDDEN)
+      if (gabble_presence_added_to_view (presence))
         {
-          presence->status = GABBLE_PRESENCE_AVAILABLE;
           g_array_append_val (changed, handle);
         }
     }
@@ -1540,13 +1537,8 @@ gabble_presence_cache_contacts_removed_from_olpc_view (
           presence = _cache_insert (self, handle);
         }
 
-      presence->olpc_views--;
-
-      if (presence->olpc_views == 0)
+      if (gabble_presence_removed_from_view (presence))
         {
-          presence->status = GABBLE_PRESENCE_OFFLINE;
-          /* FIXME: don't do that if we have a presence */
-          /* FIXME: set OFFLINE or unknown depending the roster status */
           g_array_append_val (changed, handle);
         }
     }
diff --git a/src/presence.c b/src/presence.c
index b5cac6d..751fafa 100644
--- a/src/presence.c
+++ b/src/presence.c
@@ -50,6 +50,7 @@ struct _Resource {
 struct _GabblePresencePrivate {
     gchar *no_resource_status_message;
     GSList *resources;
+    guint olpc_views;
 };
 
 static Resource *
@@ -463,3 +464,40 @@ gabble_presence_dump (GabblePresence *presence)
 
   return g_string_free (ret, FALSE);
 }
+
+gboolean
+gabble_presence_added_to_view (GabblePresence *self)
+{
+  GabblePresencePrivate *priv = GABBLE_PRESENCE_PRIV (self);
+
+  priv->olpc_views++;
+
+  if (priv->olpc_views > 1)
+    /* That's not the version view associated with this presence so
+     * that doesn't change anything */
+    return FALSE;
+
+  if (self->status > GABBLE_PRESENCE_HIDDEN)
+    /* We already have a better presence */
+    return FALSE;
+
+  return TRUE;
+}
+
+gboolean
+gabble_presence_removed_from_view (GabblePresence *self)
+{
+  GabblePresencePrivate *priv = GABBLE_PRESENCE_PRIV (self);
+
+  priv->olpc_views--;
+
+  if (priv->olpc_views > 0)
+    /* We are still in at least one view */
+    return FALSE;
+
+  if (self->status > GABBLE_PRESENCE_HIDDEN)
+    /* We still have a better presence */
+    return FALSE;
+
+  return TRUE;
+}
diff --git a/src/presence.h b/src/presence.h
index e39e6ef..50596a2 100644
--- a/src/presence.h
+++ b/src/presence.h
@@ -62,7 +62,6 @@ struct _GabblePresence {
     gchar *avatar_sha1;
     gboolean keep_unavailable;
     GabblePresencePrivate *priv;
-    guint olpc_views;
 };
 
 typedef struct _GabblePresenceClass GabblePresenceClass;
@@ -93,6 +92,9 @@ LmMessage *gabble_presence_as_message (GabblePresence *presence,
     const gchar *to);
 gchar *gabble_presence_dump (GabblePresence *presence);
 
+gboolean gabble_presence_added_to_view (GabblePresence *presence);
+gboolean gabble_presence_removed_from_view (GabblePresence *presence);
+
 G_END_DECLS
 
 #endif /* __GABBLE_PRESENCE_H__ */
diff --git a/tests/twisted/olpc/view-presence.py b/tests/twisted/olpc/view-presence.py
index 035306e..d79621f 100644
--- a/tests/twisted/olpc/view-presence.py
+++ b/tests/twisted/olpc/view-presence.py
@@ -141,5 +141,19 @@ def test(q, bus, conn, stream):
     # Connection_Presence_Type_Offline = 1
     assert presence[handles['bob']] == (1, 'offline', '')
 
+    # remove charles from view
+    message = create_gadget_message("test at localhost")
+    added = message.addElement((NS_OLPC_BUDDY, 'removed'))
+    added['id'] = '1'
+    buddy = added.addElement((None, 'buddy'))
+    buddy['jid'] = 'charles at localhost'
+    stream.send(message)
+
+    event = q.expect('dbus-signal', signal='BuddiesChanged')
+
+    # Charles's presence didn't change
+    presence = simple_presence_iface.GetPresences([handles['charles']])
+    assert presence[handles['charles']] == (6, 'dnd', 'Hacking on Sugar')
+
 if __name__ == '__main__':
     exec_test(test)
-- 
1.5.6.5




More information about the Telepathy-commits mailing list