[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