[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