X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=blobdiff_plain;f=src%2Fcommon%2Ftemplate.c;h=225c1d83a923ab247ff786045f74386d41773df5;hp=2cb5aacdb7a87fba2b5a3e528cf0cd4f724ae0f8;hb=16f9a5d51f38804fee144a54d80d7c744e00cd53;hpb=aff60f24b63a6aadcf9806f2561bce956ee886f8 diff --git a/src/common/template.c b/src/common/template.c index 2cb5aacdb..225c1d83a 100644 --- a/src/common/template.c +++ b/src/common/template.c @@ -1,7 +1,7 @@ /* * Sylpheed templates subsystem * Copyright (C) 2001 Alexander Barinov - * Copyright (C) 2001 Hiroyuki Yamamoto + * Copyright (C) 2001-2007 Hiroyuki Yamamoto and the Claws Mail team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "defs.h" @@ -23,7 +23,6 @@ #include #include #include -#include #include #include @@ -40,12 +39,13 @@ static Template *template_load(gchar *filename) gchar buf[BUFFSIZE]; gint bytes_read; - if ((fp = fopen(filename, "rb")) == NULL) { + if ((fp = g_fopen(filename, "rb")) == NULL) { FILE_OP_ERROR(filename, "fopen"); return NULL; } tmpl = g_new(Template, 1); + tmpl->load_filename = g_strdup(filename);; tmpl->name = NULL; tmpl->subject = NULL; tmpl->to = NULL; @@ -54,8 +54,6 @@ static Template *template_load(gchar *filename) tmpl->value = NULL; while (fgets(buf, sizeof(buf), fp) != NULL) { - gchar *tmp = NULL; - if (buf[0] == '\n') break; else if (!g_ascii_strncasecmp(buf, "Name:", 5)) @@ -64,6 +62,8 @@ static Template *template_load(gchar *filename) tmpl->to = g_strdup(g_strstrip(buf + 3)); else if (!g_ascii_strncasecmp(buf, "Cc:", 3)) tmpl->cc = g_strdup(g_strstrip(buf + 3)); + else if (!g_ascii_strncasecmp(buf, "Bcc:", 4)) + tmpl->bcc = g_strdup(g_strstrip(buf + 4)); else if (!g_ascii_strncasecmp(buf, "Subject:", 8)) tmpl->subject = g_strdup(g_strstrip(buf + 8)); } @@ -89,6 +89,7 @@ static Template *template_load(gchar *filename) void template_free(Template *tmpl) { + g_free(tmpl->load_filename); g_free(tmpl->name); g_free(tmpl->subject); g_free(tmpl->to); @@ -110,12 +111,43 @@ void template_clear_config(GSList *tmpl_list) g_slist_free(tmpl_list); } +static gint tmpl_compare(gconstpointer tmpl1, gconstpointer tmpl2) +{ + gchar *basename1, *basename2; + long filenum1, filenum2; + gint ret = 0; + + if ((Template *)tmpl1 == NULL || (Template *)tmpl2 == NULL) + return 0; + + if (((Template *)tmpl1)->load_filename == NULL || ((Template *)tmpl2)->load_filename == NULL) + return 0; + + basename1 = g_path_get_basename(((Template *)tmpl1)->load_filename); + basename2 = g_path_get_basename(((Template *)tmpl2)->load_filename); + filenum1 = atol(basename1); + filenum2 = atol(basename2); + g_free(basename1); + g_free(basename2); + + if (filenum1 == 0 || filenum2 == 0) + return 0; + + if (filenum1 < filenum2) + ret = -1; + else + if (filenum1 > filenum2) + ret = 1; + + return ret; +} + GSList *template_read_config(void) { const gchar *path; gchar *filename; - DIR *dp; - struct dirent *de; + GDir *dir; + const gchar *dir_name; struct stat s; Template *tmpl; GSList *tmpl_list = NULL; @@ -129,18 +161,16 @@ GSList *template_read_config(void) return NULL; } - if ((dp = opendir(path)) == NULL) { - FILE_OP_ERROR(path, "opendir"); + if ((dir = g_dir_open(path, 0, NULL)) == NULL) { + g_warning("failed to open directory: %s\n", path); return NULL; } - while ((de = readdir(dp)) != NULL) { - if (*de->d_name == '.') continue; - + while ((dir_name = g_dir_read_name(dir)) != NULL) { filename = g_strconcat(path, G_DIR_SEPARATOR_S, - de->d_name, NULL); + dir_name, NULL); - if (stat(filename, &s) != 0 || !S_ISREG(s.st_mode) ) { + if (g_stat(filename, &s) != 0 || !S_ISREG(s.st_mode) ) { debug_print("%s:%d %s is not an ordinary file\n", __FILE__, __LINE__, filename); continue; @@ -148,12 +178,12 @@ GSList *template_read_config(void) tmpl = template_load(filename); if (tmpl) - tmpl_list = g_slist_append(tmpl_list, tmpl); + tmpl_list = g_slist_insert_sorted(tmpl_list, tmpl, tmpl_compare); g_free(filename); } - closedir(dp); + g_dir_close(dir); return tmpl_list; } @@ -190,7 +220,7 @@ void template_write_config(GSList *tmpl_list) filename = g_strconcat(path, G_DIR_SEPARATOR_S, itos(tmpl_num), NULL); - if ((fp = fopen(filename, "wb")) == NULL) { + if ((fp = g_fopen(filename, "wb")) == NULL) { FILE_OP_ERROR(filename, "fopen"); g_free(filename); return; @@ -203,11 +233,11 @@ void template_write_config(GSList *tmpl_list) fprintf(fp, "To: %s\n", tmpl->to); if (tmpl->cc && *tmpl->cc != '\0') fprintf(fp, "Cc: %s\n", tmpl->cc); - if (tmpl->cc && *tmpl->bcc != '\0') - fprintf(fp, "Cc: %s\n", tmpl->bcc); + if (tmpl->bcc && *tmpl->bcc != '\0') + fprintf(fp, "Bcc: %s\n", tmpl->bcc); fputs("\n", fp); if (tmpl->value && *tmpl->value != '\0') - fwrite(tmpl->value, sizeof(gchar) * strlen(tmpl->value), 1, fp); + fwrite(tmpl->value, sizeof(gchar), strlen(tmpl->value), fp); else fwrite("", sizeof(gchar), 1, fp);