sync with sylpheed 0.6.4cvs18
[claws.git] / src / template.c
1 /*
2  * Sylpheed templates subsystem 
3  * Copyright (C) 2001 Alexander Barinov
4  * Copyright (C) 2001 Hiroyuki Yamamoto
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19  */
20
21 #include "defs.h"
22
23 #include <glib.h>
24 #include <stdio.h>
25 #include <dirent.h>
26 #include <sys/stat.h>
27 #include <ctype.h>
28
29 #include "intl.h"
30 #include "main.h"
31 #include "template.h"
32 #include "utils.h"
33
34 static GSList *template_list;
35
36 static Template *template_load(gchar *filename)
37 {
38         Template *tmpl;
39         FILE *fp;
40         gchar buf[BUFFSIZE];
41         gint bytes_read;
42
43         debug_print(_("%s:%d loading template from %s\n"), __FILE__, __LINE__, filename);
44
45         if ((fp = fopen(filename, "r")) == NULL) {
46                 FILE_OP_ERROR(filename, "fopen");
47                 return NULL;
48         }
49
50         tmpl = g_new(Template, 1);
51         tmpl->name = NULL;
52
53         while (fgets(buf, sizeof(buf), fp) != NULL) {
54                 if (buf[0] == '\n')
55                         break;
56                 else if (!g_strncasecmp(buf, "Name:", 5))
57                         tmpl->name = g_strdup(g_strstrip(buf + 5));
58         }
59
60         if (!tmpl->name) {
61                 g_warning("wrong template format\n");
62                 g_free(tmpl);
63                 return NULL;
64         }
65
66         if ((bytes_read = fread(buf, 1, sizeof(buf), fp)) == 0) {
67                 if (ferror(fp)) {
68                         FILE_OP_ERROR(filename, "fread");
69                         g_free(tmpl->name);
70                         g_free(tmpl);
71                         return NULL;
72                 }
73         }
74         fclose(fp);
75         tmpl->value = g_strndup(buf, bytes_read);
76
77         return tmpl;
78 }
79
80 void template_free(Template *tmpl)
81 {
82         g_free(tmpl->name);
83         g_free(tmpl->value);
84         g_free(tmpl);
85 }
86
87 void template_clear_config(GSList *tmpl_list)
88 {
89         GSList *cur;
90         Template *tmpl;
91
92         for (cur = tmpl_list; cur != NULL; cur = cur->next) {
93                 tmpl = (Template *)cur->data;
94                 template_free(tmpl);
95         }
96         g_slist_free(tmpl_list);
97 }
98
99 GSList *template_read_config(void)
100 {
101         gchar *path;
102         gchar *filename;
103         DIR *dp;
104         struct dirent *de;
105         struct stat s;
106         Template *tmpl;
107         GSList *tmpl_list = NULL;
108
109         path = get_template_dir();
110         debug_print(_("%s:%d reading templates dir %s\n"), __FILE__, __LINE__, path);
111
112         if (!is_dir_exist(path)) {
113                 if (mkdir(path, S_IRWXU) < 0) {
114                         FILE_OP_ERROR(path, "mkdir");
115                         return NULL;
116                 }
117         }
118
119         if ((dp = opendir(path)) == NULL) {
120                 FILE_OP_ERROR(path, "opendir");
121                 return NULL;
122         }
123
124         while ((de = readdir(dp)) != NULL) {
125                 if (*de->d_name == '.') continue;
126
127                 filename = g_strconcat(path, G_DIR_SEPARATOR_S, de->d_name, NULL);
128                 debug_print(_("%s:%d found file %s\n"), __FILE__, __LINE__, filename);
129
130                 if (stat(filename, &s) != 0 || !S_ISREG(s.st_mode) ) {
131                         debug_print(_("%s:%d %s is not an ordinary file\n"), 
132                                     __FILE__, __LINE__, filename);
133                         continue;
134                 }
135
136                 tmpl = template_load(filename);
137                 if (tmpl)
138                         tmpl_list = g_slist_append(tmpl_list, tmpl);
139                 g_free(filename);
140         }
141
142         closedir(dp);
143
144         return tmpl_list;
145 }
146
147 void template_write_config(GSList *tmpl_list)
148 {
149         gchar *path;
150         GSList *cur;
151         Template *tmpl;
152         FILE *fp;
153         gint tmpl_num;
154
155         path = get_template_dir();
156
157         if (!is_dir_exist(path)) {
158                 if (is_file_exist(path)) {
159                         g_warning(_("file %s allready exists\n"), path);
160                         return;
161                 }
162                 if (mkdir(path, S_IRWXU) < 0) {
163                         FILE_OP_ERROR(path, "mkdir");
164                         return;
165                 }
166         }
167
168         remove_all_files(path);
169
170         for (cur = tmpl_list, tmpl_num = 1; cur != NULL;
171              cur = cur->next, tmpl_num++) {
172                 gchar *filename;
173
174                 tmpl = cur->data;
175
176                 filename = g_strconcat(path, G_DIR_SEPARATOR_S,
177                                        itos(tmpl_num), NULL);
178
179                 if ((fp = fopen(filename, "w")) == NULL) {
180                         FILE_OP_ERROR(filename, "fopen");
181                         g_free(filename);
182                         g_free(path);
183                         return;
184                 }
185
186                 debug_print(_("%s:%d writing template \"%s\" to %s\n"),
187                             __FILE__, __LINE__, tmpl->name, filename);
188                 fprintf(fp, "Name: %s\n", tmpl->name);
189                 fputs("\n", fp);
190                 fwrite(tmpl->value, sizeof(gchar) * strlen(tmpl->value), 1,
191                        fp);
192                 fclose(fp);
193         }
194 }
195
196 GSList *template_get_config(void)
197 {
198         if (!template_list)
199                 template_list = template_read_config();
200
201         return template_list;
202 }
203
204 void template_set_config(GSList *tmpl_list)
205 {
206         template_clear_config(template_list);
207         template_write_config(tmpl_list);
208         template_list = tmpl_list;
209 }