changeset 15584:d91aed154695

Work around gdk-pixbuf brokenness when dealing with unrecognized parameters. Also, improve the error handling so we don't get a confusing error message.
author Daniel Atallah <daniel.atallah@gmail.com>
date Thu, 08 Feb 2007 03:33:44 +0000
parents ad1ddb31202d
children 9cbf44d3c0f9 c406a1e73d6f
files pidgin/gtkutils.c
diffstat 1 files changed, 19 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/pidgin/gtkutils.c	Thu Feb 08 00:39:29 2007 +0000
+++ b/pidgin/gtkutils.c	Thu Feb 08 03:33:44 2007 +0000
@@ -2583,6 +2583,8 @@
 		int i;
 		GError *error = NULL;
 		GdkPixbuf *scale;
+		gboolean success = FALSE;
+
 		g_strfreev(pixbuf_formats);
 
 		pixbuf = gdk_pixbuf_new_from_file(path, &error);
@@ -2614,25 +2616,33 @@
 
 		for (i = 0; prpl_formats[i]; i++) {
 			gaim_debug_info("buddyicon", "Converting buddy icon to %s as %s\n", prpl_formats[i], filename);
-			if (strcmp(prpl_formats[i], "png") == 0) {
+			/* The "compression" param wasn't supported until gdk-pixbuf 2.8.
+			 * Using it in previous versions causes the save to fail (and an assert message).  */
+			if ((gdk_pixbuf_major_version > 2 || (gdk_pixbuf_major_version == 2
+						&& gdk_pixbuf_minor_version >= 8))
+					&& strcmp(prpl_formats[i], "png") == 0) {
 				if (gdk_pixbuf_save(pixbuf, filename, prpl_formats[i],
-					&error, "compression", "9", NULL))
-				/* Success! */
-				break;
+						&error, "compression", "9", NULL)) {
+					success = TRUE;
+					break;
+				}
 			} else if (gdk_pixbuf_save(pixbuf, filename, prpl_formats[i],
 					&error, NULL)) {
-				/* Success! */
+				success = TRUE;
 				break;
 			}
-			gaim_debug_warning("buddyicon", "Could not convert to %s: %s\n", prpl_formats[i], error->message);
+
+			/* The NULL checking is necessary due to this bug:
+			 * http://bugzilla.gnome.org/show_bug.cgi?id=405539 */
+			gaim_debug_warning("buddyicon", "Could not convert to %s: %s\n", prpl_formats[i],
+				(error && error->message) ? error->message : "Unknown error");
 			g_error_free(error);
 			error = NULL;
 		}
 		g_strfreev(prpl_formats);
 		g_object_unref(G_OBJECT(pixbuf));
-		if (error) {
-			gaim_debug_error("buddyicon", "Could not convert icon to usable format: %s\n", error->message);
-			g_error_free(error);
+		if (!success) {
+			gaim_debug_error("buddyicon", "Could not convert icon to usable format.\n");
 			g_free(random);
 			g_free(filename);
 			return NULL;