summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2013-01-08 18:21:38 +0000
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2013-01-08 18:21:38 +0000
commite5cd53ee8ebca0d0839ad1345183adc93510335b (patch)
tree891d0aa70c8047064927fdb1e93d24f9a5c918d7
parent0f1435f548071f873d7626643f250b04b53931c9 (diff)
Stop using qdata on handles to cache nicknameswip-less-qdata
It's much simpler to use a hash table like everyone else, and this is no more leaky than qdata now that handles share the connection's lifetime. Also stop using a special non-null pointer as a value for negative caching, and just use NULL: unlike TpHandle qdata, hash tables have g_hash_table_lookup_extended.
-rw-r--r--src/vcard-manager.c49
-rw-r--r--src/vcard-manager.h2
2 files changed, 19 insertions, 32 deletions
diff --git a/src/vcard-manager.c b/src/vcard-manager.c
index 39fd4a3e0..bd45e236c 100644
--- a/src/vcard-manager.c
+++ b/src/vcard-manager.c
@@ -46,8 +46,6 @@ static guint default_request_timeout = 180;
* the same recipient */
static guint request_wait_delay = 5 * 60;
-static const gchar *NO_ALIAS = "none";
-
struct _GabbleVCardManagerEditInfo {
/* name of element to edit */
gchar *element_name;
@@ -100,6 +98,9 @@ struct _GabbleVCardManagerPrivate
gboolean dispose_has_run;
GabbleConnection *connection;
+ /* TpHandle => owned string, which may be "" as a negative cache entry */
+ GHashTable *nickname_cache;
+
/* TpHandle borrowed from the entry => owned (GabbleVCardCacheEntry *) */
GHashTable *cache;
@@ -199,15 +200,6 @@ gabble_vcard_manager_error_quark (void)
return quark;
}
-GQuark
-gabble_vcard_manager_cache_quark (void)
-{
- static GQuark quark = 0;
- if (!quark)
- quark = g_quark_from_static_string ("gabble-vcard-manager-cache");
- return quark;
-}
-
static void cache_entry_free (void *data);
static gint cache_entry_compare (gconstpointer a, gconstpointer b);
static void manager_patch_vcard (
@@ -229,6 +221,8 @@ gabble_vcard_manager_init (GabbleVCardManager *obj)
priv->timed_cache = tp_heap_new (cache_entry_compare, NULL);
priv->cache_timer = 0;
+ priv->nickname_cache = g_hash_table_new_full (NULL, NULL, NULL, g_free);
+
priv->have_self_avatar = FALSE;
priv->edits = NULL;
}
@@ -576,7 +570,12 @@ gabble_vcard_manager_dispose (GObject *object)
static void
gabble_vcard_manager_finalize (GObject *object)
{
+ GabbleVCardManager *self = GABBLE_VCARD_MANAGER (object);
+
DEBUG ("%p", object);
+
+ g_hash_table_unref (self->priv->nickname_cache);
+
G_OBJECT_CLASS (gabble_vcard_manager_parent_class)->finalize (object);
}
@@ -804,8 +803,6 @@ observe_vcard (GabbleConnection *conn,
TpHandle handle,
WockyNode *vcard_node)
{
- TpHandleRepoIface *contact_repo = tp_base_connection_get_handles (
- (TpBaseConnection *) conn, TP_HANDLE_TYPE_CONTACT);
const gchar *field = "<NICKNAME>";
gchar *alias;
const gchar *old_alias;
@@ -846,15 +843,15 @@ observe_vcard (GabbleConnection *conn,
handle, field);
/* takes ownership of alias */
- tp_handle_set_qdata (contact_repo, handle,
- gabble_vcard_manager_cache_quark (), alias, g_free);
+ g_hash_table_insert (manager->priv->nickname_cache,
+ GUINT_TO_POINTER (handle), alias);
}
else
{
DEBUG ("got no vCard alias for handle %u", handle);
- tp_handle_set_qdata (contact_repo, handle,
- gabble_vcard_manager_cache_quark (), (gchar *) NO_ALIAS, NULL);
+ g_hash_table_insert (manager->priv->nickname_cache,
+ GUINT_TO_POINTER (handle), NULL);
}
if ((old_alias != NULL) || (alias != NULL))
@@ -1649,7 +1646,6 @@ gabble_vcard_manager_get_cached_alias (GabbleVCardManager *self,
{
GabbleVCardManagerPrivate *priv;
TpHandleRepoIface *contact_repo;
- const gchar *s;
g_return_val_if_fail (GABBLE_IS_VCARD_MANAGER (self), NULL);
@@ -1659,17 +1655,13 @@ gabble_vcard_manager_get_cached_alias (GabbleVCardManager *self,
g_return_val_if_fail (tp_handle_is_valid (contact_repo, handle, NULL), NULL);
- s = tp_handle_get_qdata (contact_repo, handle,
- gabble_vcard_manager_cache_quark ());
-
- if (s == NO_ALIAS)
- s = NULL;
-
- return s;
+ return g_hash_table_lookup (priv->nickname_cache, GUINT_TO_POINTER (handle));
}
/**
* Return TRUE if we've tried looking up an alias for this handle before.
+ * In particular, return TRUE if we have a negative cache entry indicating
+ * that there is no vCard-based alias.
*/
gboolean
gabble_vcard_manager_has_cached_alias (GabbleVCardManager *self,
@@ -1677,7 +1669,6 @@ gabble_vcard_manager_has_cached_alias (GabbleVCardManager *self,
{
GabbleVCardManagerPrivate *priv;
TpHandleRepoIface *contact_repo;
- gpointer p;
g_return_val_if_fail (GABBLE_IS_VCARD_MANAGER (self), FALSE);
@@ -1688,10 +1679,8 @@ gabble_vcard_manager_has_cached_alias (GabbleVCardManager *self,
g_return_val_if_fail (tp_handle_is_valid (contact_repo, handle, NULL),
FALSE);
- p = tp_handle_get_qdata (contact_repo, handle,
- gabble_vcard_manager_cache_quark ());
-
- return p != NULL;
+ return g_hash_table_lookup_extended (priv->nickname_cache,
+ GUINT_TO_POINTER (handle), NULL, NULL);
}
/* For unit tests only */
diff --git a/src/vcard-manager.h b/src/vcard-manager.h
index 8f877050a..0a212b783 100644
--- a/src/vcard-manager.h
+++ b/src/vcard-manager.h
@@ -96,8 +96,6 @@ typedef void (*GabbleVCardManagerCb)(GabbleVCardManager *self,
GabbleVCardManager *gabble_vcard_manager_new (GabbleConnection *);
-GQuark gabble_vcard_manager_cache_quark (void);
-
GabbleVCardManagerRequest *gabble_vcard_manager_request (GabbleVCardManager *,
TpHandle,
guint timeout,