[Telepathy-commits] [telepathy-gabble/master] Add tubes caps in GabblePresence and Resource
Alban Crequy
alban.crequy at collabora.co.uk
Fri Dec 5 09:42:28 PST 2008
---
src/presence-cache.c | 12 ++++++++++--
src/presence.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
src/presence.h | 2 ++
3 files changed, 56 insertions(+), 2 deletions(-)
diff --git a/src/presence-cache.c b/src/presence-cache.c
index cfd25e3..85dc634 100644
--- a/src/presence-cache.c
+++ b/src/presence-cache.c
@@ -829,14 +829,14 @@ _caps_disco_cb (GabbleDisco *disco,
gchar *service;
var += strlen ("stream/");
service = g_strdup (var);
- g_hash_table_insert (stream_tube_caps, service, service);
+ g_hash_table_insert (stream_tube_caps, service, NULL);
}
else if (g_str_has_prefix (var, "dbus/"))
{
gchar *service;
var += strlen ("dbus/");
service = g_strdup (var);
- g_hash_table_insert (dbus_tube_caps, service, service);
+ g_hash_table_insert (dbus_tube_caps, service, NULL);
}
}
}
@@ -847,6 +847,8 @@ _caps_disco_cb (GabbleDisco *disco,
DEBUG ("Ignoring presence from invalid JID %s", jid);
g_hash_table_destroy (stream_tube_caps);
g_hash_table_destroy (dbus_tube_caps);
+ stream_tube_caps = NULL;
+ dbus_tube_caps = NULL;
goto OUT;
}
@@ -867,6 +869,8 @@ _caps_disco_cb (GabbleDisco *disco,
DEBUG ("Ignoring non requested disco reply");
g_hash_table_destroy (stream_tube_caps);
g_hash_table_destroy (dbus_tube_caps);
+ stream_tube_caps = NULL;
+ dbus_tube_caps = NULL;
goto OUT;
}
@@ -896,6 +900,8 @@ _caps_disco_cb (GabbleDisco *disco,
bad_hash = TRUE;
g_hash_table_destroy (stream_tube_caps);
g_hash_table_destroy (dbus_tube_caps);
+ stream_tube_caps = NULL;
+ dbus_tube_caps = NULL;
}
}
else
@@ -909,6 +915,8 @@ _caps_disco_cb (GabbleDisco *disco,
* 1.3 and tubes caps */
g_hash_table_destroy (stream_tube_caps);
g_hash_table_destroy (dbus_tube_caps);
+ stream_tube_caps = NULL;
+ dbus_tube_caps = NULL;
}
for (i = waiters; NULL != i;)
diff --git a/src/presence.c b/src/presence.c
index 8401b12..2491981 100644
--- a/src/presence.c
+++ b/src/presence.c
@@ -40,6 +40,8 @@ typedef struct _Resource Resource;
struct _Resource {
gchar *name;
GabblePresenceCapabilities caps;
+ GHashTable *stream_tube_caps;
+ GHashTable *dbus_tube_caps;
guint caps_serial;
GabblePresenceId status;
gchar *status_message;
@@ -58,6 +60,8 @@ _resource_new (gchar *name)
Resource *new = g_slice_new (Resource);
new->name = name;
new->caps = PRESENCE_CAP_NONE;
+ new->stream_tube_caps = NULL;
+ new->dbus_tube_caps = NULL;
new->status = GABBLE_PRESENCE_OFFLINE;
new->status_message = NULL;
new->priority = 0;
@@ -72,6 +76,10 @@ _resource_free (Resource *resource)
{
g_free (resource->name);
g_free (resource->status_message);
+ if (resource->stream_tube_caps != NULL)
+ g_hash_table_destroy (resource->stream_tube_caps);
+ if (resource->dbus_tube_caps != NULL)
+ g_hash_table_destroy (resource->dbus_tube_caps);
g_slice_free (Resource, resource);
}
@@ -85,6 +93,11 @@ gabble_presence_finalize (GObject *object)
for (i = priv->resources; NULL != i; i = i->next)
_resource_free (i->data);
+ if (presence->stream_tube_caps != NULL)
+ g_hash_table_destroy (presence->stream_tube_caps);
+ if (presence->dbus_tube_caps != NULL)
+ g_hash_table_destroy (presence->dbus_tube_caps);
+
g_slist_free (priv->resources);
g_free (presence->nickname);
g_free (presence->avatar_sha1);
@@ -190,6 +203,14 @@ gabble_presence_set_capabilities (GabblePresence *presence,
GSList *i;
presence->caps = 0;
+ if (presence->stream_tube_caps != NULL)
+ g_hash_table_destroy (presence->stream_tube_caps);
+ if (presence->dbus_tube_caps != NULL)
+ g_hash_table_destroy (presence->dbus_tube_caps);
+ presence->stream_tube_caps = g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, NULL);
+ presence->dbus_tube_caps = g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, NULL);
DEBUG ("about to add caps %u to resource %s with serial %u", caps, resource,
serial);
@@ -215,10 +236,33 @@ gabble_presence_set_capabilities (GabblePresence *presence,
DEBUG ("adding caps %u to resource %s", caps, resource);
tmp->caps |= caps;
DEBUG ("resource %s caps now %u", resource, tmp->caps);
+
+ if (tmp->stream_tube_caps != NULL)
+ g_hash_table_destroy (tmp->stream_tube_caps);
+ if (tmp->dbus_tube_caps != NULL)
+ g_hash_table_destroy (tmp->dbus_tube_caps);
+ tmp->stream_tube_caps = g_hash_table_new_full (g_str_hash,
+ g_str_equal, g_free, NULL);
+ tmp->dbus_tube_caps = g_hash_table_new_full (g_str_hash,
+ g_str_equal, g_free, NULL);
+ if (stream_tube_caps != NULL)
+ tp_g_hash_table_update (tmp->stream_tube_caps,
+ stream_tube_caps, g_strdup, NULL);
+ if (dbus_tube_caps != NULL)
+ tp_g_hash_table_update (tmp->dbus_tube_caps,
+ dbus_tube_caps, g_strdup, NULL);
}
}
presence->caps |= tmp->caps;
+
+ if (tmp->stream_tube_caps != NULL)
+ tp_g_hash_table_update (presence->stream_tube_caps,
+ tmp->stream_tube_caps, g_strdup, NULL);
+
+ if (tmp->dbus_tube_caps != NULL)
+ tp_g_hash_table_update (presence->dbus_tube_caps,
+ tmp->dbus_tube_caps, g_strdup, NULL);
}
DEBUG ("total caps now %u", presence->caps);
diff --git a/src/presence.h b/src/presence.h
index 142f3fc..500d9e2 100644
--- a/src/presence.h
+++ b/src/presence.h
@@ -56,6 +56,8 @@ typedef struct _GabblePresencePrivate GabblePresencePrivate;
struct _GabblePresence {
GObject parent;
GabblePresenceCapabilities caps;
+ GHashTable *stream_tube_caps;
+ GHashTable *dbus_tube_caps;
GabblePresenceId status;
gchar *status_message;
gchar *nickname;
--
1.5.6.5
More information about the Telepathy-commits
mailing list