libpurple/protocols/facebook/data.c

branch
facebook
changeset 37343
3e818c95dfd9
parent 37342
acae53caaff0
child 37352
dd1528f03f59
--- a/libpurple/protocols/facebook/data.c	Wed Aug 12 18:55:37 2015 -0400
+++ b/libpurple/protocols/facebook/data.c	Thu Aug 13 06:22:01 2015 -0400
@@ -35,7 +35,8 @@
 	GQueue *msgs;
 	GHashTable *icons;
 	GHashTable *icona;
-	guint syncev;
+	GHashTable *unread;
+	GHashTable *evs;
 };
 
 static const gchar *fb_props_strs[] = {
@@ -54,9 +55,13 @@
 fb_data_dispose(GObject *obj)
 {
 	FbDataPrivate *priv = FB_DATA(obj)->priv;
+	GHashTableIter iter;
+	gpointer ptr;
 
-	if (priv->syncev > 0) {
-		purple_timeout_remove(priv->syncev);
+	g_hash_table_iter_init(&iter, priv->evs);
+
+	while (g_hash_table_iter_next(&iter, NULL, &ptr)) {
+		purple_timeout_remove(GPOINTER_TO_UINT(ptr));
 	}
 
 	if (G_LIKELY(priv->api != NULL)) {
@@ -64,8 +69,11 @@
 	}
 
 	g_queue_free_full(priv->msgs, (GDestroyNotify) fb_api_message_free);
+
 	g_hash_table_destroy(priv->icons);
 	g_hash_table_destroy(priv->icona);
+	g_hash_table_destroy(priv->unread);
+	g_hash_table_destroy(priv->evs);
 }
 
 static void
@@ -92,6 +100,10 @@
 	priv->icona = g_hash_table_new_full(g_direct_hash, g_direct_equal,
 	                                    (GDestroyNotify) fb_data_icon_free,
 					    NULL);
+	priv->unread = g_hash_table_new_full(fb_id_hash, fb_id_equal, g_free,
+	                                     NULL);
+	priv->evs = g_hash_table_new_full(g_str_hash, g_str_equal, g_free,
+	                                  NULL);
 }
 
 FbData *
@@ -211,36 +223,41 @@
 }
 
 void
-fb_data_add_sync_timeout(FbData *fata, guint minutes, GSourceFunc func,
-                         gpointer data)
+fb_data_add_timeout(FbData *fata, const gchar *name, guint interval,
+                    GSourceFunc func, gpointer data)
 {
 	FbDataPrivate *priv;
+	gchar *key;
+	guint id;
 
 	g_return_if_fail(FB_IS_DATA(fata));
 	priv = fata->priv;
 
-	if (priv->syncev > 0) {
-		purple_timeout_remove(priv->syncev);
-	}
+	fb_data_clear_timeout(fata, name, TRUE);
 
-	minutes *= 60;
-	priv->syncev = purple_timeout_add_seconds(minutes, func, data);
+	key = g_strdup(name);
+	id = purple_timeout_add_seconds(interval, func, data);
+	g_hash_table_replace(priv->evs, key, GUINT_TO_POINTER(id));
 }
 
 void
-fb_data_clear_sync_timeout(FbData *fata, gboolean remove)
+fb_data_clear_timeout(FbData *fata, const gchar *name, gboolean remove)
 {
 	FbDataPrivate *priv;
+	gpointer ptr;
+	guint id;
 
 	g_return_if_fail(FB_IS_DATA(fata));
 	priv = fata->priv;
-	g_return_if_fail(priv->syncev > 0);
 
-	if (remove) {
-		purple_timeout_remove(priv->syncev);
+	ptr = g_hash_table_lookup(priv->evs, name);
+	id = GPOINTER_TO_UINT(ptr);
+
+	if ((id > 0) && remove) {
+		purple_timeout_remove(id);
 	}
 
-	priv->syncev = 0;
+	g_hash_table_remove(priv->evs, name);
 }
 
 FbApi *
@@ -276,6 +293,20 @@
 	return priv->roomlist;
 }
 
+gboolean
+fb_data_get_unread(FbData *fata, FbId id)
+{
+	FbDataPrivate *priv;
+	gpointer *ptr;
+
+	g_return_val_if_fail(FB_IS_DATA(fata), FALSE);
+	g_return_val_if_fail(id != 0, FALSE);
+	priv = fata->priv;
+
+	ptr = g_hash_table_lookup(priv->unread, &id);
+	return GPOINTER_TO_INT(ptr);
+}
+
 void
 fb_data_set_roomlist(FbData *fata, PurpleRoomlist *list)
 {
@@ -288,6 +319,25 @@
 }
 
 void
+fb_data_set_unread(FbData *fata, FbId id, gboolean unread)
+{
+	FbDataPrivate *priv;
+	gpointer key;
+
+	g_return_if_fail(FB_IS_DATA(fata));
+	g_return_if_fail(id != 0);
+	priv = fata->priv;
+
+	if (!unread) {
+		g_hash_table_remove(priv->unread, &id);
+		return;
+	}
+
+	key = g_memdup(&id, sizeof id);
+	g_hash_table_replace(priv->unread, key, GINT_TO_POINTER(unread));
+}
+
+void
 fb_data_add_message(FbData *fata, FbApiMessage *msg)
 {
 	FbDataPrivate *priv;

mercurial