# HG changeset patch # User Mark Doliner # Date 1117583334 0 # Node ID e8e535ad720be14919918d940e3c39c74c27ba9e # Parent 98225b573c9d74f9cf3de4e56999b3814aef9044 [gaim-migrate @ 12753] sf patch #1211718, from Richard Laager "Set Extension for Saving Buddy Icons" committer: Tailor Script diff -r 98225b573c9d -r e8e535ad720b ChangeLog --- a/ChangeLog Tue May 31 23:40:57 2005 +0000 +++ b/ChangeLog Tue May 31 23:48:54 2005 +0000 @@ -34,6 +34,8 @@ * Full message background colors are now supported * Smooth scrolling when receiving a new message * Themeable mouse-over hyperlink coloring + * Attempt to detect the file type of a buddy icon when saving + (Richard Laager) Bug fixes: * People using input methods can now use Enter again. diff -r 98225b573c9d -r e8e535ad720b src/buddyicon.c --- a/src/buddyicon.c Tue May 31 23:40:57 2005 +0000 +++ b/src/buddyicon.c Tue May 31 23:48:54 2005 +0000 @@ -331,6 +331,32 @@ return icon->data; } +const char * +gaim_buddy_icon_get_type(const GaimBuddyIcon *icon) +{ + const void *data; + size_t len; + + g_return_val_if_fail(icon != NULL, NULL); + + data = gaim_buddy_icon_get_data(icon, &len); + + /* TODO: Find a way to do this with GDK */ + if (len >= 4) + { + if (!strncmp(data, "BM", 2)) + return "bmp"; + else if (!strncmp(data, "GIF8", 4)) + return "gif"; + else if (!strncmp(data, "\xff\xd8\xff\xe0", 4)) + return "jpg"; + else if (!strncmp(data, "\x89PNG", 4)) + return "png"; + } + + return NULL; +} + void gaim_buddy_icons_set_for_user(GaimAccount *account, const char *username, void *icon_data, size_t icon_len) diff -r 98225b573c9d -r e8e535ad720b src/buddyicon.h --- a/src/buddyicon.h Tue May 31 23:40:57 2005 +0000 +++ b/src/buddyicon.h Tue May 31 23:48:54 2005 +0000 @@ -158,6 +158,15 @@ */ const void *gaim_buddy_icon_get_data(const GaimBuddyIcon *icon, size_t *len); +/** + * Returns an extension corresponding to the buddy icon's file type. + * + * @param icon The buddy icon. + * + * @return The icon's extension. + */ +const char *gaim_buddy_icon_get_type(const GaimBuddyIcon *icon); + /*@}*/ /**************************************************************************/ diff -r 98225b573c9d -r e8e535ad720b src/gtkconv.c --- a/src/gtkconv.c Tue May 31 23:40:57 2005 +0000 +++ b/src/gtkconv.c Tue May 31 23:48:54 2005 +0000 @@ -2543,15 +2543,16 @@ icon_menu_save_cb(GtkWidget *widget, GaimGtkConversation *gtkconv) { GaimConversation *conv = gtkconv->active_conv; + const gchar *ext; gchar *buf; g_return_if_fail(conv != NULL); - /* - * XXX - The file extension needs to be set to something that doesn't suck... - * Maybe do what gtkimhtml.c does when saving an image? - */ - buf = g_strdup_printf("%s.icon", gaim_normalize(conv->account, conv->name)); + ext = gaim_buddy_icon_get_type(gaim_conv_im_get_icon(GAIM_CONV_IM(conv))); + if (ext == NULL) + ext = "icon"; + + buf = g_strdup_printf("%s.%s", gaim_normalize(conv->account, conv->name), ext); gaim_request_file(conv, _("Save Icon"), buf, TRUE, G_CALLBACK(saveicon_writefile_cb), NULL, conv);