diff src/buddyicon.c @ 6886:b5fb1d5282e5

[gaim-migrate @ 7432] Buddy icon caching can now be enabled/disabled in the core, and the cache dir can be changed. committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Thu, 18 Sep 2003 07:11:55 +0000
parents 8ab95f4c9800
children bf630f7dfdcd
line wrap: on
line diff
--- a/src/buddyicon.c	Thu Sep 18 05:39:44 2003 +0000
+++ b/src/buddyicon.c	Thu Sep 18 07:11:55 2003 +0000
@@ -23,8 +23,12 @@
 #include "internal.h"
 #include "buddyicon.h"
 #include "conversation.h"
+#include "debug.h"
+#include "util.h"
 
 static GHashTable *account_cache = NULL;
+static char       *cache_dir     = NULL;
+static gboolean    icon_caching  = TRUE;
 
 GaimBuddyIcon *
 gaim_buddy_icon_new(GaimAccount *account, const char *username,
@@ -154,6 +158,62 @@
 }
 
 void
+gaim_buddy_icon_cache(GaimBuddyIcon *icon, GaimBuddy *buddy)
+{
+	const void *data;
+	const char *dirname;
+	char *random;
+	char *filename;
+	char *old_icon;
+	size_t len;
+	FILE *file = NULL;
+
+	g_return_if_fail(icon  != NULL);
+	g_return_if_fail(buddy != NULL);
+
+	if (!gaim_buddy_icons_is_caching())
+		return;
+
+	data = gaim_buddy_icon_get_data(icon, &len);
+
+	random   = g_strdup_printf("%x", g_random_int());
+	dirname  = gaim_buddy_icons_get_cache_dir();
+	filename = g_build_filename(dirname, random, NULL);
+	old_icon = gaim_buddy_get_setting(buddy, "buddy_icon");
+
+	g_free(random);
+
+	if (!g_file_test(dirname, G_FILE_TEST_IS_DIR))
+	{
+		gaim_debug_info("buddy icons", "Creating icon cache directory.\n");
+
+		if (mkdir(dirname, S_IRUSR | S_IWUSR | S_IXUSR) < 0)
+		{
+			gaim_debug_error("buddy icons",
+							 "Unable to create directory %s: %s\n",
+							 dirname, strerror(errno));
+		}
+	}
+
+	if ((file = fopen(filename, "wb")) != NULL)
+	{
+		fwrite(data, 1, len, file);
+		fclose(file);
+	}
+
+	if (old_icon != NULL)
+	{
+		unlink(old_icon);
+		g_free(old_icon);
+	}
+
+	gaim_buddy_set_setting(buddy, "buddy_icon", filename);
+	gaim_blist_save();
+
+	g_free(filename);
+}
+
+void
 gaim_buddy_icon_set_account(GaimBuddyIcon *icon, GaimAccount *account)
 {
 	g_return_if_fail(icon    != NULL);
@@ -249,6 +309,35 @@
 	return g_hash_table_lookup(icon_cache, username);
 }
 
+void
+gaim_buddy_icons_set_caching(gboolean caching)
+{
+	icon_caching = caching;
+}
+
+gboolean
+gaim_buddy_icons_is_caching(void)
+{
+	return icon_caching;
+}
+
+void
+gaim_buddy_icons_set_cache_dir(const char *dir)
+{
+	g_return_if_fail(cache_dir != NULL);
+
+	if (cache_dir != NULL)
+		g_free(cache_dir);
+
+	cache_dir = g_strdup(dir);
+}
+
+const char *
+gaim_buddy_icons_get_cache_dir(void)
+{
+	return cache_dir;
+}
+
 void *
 gaim_buddy_icons_get_handle()
 {
@@ -263,6 +352,8 @@
 	account_cache = g_hash_table_new_full(
 		g_direct_hash, g_direct_equal,
 		NULL, (GFreeFunc)g_hash_table_destroy);
+
+	cache_dir = g_build_filename(gaim_user_dir(), "icons", NULL);
 }
 
 void