2007-03-20 [colin] 2.8.1cvs26
[claws.git] / src / wizard.c
1 /*
2  * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2007 Colin Leroy <colin@colino.net> 
4  * and the Claws Mail team
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  */
20
21 #ifdef HAVE_CONFIG_H
22 #  include "config.h"
23 #endif
24
25 #include "defs.h"
26
27 #include <glib.h>
28 #include <glib/gi18n.h>
29 #include <gdk/gdkkeysyms.h>
30 #include <gtk/gtkwidget.h>
31 #include <gtk/gtkvbox.h>
32 #include <gtk/gtkbox.h>
33 #include <gtk/gtktable.h>
34 #include <gtk/gtkentry.h>
35 #include <gtk/gtklabel.h>
36 #include <gtk/gtknotebook.h>
37 #include <gtk/gtktogglebutton.h>
38 #include <gtk/gtkcheckbutton.h>
39 #include <gtk/gtk.h>
40
41 #include <stdio.h>
42 #include <stdlib.h>
43 #include <string.h>
44 #include <ctype.h>
45
46 #ifdef HAVE_CONFIG_H
47 #  include "config.h"
48 #endif
49
50 #include "utils.h"
51 #include "gtk/menu.h"
52 #include "plugin.h"
53 #include "account.h"
54 #include "prefs_account.h"
55 #include "mainwindow.h"
56 #include "stock_pixmap.h"
57 #include "setup.h"
58 #include "folder.h"
59 #include "alertpanel.h"
60 #ifdef USE_OPENSSL                      
61 #include "ssl.h"
62 #endif
63 #include "prefs_common.h"
64
65 typedef enum
66 {
67         GO_BACK,
68         GO_FORWARD,
69         CANCEL,
70         FINISHED
71 } PageNavigation;
72
73 int WELCOME_PAGE = -1;
74 int USER_PAGE = -1;
75 int SMTP_PAGE = -1;
76 int RECV_PAGE = -1;
77 int MAILBOX_PAGE = -1;
78 int DONE_PAGE = -1;
79
80 typedef struct
81 {
82         GtkWidget *window;
83         GSList    *pages;
84         GtkWidget *notebook;
85
86         MainWindow *mainwin;
87         
88         GtkWidget *email;
89         GtkWidget *full_name;
90         GtkWidget *organization;
91
92         GtkWidget *mailbox_name;
93         
94         GtkWidget *smtp_server;
95         GtkWidget *smtp_auth;
96         GtkWidget *smtp_username;
97         GtkWidget *smtp_password;
98         GtkWidget *smtp_username_label;
99         GtkWidget *smtp_password_label;
100
101         GtkWidget *recv_type;
102         GtkWidget *recv_label;
103         GtkWidget *recv_server;
104         GtkWidget *recv_username;
105         GtkWidget *recv_password;
106         GtkWidget *recv_username_label;
107         GtkWidget *recv_password_label;
108         GtkWidget *recv_imap_label;
109         GtkWidget *recv_imap_subdir;
110         GtkWidget *subsonly_checkbtn;
111         GtkWidget *no_imap_warning;
112 #ifdef USE_OPENSSL
113         GtkWidget *smtp_use_ssl;
114         GtkWidget *recv_use_ssl;
115         GtkWidget *smtp_use_tls;
116         GtkWidget *recv_use_tls;
117 #endif
118         
119         gboolean create_mailbox;
120         gboolean finished;
121         gboolean result;
122
123 } WizardWindow;
124
125 typedef struct _AccountTemplate {
126         gchar *name;
127         gchar *domain;
128         gchar *email;
129         gchar *organization;
130         gchar *smtpserver;
131         gboolean smtpauth;
132         gchar *smtpuser;
133         gchar *smtppass;
134         RecvProtocol recvtype;
135         gchar *recvserver;
136         gchar *recvuser;
137         gchar *recvpass;
138         gchar *imapdir;
139         gboolean subsonly;
140         gchar *mboxfile;
141         gchar *mailbox;
142         gboolean smtpssl;
143         gboolean recvssl;
144 } AccountTemplate;
145
146 static AccountTemplate tmpl;
147
148 static PrefParam template_params[] = {
149         {"name", "$USERNAME",
150          &tmpl.name, P_STRING, NULL, NULL, NULL},
151         {"domain", "$DEFAULTDOMAIN",
152          &tmpl.domain, P_STRING, NULL, NULL, NULL},
153         {"email", "$NAME_MAIL@$DOMAIN",
154          &tmpl.email, P_STRING, NULL, NULL, NULL},
155         {"organization", "",
156          &tmpl.organization, P_STRING, NULL, NULL, NULL},
157         {"smtpserver", "smtp.$DOMAIN",
158          &tmpl.smtpserver, P_STRING, NULL, NULL, NULL},
159         {"smtpauth", "FALSE",
160          &tmpl.smtpauth, P_BOOL, NULL, NULL, NULL},
161         {"smtpuser", "",
162          &tmpl.smtpuser, P_STRING, NULL, NULL, NULL},
163         {"smtppass", "",
164          &tmpl.smtppass, P_STRING, NULL, NULL, NULL},
165         {"recvtype", A_POP3,
166          &tmpl.recvtype, P_INT, NULL, NULL, NULL},
167         {"recvserver", "pop.$DOMAIN",
168          &tmpl.recvserver, P_STRING, NULL, NULL, NULL},
169         {"recvuser", "$LOGIN",
170          &tmpl.recvuser, P_STRING, NULL, NULL, NULL},
171         {"recvpass", "",
172          &tmpl.recvpass, P_STRING, NULL, NULL, NULL},
173         {"imapdir", "",
174          &tmpl.imapdir, P_STRING, NULL, NULL, NULL},
175         {"subsonly", "TRUE",
176          &tmpl.subsonly, P_BOOL, NULL, NULL, NULL},
177         {"mboxfile", "/var/mail/$LOGIN",
178          &tmpl.mboxfile, P_STRING, NULL, NULL, NULL},
179         {"mailbox", "Mail",
180          &tmpl.mailbox, P_STRING, NULL, NULL, NULL},
181         {"smtpssl", "0",
182          &tmpl.smtpssl, P_INT, NULL, NULL, NULL},
183         {"recvssl", "0",
184          &tmpl.recvssl, P_INT, NULL, NULL, NULL},
185         {NULL, NULL, NULL, P_INT, NULL, NULL, NULL}
186 };
187
188
189 static gchar *accountrc_tmpl =
190         "[AccountTemplate]\n"
191         "#you can use $DEFAULTDOMAIN here\n"
192         "#domain must be defined before the variables that use it\n"
193         "#by default, domain is extracted from the hostname\n"
194         "#domain=\n"
195         "\n"
196         "#you can use $USERNAME for name (this is the default)\n"
197         "#name=\n"
198         "\n"
199         "#you can use $LOGIN, $NAME_MAIL and $DOMAIN here \n"
200         "#$NAME_MAIL is the name without uppercase and with dots instead\n"
201         "#of spaces\n"
202         "#the default is $NAME_MAIL@$DOMAIN\n"
203         "#email=\n"
204         "\n"
205         "#you can use $DOMAIN here\n"
206         "#the default organization is empty\n"
207         "#organization=\n"
208         "\n"
209         "#you can use $DOMAIN here \n"
210         "#the default is stmp.$DOMAIN\n"
211         "#smtpserver=\n"
212         "\n"
213         "#Whether to use smtp authentication\n"
214         "#the default is 0 (no)\n"
215         "#smtpauth=\n"
216         "\n"
217         "#SMTP username\n"
218         "#you can use $LOGIN, $NAME_MAIL, $DOMAIN or $EMAIL here\n"
219         "#the default is empty (same as reception username)\n"
220         "#smtpuser=\n"
221         "\n"
222         "#SMTP password\n"
223         "#the default is empty (same as reception password)\n"
224         "#smtppass=\n"
225         "\n"
226         "#recvtype can be:\n"
227         "#0 for pop3\n"
228         "#3  for imap\n"
229         "#5  for a local mbox file\n"
230         "#recvtype=\n"
231         "\n"
232         "#you can use $DOMAIN here \n"
233         "#the default is {pop,imap}.$DOMAIN\n"
234         "#recvserver=\n"
235         "\n"
236         "#you can use $LOGIN, $NAME_MAIL, $DOMAIN or $EMAIL here\n"
237         "#default is $LOGIN\n"
238         "#recvuser=\n"
239         "\n"
240         "#default is empty\n"
241         "#recvpass=\n"
242         "\n"
243         "#imap dir if imap (relative to the home on the server)\n"
244         "#default is empty\n"
245         "#imapdir=\n"
246         "\n"
247         "#show subscribed folders only, if imap\n"
248         "#default is TRUE\n"
249         "#subsonly=\n"
250         "\n"
251         "#mbox file if local\n"
252         "#you can use $LOGIN here\n"
253         "#default is /var/mail/$LOGIN\n"
254         "#mboxfile=\n"
255         "\n"
256         "#mailbox name if pop3 or local\n"
257         "#relative path from the user's home\n"
258         "#default is \"Mail\"\n"
259         "#mailbox=\n"
260         "\n"
261         "#whether to use ssl on STMP connections\n"
262         "#default is 0, 1 is ssl, 2 is starttls\n"
263         "#smtpssl=\n"
264         "\n"
265         "#whether to use ssl on pop or imap connections\n"
266         "#default is 0, 1 is ssl, 2 is starttls\n"
267         "#recvssl=\n";
268
269 static gchar *wizard_get_default_domain_name(void)
270 {
271         static gchar *domain_name = NULL;
272         
273         if (domain_name == NULL) {
274                 domain_name = g_strdup(get_domain_name());
275                 if (strchr(domain_name, '.') != strrchr(domain_name, '.')
276                 && strlen(strchr(domain_name, '.')) > 6) {
277                         gchar *tmp = g_strdup(strchr(domain_name, '.')+1);
278                         g_free(domain_name);
279                         domain_name = tmp;
280                 }
281         }
282         return domain_name;
283 }
284
285 static gchar *get_name_for_mail(void)
286 {
287         gchar *name = g_strdup(tmpl.name);
288         if (name == NULL)
289                 return NULL;
290         g_strdown(name);
291         while(strstr(name, " "))
292                 *strstr(name, " ")='.';
293         
294         return name;
295 }
296
297 #define PARSE_DEFAULT(str) {    \
298         gchar *tmp = NULL, *new = NULL; \
299         if (str != NULL) {      \
300                 tmp = g_strdup(str);    \
301                 if (strstr(str, "$USERNAME")) { \
302                         tmp = g_strdup(str);    \
303                         *strstr(tmp, "$USERNAME") = '\0';       \
304                         new = g_strconcat(tmp, g_get_real_name(),       \
305                                 strstr(str, "$USERNAME")+strlen("$USERNAME"),   \
306                                 NULL);  \
307                         g_free(tmp);    \
308                         g_free(str);    \
309                         str = new;      \
310                         new = NULL;     \
311                 }       \
312                 if (strstr(str, "$LOGIN")) {    \
313                         tmp = g_strdup(str);    \
314                         *strstr(tmp, "$LOGIN") = '\0';  \
315                         new = g_strconcat(tmp, g_get_user_name(),       \
316                                 strstr(str, "$LOGIN")+strlen("$LOGIN"),         \
317                                 NULL);  \
318                         g_free(tmp);    \
319                         g_free(str);    \
320                         str = new;      \
321                         new = NULL;     \
322                 }       \
323                 if (strstr(str, "$EMAIL")) {    \
324                         tmp = g_strdup(str);    \
325                         *strstr(tmp, "$EMAIL") = '\0';  \
326                         new = g_strconcat(tmp, tmpl.email,      \
327                                 strstr(str, "$EMAIL")+strlen("$EMAIL"),         \
328                                 NULL);  \
329                         g_free(tmp);    \
330                         g_free(str);    \
331                         str = new;      \
332                         new = NULL;     \
333                 }       \
334                 if (strstr(str, "$NAME_MAIL")) {        \
335                         tmp = g_strdup(str);    \
336                         *strstr(tmp, "$NAME_MAIL") = '\0';      \
337                         new = g_strconcat(tmp, get_name_for_mail(),     \
338                                 strstr(str, "$NAME_MAIL")+strlen("$NAME_MAIL"),         \
339                                 NULL);  \
340                         g_free(tmp);    \
341                         g_free(str);    \
342                         str = new;      \
343                         new = NULL;     \
344                 }       \
345                 if (strstr(str, "$DEFAULTDOMAIN")) {    \
346                         tmp = g_strdup(str);    \
347                         *strstr(tmp, "$DEFAULTDOMAIN") = '\0';  \
348                         new = g_strconcat(tmp, wizard_get_default_domain_name(),        \
349                                 strstr(str, "$DEFAULTDOMAIN")+strlen("$DEFAULTDOMAIN"),         \
350                                 NULL);  \
351                         g_free(tmp);    \
352                         g_free(str);    \
353                         str = new;      \
354                         new = NULL;     \
355                 }       \
356                 if (strstr(str, "$DOMAIN")) {   \
357                         tmp = g_strdup(str);    \
358                         *strstr(tmp, "$DOMAIN") = '\0'; \
359                         new = g_strconcat(tmp, tmpl.domain,     \
360                                 strstr(str, "$DOMAIN")+strlen("$DOMAIN"),       \
361                                 NULL);  \
362                         g_free(tmp);    \
363                         g_free(str);    \
364                         str = new;      \
365                         new = NULL;     \
366                 }       \
367         }       \
368 }
369 static void wizard_read_defaults(void)
370 {
371         gchar *rcpath;
372
373         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, "accountrc.tmpl", NULL);
374         if (!is_file_exist(rcpath)) {
375                 str_write_to_file(accountrc_tmpl, rcpath);
376         }
377
378         prefs_read_config(template_params, "AccountTemplate", rcpath, NULL);
379
380         PARSE_DEFAULT(tmpl.domain);
381         PARSE_DEFAULT(tmpl.name);
382         PARSE_DEFAULT(tmpl.email);
383         PARSE_DEFAULT(tmpl.organization);
384         PARSE_DEFAULT(tmpl.smtpserver);
385         PARSE_DEFAULT(tmpl.smtpuser);
386         PARSE_DEFAULT(tmpl.smtppass);
387         PARSE_DEFAULT(tmpl.recvserver);
388         PARSE_DEFAULT(tmpl.recvuser);
389         PARSE_DEFAULT(tmpl.recvpass);
390         PARSE_DEFAULT(tmpl.imapdir);
391         PARSE_DEFAULT(tmpl.mboxfile);
392         PARSE_DEFAULT(tmpl.mailbox);
393 /*
394         printf("defaults:"
395         "%s, %s, %s, %s, %s, %d, %s, %s, %s, %s, %s, %s, %d, %d\n",
396         tmpl.name,tmpl.domain,tmpl.email,tmpl.organization,tmpl.smtpserver,
397         tmpl.recvtype,tmpl.recvserver,tmpl.recvuser,tmpl.recvpass,
398         tmpl.imapdir,tmpl.mboxfile,tmpl.mailbox,tmpl.smtpssl,tmpl.recvssl);
399 */
400         g_free(rcpath);
401 }
402
403 static void initialize_fonts(WizardWindow *wizard)
404 {
405         GtkWidget *widget = wizard->email;
406         gint size = pango_font_description_get_size(
407                         widget->style->font_desc)
408                       /PANGO_SCALE;
409         gchar *tmp, *new;
410         
411         tmp = g_strdup(prefs_common.textfont);
412         if (strrchr(tmp, ' ')) {
413                 *(strrchr(tmp, ' ')) = '\0';
414                 new = g_strdup_printf("%s %d", tmp, size);
415                 g_free(prefs_common.textfont);
416                 prefs_common.textfont = new;
417         }
418         g_free(tmp);
419         
420         tmp = g_strdup(prefs_common.smallfont);
421         if (strrchr(tmp, ' ')) {
422                 *(strrchr(tmp, ' ')) = '\0';
423                 new = g_strdup_printf("%s %d", tmp, size);
424                 g_free(prefs_common.smallfont);
425                 prefs_common.smallfont = new;
426         }
427         g_free(tmp);
428         
429         tmp = g_strdup(prefs_common.normalfont);
430         if (strrchr(tmp, ' ')) {
431                 *(strrchr(tmp, ' ')) = '\0';
432                 new = g_strdup_printf("%s %d", tmp, size);
433                 g_free(prefs_common.normalfont);
434                 prefs_common.normalfont = new;
435         }
436         g_free(tmp);
437 }
438
439 #define XFACE "+}Axz@~a,-Yx?0Ysa|q}CLRH=89Y]\"')DSX^<6p\"d)'81yx5%G#u^o*7JG&[aPU0h1Ux.vb2yIjH83{5`/bVo|~nn/i83vE^E)qk-4W)_E.4Y=D*qvf/,Ci_=P<iY<M6"
440 #define FACE "iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAJ1BMVEUTGBYnS3BCUE9KVC9acyRy\n\
441  kC6LjITZdGiumnF/p7yrq6jJzc/5+vf7GI+IAAACZ0lEQVQ4y5XUvW/UMBQA8LRl6VZ3QLqNNhVS\n\
442  YSnKFfExEg9lbJNK3QqVoiPHzgpFnAIs5Do9ORNDVOwuFVIgduZWOfuP4vlyybVVkeCdTpHe7z1/\n\
443  RHYc85dw/gEUxi2gS5ZlDKqbUDcpzarroMEOpDU2VtcAmFKlxn+t2VWQUNa1BmAlGrsCqWKMwetv\n\
444  MMbnFaixFn9rh47DFCuzDs6hxPyrxXuOA7WqWQcp2Fhx7gTOcga6bGHSS6FHCHFouLcMJptuaQbp\n\
445  +kff90P6Yn0TMpXN4DxNVz+FQZ8Gob8DGWSsBUIG23seDXwaBBnU0EJKVhNvqx/6aHTHrmMGhNw9\n\
446  XlqkgbdEX/gh1PUcVj84G4HnuHTXDQ+6Dk3IyqFL/UfEpXvj7RChaoEsUX9rYeGE7o83wp0WcCjS\n\
447  9/01AifhLrj0oINeuuJ53kIP+uF+7uL03eQpGWx5yzDu05fM3Z53AJDkvdODwvOfmbH3uOuwcLz+\n\
448  UBWLR8/N+MHnDsoeG4zecDl5Mhqa74NR90p+VEYmo+ioSEan8WnytANhDB8kX06TJFZJcowvfrZz\n\
449  XIMS2vxMIlHJfHMTRLOqC7TovlJFEVVGF7yafFVTkGgij+I851hZCHP5Tk8BWXObjuxhl2fm8pdu\n\
450  O0wluZDKHgJ91nVMKhuKN6cZQf9uQAs85lrjGDYmwmqzDynwClRKTCF/OwfDub0dQyzHxVUt6DzK\n\
451  eY5NseIxb8abwoVSMpZDhJyL9kJamGAxplC7izkHyaXM5/nZHFiNeRHfBFNwLjhOr+fAmw1G3OYl\n\
452  bwoijGGzD40pdeu3ROv/+Pr8AWPP4vVXbP0VAAAAAElFTkSuQmCC"
453
454 static void write_welcome_email(WizardWindow *wizard)
455 {
456         gchar buf_date[64];
457         gchar *head=NULL;
458         gchar *body=NULL;
459         gchar *msg=NULL;
460         const gchar *mailbox = gtk_entry_get_text(GTK_ENTRY(wizard->mailbox_name));
461         Folder *folder = folder_find_from_path(mailbox);
462         FolderItem *inbox = folder ? folder->inbox:NULL;
463         gchar *file = get_tmp_file();
464         gchar enc_from_name[BUFFSIZE], enc_to_name[BUFFSIZE], enc_subject[BUFFSIZE];
465         
466         get_rfc822_date(buf_date, sizeof(buf_date));
467
468         conv_encode_header_full(enc_subject, sizeof(enc_subject), 
469                         Q_("Welcome Mail Subject|Welcome to Claws Mail"),
470                         strlen("Subject: "), FALSE, CS_INTERNAL);
471         conv_encode_header_full(enc_to_name, sizeof(enc_to_name), 
472                         gtk_entry_get_text(GTK_ENTRY(wizard->full_name)),
473                         strlen("To: "), TRUE, CS_INTERNAL);
474         conv_encode_header_full(enc_from_name, sizeof(enc_from_name), 
475                         _("The Claws Mail Team"),
476                         strlen("From: "), TRUE, CS_INTERNAL);
477
478         head = g_strdup_printf(
479                 "From: %s <%s>\n"
480                 "To: %s <%s>\n"
481                 "Date: %s\n"
482                 "Subject: %s\n"
483                 "X-Face: %s\n"
484                 "Face: %s\n"
485                 "Content-Type: text/plain; charset=UTF-8\n",
486                 enc_from_name,
487                 USERS_ML_ADDR,
488                 enc_to_name,
489                 gtk_entry_get_text(GTK_ENTRY(wizard->email)),
490                 buf_date, enc_subject, XFACE, FACE);
491         body = g_strdup_printf(
492                 _("\n"
493                 "Welcome to Claws Mail\n"
494                 "---------------------\n"
495                 "\n"
496                 "Now that you have set up your account you can fetch your\n"
497                 "mail by clicking the 'Get Mail' button at the left of the\n"
498                 "toolbar.\n"
499                 "\n"
500                 "Claws Mail has lots of extra features accessible via plugins,\n"
501                 "like anti-spam filtering and learning (via the Bogofilter or\n"
502                 "SpamAssassin plugins), privacy protection (via PGP/Mime), an RSS\n"
503                 "aggregator, a calendar, and much more. You can load them from\n"
504                 "the menu entry '/Configuration/Plugins'.\n"
505                 "\n"
506                 "You can change your Account Preferences by using the menu\n"
507                 "entry '/Configuration/Preferences for current account'\n"
508                 "and change the general Preferences by using\n"
509                 "'/Configuration/Preferences'.\n"
510                 "\n"
511                 "You can find further information in the Claws Mail manual,\n"
512                 "which can be accessed by using the menu entry '/Help/Manual'\n"
513                 "or online at the URL given below.\n"
514                 "\n"
515                 "Useful URLs\n"
516                 "-----------\n"
517                 "Homepage:      <%s>\n"
518                 "Manual:        <%s>\n"
519                 "FAQ:          <%s>\n"
520                 "Themes:        <%s>\n"
521                 "Mailing Lists: <%s>\n"
522                 "\n"
523                 "LICENSE\n"
524                 "-------\n"
525                 "Claws Mail is free software, released under the terms\n"
526                 "of the GNU General Public License, version 2 or later, as\n"
527                 "published by the Free Software Foundation, 51 Franklin Street,\n"
528                 "Fifth Floor, Boston, MA 02110-1301, USA. The license can be\n"
529                 "found at <%s>.\n"
530                 "\n"
531                 "DONATIONS\n"
532                 "---------\n"
533                 "If you wish to donate to the Claws Mail project you can do\n"
534                 "so at <%s>.\n\n"),
535                 HOMEPAGE_URI, MANUAL_URI, FAQ_URI, THEMES_URI, MAILING_LIST_URI,
536                 GPL_URI, DONATE_URI);
537         
538         msg = g_strconcat(head, body, NULL);
539
540         if (inbox && inbox->total_msgs == 0
541          && str_write_to_file(msg, file) >= 0) {
542                 MsgFlags flags = { MSG_UNREAD|MSG_NEW, 0};
543                 folder_item_add_msg(inbox, file, &flags, FALSE);
544         }
545         g_free(head);
546         g_free(body);
547         g_free(msg);
548         g_unlink(file);
549 }
550 #undef XFACE
551
552 static gboolean wizard_write_config(WizardWindow *wizard)
553 {
554         static gboolean mailbox_ok = FALSE;
555         PrefsAccount *prefs_account = prefs_account_new();
556         GList *account_list = NULL;
557         GtkWidget *menu, *menuitem;
558         gchar *smtp_server, *recv_server;
559         gchar *tmp;
560         gint smtp_port, recv_port;
561 #ifdef USE_OPENSSL                      
562         SSLType smtp_ssl_type, recv_ssl_type;
563 #endif
564
565         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(wizard->recv_type));
566         menuitem = gtk_menu_get_active(GTK_MENU(menu));
567         prefs_account->protocol = GPOINTER_TO_INT
568                         (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
569         
570         
571         if (wizard->create_mailbox && prefs_account->protocol != A_IMAP4 && 
572             !strlen(gtk_entry_get_text(GTK_ENTRY(wizard->mailbox_name)))) {
573                 alertpanel_error(_("Please enter the mailbox name."));
574                 g_free(prefs_account);
575                 gtk_notebook_set_current_page (
576                         GTK_NOTEBOOK(wizard->notebook), 
577                         MAILBOX_PAGE);
578                 return FALSE;
579         }
580
581         if (!mailbox_ok) {
582                 if (wizard->create_mailbox && prefs_account->protocol != A_IMAP4) {
583                         mailbox_ok = setup_write_mailbox_path(wizard->mainwin, 
584                                         gtk_entry_get_text(
585                                                 GTK_ENTRY(wizard->mailbox_name)));
586                 } else
587                         mailbox_ok = TRUE;
588         }
589
590         if (!mailbox_ok) {
591                 /* alertpanel done by setup_write_mailbox_path */
592                 g_free(prefs_account);
593                 gtk_notebook_set_current_page (
594                         GTK_NOTEBOOK(wizard->notebook), 
595                         MAILBOX_PAGE);
596                 return FALSE;
597         }
598         
599         if (!strlen(gtk_entry_get_text(GTK_ENTRY(wizard->full_name)))
600         ||  !strlen(gtk_entry_get_text(GTK_ENTRY(wizard->email)))) {
601                 alertpanel_error(_("Please enter your name and email address."));
602                 g_free(prefs_account);
603                 gtk_notebook_set_current_page (
604                         GTK_NOTEBOOK(wizard->notebook), 
605                         USER_PAGE);
606                 return FALSE;
607         }
608         
609         if (prefs_account->protocol != A_LOCAL) {
610                 if (!strlen(gtk_entry_get_text(GTK_ENTRY(wizard->recv_username)))
611                 ||  !strlen(gtk_entry_get_text(GTK_ENTRY(wizard->recv_server)))) {
612                         alertpanel_error(_("Please enter your receiving server "
613                                            "and username."));
614                         g_free(prefs_account);
615                         gtk_notebook_set_current_page (
616                                 GTK_NOTEBOOK(wizard->notebook), 
617                                 RECV_PAGE);
618                         return FALSE;
619                 }
620         } else {
621                 if (!strlen(gtk_entry_get_text(GTK_ENTRY(wizard->recv_server)))) {
622                         alertpanel_error(_("Please enter your username."));
623                         g_free(prefs_account);
624                         gtk_notebook_set_current_page (
625                                 GTK_NOTEBOOK(wizard->notebook), 
626                                 RECV_PAGE);
627                         return FALSE;
628                 }
629         }
630         
631         if (!strlen(gtk_entry_get_text(GTK_ENTRY(wizard->smtp_server)))) {
632                 alertpanel_error(_("Please enter your SMTP server."));
633                 g_free(prefs_account);
634                 gtk_notebook_set_current_page (
635                         GTK_NOTEBOOK(wizard->notebook), 
636                         SMTP_PAGE);
637                 return FALSE;
638         }
639
640         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wizard->smtp_auth))) {
641                 if (prefs_account->protocol == A_LOCAL
642                 &&  !strlen(gtk_entry_get_text(GTK_ENTRY(wizard->smtp_username)))) {
643                         alertpanel_error(_("Please enter your SMTP username."));
644                         g_free(prefs_account);
645                         gtk_notebook_set_current_page (
646                                 GTK_NOTEBOOK(wizard->notebook), 
647                                 SMTP_PAGE);
648                         return FALSE;           
649                 } /* if it's not local we'll use the reception server */
650         }
651
652         if (prefs_account->protocol != A_LOCAL)
653                 prefs_account->account_name = g_strdup_printf("%s@%s",
654                                 gtk_entry_get_text(GTK_ENTRY(wizard->recv_username)),
655                                 gtk_entry_get_text(GTK_ENTRY(wizard->recv_server)));
656         else
657                 prefs_account->account_name = g_strdup_printf("%s",
658                                 gtk_entry_get_text(GTK_ENTRY(wizard->recv_server)));
659
660         recv_server = g_strdup(gtk_entry_get_text(GTK_ENTRY(wizard->recv_server)));
661         smtp_server = g_strdup(gtk_entry_get_text(GTK_ENTRY(wizard->smtp_server)));
662
663         if (prefs_account->protocol != A_LOCAL && strstr(recv_server, ":")) {
664                 recv_port = atoi(strstr(recv_server, ":")+1);
665                 *(strstr(recv_server, ":")) = '\0';
666                 if (prefs_account->protocol == A_IMAP4) {
667                         prefs_account->set_imapport = TRUE;
668                         prefs_account->imapport = recv_port;
669                 } else if (prefs_account->protocol == A_POP3) {
670                         prefs_account->set_popport = TRUE;
671                         prefs_account->popport = recv_port;
672                 }
673         }
674         if (strstr(smtp_server, ":")) {
675                 smtp_port = atoi(strstr(smtp_server, ":")+1);
676                 *(strstr(smtp_server, ":")) = '\0';
677                 prefs_account->set_smtpport = TRUE;
678                 prefs_account->smtpport = smtp_port;
679         }
680         
681         prefs_account->name = g_strdup(
682                                 gtk_entry_get_text(GTK_ENTRY(wizard->full_name)));
683         prefs_account->address = g_strdup(
684                                 gtk_entry_get_text(GTK_ENTRY(wizard->email)));
685         prefs_account->organization = g_strdup(
686                                 gtk_entry_get_text(GTK_ENTRY(wizard->organization)));
687         prefs_account->smtp_server = g_strdup(smtp_server);
688
689         tmp = g_path_get_basename(gtk_entry_get_text(GTK_ENTRY(wizard->mailbox_name)));
690         prefs_account->inbox = g_strdup_printf("#mh/%s/inbox",
691                         (tmp && !strcmp("Mail", tmp))?_("Mailbox"):tmp);
692         g_free(tmp);
693         prefs_account->local_inbox = g_strdup(prefs_account->inbox);
694
695         if (prefs_account->protocol != A_LOCAL)
696                 prefs_account->recv_server = g_strdup(recv_server);
697         else
698                 prefs_account->local_mbox = g_strdup(recv_server);
699
700         g_free(recv_server);
701         g_free(smtp_server);
702
703         prefs_account->userid = g_strdup(
704                                 gtk_entry_get_text(GTK_ENTRY(wizard->recv_username)));
705         prefs_account->passwd = g_strdup(
706                                 gtk_entry_get_text(GTK_ENTRY(wizard->recv_password)));
707
708         prefs_account->smtp_userid = g_strdup(
709                                 gtk_entry_get_text(GTK_ENTRY(wizard->smtp_username)));
710         prefs_account->smtp_passwd = g_strdup(
711                                 gtk_entry_get_text(GTK_ENTRY(wizard->smtp_password)));
712         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wizard->smtp_auth))) {
713                 prefs_account->use_smtp_auth = TRUE;
714         }
715
716 #ifdef USE_OPENSSL
717         smtp_ssl_type = SSL_NONE;
718         recv_ssl_type = SSL_NONE;       
719
720         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wizard->smtp_use_ssl))) {
721                 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wizard->smtp_use_tls)))
722                         smtp_ssl_type = SSL_STARTTLS;
723                 else
724                         smtp_ssl_type = SSL_TUNNEL;
725         }
726         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wizard->recv_use_ssl))) {
727                 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wizard->recv_use_tls)))
728                         recv_ssl_type = SSL_STARTTLS;
729                 else
730                         recv_ssl_type = SSL_TUNNEL;
731         }
732
733         prefs_account->ssl_smtp = smtp_ssl_type;
734
735         if (prefs_account->protocol == A_IMAP4)
736                 prefs_account->ssl_imap = recv_ssl_type;
737         else
738                 prefs_account->ssl_pop = recv_ssl_type;
739
740 #endif
741         if (prefs_account->protocol == A_IMAP4) {
742                 gchar *directory = gtk_editable_get_chars(
743                         GTK_EDITABLE(wizard->recv_imap_subdir), 0, -1);
744                 if (directory && strlen(directory)) {
745                         prefs_account->imap_dir = g_strdup(directory);
746                 }
747                 prefs_account->imap_subsonly = 
748                         gtk_toggle_button_get_active(
749                                 GTK_TOGGLE_BUTTON(wizard->subsonly_checkbtn));
750                 g_free(directory);
751         }
752
753         account_list = g_list_append(account_list, prefs_account);
754         prefs_account_write_config_all(account_list);
755         prefs_account_free(prefs_account);
756         account_read_config_all();
757
758         initialize_fonts(wizard);
759         if (wizard->create_mailbox && prefs_account->protocol != A_IMAP4)
760                 write_welcome_email(wizard);
761         
762 #ifndef G_OS_WIN32 
763         plugin_load_standard_plugins();
764 #endif
765         return TRUE;
766 }
767
768 static GtkWidget* create_page (WizardWindow *wizard, const char * title)
769 {
770         GtkWidget *w;
771         GtkWidget *vbox;
772         GtkWidget *hbox;
773         GtkWidget *image;
774         char *title_string;
775
776         vbox = gtk_vbox_new (FALSE, 6);
777         gtk_container_set_border_width  (GTK_CONTAINER(vbox), 10);
778
779         /* create the titlebar */
780         hbox = gtk_hbox_new (FALSE, 12);
781         image = stock_pixmap_widget(wizard->window, 
782                                 STOCK_PIXMAP_CLAWS_MAIL_ICON);
783         gtk_box_pack_start (GTK_BOX(hbox), image, FALSE, FALSE, 0);
784         title_string = g_strconcat ("<span size=\"xx-large\" weight=\"ultrabold\">", title ? title : "", "</span>", NULL);
785         w = gtk_label_new (title_string);
786         gtk_label_set_use_markup (GTK_LABEL(w), TRUE);
787         g_free (title_string);
788         gtk_box_pack_start (GTK_BOX(hbox), w, FALSE, FALSE, 0);
789
790         /* pack the titlebar */
791         gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
792
793         /* pack the separator */
794         gtk_box_pack_start (GTK_BOX(vbox), gtk_hseparator_new(), FALSE, FALSE, 0);
795
796         /* pack space */
797         w = gtk_alignment_new (0, 0, 0, 0);
798         gtk_widget_set_size_request (w, 0, 6);
799         gtk_box_pack_start (GTK_BOX(vbox), w, FALSE, FALSE, 0);
800
801         return vbox;
802 }
803
804 #define GTK_TABLE_ADD_ROW_AT(table,text,entry,i) {                            \
805         GtkWidget *label = gtk_label_new(text);                               \
806         gtk_table_attach(GTK_TABLE(table), label,                             \
807                          0,1,i,i+1, GTK_EXPAND|GTK_FILL, 0, 0, 0);            \
808         gtk_label_set_use_markup(GTK_LABEL(label), TRUE);                     \
809         if (GTK_IS_MISC(label))                                               \
810                 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);              \
811         gtk_table_attach(GTK_TABLE(table), entry,                             \
812                          1,2,i,i+1, GTK_EXPAND|GTK_FILL, 0, 0, 0);            \
813 }
814
815 static gchar *get_default_server(WizardWindow * wizard, const gchar *type)
816 {
817         if (!strcmp(type, "smtp")) {
818                 if (!tmpl.smtpserver || !strlen(tmpl.smtpserver))
819                         return g_strconcat(type, ".", tmpl.domain, NULL);
820                 else 
821                         return g_strdup(tmpl.smtpserver);
822         } else {
823                 if (!tmpl.recvserver || !strlen(tmpl.recvserver))
824                         return g_strconcat(type, ".", tmpl.domain, NULL);
825                 else 
826                         return g_strdup(tmpl.recvserver);
827         }
828 }
829
830 static gchar *get_default_account(WizardWindow * wizard)
831 {
832         gchar *result = NULL;
833         
834         if (!tmpl.recvuser || !strlen(tmpl.recvuser)) {
835                 result = gtk_editable_get_chars(
836                                 GTK_EDITABLE(wizard->email), 0, -1);
837
838                 if (strstr(result, "@")) {
839                         *(strstr(result,"@")) = '\0';
840                 } 
841         } else {
842                 result = g_strdup(tmpl.recvuser);
843         }
844         return result;
845 }
846
847 static gchar *get_default_smtp_account(WizardWindow * wizard)
848 {
849         gchar *result = NULL;
850         
851         if (!tmpl.smtpuser || !strlen(tmpl.smtpuser)) {
852                 return g_strdup("");
853         } else {
854                 result = g_strdup(tmpl.smtpuser);
855         }
856         return result;
857 }
858
859 static void wizard_email_changed(GtkWidget *widget, gpointer data)
860 {
861         WizardWindow *wizard = (WizardWindow *)data;
862         RecvProtocol protocol;
863         gchar *text;
864         protocol = GPOINTER_TO_INT
865                 (g_object_get_data(G_OBJECT(wizard->recv_type), MENU_VAL_ID));
866         
867         text = get_default_server(wizard, "smtp");
868         gtk_entry_set_text(GTK_ENTRY(wizard->smtp_server), text);
869         g_free(text);
870
871         text = get_default_account(wizard);
872         gtk_entry_set_text(GTK_ENTRY(wizard->recv_username), text);
873         g_free(text);
874
875         if (protocol == A_POP3) {
876                 text = get_default_server(wizard, "pop");
877                 gtk_entry_set_text(GTK_ENTRY(wizard->recv_server), text);
878                 g_free(text);
879         } else if (protocol == A_IMAP4) {
880                 text = get_default_server(wizard, "imap");
881                 gtk_entry_set_text(GTK_ENTRY(wizard->recv_server), text);
882                 g_free(text);
883         } else if (protocol == A_LOCAL) {
884                 gtk_entry_set_text(GTK_ENTRY(wizard->recv_server), tmpl.mboxfile?tmpl.mboxfile:"");
885         }
886         
887 }
888
889 static GtkWidget* user_page (WizardWindow * wizard)
890 {
891         GtkWidget *table = gtk_table_new(3,2, FALSE);
892         gint i = 0;
893         
894         gtk_table_set_row_spacings(GTK_TABLE(table), 4);
895         gtk_table_set_col_spacings(GTK_TABLE(table), 8);
896
897         wizard->full_name = gtk_entry_new();
898         gtk_entry_set_text(GTK_ENTRY(wizard->full_name), tmpl.name?tmpl.name:"");
899         GTK_TABLE_ADD_ROW_AT(table, _("<span weight=\"bold\">Your name:</span>"), 
900                              wizard->full_name, i); i++;
901         
902         wizard->email = gtk_entry_new();
903         gtk_entry_set_text(GTK_ENTRY(wizard->email), tmpl.email?tmpl.email:"");
904         GTK_TABLE_ADD_ROW_AT(table, _("<span weight=\"bold\">Your email address:</span>"), 
905                              wizard->email, i); i++;
906         
907         wizard->organization = gtk_entry_new();
908         GTK_TABLE_ADD_ROW_AT(table, _("Your organization:"),
909                              wizard->organization, i); i++;
910         gtk_entry_set_text(GTK_ENTRY(wizard->organization), tmpl.organization?tmpl.organization:"");
911         
912         g_signal_connect(G_OBJECT(wizard->email), "changed",
913                          G_CALLBACK(wizard_email_changed),
914                          wizard);
915         return table;
916 }
917
918 static GtkWidget* mailbox_page (WizardWindow * wizard)
919 {
920         GtkWidget *table = gtk_table_new(1,2, FALSE);
921         gint i = 0;
922         GtkTooltips *tips = gtk_tooltips_new();
923
924         gtk_table_set_row_spacings(GTK_TABLE(table), 4);
925         gtk_table_set_col_spacings(GTK_TABLE(table), 8);
926
927         wizard->mailbox_name = gtk_entry_new();
928         gtk_entry_set_text(GTK_ENTRY(wizard->mailbox_name), tmpl.mailbox?tmpl.mailbox:"");
929
930         gtk_tooltips_set_tip(GTK_TOOLTIPS(tips), wizard->mailbox_name,
931                              _("You can also specify an absolute path, for example: "
932                                "\"/home/john/Documents/Mail\""),
933                              NULL);
934
935         GTK_TABLE_ADD_ROW_AT(table, _("<span weight=\"bold\">Mailbox name:</span>"), 
936                              wizard->mailbox_name, i); i++;
937         
938         return table;
939 }
940
941 static void smtp_auth_changed (GtkWidget *btn, gpointer data)
942 {
943         WizardWindow *wizard = (WizardWindow *)data;
944         gboolean do_auth = gtk_toggle_button_get_active(
945                 GTK_TOGGLE_BUTTON(wizard->smtp_auth));
946         gtk_widget_set_sensitive(wizard->smtp_username, do_auth);
947         gtk_widget_set_sensitive(wizard->smtp_username_label, do_auth);
948         gtk_widget_set_sensitive(wizard->smtp_password, do_auth);
949         gtk_widget_set_sensitive(wizard->smtp_password_label, do_auth);
950 }
951
952 static GtkWidget* smtp_page (WizardWindow * wizard)
953 {
954 #ifdef USE_OPENSSL
955         GtkWidget *table = gtk_table_new(6, 2, FALSE);
956 #else
957         GtkWidget *table = gtk_table_new(4, 2, FALSE);
958 #endif
959         GtkTooltips *tips = gtk_tooltips_new();
960         gchar *text;
961         gint i = 0;
962         
963         gtk_table_set_row_spacings(GTK_TABLE(table), 4);
964         gtk_table_set_col_spacings(GTK_TABLE(table), 8);
965
966         wizard->smtp_server = gtk_entry_new();
967         text = get_default_server(wizard, "smtp");
968         gtk_entry_set_text(GTK_ENTRY(wizard->smtp_server), text);
969         g_free(text);
970
971         gtk_tooltips_set_tip(GTK_TOOLTIPS(tips), wizard->smtp_server,
972                              _("You can specify the port number by appending it at the end: "
973                                "\"mail.example.com:25\""),
974                              NULL);
975
976         GTK_TABLE_ADD_ROW_AT(table, _("<span weight=\"bold\">SMTP server address:</span>"), 
977                              wizard->smtp_server, i); i++;
978         wizard->smtp_auth = gtk_check_button_new_with_label(
979                                         _("Use authentication"));
980         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wizard->smtp_auth),
981                         tmpl.smtpauth);
982         g_signal_connect(G_OBJECT(wizard->smtp_auth), "toggled",
983                          G_CALLBACK(smtp_auth_changed),
984                          wizard);
985         gtk_table_attach(GTK_TABLE(table), wizard->smtp_auth,      
986                          0,2,i,i+1, GTK_EXPAND|GTK_FILL, 0, 0, 0); i++;
987
988         text = get_default_smtp_account(wizard);
989
990         wizard->smtp_username = gtk_entry_new();
991         gtk_entry_set_text(GTK_ENTRY(wizard->smtp_username), text);
992         g_free(text);
993         wizard->smtp_username_label = gtk_label_new(_("SMTP username:\n"
994                                         "<span size=\"small\">(empty to use the same as reception)</span>"));
995         gtk_label_set_use_markup(GTK_LABEL(wizard->smtp_username_label), TRUE);
996         gtk_table_attach(GTK_TABLE(table), wizard->smtp_username_label,                               
997                          0,1,i,i+1, GTK_EXPAND|GTK_FILL, 0, 0, 0);            
998         if (GTK_IS_MISC(wizard->smtp_username_label))                                                 
999                 gtk_misc_set_alignment(GTK_MISC(wizard->smtp_username_label), 1, 0.5);        
1000         gtk_table_attach(GTK_TABLE(table), wizard->smtp_username,             
1001                          1,2,i,i+1, GTK_EXPAND|GTK_FILL, 0, 0, 0);            
1002         i++;
1003         wizard->smtp_password = gtk_entry_new();
1004         gtk_entry_set_text(GTK_ENTRY(wizard->smtp_password), tmpl.smtppass?tmpl.smtppass:""); 
1005         gtk_entry_set_visibility(GTK_ENTRY(wizard->smtp_password), FALSE);
1006         wizard->smtp_password_label = gtk_label_new(_("SMTP password:\n"
1007                                         "<span size=\"small\">(empty to use the same as reception)</span>"));
1008         gtk_label_set_use_markup(GTK_LABEL(wizard->smtp_password_label), TRUE);
1009         gtk_table_attach(GTK_TABLE(table), wizard->smtp_password_label,                               
1010                          0,1,i,i+1, GTK_EXPAND|GTK_FILL, 0, 0, 0);            
1011         if (GTK_IS_MISC(wizard->smtp_password_label))                                                 
1012                 gtk_misc_set_alignment(GTK_MISC(wizard->smtp_password_label), 1, 0.5);        
1013         gtk_table_attach(GTK_TABLE(table), wizard->smtp_password,             
1014                          1,2,i,i+1, GTK_EXPAND|GTK_FILL, 0, 0, 0);            
1015         i++;
1016 #ifdef USE_OPENSSL
1017         wizard->smtp_use_ssl = gtk_check_button_new_with_label(
1018                                         _("Use SSL to connect to SMTP server"));
1019         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wizard->smtp_use_ssl),
1020                         tmpl.smtpssl != 0);
1021         gtk_table_attach(GTK_TABLE(table), wizard->smtp_use_ssl,     
1022                          0,1,i,i+1, GTK_EXPAND|GTK_FILL, 0, 0, 0); 
1023         i++;
1024         wizard->smtp_use_tls = gtk_check_button_new_with_label(
1025                                         _("Use SSL via STARTTLS"));
1026         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wizard->smtp_use_tls),
1027                         tmpl.smtpssl == 2);
1028         gtk_table_attach(GTK_TABLE(table), wizard->smtp_use_tls,      
1029                          0,1,i,i+1, GTK_EXPAND|GTK_FILL, 0, 16, 0); 
1030         i++;
1031         SET_TOGGLE_SENSITIVITY (wizard->smtp_use_ssl, wizard->smtp_use_tls);
1032 #endif
1033         smtp_auth_changed(NULL, wizard);
1034         return table;
1035 }
1036
1037 static void wizard_protocol_change(WizardWindow *wizard, RecvProtocol protocol)
1038 {
1039         gchar *text;
1040         
1041         if (protocol == A_POP3) {
1042                 text = get_default_server(wizard, "pop");
1043                 gtk_entry_set_text(GTK_ENTRY(wizard->recv_server), text);
1044                 gtk_widget_hide(wizard->recv_imap_label);
1045                 gtk_widget_hide(wizard->recv_imap_subdir);
1046                 gtk_widget_hide(wizard->subsonly_checkbtn);
1047                 gtk_widget_show(wizard->recv_username);
1048                 gtk_widget_show(wizard->recv_password);
1049                 gtk_widget_show(wizard->recv_username_label);
1050                 gtk_widget_show(wizard->recv_password_label);
1051                 gtk_widget_hide(wizard->no_imap_warning);
1052 #ifdef USE_OPENSSL
1053                 gtk_widget_show(wizard->recv_use_ssl);
1054                 gtk_widget_show(wizard->recv_use_tls);
1055 #endif
1056                 gtk_label_set_text(GTK_LABEL(wizard->recv_label), _("<span weight=\"bold\">Server address:</span>"));
1057                 gtk_label_set_use_markup(GTK_LABEL(wizard->recv_label), TRUE);
1058                 gtk_dialog_set_response_sensitive (GTK_DIALOG(wizard->window), GO_FORWARD, TRUE);
1059                 g_free(text);
1060         } else if (protocol == A_IMAP4) {
1061 #ifdef HAVE_LIBETPAN
1062                 text = get_default_server(wizard, "imap");
1063                 gtk_entry_set_text(GTK_ENTRY(wizard->recv_server), text);
1064                 gtk_widget_show(wizard->recv_imap_label);
1065                 gtk_widget_show(wizard->recv_imap_subdir);
1066                 gtk_widget_show(wizard->subsonly_checkbtn);
1067                 gtk_widget_show(wizard->recv_username);
1068                 gtk_widget_show(wizard->recv_password);
1069                 gtk_widget_show(wizard->recv_username_label);
1070                 gtk_widget_show(wizard->recv_password_label);
1071                 gtk_widget_hide(wizard->no_imap_warning);
1072 #ifdef USE_OPENSSL
1073                 gtk_widget_show(wizard->recv_use_ssl);
1074                 gtk_widget_show(wizard->recv_use_tls);
1075 #endif
1076                 gtk_label_set_text(GTK_LABEL(wizard->recv_label), _("<span weight=\"bold\">Server address:</span>"));
1077                 gtk_label_set_use_markup(GTK_LABEL(wizard->recv_label), TRUE);
1078                 gtk_dialog_set_response_sensitive (GTK_DIALOG(wizard->window), GO_FORWARD, TRUE);
1079                 g_free(text);
1080 #else
1081                 gtk_widget_hide(wizard->recv_imap_label);
1082                 gtk_widget_hide(wizard->recv_imap_subdir);
1083                 gtk_widget_hide(wizard->subsonly_checkbtn);
1084                 gtk_widget_hide(wizard->recv_username);
1085                 gtk_widget_hide(wizard->recv_password);
1086                 gtk_widget_hide(wizard->recv_username_label);
1087                 gtk_widget_hide(wizard->recv_password_label);
1088                 gtk_widget_show(wizard->no_imap_warning);
1089 #ifdef USE_OPENSSL
1090                 gtk_widget_hide(wizard->recv_use_ssl);
1091                 gtk_widget_hide(wizard->recv_use_tls);
1092 #endif
1093                 gtk_dialog_set_response_sensitive (GTK_DIALOG(wizard->window), GO_FORWARD, FALSE);
1094 #endif
1095         } else if (protocol == A_LOCAL) {
1096                 gtk_entry_set_text(GTK_ENTRY(wizard->recv_server), tmpl.mboxfile?tmpl.mboxfile:"");
1097                 gtk_label_set_text(GTK_LABEL(wizard->recv_label), _("<span weight=\"bold\">Local mailbox:</span>"));
1098                 gtk_label_set_use_markup(GTK_LABEL(wizard->recv_label), TRUE);
1099                 gtk_widget_hide(wizard->no_imap_warning);
1100                 gtk_widget_hide(wizard->recv_imap_label);
1101                 gtk_widget_hide(wizard->recv_imap_subdir);
1102                 gtk_widget_hide(wizard->subsonly_checkbtn);
1103                 gtk_widget_hide(wizard->recv_username);
1104                 gtk_widget_hide(wizard->recv_password);
1105                 gtk_widget_hide(wizard->recv_username_label);
1106                 gtk_widget_hide(wizard->recv_password_label);
1107 #ifdef USE_OPENSSL
1108                 gtk_widget_hide(wizard->recv_use_ssl);
1109                 gtk_widget_hide(wizard->recv_use_tls);
1110 #endif
1111                 gtk_dialog_set_response_sensitive (GTK_DIALOG(wizard->window), GO_FORWARD, TRUE);
1112         }
1113 }
1114
1115 static void wizard_protocol_changed(GtkMenuItem *menuitem, gpointer data)
1116 {
1117         WizardWindow *wizard = (WizardWindow *)data;
1118         RecvProtocol protocol;
1119         protocol = GPOINTER_TO_INT
1120                 (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
1121
1122         wizard_protocol_change(wizard, protocol);       
1123 }
1124
1125 static GtkWidget* recv_page (WizardWindow * wizard)
1126 {
1127 #ifdef USE_OPENSSL
1128         GtkWidget *table = gtk_table_new(8,2, FALSE);
1129 #else
1130         GtkWidget *table = gtk_table_new(6,2, FALSE);
1131 #endif
1132         GtkWidget *menu = gtk_menu_new();
1133         GtkWidget *menuitem;
1134         GtkTooltips *tips = gtk_tooltips_new();
1135         gchar *text;
1136         gint i = 0;
1137         gint index = 0;
1138
1139         gtk_table_set_row_spacings(GTK_TABLE(table), 4);
1140         gtk_table_set_col_spacings(GTK_TABLE(table), 8);
1141
1142         wizard->recv_type = gtk_option_menu_new();
1143         
1144         MENUITEM_ADD (menu, menuitem, _("POP3"), A_POP3);
1145         g_signal_connect(G_OBJECT(menuitem), "activate",
1146                          G_CALLBACK(wizard_protocol_changed),
1147                          wizard);
1148
1149         MENUITEM_ADD (menu, menuitem, _("IMAP"), A_IMAP4);
1150         g_signal_connect(G_OBJECT(menuitem), "activate",
1151                          G_CALLBACK(wizard_protocol_changed),
1152                          wizard);
1153
1154         MENUITEM_ADD (menu, menuitem, _("Local mbox file"), A_LOCAL);
1155         g_signal_connect(G_OBJECT(menuitem), "activate",
1156                          G_CALLBACK(wizard_protocol_changed),
1157                          wizard);
1158
1159         gtk_option_menu_set_menu (GTK_OPTION_MENU (wizard->recv_type), menu);
1160         switch(tmpl.recvtype) {
1161         case A_POP3: 
1162                 index = 0;
1163                 break;
1164         case A_IMAP4:
1165                 index = 1;
1166                 break;
1167         case A_LOCAL:
1168                 index = 2;
1169                 break;
1170         default:
1171                 index = 0;
1172         }
1173         gtk_option_menu_set_history(GTK_OPTION_MENU (wizard->recv_type), index);
1174         GTK_TABLE_ADD_ROW_AT(table, _("<span weight=\"bold\">Server type:</span>"), 
1175                              wizard->recv_type, i); i++;
1176
1177         wizard->recv_server = gtk_entry_new();
1178         text = get_default_server(wizard, "pop");
1179         gtk_entry_set_text(GTK_ENTRY(wizard->recv_server), text);
1180         g_free(text);
1181         
1182         gtk_tooltips_set_tip(GTK_TOOLTIPS(tips), wizard->recv_server,
1183                              _("You can specify the port number by appending it at the end: "
1184                                "\"mail.example.com:110\""),
1185                              NULL);
1186
1187         wizard->recv_label = gtk_label_new(_("<span weight=\"bold\">Server address:</span>"));
1188         gtk_label_set_use_markup(GTK_LABEL(wizard->recv_label), TRUE);
1189         gtk_table_attach(GTK_TABLE(table), wizard->recv_label,                        
1190                          0,1,i,i+1, GTK_EXPAND|GTK_FILL, 0, 0, 0);            
1191         if (GTK_IS_MISC(wizard->recv_label))                                                  
1192                 gtk_misc_set_alignment(GTK_MISC(wizard->recv_label), 1, 0.5);         
1193         gtk_table_attach(GTK_TABLE(table), wizard->recv_server,       
1194                          1,2,i,i+1, GTK_EXPAND|GTK_FILL, 0, 0, 0);            
1195         i++;
1196         
1197         wizard->recv_username = gtk_entry_new();
1198         wizard->recv_username_label = gtk_label_new(_("<span weight=\"bold\">Username:</span>"));
1199         gtk_label_set_use_markup(GTK_LABEL(wizard->recv_username_label), TRUE);
1200         gtk_table_attach(GTK_TABLE(table), wizard->recv_username_label,                               
1201                          0,1,i,i+1, GTK_EXPAND|GTK_FILL, 0, 0, 0);            
1202         if (GTK_IS_MISC(wizard->recv_username_label))                                                 
1203                 gtk_misc_set_alignment(GTK_MISC(wizard->recv_username_label), 1, 0.5);        
1204         gtk_table_attach(GTK_TABLE(table), wizard->recv_username,             
1205                          1,2,i,i+1, GTK_EXPAND|GTK_FILL, 0, 0, 0);            
1206         i++;
1207         
1208         text = get_default_account(wizard);
1209         gtk_entry_set_text(GTK_ENTRY(wizard->recv_username), text);
1210         g_free(text);
1211
1212         wizard->recv_password = gtk_entry_new();
1213         gtk_entry_set_text(GTK_ENTRY(wizard->recv_password), tmpl.recvpass?tmpl.recvpass:"");
1214         wizard->recv_password_label = gtk_label_new(_("Password:"));
1215         gtk_table_attach(GTK_TABLE(table), wizard->recv_password_label,                               
1216                          0,1,i,i+1, GTK_EXPAND|GTK_FILL, 0, 0, 0);            
1217         if (GTK_IS_MISC(wizard->recv_password_label))                                                 
1218                 gtk_misc_set_alignment(GTK_MISC(wizard->recv_password_label), 1, 0.5);        
1219         gtk_table_attach(GTK_TABLE(table), wizard->recv_password,             
1220                          1,2,i,i+1, GTK_EXPAND|GTK_FILL, 0, 0, 0);            
1221         gtk_entry_set_visibility(GTK_ENTRY(wizard->recv_password), FALSE);
1222         i++;
1223         
1224         wizard->recv_imap_subdir = gtk_entry_new();
1225         gtk_entry_set_text(GTK_ENTRY(wizard->recv_imap_subdir), tmpl.imapdir?tmpl.imapdir:"");
1226         wizard->recv_imap_label = gtk_label_new(_("IMAP server directory:"));
1227         
1228         gtk_table_attach(GTK_TABLE(table), wizard->recv_imap_label,                           
1229                          0,1,i,i+1, GTK_EXPAND|GTK_FILL, 0, 0, 0);            
1230         if (GTK_IS_MISC(wizard->recv_imap_label))                                                     
1231                 gtk_misc_set_alignment(GTK_MISC(wizard->recv_imap_label), 1, 0.5);            
1232         gtk_table_attach(GTK_TABLE(table), wizard->recv_imap_subdir,          
1233                          1,2,i,i+1, GTK_EXPAND|GTK_FILL, 0, 0, 0);            
1234
1235         i++;
1236         
1237         wizard->subsonly_checkbtn = gtk_check_button_new_with_label(
1238                         _("Show only subscribed folders"));
1239         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wizard->subsonly_checkbtn),
1240                         tmpl.subsonly);
1241         gtk_table_attach(GTK_TABLE(table), wizard->subsonly_checkbtn,                         
1242                          0,1,i,i+1, GTK_EXPAND|GTK_FILL, 0, 0, 0);            
1243
1244         i++;
1245         
1246         
1247         wizard->no_imap_warning = gtk_label_new(_(
1248                           "<span weight=\"bold\">Warning: this version of Claws Mail\n"
1249                           "has been built without IMAP support.</span>"));
1250         gtk_label_set_use_markup(GTK_LABEL(wizard->no_imap_warning), TRUE);
1251         gtk_table_attach(GTK_TABLE(table), wizard->no_imap_warning,                           
1252                          0,2,i,i+1, GTK_EXPAND|GTK_FILL, 0, 0, 0);            
1253 #ifdef USE_OPENSSL
1254         wizard->recv_use_ssl = gtk_check_button_new_with_label(
1255                                         _("Use SSL to connect to receiving server"));
1256         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wizard->recv_use_ssl),
1257                         tmpl.recvssl != 0);
1258         gtk_table_attach(GTK_TABLE(table), wizard->recv_use_ssl,      
1259                          0,1,i,i+1, GTK_EXPAND|GTK_FILL, 0, 0, 0);
1260         i++;
1261         wizard->recv_use_tls = gtk_check_button_new_with_label(
1262                                         _("Use SSL via STARTTLS"));
1263         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wizard->recv_use_tls),
1264                         tmpl.recvssl == 2);
1265         gtk_table_attach(GTK_TABLE(table), wizard->recv_use_tls,      
1266                          0,1,i,i+1, GTK_EXPAND|GTK_FILL, 0, 16, 0); 
1267         i++;
1268         SET_TOGGLE_SENSITIVITY (wizard->recv_use_ssl, wizard->recv_use_tls);
1269 #endif  
1270         return table;
1271 }
1272
1273 static void
1274 wizard_response_cb (GtkDialog * dialog, int response, gpointer data)
1275 {
1276         WizardWindow * wizard = (WizardWindow *)data;
1277         int current_page, num_pages;
1278         GtkWidget *menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(wizard->recv_type));
1279         GtkWidget *menuitem = gtk_menu_get_active(GTK_MENU(menu));
1280         gint protocol = GPOINTER_TO_INT
1281                         (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
1282         gboolean skip_mailbox_page = FALSE;
1283         
1284         if (protocol == A_IMAP4) {
1285                 skip_mailbox_page = TRUE;
1286         }
1287         
1288         num_pages = g_slist_length(wizard->pages);
1289
1290         current_page = gtk_notebook_get_current_page (
1291                                 GTK_NOTEBOOK(wizard->notebook));
1292         if (response == CANCEL)
1293         {
1294                 wizard->result = FALSE;
1295                 wizard->finished = TRUE;
1296                 gtk_widget_destroy (GTK_WIDGET(dialog));
1297         }
1298         else if (response == FINISHED)
1299         {
1300                 if (!wizard_write_config(wizard)) {
1301                         current_page = gtk_notebook_get_current_page (
1302                                         GTK_NOTEBOOK(wizard->notebook));
1303                         goto set_sens;
1304                 }
1305                 wizard->result = TRUE;
1306                 wizard->finished = TRUE;
1307                 gtk_widget_destroy (GTK_WIDGET(dialog));
1308         }
1309         else
1310         {
1311                 if (response == GO_BACK)
1312                 {
1313                         if (current_page > 0) {
1314                                 current_page--;
1315                                 if (current_page == MAILBOX_PAGE && skip_mailbox_page) {
1316                                         /* mailbox */
1317                                         current_page--;
1318                                 }
1319                                 gtk_notebook_set_current_page (
1320                                         GTK_NOTEBOOK(wizard->notebook), 
1321                                         current_page);
1322                         }
1323                 }
1324                 else if (response == GO_FORWARD)
1325                 {
1326                         if (current_page < (num_pages-1)) {
1327                                 current_page++;
1328                                 if (current_page == MAILBOX_PAGE && skip_mailbox_page) {
1329                                         /* mailbox */
1330                                         current_page++;
1331                                 }
1332                                 gtk_notebook_set_current_page (
1333                                         GTK_NOTEBOOK(wizard->notebook), 
1334                                         current_page);
1335                         }
1336                 }
1337 set_sens:
1338                 gtk_dialog_set_response_sensitive (dialog, GO_BACK, 
1339                                 current_page > 0);
1340                 gtk_dialog_set_response_sensitive (dialog, GO_FORWARD, 
1341                                 current_page < (num_pages - 1));
1342                 if (current_page == (num_pages -1)) {
1343                         gtk_dialog_set_response_sensitive (dialog, FINISHED, TRUE);
1344                         gtk_dialog_set_default_response(GTK_DIALOG(wizard->window), FINISHED);
1345                 } else {
1346                         gtk_dialog_set_response_sensitive (dialog, FINISHED, FALSE);
1347                         gtk_dialog_set_default_response(GTK_DIALOG(wizard->window), GO_FORWARD);
1348                 }
1349
1350         }
1351 }
1352
1353 static gint wizard_close_cb(GtkWidget *widget, GdkEventAny *event,
1354                                  gpointer data)
1355 {
1356         WizardWindow *wizard = (WizardWindow *)data;
1357         wizard->result = FALSE;
1358         wizard->finished = TRUE;
1359         
1360         return FALSE;
1361 }
1362
1363 #define PACK_WARNING(text) {                                            \
1364         label = gtk_label_new(text);                                    \
1365         gtk_misc_set_alignment(GTK_MISC(label), 0, 0);                  \
1366         gtk_box_pack_end(GTK_BOX(widget), label, FALSE, FALSE, 0);      \
1367 }
1368
1369 gboolean run_wizard(MainWindow *mainwin, gboolean create_mailbox) {
1370         WizardWindow *wizard = g_new0(WizardWindow, 1);
1371         GtkWidget *page;
1372         GtkWidget *widget;
1373         GtkWidget *label;
1374         gchar     *text;
1375         GSList    *cur;
1376         gboolean   result;
1377         gint i = 0;
1378         wizard->mainwin = mainwin;
1379         wizard->create_mailbox = create_mailbox;
1380         
1381         gtk_widget_hide(mainwin->window);
1382         
1383         wizard_read_defaults();
1384         
1385         wizard->window = gtk_dialog_new_with_buttons (_("Claws Mail Setup Wizard"),
1386                         NULL, 0, 
1387                         GTK_STOCK_GO_BACK, GO_BACK,
1388                         GTK_STOCK_GO_FORWARD, GO_FORWARD,
1389                         GTK_STOCK_SAVE, FINISHED,
1390                         GTK_STOCK_CANCEL, CANCEL,
1391                         NULL);
1392
1393         g_signal_connect(wizard->window, "response", 
1394                           G_CALLBACK(wizard_response_cb), wizard);
1395         gtk_widget_realize(wizard->window);
1396         gtk_dialog_set_default_response(GTK_DIALOG(wizard->window), 
1397                         GO_FORWARD);
1398         gtk_dialog_set_response_sensitive(GTK_DIALOG(wizard->window), 
1399                         GO_BACK, FALSE);
1400         gtk_dialog_set_response_sensitive(GTK_DIALOG(wizard->window), 
1401                         GO_FORWARD, TRUE);
1402         gtk_dialog_set_response_sensitive(GTK_DIALOG(wizard->window), 
1403                         FINISHED, FALSE);
1404         gtk_dialog_set_response_sensitive(GTK_DIALOG(wizard->window), 
1405                         CANCEL, TRUE);
1406         
1407         wizard->notebook = gtk_notebook_new();
1408         gtk_notebook_set_show_tabs(GTK_NOTEBOOK(wizard->notebook), FALSE);
1409         gtk_notebook_set_show_border(GTK_NOTEBOOK(wizard->notebook), FALSE);
1410         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(wizard->window)->vbox), 
1411                             wizard->notebook, TRUE, TRUE, 0);
1412         
1413         wizard->pages = NULL;
1414         
1415 /*welcome page: 0 */
1416         WELCOME_PAGE = i;
1417         page = create_page(wizard, _("Welcome to Claws Mail"));
1418         
1419         wizard->pages = g_slist_append(wizard->pages, page);
1420         widget = stock_pixmap_widget(wizard->window, 
1421                                 STOCK_PIXMAP_CLAWS_MAIL_LOGO);
1422
1423         gtk_box_pack_start (GTK_BOX(page), widget, FALSE, FALSE, 0);
1424         
1425         text = g_strdup(_("Welcome to the Claws Mail setup wizard.\n\n"
1426                           "We will begin by defining some basic "
1427                           "information about you and your most common "
1428                           "mail options so that you can start to use "
1429                           "Claws Mail in less than five minutes."));
1430         widget = gtk_label_new(text);
1431         gtk_label_set_line_wrap(GTK_LABEL(widget), TRUE);
1432         gtk_box_pack_start (GTK_BOX(page), widget, FALSE, FALSE, 0);
1433         g_free(text);
1434
1435 /* user page: 1 */
1436         i++;
1437         USER_PAGE = i;
1438         widget = create_page (wizard, _("About You"));
1439         gtk_box_pack_start (GTK_BOX(widget), user_page(wizard), FALSE, FALSE, 0);
1440         PACK_WARNING(_("Bold fields must be completed"));
1441         
1442         wizard->pages = g_slist_append(wizard->pages, widget);
1443
1444 /* recv+auth page: 2 */
1445         i++;
1446         RECV_PAGE = i;
1447         widget = create_page (wizard, _("Receiving mail"));
1448         gtk_box_pack_start (GTK_BOX(widget), recv_page(wizard), FALSE, FALSE, 0);
1449         PACK_WARNING(_("Bold fields must be completed"));
1450         
1451         wizard->pages = g_slist_append(wizard->pages, widget);
1452
1453 /*smtp page: 3 */
1454         i++;
1455         SMTP_PAGE = i;
1456         widget = create_page (wizard, _("Sending mail"));
1457         gtk_box_pack_start (GTK_BOX(widget), smtp_page(wizard), FALSE, FALSE, 0);
1458         PACK_WARNING(_("Bold fields must be completed"));
1459         
1460         wizard->pages = g_slist_append(wizard->pages, widget);
1461
1462 /* mailbox page: 4 */
1463         if (create_mailbox) {
1464                 i++;
1465                 MAILBOX_PAGE = i;
1466                 widget = create_page (wizard, _("Saving mail on disk"));
1467                 gtk_box_pack_start (GTK_BOX(widget), mailbox_page(wizard), FALSE, FALSE, 0);
1468                 PACK_WARNING(_("Bold fields must be completed"));
1469         
1470                 wizard->pages = g_slist_append(wizard->pages, widget);
1471         }
1472
1473 /* done page: 6 */
1474         i++;
1475         DONE_PAGE = i;
1476         page = create_page(wizard, _("Configuration finished"));
1477         
1478         wizard->pages = g_slist_append(wizard->pages, page);
1479         widget = stock_pixmap_widget(wizard->window, 
1480                                 STOCK_PIXMAP_CLAWS_MAIL_LOGO);
1481
1482         gtk_box_pack_start (GTK_BOX(page), widget, FALSE, FALSE, 0);
1483         
1484         text = g_strdup(_("Claws Mail is now ready.\n\n"
1485                           "Click Save to start."));
1486         widget = gtk_label_new(text);
1487         gtk_box_pack_start (GTK_BOX(page), widget, FALSE, FALSE, 0);
1488         g_free(text);
1489
1490
1491         for (cur = wizard->pages; cur && cur->data; cur = cur->next) {
1492                 gtk_notebook_append_page (GTK_NOTEBOOK(wizard->notebook), 
1493                                           GTK_WIDGET(cur->data), NULL);
1494         }
1495         
1496         g_signal_connect(G_OBJECT(wizard->window), "delete_event",
1497                          G_CALLBACK(wizard_close_cb), wizard);
1498         gtk_widget_show_all (wizard->window);
1499
1500         gtk_widget_hide(wizard->recv_imap_label);
1501         gtk_widget_hide(wizard->recv_imap_subdir);
1502         gtk_widget_hide(wizard->subsonly_checkbtn);
1503
1504         wizard_protocol_change(wizard, tmpl.recvtype);
1505
1506         while (!wizard->finished)
1507                 gtk_main_iteration();
1508
1509         result = wizard->result;
1510         
1511         GTK_EVENTS_FLUSH();
1512
1513         gtk_widget_show(mainwin->window);
1514         g_free(wizard);
1515
1516         return result;
1517 }