libpurple/smiley-list.c

changeset 35713
4423f463a782
parent 35709
0d7a84931572
child 35716
80bedd712883
--- a/libpurple/smiley-list.c	Tue Apr 01 04:15:45 2014 +0200
+++ b/libpurple/smiley-list.c	Tue Apr 01 15:20:43 2014 +0200
@@ -33,6 +33,7 @@
 	GList *smileys;
 	GList *smileys_end;
 	PurpleTrie *trie;
+	GHashTable *unique_map;
 } PurpleSmileyListPrivate;
 
 enum
@@ -91,6 +92,7 @@
 purple_smiley_list_add(PurpleSmileyList *list, PurpleSmiley *smiley)
 {
 	PurpleSmileyListPrivate *priv = PURPLE_SMILEY_LIST_GET_PRIVATE(list);
+	const gchar *smiley_path;
 	gboolean succ;
 
 	g_return_val_if_fail(priv != NULL, FALSE);
@@ -113,6 +115,12 @@
 	g_object_set_data(G_OBJECT(smiley), "purple-smiley-list-elem",
 		priv->smileys_end);
 
+	smiley_path = purple_smiley_get_path(smiley);
+	if (g_hash_table_lookup(priv->unique_map, smiley_path) == NULL) {
+		g_hash_table_insert(priv->unique_map,
+			g_strdup(smiley_path), smiley);
+	}
+
 	return TRUE;
 }
 
@@ -151,6 +159,16 @@
 	return priv->trie;
 }
 
+GList *
+purple_smiley_list_get_unique(PurpleSmileyList *list)
+{
+	PurpleSmileyListPrivate *priv = PURPLE_SMILEY_LIST_GET_PRIVATE(list);
+
+	g_return_val_if_fail(priv != NULL, NULL);
+
+	return g_hash_table_get_values(priv->unique_map);
+}
+
 
 /*******************************************************************************
  * Object stuff
@@ -163,6 +181,8 @@
 	PurpleSmileyListPrivate *priv = PURPLE_SMILEY_LIST_GET_PRIVATE(sl);
 
 	priv->trie = purple_trie_new();
+	priv->unique_map = g_hash_table_new_full(g_str_hash, g_str_equal,
+		g_free, NULL);
 
 	PURPLE_DBUS_REGISTER_POINTER(sl, PurpleSmileyList);
 }
@@ -175,6 +195,7 @@
 	GList *it;
 
 	g_object_unref(priv->trie);
+	g_hash_table_destroy(priv->unique_map);
 
 	for (it = priv->smileys; it; it = g_list_next(it)) {
 		PurpleSmiley *smiley = it->data;

mercurial