Make GData plugin use the password store.
[claws.git] / src / plugins / archive / archiver_prefs.c
1 /*
2  * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2008 Michael Rasmussen and the Claws Mail Team
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  * 
18  */
19
20 #ifdef HAVE_CONFIG_H
21 #  include "config.h"
22 #include "claws-features.h"
23 #endif
24
25 #include <glib.h>
26 #include <glib/gi18n.h>
27
28 #include "defs.h"
29
30 #include <glib.h>
31 #include <gtk/gtk.h>
32
33 #include "gtkutils.h"
34 #include "prefs.h"
35 #include "prefs_gtk.h"
36 #include "prefswindow.h"
37 #include "alertpanel.h"
38 #include "utils.h"
39 #include "filesel.h"
40
41 #include "archiver_prefs.h"
42
43 #define PREFS_BLOCK_NAME "Archiver"
44
45 ArchiverPrefs archiver_prefs;
46
47 struct ArchiverPrefsPage {
48         PrefsPage page;
49         GtkWidget *save_folder;
50         gint compression;
51         GtkWidget *zip_radiobtn;
52         GtkWidget *bzip_radiobtn;
53     GtkWidget *compress_radiobtn;
54         GtkWidget *none_radiobtn;
55         GtkWidget *tar_radiobtn;
56         GtkWidget *shar_radiobtn;
57         GtkWidget *cpio_radiobtn;
58         GtkWidget *pax_radiobtn;
59         GtkWidget *recursive_chkbtn;
60         GtkWidget *md5sum_chkbtn;
61         GtkWidget *rename_chkbtn;
62         GtkWidget *unlink_chkbtn;
63 };
64
65 struct ArchiverPrefsPage archiver_prefs_page;
66
67 static void create_archiver_prefs_page                  (PrefsPage *page,
68                                                          GtkWindow *window,
69                                                          gpointer   data);
70 static void destroy_archiver_prefs_page                 (PrefsPage *page);
71 static void save_archiver_prefs                         (PrefsPage *page);
72
73 static PrefParam param[] = {
74         {"save_folder", NULL, &archiver_prefs.save_folder, P_STRING, NULL, NULL, NULL},
75         {"compression", "0", &archiver_prefs.compression, P_ENUM, NULL, NULL, NULL},
76         {"format", "0", &archiver_prefs.format, P_ENUM, NULL, NULL, NULL},
77         {"recursive", "TRUE", &archiver_prefs.recursive, P_BOOL, NULL, NULL, NULL},
78         {"md5sum",  "FALSE", &archiver_prefs.md5sum, P_BOOL, NULL, NULL, NULL},
79         {"rename", "FALSE", &archiver_prefs.rename, P_BOOL, NULL, NULL, NULL},
80         {"unlink", "FALSE", &archiver_prefs.unlink, P_BOOL, NULL, NULL, NULL},
81
82         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
83 };
84
85 void archiver_prefs_init(void)
86 {
87         static gchar *path[3];
88         gchar *rcpath;
89
90         path[0] = _("Plugins");
91         path[1] = _("Mail Archiver");
92         path[2] = NULL;
93
94         prefs_set_default(param);
95         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
96         prefs_read_config(param, PREFS_BLOCK_NAME, rcpath, NULL);
97         g_free(rcpath);
98         
99         archiver_prefs_page.page.path = path;
100         archiver_prefs_page.page.create_widget = create_archiver_prefs_page;
101         archiver_prefs_page.page.destroy_widget = destroy_archiver_prefs_page;
102         archiver_prefs_page.page.save_page = save_archiver_prefs;
103         archiver_prefs_page.page.weight = 30.0;
104         
105         prefs_gtk_register_page((PrefsPage *) &archiver_prefs_page);
106 }
107
108 void archiver_prefs_done(void)
109 {
110         prefs_gtk_unregister_page((PrefsPage *) &archiver_prefs_page);
111 }
112
113 static void foldersel_cb(GtkWidget *widget, gpointer data)
114 {
115         struct ArchiverPrefsPage *page = (struct ArchiverPrefsPage *) data;
116         gchar *startdir = NULL;
117         gchar *dirname;
118         gchar *tmp;
119         
120         if (archiver_prefs.save_folder && *archiver_prefs.save_folder)
121                 startdir = g_strconcat(archiver_prefs.save_folder,
122                                        G_DIR_SEPARATOR_S, NULL);
123         else
124                 startdir = g_strdup(get_home_dir());
125
126         dirname = filesel_select_file_save_folder(_("Select destination folder"), startdir);
127         if (!dirname) {
128                 g_free(startdir);
129                 return;
130         }
131         if (!is_dir_exist(dirname)) {
132                 alertpanel_error(_("'%s' is not a directory."),dirname);
133                 g_free(dirname);
134                 g_free(startdir);
135                 return;
136         }
137         if (dirname[strlen(dirname)-1] == G_DIR_SEPARATOR)
138                 dirname[strlen(dirname)-1] = '\0';
139         g_free(startdir);
140
141         tmp =  g_filename_to_utf8(dirname,-1, NULL, NULL, NULL);
142         gtk_entry_set_text(GTK_ENTRY(page->save_folder), tmp);
143
144         g_free(dirname);
145         g_free(tmp);
146 }
147
148 static void create_archiver_prefs_page(PrefsPage * _page,
149                                        GtkWindow *window,
150                                        gpointer data)
151 {
152         struct ArchiverPrefsPage *page = (struct ArchiverPrefsPage *) _page;
153         GtkWidget *vbox1, *vbox2;
154         GtkWidget *hbox1;
155         GtkWidget *save_folder_label;
156         GtkWidget *save_folder;
157         GtkWidget *save_folder_select;
158         GtkWidget *frame;
159         GSList    *compression_group = NULL;
160         GtkWidget *zip_radiobtn;
161         GtkWidget *bzip_radiobtn;
162     GtkWidget *compress_radiobtn;
163         GtkWidget *none_radiobtn;
164         GSList    *format_group = NULL;
165         GtkWidget *tar_radiobtn;
166         GtkWidget *shar_radiobtn;
167         GtkWidget *cpio_radiobtn;
168         GtkWidget *pax_radiobtn;
169         GtkWidget *recursive_chkbtn;
170         GtkWidget *md5sum_chkbtn;
171         GtkWidget *rename_chkbtn;
172         GtkWidget *unlink_chkbtn;
173
174         vbox1 = gtk_vbox_new (FALSE, VSPACING);
175         gtk_widget_show (vbox1);
176         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
177
178         vbox2 = gtk_vbox_new (FALSE, 4);
179         gtk_widget_show (vbox2);
180         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
181
182         hbox1 = gtk_hbox_new (FALSE, 8);
183         gtk_widget_show (hbox1);
184         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0);
185
186         save_folder_label = gtk_label_new(_("Default save folder"));
187         gtk_widget_show (save_folder_label);
188         gtk_box_pack_start (GTK_BOX (hbox1), save_folder_label, FALSE, FALSE, 0);
189
190         save_folder = gtk_entry_new ();
191         gtk_widget_show (save_folder);
192         gtk_box_pack_start (GTK_BOX (hbox1), save_folder, TRUE, TRUE, 0);
193
194         save_folder_select = gtkut_get_browse_directory_btn(_("_Select"));
195         gtk_widget_show (save_folder_select);
196         gtk_box_pack_start (GTK_BOX (hbox1), save_folder_select, FALSE, FALSE, 0);
197         CLAWS_SET_TIP(save_folder_select,
198                              _("Click this button to select the default location for saving archives"));
199
200         g_signal_connect(G_OBJECT(save_folder_select), "clicked", 
201                          G_CALLBACK(foldersel_cb), page);
202
203         if (archiver_prefs.save_folder != NULL)
204                 gtk_entry_set_text(GTK_ENTRY(save_folder),
205                                    archiver_prefs.save_folder);
206
207         PACK_FRAME (vbox1, frame, _("Default compression"));
208
209         hbox1 = gtk_hbox_new(FALSE, 4);
210         gtk_widget_show(hbox1);
211         gtk_container_set_border_width(GTK_CONTAINER(hbox1), 4);
212         gtk_container_add(GTK_CONTAINER(frame), hbox1);
213
214         zip_radiobtn = gtk_radio_button_new_with_label(compression_group, "ZIP");
215         compression_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(zip_radiobtn));
216         gtk_widget_show(zip_radiobtn);
217         gtk_box_pack_start(GTK_BOX (hbox1), zip_radiobtn, FALSE, FALSE, 0);
218         CLAWS_SET_TIP(zip_radiobtn,
219                         _("Choose this option to use ZIP compression by default"));
220
221         bzip_radiobtn = gtk_radio_button_new_with_label(compression_group, "BZIP2");
222         compression_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(bzip_radiobtn));
223         gtk_widget_show(bzip_radiobtn);
224         gtk_box_pack_start(GTK_BOX (hbox1), bzip_radiobtn, FALSE, FALSE, 0);
225         CLAWS_SET_TIP(bzip_radiobtn,
226                         _("Choose this option to use BZIP2 compression by default"));
227
228         compress_radiobtn = gtk_radio_button_new_with_label(compression_group, "COMPRESS");
229         compression_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(compress_radiobtn));
230         gtk_widget_show(compress_radiobtn);
231         gtk_box_pack_start(GTK_BOX (hbox1), compress_radiobtn, FALSE, FALSE, 0);
232         CLAWS_SET_TIP(compress_radiobtn,
233                         _("Choose this option to use COMPRESS compression by default"));
234
235     none_radiobtn = gtk_radio_button_new_with_label(compression_group, _("None"));
236         compression_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(none_radiobtn));
237         gtk_widget_show(none_radiobtn);
238         gtk_box_pack_start(GTK_BOX (hbox1), none_radiobtn, FALSE, FALSE, 0);
239         CLAWS_SET_TIP(none_radiobtn,
240                         _("Choose this option to disable compression by default"));
241
242         switch (archiver_prefs.compression) {
243         case COMPRESSION_ZIP:
244                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(zip_radiobtn), TRUE);
245                 break;
246         case COMPRESSION_BZIP:
247                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bzip_radiobtn), TRUE);
248                 break;
249     case COMPRESSION_COMPRESS:       
250                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compress_radiobtn), TRUE);
251                 break;
252         case COMPRESSION_NONE:
253                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(none_radiobtn), TRUE);
254                 break;
255         }
256
257         PACK_FRAME (vbox1, frame, _("Default format"));
258
259         hbox1 = gtk_hbox_new(FALSE, 4);
260         gtk_widget_show(hbox1);
261         gtk_container_set_border_width(GTK_CONTAINER(hbox1), 4);
262         gtk_container_add(GTK_CONTAINER(frame), hbox1);
263
264         tar_radiobtn = gtk_radio_button_new_with_label(format_group, "TAR");
265         format_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(tar_radiobtn));
266         gtk_widget_show(tar_radiobtn);
267         gtk_box_pack_start(GTK_BOX (hbox1), tar_radiobtn, FALSE, FALSE, 0);
268         CLAWS_SET_TIP(tar_radiobtn,
269                         _("Choose this option to use the TAR format by default"));
270
271         shar_radiobtn = gtk_radio_button_new_with_label(format_group, "SHAR");
272         format_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(shar_radiobtn));
273         gtk_widget_show(shar_radiobtn);
274         gtk_box_pack_start(GTK_BOX (hbox1), shar_radiobtn, FALSE, FALSE, 0);
275         CLAWS_SET_TIP(shar_radiobtn,
276                         _("Choose this option to use the SHAR format by default"));
277
278         cpio_radiobtn = gtk_radio_button_new_with_label(format_group, "CPIO");
279         format_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(cpio_radiobtn));
280         gtk_widget_show(cpio_radiobtn);
281         gtk_box_pack_start(GTK_BOX (hbox1), cpio_radiobtn, FALSE, FALSE, 0);
282         CLAWS_SET_TIP(cpio_radiobtn,
283                         _("Choose this option to use the CPIO format by default"));
284
285         pax_radiobtn = gtk_radio_button_new_with_label(format_group, "PAX");
286         format_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(pax_radiobtn));
287         gtk_widget_show(pax_radiobtn);
288         gtk_box_pack_start(GTK_BOX (hbox1), pax_radiobtn, FALSE, FALSE, 0);
289         CLAWS_SET_TIP(pax_radiobtn,
290                         _("Choose this option to use the PAX format by default"));
291
292         switch (archiver_prefs.format) {
293         case FORMAT_TAR:
294                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tar_radiobtn), TRUE);
295                 break;
296         case FORMAT_SHAR:
297                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(shar_radiobtn), TRUE);
298                 break;
299         case FORMAT_CPIO:
300                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cpio_radiobtn), TRUE);
301                 break;
302         case FORMAT_PAX:
303                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pax_radiobtn), TRUE);
304                 break;
305         }
306
307         PACK_FRAME (vbox1, frame, _("Default miscellaneous options"));
308
309         hbox1 = gtk_hbox_new(FALSE, 4);
310         gtk_widget_show(hbox1);
311         gtk_container_set_border_width(GTK_CONTAINER(hbox1), 4);
312         gtk_container_add(GTK_CONTAINER(frame), hbox1);
313
314         PACK_CHECK_BUTTON(hbox1, recursive_chkbtn, _("Recursive"));
315         CLAWS_SET_TIP(recursive_chkbtn,
316                 _("Choose this option to include subfolders in the archives by default"));
317         PACK_CHECK_BUTTON(hbox1, md5sum_chkbtn, _("MD5sum"));
318         CLAWS_SET_TIP(md5sum_chkbtn,
319                 _("Choose this option to add MD5 checksums for each file in the archives by default.\n"
320                   "Be aware though, that this dramatically increases the time it\n"
321                   "will take to create the archives"));
322
323         PACK_CHECK_BUTTON(hbox1, rename_chkbtn, _("Rename"));
324         CLAWS_SET_TIP(rename_chkbtn,
325                 _("Choose this option to use descriptive names for each file in the archive.\n"
326                   "The naming scheme: date_from@to@subject.\n"
327                   "Names will be truncated to max 96 characters"));
328
329         PACK_CHECK_BUTTON(hbox1, unlink_chkbtn, _("Delete"));
330         CLAWS_SET_TIP(unlink_chkbtn,
331                 _("Choose this option to delete mails after archiving"));
332
333         if (archiver_prefs.recursive)
334                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(recursive_chkbtn), TRUE);
335         if (archiver_prefs.md5sum)
336                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(md5sum_chkbtn), TRUE);
337         if (archiver_prefs.rename)
338                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rename_chkbtn), TRUE);
339         if (archiver_prefs.unlink)
340                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(unlink_chkbtn), TRUE);
341
342
343         page->save_folder = save_folder;
344         page->zip_radiobtn = zip_radiobtn;
345         page->bzip_radiobtn = bzip_radiobtn;
346     page->compress_radiobtn = compress_radiobtn;
347         page->none_radiobtn = none_radiobtn;
348         page->tar_radiobtn = tar_radiobtn;
349         page->shar_radiobtn = shar_radiobtn;
350         page->cpio_radiobtn = cpio_radiobtn;
351         page->pax_radiobtn = pax_radiobtn;
352         page->recursive_chkbtn = recursive_chkbtn;
353         page->md5sum_chkbtn = md5sum_chkbtn;
354         page->rename_chkbtn = rename_chkbtn;
355         page->unlink_chkbtn = unlink_chkbtn;
356
357         page->page.widget = vbox1;
358 }
359
360 static void destroy_archiver_prefs_page(PrefsPage *page)
361 {
362         /* Do nothing! */
363 }
364
365 static void save_archiver_prefs(PrefsPage * _page)
366 {
367         struct ArchiverPrefsPage *page = (struct ArchiverPrefsPage *) _page;
368         PrefFile *pref_file;
369         gchar *rc_file_path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S,
370                                           COMMON_RC, NULL);
371
372         archiver_prefs.save_folder = gtk_editable_get_chars(GTK_EDITABLE(page->save_folder), 0, -1);
373         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->zip_radiobtn)))
374                 archiver_prefs.compression = COMPRESSION_ZIP;
375         else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->bzip_radiobtn)))
376                 archiver_prefs.compression = COMPRESSION_BZIP;
377         else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->compress_radiobtn)))
378                 archiver_prefs.compression = COMPRESSION_COMPRESS;
379         else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->none_radiobtn)))
380                 archiver_prefs.compression = COMPRESSION_NONE;
381
382         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->tar_radiobtn)))
383                 archiver_prefs.format = FORMAT_TAR;
384         else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->shar_radiobtn)))
385                 archiver_prefs.format = FORMAT_SHAR;
386         else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->cpio_radiobtn)))
387                 archiver_prefs.format = FORMAT_CPIO;
388         else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->pax_radiobtn)))
389                 archiver_prefs.format = FORMAT_PAX;
390
391         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->recursive_chkbtn)))
392                 archiver_prefs.recursive = TRUE;
393         else
394                 archiver_prefs.recursive = FALSE;
395         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->md5sum_chkbtn)))
396                 archiver_prefs.md5sum = TRUE;
397         else
398                 archiver_prefs.md5sum = FALSE;
399         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->rename_chkbtn)))
400                 archiver_prefs.rename = TRUE;
401         else
402                 archiver_prefs.rename = FALSE;
403         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->unlink_chkbtn)))
404                 archiver_prefs.unlink = TRUE;
405         else
406                 archiver_prefs.unlink = FALSE;
407
408
409         pref_file = prefs_write_open(rc_file_path);
410         g_free(rc_file_path);
411         
412         if (!(pref_file) ||
413             (prefs_set_block_label(pref_file, PREFS_BLOCK_NAME) < 0))
414           return;
415         
416         if (prefs_write_param(param, pref_file->fp) < 0) {
417           g_warning("failed to write Archiver Plugin configuration");
418           prefs_file_close_revert(pref_file);
419           return;
420         }
421         if (fprintf(pref_file->fp, "\n") < 0) {
422                 FILE_OP_ERROR(rc_file_path, "fprintf");
423                 prefs_file_close_revert(pref_file);
424         } else
425                 prefs_file_close(pref_file);
426
427 }