gaim/gaim

Parents 85441c753905
Children 85581c0b1fe3
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).
--- a/src/gtkmain.c Tue Apr 04 22:10:39 2006 -0400
+++ b/src/gtkmain.c Wed Apr 05 22:03:20 2006 -0400
@@ -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);
--- a/src/gtkthemes.c Tue Apr 04 22:10:39 2006 -0400
+++ b/src/gtkthemes.c Wed Apr 05 22:03:20 2006 -0400
@@ -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()