# HG changeset patch # User Daniel Atallah # Date 1144289000 0 # Node ID 0cc7773b1d8719bd6d18b00cd59c3778052ffa4c # Parent ffb12e85473f2cd64bf7c0888b89d3444b6d39ec [gaim-migrate @ 15971] Don't load invalid smiley themes (i.e. themes missing the Name, Description or Author lines). I noticed that gtkprefs were being initialized twice, so that is fixed too (it took me forever to figure out why the callback was being called twice). committer: Tailor Script diff -r ffb12e85473f -r 0cc7773b1d87 src/gtkmain.c --- a/src/gtkmain.c Wed Apr 05 02:10:39 2006 +0000 +++ b/src/gtkmain.c Thu Apr 06 02:03:20 2006 +0000 @@ -248,7 +248,6 @@ #endif gaim_gtk_stock_init(); - gaim_gtk_prefs_init(); gaim_gtk_account_init(); gaim_gtk_connection_init(); gaim_gtk_blist_init(); @@ -506,11 +505,11 @@ "%scontactinfo.php\n"), GAIM_WEBSITE, GAIM_WEBSITE, GAIM_WEBSITE ); - + /* we have to convert the message (UTF-8 to console charset) early because after a segmentation fault it's not a good practice to allocate memory */ - segfault_message = g_locale_from_utf8(segfault_message_tmp, + segfault_message = g_locale_from_utf8(segfault_message_tmp, -1, NULL, NULL, &error); if (segfault_message != NULL) { g_free(segfault_message_tmp); diff -r ffb12e85473f -r 0cc7773b1d87 src/gtkthemes.c --- a/src/gtkthemes.c Wed Apr 05 02:10:39 2006 +0000 +++ b/src/gtkthemes.c Thu Apr 06 02:03:20 2006 +0000 @@ -72,6 +72,7 @@ struct smiley_list *list = NULL; GSList *lst = smiley_themes; char *dirname; + gboolean new_theme = FALSE; if (!f) return; @@ -86,40 +87,16 @@ } if (!theme) { + new_theme = TRUE; theme = g_new0(struct smiley_theme, 1); theme->path = g_strdup(file); - smiley_themes = g_slist_append(smiley_themes, theme); + } else if (theme == current_smiley_theme) { + /* Don't reload the theme if it is already loaded */ + fclose(f); + return; } dirname = g_path_get_dirname(file); - if (load) { - if (current_smiley_theme) { - GSList *already_freed = NULL; - struct smiley_list *wer = current_smiley_theme->list, *wer2; - while (wer) { - while (wer->smileys) { - GtkIMHtmlSmiley *uio = wer->smileys->data; - if (uio->icon) - g_object_unref(uio->icon); - if (!g_slist_find(already_freed, uio->file)) { - g_free(uio->file); - already_freed = g_slist_append(already_freed, uio->file); - } - g_free(uio->smile); - g_free(uio); - wer->smileys=g_slist_remove(wer->smileys, uio); - } - wer2 = wer->next; - g_free(wer->sml); - g_free(wer); - wer = wer2; - } - current_smiley_theme->list = NULL; - g_slist_free(already_freed); - } - current_smiley_theme = theme; - } - while (!feof(f)) { if (!fgets(buf, sizeof(buf), f)) { @@ -195,9 +172,75 @@ } } + g_free(dirname); + fclose(f); + + if (!theme->name || !theme->desc || !theme->author) { + GSList *already_freed = NULL; + struct smiley_list *wer = theme->list, *wer2; + + gaim_debug_error("gtkthemes", "Invalid file format, not loading smiley theme from '%s'\n", file); + + while (wer) { + while (wer->smileys) { + GtkIMHtmlSmiley *uio = wer->smileys->data; + if (uio->icon) + g_object_unref(uio->icon); + if (!g_slist_find(already_freed, uio->file)) { + g_free(uio->file); + already_freed = g_slist_append(already_freed, uio->file); + } + g_free(uio->smile); + g_free(uio); + wer->smileys = g_slist_remove(wer->smileys, uio); + } + wer2 = wer->next; + g_free(wer->sml); + g_free(wer); + wer = wer2; + } + theme->list = NULL; + g_slist_free(already_freed); + + g_free(theme->path); + g_free(theme); + + return; + } + + if (new_theme) { + smiley_themes = g_slist_append(smiley_themes, theme); + } + if (load) { GList *cnv; + if (current_smiley_theme) { + GSList *already_freed = NULL; + struct smiley_list *wer = current_smiley_theme->list, *wer2; + while (wer) { + while (wer->smileys) { + GtkIMHtmlSmiley *uio = wer->smileys->data; + if (uio->icon) + g_object_unref(uio->icon); + if (!g_slist_find(already_freed, uio->file)) { + g_free(uio->file); + already_freed = g_slist_append(already_freed, uio->file); + } + g_free(uio->smile); + g_free(uio); + wer->smileys = g_slist_remove(wer->smileys, uio); + } + wer2 = wer->next; + g_free(wer->sml); + g_free(wer); + wer = wer2; + } + current_smiley_theme->list = NULL; + g_slist_free(already_freed); + } + current_smiley_theme = theme; + for (cnv = gaim_get_conversations(); cnv != NULL; cnv = cnv->next) { GaimConversation *conv = cnv->data; @@ -207,9 +250,6 @@ } } } - - g_free(dirname); - fclose(f); } void gaim_gtkthemes_smiley_theme_probe()