diff options
author | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2009-08-27 15:55:39 +0100 |
---|---|---|
committer | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2009-08-28 11:16:28 +0100 |
commit | cf4f136dfd09d9dcab342483d07633b260da7913 (patch) | |
tree | dc2374c458e6281cabaa7fbffe88717861ff84f3 | |
parent | a6da9047512845872e0ad7a041ab93245c79975c (diff) |
add wocky_contact_factory_ensure_resource_contact
-rw-r--r-- | wocky/wocky-contact-factory.c | 55 | ||||
-rw-r--r-- | wocky/wocky-contact-factory.h | 5 |
2 files changed, 60 insertions, 0 deletions
diff --git a/wocky/wocky-contact-factory.c b/wocky/wocky-contact-factory.c index 23cd4a0..80b9015 100644 --- a/wocky/wocky-contact-factory.c +++ b/wocky/wocky-contact-factory.c @@ -66,6 +66,8 @@ struct _WockyContactFactoryPrivate { /* bare JID (gchar *) => weak reffed (WockyBareContact *) */ GHashTable *bare_contacts; + /* full JID (gchar *) => weak reffed (WockyResourceContact *) */ + GHashTable *resource_contacts; gboolean dispose_has_run; }; @@ -82,6 +84,8 @@ wocky_contact_factory_init (WockyContactFactory *obj) priv->bare_contacts = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + priv->resource_contacts = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, NULL); } static void @@ -136,6 +140,17 @@ bare_contact_disposed_cb (gpointer user_data, } static void +resource_contact_disposed_cb (gpointer user_data, + GObject *contact) +{ + WockyContactFactory *self = WOCKY_CONTACT_FACTORY (user_data); + WockyContactFactoryPrivate *priv = WOCKY_CONTACT_FACTORY_GET_PRIVATE (self); + + g_hash_table_foreach_remove (priv->resource_contacts, remove_contact, + contact); +} + +static void wocky_contact_factory_dispose (GObject *object) { WockyContactFactory *self = WOCKY_CONTACT_FACTORY (object); @@ -154,6 +169,13 @@ wocky_contact_factory_dispose (GObject *object) g_object_weak_unref (G_OBJECT (contact), bare_contact_disposed_cb, self); } + g_hash_table_iter_init (&iter, priv->resource_contacts); + while (g_hash_table_iter_next (&iter, NULL, &contact)) + { + g_object_weak_unref (G_OBJECT (contact), resource_contact_disposed_cb, + self); + } + if (G_OBJECT_CLASS (wocky_contact_factory_parent_class)->dispose) G_OBJECT_CLASS (wocky_contact_factory_parent_class)->dispose (object); } @@ -165,6 +187,7 @@ wocky_contact_factory_finalize (GObject *object) WockyContactFactoryPrivate *priv = WOCKY_CONTACT_FACTORY_GET_PRIVATE (self); g_hash_table_destroy (priv->bare_contacts); + g_hash_table_destroy (priv->resource_contacts); G_OBJECT_CLASS (wocky_contact_factory_parent_class)->finalize (object); } @@ -219,3 +242,35 @@ wocky_contact_factory_lookup_bare_contact (WockyContactFactory *self, return g_hash_table_lookup (priv->bare_contacts, bare_jid); } + +WockyResourceContact * +wocky_contact_factory_ensure_resource_contact (WockyContactFactory *self, + const gchar *full_jid) +{ + WockyContactFactoryPrivate *priv = WOCKY_CONTACT_FACTORY_GET_PRIVATE (self); + WockyBareContact *bare; + WockyResourceContact *contact; + gchar *node, *domain, *resource, *bare_jid; + + contact = g_hash_table_lookup (priv->resource_contacts, full_jid); + if (contact != NULL) + return g_object_ref (contact); + + wocky_decode_jid (full_jid, &node, &domain, &resource); + bare_jid = g_strdup_printf ("%s@%s", node, domain); + + bare = wocky_contact_factory_ensure_bare_contact (self, bare_jid); + + contact = wocky_resource_contact_new (bare, resource); + + g_object_weak_ref (G_OBJECT (contact), resource_contact_disposed_cb, self); + g_hash_table_insert (priv->resource_contacts, g_strdup (full_jid), contact); + + g_free (node); + g_free (domain); + g_free (resource); + g_free (bare_jid); + g_object_unref (bare); + + return contact; +} diff --git a/wocky/wocky-contact-factory.h b/wocky/wocky-contact-factory.h index 1c71fa3..b40ffff 100644 --- a/wocky/wocky-contact-factory.h +++ b/wocky/wocky-contact-factory.h @@ -24,6 +24,7 @@ #include <glib-object.h> #include "wocky-bare-contact.h" +#include "wocky-resource-contact.h" G_BEGIN_DECLS @@ -66,6 +67,10 @@ WockyBareContact * wocky_contact_factory_lookup_bare_contact ( WockyContactFactory *factory, const gchar *bare_jid); +WockyResourceContact * wocky_contact_factory_ensure_resource_contact ( + WockyContactFactory *factory, + const gchar *full_jid); + G_END_DECLS #endif /* #ifndef __WOCKY_CONTACT_FACTORY_H__*/ |