[Telepathy-commits] [telepathy-gabble/master] Make it possible to update the presence cache of multiple handles at the same time
Sjoerd Simons
sjoerd at luon.net
Tue Aug 19 10:54:08 PDT 2008
20080721144733-93b9a-4fa09a592fe065d4de9c4f0318c758cdab9d82e2.gz
---
src/presence-cache.c | 82 ++++++++++++++++++++++++++++++++++++++++++++-----
src/presence-cache.h | 3 ++
2 files changed, 76 insertions(+), 9 deletions(-)
diff --git a/src/presence-cache.c b/src/presence-cache.c
index ea9a7d6..8417e85 100644
--- a/src/presence-cache.c
+++ b/src/presence-cache.c
@@ -54,7 +54,7 @@ enum
/* signal enum */
enum
{
- PRESENCE_UPDATE,
+ PRESENCES_UPDATED,
NICKNAME_UPDATE,
CAPABILITIES_UPDATE,
AVATAR_UPDATE,
@@ -283,13 +283,13 @@ gabble_presence_cache_class_init (GabblePresenceCacheClass *klass)
PROP_CONNECTION,
param_spec);
- signals[PRESENCE_UPDATE] = g_signal_new (
- "presence-update",
+ signals[PRESENCES_UPDATED] = g_signal_new (
+ "presences-updated",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
- g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT);
+ g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER);
signals[NICKNAME_UPDATE] = g_signal_new (
"nickname-update",
G_TYPE_FROM_CLASS (klass),
@@ -1336,8 +1336,8 @@ _cache_insert (
return presence;
}
-void
-gabble_presence_cache_update (
+static gboolean
+gabble_presence_cache_do_update (
GabblePresenceCache *cache,
TpHandle handle,
const gchar *resource,
@@ -1351,6 +1351,7 @@ gabble_presence_cache_update (
const gchar *jid;
GabblePresence *presence;
GabblePresenceCapabilities caps_before;
+ gboolean ret = FALSE;
jid = tp_handle_inspect (contact_repo, handle);
DEBUG ("%s (%d) resource %s prio %d presence %d message \"%s\"",
@@ -1363,17 +1364,80 @@ gabble_presence_cache_update (
caps_before = presence->caps;
- if (gabble_presence_update (presence, resource, presence_id, status_message,
- priority))
- g_signal_emit (cache, signals[PRESENCE_UPDATE], 0, handle);
+ ret = gabble_presence_update (presence, resource, presence_id,
+ status_message, priority);
if (caps_before != presence->caps)
g_signal_emit (cache, signals[CAPABILITIES_UPDATE], 0, handle,
caps_before, presence->caps);
+ return ret;
+}
+
+void
+gabble_presence_cache_update (
+ GabblePresenceCache *cache,
+ TpHandle handle,
+ const gchar *resource,
+ GabblePresenceId presence_id,
+ const gchar *status_message,
+ gint8 priority)
+{
+ if (gabble_presence_cache_do_update (cache, handle, resource, presence_id,
+ status_message, priority))
+ {
+ GArray *handles;
+
+ handles = g_array_sized_new (FALSE, FALSE, sizeof (TpHandle), 1);
+
+ g_array_append_val (handles, handle);
+ g_signal_emit (cache, signals[PRESENCES_UPDATED], 0, handles);
+ g_array_free (handles, TRUE);
+ }
+
gabble_presence_cache_maybe_remove (cache, handle);
}
+void
+gabble_presence_cache_update_many (
+ GabblePresenceCache *cache,
+ const GArray *contact_handles,
+ const gchar *resource,
+ GabblePresenceId presence_id,
+ const gchar *status_message,
+ gint8 priority)
+{
+ GArray *updated;
+ guint i;
+
+ updated = g_array_sized_new (FALSE, FALSE, sizeof (TpHandle),
+ contact_handles->len);
+
+ for (i = 0 ; i < contact_handles->len ; i++)
+ {
+ TpHandle handle;
+
+ handle = g_array_index (contact_handles, TpHandle, i);
+ if (gabble_presence_cache_do_update (cache, handle, resource,
+ presence_id, status_message, priority))
+ {
+ g_array_append_val (updated, handle);
+ }
+ }
+
+ g_signal_emit (cache, signals[PRESENCES_UPDATED], 0, updated);
+
+ for (i = 0 ; i < contact_handles->len ; i++)
+ {
+ TpHandle handle;
+
+ handle = g_array_index (contact_handles, TpHandle, i);
+ gabble_presence_cache_maybe_remove (cache, handle);
+ }
+
+ g_array_free (updated, TRUE);
+}
+
void gabble_presence_cache_add_bundle_caps (GabblePresenceCache *cache,
const gchar *node, GabblePresenceCapabilities new_caps)
{
diff --git a/src/presence-cache.h b/src/presence-cache.h
index b56bc39..fc18d54 100644
--- a/src/presence-cache.h
+++ b/src/presence-cache.h
@@ -75,6 +75,9 @@ GabblePresence *gabble_presence_cache_get (GabblePresenceCache *cache,
void gabble_presence_cache_update (GabblePresenceCache *cache,
TpHandle handle, const gchar *resource, GabblePresenceId presence_id,
const gchar *status_message, gint8 priority);
+void gabble_presence_cache_update_many (GabblePresenceCache *cache,
+ const GArray *contact_handles, const gchar *resource,
+ GabblePresenceId presence_id, const gchar *status_message, gint8 priority);
void gabble_presence_cache_maybe_remove (GabblePresenceCache *cache,
TpHandle handle);
void gabble_presence_cache_add_bundle_caps (GabblePresenceCache *cache,
--
1.5.6.3
More information about the Telepathy-commits
mailing list