From 0b3cbf57875fd692e4ba0b336fefa4bee1ed00dc Mon Sep 17 00:00:00 2001 From: Simeon Simeonov Date: Mon, 26 Feb 2018 11:23:00 +0100 Subject: Initial commit for sylpheed 3.7.0 --- src/setup.c | 1281 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1281 insertions(+) create mode 100644 src/setup.c (limited to 'src/setup.c') diff --git a/src/setup.c b/src/setup.c new file mode 100644 index 0000000..8d54af0 --- /dev/null +++ b/src/setup.c @@ -0,0 +1,1281 @@ +/* + * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client + * Copyright (C) 1999-2014 Hiroyuki Yamamoto + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#ifdef G_OS_WIN32 +# include +# include +# include +#endif + +#include "inputdialog.h" +#include "alertpanel.h" +#include "mainwindow.h" +#include "folderview.h" +#include "manage_window.h" +#include "account_dialog.h" +#include "gtkutils.h" +#include "filesel.h" +#include "prefs_common.h" +#include "stock_pixmap.h" +#include "account.h" +#include "addressbook.h" +#if USE_SSL +# include "ssl.h" +#endif + +static PangoFontDescription *font_desc; + +static void scan_tree_func(Folder *folder, FolderItem *item, gpointer data); + + +static void button_toggled(GtkToggleButton *button, GtkWidget *widget) +{ + gboolean is_active; + + is_active = gtk_toggle_button_get_active(button); + gtk_widget_set_sensitive(widget, is_active); +} + +static void sel_btn_clicked(GtkButton *button, GtkWidget *entry) +{ + gchar *folder; + gchar *utf8_folder; + gchar *base; + + folder = filesel_select_dir(NULL); + if (folder) { + utf8_folder = conv_filename_to_utf8(folder); + base = g_path_get_basename(utf8_folder); + if (!g_ascii_strcasecmp(base, "Mail")) { + gtk_entry_set_text(GTK_ENTRY(entry), utf8_folder); + } else { + gchar *text; + + text = g_strconcat(utf8_folder, G_DIR_SEPARATOR_S, "Mail", NULL); + gtk_entry_set_text(GTK_ENTRY(entry), text); + g_free(text); + } + g_free(base); + g_free(utf8_folder); + g_free(folder); + } +} + +#ifdef G_OS_WIN32 +#define MODIFY_LABEL_STYLE() \ + { \ + GtkStyle *style; \ + style = gtk_widget_get_style(dialog); \ + gtk_widget_modify_base(label, GTK_STATE_ACTIVE, \ + &style->base[GTK_STATE_SELECTED]); \ + gtk_widget_modify_text(label, GTK_STATE_ACTIVE, \ + &style->text[GTK_STATE_SELECTED]); \ + } +#else +#define MODIFY_LABEL_STYLE() +#endif + +void setup_mailbox(void) +{ + MainWindow *mainwin; + GtkWidget *dialog; + GtkWidget *hbox; + GtkWidget *image; + GtkWidget *vbox; + GtkWidget *label; + GtkWidget *radio; + GtkWidget *entry; + GtkWidget *sel_btn; + GtkWidget *ok_btn; + gchar *path = NULL; + gchar *fullpath; + Folder *folder; + gint result; + + mainwin = main_window_get(); + manage_window_focus_in(mainwin->window, NULL, NULL); + + dialog = gtk_dialog_new(); + gtk_window_set_title(GTK_WINDOW(dialog), _("Mailbox setting")); + gtk_window_set_policy(GTK_WINDOW(dialog), FALSE, TRUE, FALSE); + gtk_widget_set_size_request(dialog, 540 * gtkut_get_dpi_multiplier(), -1); + gtk_window_set_position(GTK_WINDOW(dialog), + GTK_WIN_POS_CENTER_ON_PARENT); + gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); + manage_window_set_transient(GTK_WINDOW(dialog)); + gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE); + MANAGE_WINDOW_SIGNALS_CONNECT(dialog); + gtk_widget_realize(dialog); + + hbox = gtk_hbox_new(FALSE, 12); + gtk_container_set_border_width(GTK_CONTAINER(hbox), 12); + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), + hbox, FALSE, FALSE, 0); + + image = stock_pixbuf_widget(dialog, STOCK_PIXMAP_SYLPHEED); + + gtk_misc_set_alignment(GTK_MISC(image), 0.5, 0.0); + gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); + + vbox = gtk_vbox_new(FALSE, 12); + gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); + + label = gtk_label_new(_("Mailbox setting")); + gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); + gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); + + if (!font_desc) { + gint size; + + size = pango_font_description_get_size + (label->style->font_desc); + font_desc = pango_font_description_new(); + pango_font_description_set_weight + (font_desc, PANGO_WEIGHT_BOLD); + pango_font_description_set_size + (font_desc, size * PANGO_SCALE_LARGE); + } + if (font_desc) + gtk_widget_modify_font(label, font_desc); + + label = gtk_label_new(_("This dialog will make initial setup of mailbox.")); + gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); + gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); + gtk_label_set_selectable(GTK_LABEL(label), TRUE); + GTK_WIDGET_UNSET_FLAGS(label, GTK_CAN_FOCUS); + MODIFY_LABEL_STYLE(); + + vbox = gtk_vbox_new(FALSE, 8); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 12); + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), vbox, + TRUE, TRUE, 0); + + radio = gtk_radio_button_new_with_label + (NULL, _("Create mailbox at the following default location:")); + gtk_box_pack_start(GTK_BOX(vbox), radio, FALSE, FALSE, 0); + + fullpath = g_strdup_printf("%s%cMail", get_mail_base_dir(), + G_DIR_SEPARATOR); + + label = gtk_label_new(fullpath); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); + gtk_label_set_line_wrap(GTK_LABEL(label), FALSE); +#if GTK_CHECK_VERSION(2, 6, 0) + gtk_label_set_ellipsize(GTK_LABEL(label), PANGO_ELLIPSIZE_MIDDLE); +#endif + gtk_label_set_selectable(GTK_LABEL(label), TRUE); + GTK_WIDGET_UNSET_FLAGS(label, GTK_CAN_FOCUS); + MODIFY_LABEL_STYLE(); + + g_free(fullpath); + + radio = gtk_radio_button_new_with_label_from_widget + (GTK_RADIO_BUTTON(radio), _("Create mailbox at the following location:\n(enter folder name or full folder path)")); + gtk_box_pack_start(GTK_BOX(vbox), radio, FALSE, FALSE, 0); + + hbox = gtk_hbox_new(FALSE, 4); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + + entry = gtk_entry_new(); + gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); + + sel_btn = gtk_button_new_with_label("..."); + gtk_box_pack_start(GTK_BOX(hbox), sel_btn, FALSE, FALSE, 0); + g_signal_connect(G_OBJECT(sel_btn), "clicked", + G_CALLBACK(sel_btn_clicked), entry); + + gtk_widget_set_sensitive(hbox, FALSE); + g_signal_connect(G_OBJECT(radio), "toggled", G_CALLBACK(button_toggled), + hbox); + + label = gtk_label_new(_("If you want to add a mailbox at another location afterward, please select 'File - Mailbox - Add mailbox...' in the menu.")); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); + gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); + gtk_label_set_selectable(GTK_LABEL(label), TRUE); + GTK_WIDGET_UNSET_FLAGS(label, GTK_CAN_FOCUS); + MODIFY_LABEL_STYLE(); + + if (prefs_common.comply_gnome_hig) { + gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); + ok_btn = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_OK, GTK_RESPONSE_OK); + } else { + ok_btn = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_OK, GTK_RESPONSE_OK); + gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); + } + gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); + gtk_widget_grab_focus(ok_btn); + + gtk_widget_show_all(dialog); + + do { + result = gtk_dialog_run(GTK_DIALOG(dialog)); + if (result != GTK_RESPONSE_OK) { + if (alertpanel(_("Cancel"), _("Continue without creating mailbox?"), GTK_STOCK_YES, GTK_STOCK_NO, NULL) == G_ALERTDEFAULT) + break; + else + continue; + } + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio))) { + path = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1); + g_strstrip(path); + if (*path == '\0') { + alertpanel_error(_("Please input folder name or full folder path.")); + g_free(path); + path = NULL; + } + } else + path = g_strdup("Mail"); + + if (path) { + if (folder_find_from_path(path)) { + alertpanel_error(_("The mailbox '%s' already exists."), path); + g_warning("The mailbox '%s' already exists.", path); + g_free(path); + path = NULL; + } else if (is_path_parent(path, get_rc_dir()) || + is_path_parent(path, get_mail_base_dir())) { + alertpanel_error(_("The location '%s' includes settings folder. Please specify another location."), path); + g_warning("The location '%s' includes settings folder.", path); + g_free(path); + path = NULL; + } + } + } while (path == NULL); + + gtk_widget_destroy(dialog); + if (path == NULL) + return; + + if (!strcmp(g_basename(path), "Mail")) + folder = folder_new(F_MH, _("Mailbox"), path); + else + folder = folder_new(F_MH, g_basename(path), path); + g_free(path); + + if (folder->klass->create_tree(folder) < 0) { + alertpanel_error(_("Creation of the mailbox failed.\n" + "Maybe some files already exist, or you don't have the permission to write there.")); + folder_destroy(folder); + return; + } + + folder_add(folder); + folder_set_ui_func(folder, scan_tree_func, mainwin); + folder->klass->scan_tree(folder); + folder_set_ui_func(folder, NULL, NULL); + + folderview_set(mainwin->folderview); +} + +static void scan_tree_func(Folder *folder, FolderItem *item, gpointer data) +{ + MainWindow *mainwin = (MainWindow *)data; + gchar *str; + + if (item->path) + str = g_strdup_printf(_("Scanning folder %s%c%s ..."), + LOCAL_FOLDER(folder)->rootpath, + G_DIR_SEPARATOR, + item->path); + else + str = g_strdup_printf(_("Scanning folder %s ..."), + LOCAL_FOLDER(folder)->rootpath); + + gtk_statusbar_push(GTK_STATUSBAR(mainwin->statusbar), + mainwin->mainwin_cid, str); + gtkut_widget_draw_now(mainwin->statusbar); + gtk_statusbar_pop(GTK_STATUSBAR(mainwin->statusbar), + mainwin->mainwin_cid); + g_free(str); +} + +static struct +{ + GtkWidget *dialog; + GtkWidget *notebook; + GtkWidget *prev_btn; + GtkWidget *next_btn; + GtkWidget *cancel_btn; + GtkWidget *pop3_radio; + GtkWidget *imap_radio; +#if USE_SSL + GtkWidget *pop3g_radio; + GtkWidget *imapg_radio; +#endif + GtkWidget *name_entry; + GtkWidget *addr_entry; + GtkWidget *id_entry; + GtkWidget *serv_entry; + GtkWidget *smtp_entry; + GtkWidget *smtpauth_chkbtn; +#if USE_SSL + GtkWidget *servssl_chkbtn; + GtkWidget *smtpssl_chkbtn; +#endif + GtkWidget *serv_label_name1; + GtkWidget *serv_label_name2; + GtkWidget *name_label; + GtkWidget *addr_label; + GtkWidget *id_label; + GtkWidget *serv_label; + GtkWidget *smtp_label; + gboolean finished; + gboolean cancelled; + + gint type; + gchar *name; + gchar *addr; + gchar *userid; + gchar *serv; + gchar *smtpserv; + gushort serv_port; + gushort smtp_port; +#if USE_SSL + gboolean serv_ssl; + gboolean smtp_ssl; +#endif + gboolean smtp_auth; +} setupac; + +enum +{ + SETUP_PAGE_START, + SETUP_PAGE_ADDRESS, + SETUP_PAGE_ACCOUNT, + SETUP_PAGE_FINISH +}; + +enum +{ + SETUP_TYPE_POP3, + SETUP_TYPE_IMAP, +#if USE_SSL + SETUP_TYPE_POP3G, + SETUP_TYPE_IMAPG +#endif +}; + +#define GMAIL_POP3_SERVER "pop.gmail.com" +#define GMAIL_IMAP_SERVER "imap.gmail.com" +#define GMAIL_SMTP_SERVER "smtp.gmail.com" +#define POP3_PORT 110 +#define IMAP_PORT 143 +#define SMTP_PORT 25 +#define POP3S_PORT 995 +#define IMAPS_PORT 993 +#define SMTPS_PORT 465 + +static void entry_changed(GtkEditable *editable, gpointer data) +{ + const gchar *name, *addr, *userid, *serv, *smtp; + gint page; + gboolean next_enable = FALSE; + + page = gtk_notebook_get_current_page(GTK_NOTEBOOK(setupac.notebook)); + if (page != SETUP_PAGE_ADDRESS && page != SETUP_PAGE_ACCOUNT) + return; + + name = gtk_entry_get_text(GTK_ENTRY(setupac.name_entry)); + addr = gtk_entry_get_text(GTK_ENTRY(setupac.addr_entry)); + userid = gtk_entry_get_text(GTK_ENTRY(setupac.id_entry)); + serv = gtk_entry_get_text(GTK_ENTRY(setupac.serv_entry)); + smtp = gtk_entry_get_text(GTK_ENTRY(setupac.smtp_entry)); + +#if USE_SSL + if (setupac.type == SETUP_TYPE_POP3G || + setupac.type == SETUP_TYPE_IMAPG) { + if (GTK_WIDGET(editable) == setupac.addr_entry) + gtk_entry_set_text(GTK_ENTRY(setupac.id_entry), addr); + } +#endif + + if (page == SETUP_PAGE_ADDRESS && name && *name && addr && *addr) + next_enable = TRUE; + else if (page == SETUP_PAGE_ACCOUNT && + userid && *userid && serv && *serv && smtp && *smtp) + next_enable = TRUE; + + gtk_dialog_set_response_sensitive(GTK_DIALOG(setupac.dialog), + GTK_RESPONSE_ACCEPT, next_enable); +} + +static gboolean entry_is_valid(GtkWidget *entry) +{ + const gchar *str, *p; + guchar c; + + p = str = gtk_entry_get_text(GTK_ENTRY(entry)); + if (!str || *p == '\0') + return FALSE; + if (!strcmp(str, "(username)@gmail.com")) + return FALSE; + + while (*p) { + c = *p; + if (g_ascii_isspace(c) || c < 32 || c > 127) + return FALSE; + p++; + } + + return TRUE; +} + +#define GET_STR(s, m) \ +{ \ + setupac.s = gtk_editable_get_chars(GTK_EDITABLE(setupac.m), 0, -1); \ + g_strstrip(setupac.s); \ +} + +static void setup_account_response_cb(GtkDialog *dialog, gint response_id, + gpointer data) +{ + gint page, prev_page; + gboolean next_enable = TRUE; + gboolean prev_enable = TRUE; + gchar buf[1024]; + + prev_page = page = + gtk_notebook_get_current_page(GTK_NOTEBOOK(setupac.notebook)); + + if (response_id == GTK_RESPONSE_CANCEL || + response_id == GTK_RESPONSE_DELETE_EVENT) { + if (page == SETUP_PAGE_FINISH) { + setupac.finished = TRUE; + } else { + if (alertpanel(_("Cancel"), _("Cancel mail account setup?"), GTK_STOCK_YES, GTK_STOCK_NO, NULL) == G_ALERTDEFAULT) { + setupac.finished = TRUE; + setupac.cancelled = TRUE; + } + return; + } + } else if (response_id == GTK_RESPONSE_ACCEPT) { + if (prev_page == SETUP_PAGE_ADDRESS) { + if (entry_is_valid(setupac.addr_entry)) { +#if USE_SSL + if (setupac.type == SETUP_TYPE_POP3G || + setupac.type == SETUP_TYPE_IMAPG) + gtk_notebook_set_current_page + (GTK_NOTEBOOK(setupac.notebook), + SETUP_PAGE_FINISH); + else +#endif + gtk_notebook_set_current_page + (GTK_NOTEBOOK(setupac.notebook), page + 1); + } else + alertpanel_error(_("Input value is not valid.")); + } else if (prev_page == SETUP_PAGE_ACCOUNT) { + if (entry_is_valid(setupac.id_entry) && + entry_is_valid(setupac.serv_entry) && + entry_is_valid(setupac.smtp_entry)) + gtk_notebook_set_current_page + (GTK_NOTEBOOK(setupac.notebook), page + 1); + else + alertpanel_error(_("Input value is not valid.")); + } else { + gtk_notebook_set_current_page + (GTK_NOTEBOOK(setupac.notebook), page + 1); + } + + if (prev_page == SETUP_PAGE_START) { + setupac.type = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(setupac.pop3_radio)) ? SETUP_TYPE_POP3 + : gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(setupac.imap_radio)) ? SETUP_TYPE_IMAP +#if USE_SSL + : gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(setupac.pop3g_radio)) ? SETUP_TYPE_POP3G + : gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(setupac.imapg_radio)) ? SETUP_TYPE_IMAPG +#endif + : SETUP_TYPE_POP3; + } + } else if (response_id == GTK_RESPONSE_REJECT) { + gtk_notebook_set_current_page(GTK_NOTEBOOK(setupac.notebook), + page - 1); + } else { + g_warning("setup_account_response_cb: invalid response_id: %d\n", response_id); + } + + page = gtk_notebook_get_current_page(GTK_NOTEBOOK(setupac.notebook)); + + if (page == SETUP_PAGE_START) + prev_enable = FALSE; + else if (page == SETUP_PAGE_ADDRESS || page == SETUP_PAGE_ACCOUNT) { + switch (setupac.type) { + case SETUP_TYPE_POP3: + gtk_widget_set_sensitive(setupac.id_entry, TRUE); + gtk_label_set_text(GTK_LABEL(setupac.serv_label_name1), _("POP3 server:")); + gtk_widget_set_sensitive(setupac.serv_entry, TRUE); + gtk_widget_set_sensitive(setupac.smtp_entry, TRUE); + break; + case SETUP_TYPE_IMAP: + gtk_widget_set_sensitive(setupac.id_entry, TRUE); + gtk_label_set_text(GTK_LABEL(setupac.serv_label_name1), _("IMAP4 server:")); + gtk_widget_set_sensitive(setupac.serv_entry, TRUE); + gtk_widget_set_sensitive(setupac.smtp_entry, TRUE); + break; +#if USE_SSL + case SETUP_TYPE_POP3G: + if (prev_page == SETUP_PAGE_START) + gtk_entry_set_text(GTK_ENTRY(setupac.addr_entry), "(username)@gmail.com"); + gtk_widget_set_sensitive(setupac.id_entry, FALSE); + gtk_label_set_text(GTK_LABEL(setupac.serv_label_name1), _("POP3 server:")); + gtk_entry_set_text(GTK_ENTRY(setupac.serv_entry), GMAIL_POP3_SERVER); + gtk_widget_set_sensitive(setupac.serv_entry, FALSE); + gtk_entry_set_text(GTK_ENTRY(setupac.smtp_entry), GMAIL_SMTP_SERVER); + gtk_widget_set_sensitive(setupac.smtp_entry, FALSE); + break; + case SETUP_TYPE_IMAPG: + if (prev_page == SETUP_PAGE_START) + gtk_entry_set_text(GTK_ENTRY(setupac.addr_entry), "(username)@gmail.com"); + gtk_widget_set_sensitive(setupac.id_entry, FALSE); + gtk_label_set_text(GTK_LABEL(setupac.serv_label_name1), _("IMAP4 server:")); + gtk_entry_set_text(GTK_ENTRY(setupac.serv_entry), GMAIL_IMAP_SERVER); + gtk_widget_set_sensitive(setupac.serv_entry, FALSE); + gtk_entry_set_text(GTK_ENTRY(setupac.smtp_entry), GMAIL_SMTP_SERVER); + gtk_widget_set_sensitive(setupac.smtp_entry, FALSE); + break; +#endif /* USE_SSL */ + } + } else if (page == SETUP_PAGE_FINISH) { + prev_enable = FALSE; + next_enable = FALSE; + gtk_button_set_label(GTK_BUTTON(setupac.cancel_btn), + GTK_STOCK_CLOSE); + + switch (setupac.type) { + case SETUP_TYPE_POP3: +#if USE_SSL + setupac.serv_ssl = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(setupac.servssl_chkbtn)); + setupac.smtp_ssl = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(setupac.smtpssl_chkbtn)); + setupac.serv_port = setupac.serv_ssl ? POP3S_PORT : POP3_PORT; + setupac.smtp_port = setupac.smtp_ssl ? SMTPS_PORT : SMTP_PORT; +#else /* !USE_SSL */ + setupac.serv_port = POP3_PORT; + setupac.smtp_port = SMTP_PORT; +#endif /* USE_SSL */ + setupac.smtp_auth = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(setupac.smtpauth_chkbtn)); + gtk_label_set_text(GTK_LABEL(setupac.serv_label_name2), _("POP3 server:")); + break; + case SETUP_TYPE_IMAP: +#if USE_SSL + setupac.serv_ssl = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(setupac.servssl_chkbtn)); + setupac.smtp_ssl = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(setupac.smtpssl_chkbtn)); + setupac.serv_port = setupac.serv_ssl ? IMAPS_PORT : IMAP_PORT; + setupac.smtp_port = setupac.smtp_ssl ? SMTPS_PORT : SMTP_PORT; +#else /* !USE_SSL */ + setupac.serv_port = IMAP_PORT; + setupac.smtp_port = SMTP_PORT; +#endif /* USE_SSL */ + setupac.smtp_auth = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(setupac.smtpauth_chkbtn)); + gtk_label_set_text(GTK_LABEL(setupac.serv_label_name2), _("IMAP4 server:")); + break; +#if USE_SSL + case SETUP_TYPE_POP3G: + setupac.serv_ssl = TRUE; + setupac.smtp_ssl = TRUE; + setupac.smtp_auth = TRUE; + setupac.serv_port = POP3S_PORT; + setupac.smtp_port = SMTPS_PORT; + gtk_label_set_text(GTK_LABEL(setupac.serv_label_name2), _("POP3 server:")); + break; + case SETUP_TYPE_IMAPG: + setupac.serv_ssl = TRUE; + setupac.smtp_ssl = TRUE; + setupac.smtp_auth = TRUE; + setupac.serv_port = IMAPS_PORT; + setupac.smtp_port = SMTPS_PORT; + gtk_label_set_text(GTK_LABEL(setupac.serv_label_name2), _("IMAP4 server:")); + break; +#endif /* USE_SSL */ + } + + GET_STR(name, name_entry); + GET_STR(addr, addr_entry); + GET_STR(userid, id_entry); + GET_STR(serv, serv_entry); + GET_STR(smtpserv, smtp_entry); + gtk_label_set_text(GTK_LABEL(setupac.name_label), setupac.name); + gtk_label_set_text(GTK_LABEL(setupac.addr_label), setupac.addr); + gtk_label_set_text(GTK_LABEL(setupac.id_label), setupac.userid); +#if USE_SSL + if (setupac.serv_ssl) + g_snprintf(buf, sizeof(buf), "%s:%u (SSL)", + setupac.serv, setupac.serv_port); + else +#endif + g_snprintf(buf, sizeof(buf), "%s:%u", + setupac.serv, setupac.serv_port); + gtk_label_set_text(GTK_LABEL(setupac.serv_label), buf); +#if USE_SSL + if (setupac.smtp_ssl) + g_snprintf(buf, sizeof(buf), "%s:%u (SSL)", + setupac.smtpserv, setupac.smtp_port); + else +#endif + g_snprintf(buf, sizeof(buf), "%s:%u", + setupac.smtpserv, setupac.smtp_port); + gtk_label_set_text(GTK_LABEL(setupac.smtp_label), buf); + } + + gtk_dialog_set_response_sensitive(GTK_DIALOG(setupac.dialog), + GTK_RESPONSE_REJECT, prev_enable); + gtk_dialog_set_response_sensitive(GTK_DIALOG(setupac.dialog), + GTK_RESPONSE_ACCEPT, next_enable); + + if (page == SETUP_PAGE_ADDRESS || page == SETUP_PAGE_ACCOUNT) + entry_changed(GTK_EDITABLE(setupac.addr_entry), NULL); +} + +PrefsAccount *setup_account(void) +{ + MainWindow *mainwin; + GtkWidget *dialog; + GtkWidget *hbox; + GtkWidget *image; + GtkWidget *vbox; + GtkWidget *vbox2; + GtkWidget *label; + GtkWidget *table; + GtkWidget *chkbtn; + gint result; + PrefsAccount *ac; + + mainwin = main_window_get(); + manage_window_focus_in(mainwin->window, NULL, NULL); + + dialog = gtk_dialog_new_with_buttons(_("New account setup"), NULL, GTK_DIALOG_MODAL, NULL); + setupac.dialog = dialog; + + setupac.prev_btn = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_GO_BACK, GTK_RESPONSE_REJECT); + setupac.next_btn = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_GO_FORWARD, GTK_RESPONSE_ACCEPT); + setupac.cancel_btn = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); + + gtk_window_set_policy(GTK_WINDOW(dialog), FALSE, TRUE, FALSE); + gtk_widget_set_size_request(dialog, 540 * gtkut_get_dpi_multiplier(), -1); + gtk_window_set_position(GTK_WINDOW(dialog), + GTK_WIN_POS_CENTER_ON_PARENT); + //gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); + manage_window_set_transient(GTK_WINDOW(dialog)); + gtk_dialog_set_has_separator(GTK_DIALOG(dialog), TRUE); + gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); + gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), + GTK_RESPONSE_REJECT, FALSE); + MANAGE_WINDOW_SIGNALS_CONNECT(dialog); + gtk_widget_realize(dialog); + + g_signal_connect(dialog, "response", + G_CALLBACK(setup_account_response_cb), NULL); + + hbox = gtk_hbox_new(FALSE, 12); + gtk_container_set_border_width(GTK_CONTAINER(hbox), 12); + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), + hbox, FALSE, FALSE, 0); + + image = stock_pixbuf_widget(dialog, STOCK_PIXMAP_SYLPHEED); + + gtk_misc_set_alignment(GTK_MISC(image), 0.5, 0.0); + gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); + + vbox = gtk_vbox_new(FALSE, 12); + gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); + + label = gtk_label_new(_("New account setup")); + gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); + gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); + + if (!font_desc) { + gint size; + + size = pango_font_description_get_size + (label->style->font_desc); + font_desc = pango_font_description_new(); + pango_font_description_set_weight + (font_desc, PANGO_WEIGHT_BOLD); + pango_font_description_set_size + (font_desc, size * PANGO_SCALE_LARGE); + } + if (font_desc) + gtk_widget_modify_font(label, font_desc); + + label = gtk_label_new(_("This dialog will make initial setup of new mail account.")); + gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); + gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); + gtk_label_set_selectable(GTK_LABEL(label), TRUE); + GTK_WIDGET_UNSET_FLAGS(label, GTK_CAN_FOCUS); + MODIFY_LABEL_STYLE(); + + vbox = gtk_vbox_new(FALSE, 8); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 8); + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), vbox, + TRUE, TRUE, 0); + + setupac.notebook = gtk_notebook_new(); + gtk_notebook_set_show_border(GTK_NOTEBOOK(setupac.notebook), FALSE); + gtk_notebook_set_show_tabs(GTK_NOTEBOOK(setupac.notebook), FALSE); + gtk_box_pack_start(GTK_BOX(vbox), setupac.notebook, TRUE, TRUE, 0); + + /* Page 1 */ + vbox = gtk_vbox_new(FALSE, 12); + gtk_notebook_append_page(GTK_NOTEBOOK(setupac.notebook), vbox, NULL); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 12); + + label = gtk_label_new(_("Select account type:")); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 8); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); + + setupac.pop3_radio = gtk_radio_button_new_with_label(NULL, "POP3"); + gtk_box_pack_start(GTK_BOX(vbox), setupac.pop3_radio, FALSE, FALSE, 0); + setupac.imap_radio = gtk_radio_button_new_with_label_from_widget + (GTK_RADIO_BUTTON(setupac.pop3_radio), "IMAP4"); + gtk_box_pack_start(GTK_BOX(vbox), setupac.imap_radio, FALSE, FALSE, 0); +#if USE_SSL + setupac.pop3g_radio = gtk_radio_button_new_with_label_from_widget + (GTK_RADIO_BUTTON(setupac.pop3_radio), "POP3 (Gmail)"); + gtk_box_pack_start(GTK_BOX(vbox), setupac.pop3g_radio, FALSE, FALSE, 0); + setupac.imapg_radio = gtk_radio_button_new_with_label_from_widget + (GTK_RADIO_BUTTON(setupac.pop3_radio), "IMAP4 (Gmail)"); + gtk_box_pack_start(GTK_BOX(vbox), setupac.imapg_radio, FALSE, FALSE, 0); +#endif + + /* Page 2 */ + vbox = gtk_vbox_new(FALSE, 12); + gtk_notebook_append_page(GTK_NOTEBOOK(setupac.notebook), vbox, NULL); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 12); + + label = gtk_label_new(_("Input your name and mail address:")); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 8); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); + + table = gtk_table_new(4, 2, FALSE); + gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); + gtk_table_set_row_spacings(GTK_TABLE(table), 8); + gtk_table_set_col_spacings(GTK_TABLE(table), 8); + + label = gtk_label_new(_("Display name:")); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, + GTK_FILL, GTK_FILL, 0, 0); + gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); + label = gtk_label_new(_("E-mail address:")); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 3, 4, + GTK_FILL, GTK_FILL, 0, 0); + gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); + + setupac.name_entry = gtk_entry_new(); + gtk_table_attach(GTK_TABLE(table), setupac.name_entry, 1, 2, 0, 1, + GTK_EXPAND|GTK_FILL, GTK_FILL, 0, 0); + g_signal_connect(setupac.name_entry, "changed", + G_CALLBACK(entry_changed), NULL); + setupac.addr_entry = gtk_entry_new(); + gtk_table_attach(GTK_TABLE(table), setupac.addr_entry, 1, 2, 3, 4, + GTK_EXPAND|GTK_FILL, GTK_FILL, 0, 0); + g_signal_connect(setupac.addr_entry, "changed", + G_CALLBACK(entry_changed), NULL); + + label = gtk_label_new(_("This name will be seen at the side of recipients (e.g. John Doe)")); + gtk_table_attach(GTK_TABLE(table), label, 1, 2, 1, 2, + GTK_FILL, GTK_FILL, 0, 0); + gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); + + /* Page 3 */ + vbox = gtk_vbox_new(FALSE, 12); + gtk_notebook_append_page(GTK_NOTEBOOK(setupac.notebook), vbox, NULL); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 12); + gtk_widget_show_all(dialog); + + label = gtk_label_new(_("Input user ID and mail server:")); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 8); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); + + table = gtk_table_new(6, 2, FALSE); + gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); + gtk_table_set_row_spacings(GTK_TABLE(table), 8); + gtk_table_set_col_spacings(GTK_TABLE(table), 8); + + label = gtk_label_new(_("User ID:")); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, + GTK_FILL, GTK_FILL, 0, 0); + gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); + label = gtk_label_new(_("POP3 server:")); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2, + GTK_FILL, GTK_FILL, 0, 0); + gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); + setupac.serv_label_name1 = label; + label = gtk_label_new(_("SMTP server:")); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 4, 5, + GTK_FILL, GTK_FILL, 0, 0); + gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); + + setupac.id_entry = gtk_entry_new(); + gtk_table_attach(GTK_TABLE(table), setupac.id_entry, 1, 2, 0, 1, + GTK_EXPAND|GTK_FILL, GTK_FILL, 0, 0); + g_signal_connect(setupac.id_entry, "changed", + G_CALLBACK(entry_changed), NULL); + setupac.serv_entry = gtk_entry_new(); + gtk_table_attach(GTK_TABLE(table), setupac.serv_entry, 1, 2, 1, 2, + GTK_EXPAND|GTK_FILL, GTK_FILL, 0, 0); + g_signal_connect(setupac.serv_entry, "changed", + G_CALLBACK(entry_changed), NULL); + setupac.smtp_entry = gtk_entry_new(); + gtk_table_attach(GTK_TABLE(table), setupac.smtp_entry, 1, 2, 4, 5, + GTK_EXPAND|GTK_FILL, GTK_FILL, 0, 0); + g_signal_connect(setupac.smtp_entry, "changed", + G_CALLBACK(entry_changed), NULL); + +#if USE_SSL + hbox = gtk_hbox_new(FALSE, 12); + gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 2, 3, + GTK_FILL, GTK_FILL, 0, 0); + chkbtn = gtk_check_button_new_with_mnemonic(_("Use SSL")); + gtk_box_pack_start(GTK_BOX(hbox), chkbtn, FALSE, FALSE, 0); + setupac.servssl_chkbtn = chkbtn; +#endif + + hbox = gtk_hbox_new(FALSE, 12); + gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 5, 6, + GTK_FILL, GTK_FILL, 0, 0); + chkbtn = gtk_check_button_new_with_mnemonic(_("Use SMTP authentication")); + gtk_box_pack_start(GTK_BOX(hbox), chkbtn, FALSE, FALSE, 0); + setupac.smtpauth_chkbtn = chkbtn; +#if USE_SSL + chkbtn = gtk_check_button_new_with_mnemonic(_("Use SSL")); + gtk_box_pack_start(GTK_BOX(hbox), chkbtn, FALSE, FALSE, 0); + setupac.smtpssl_chkbtn = chkbtn; +#endif + + /* Page 4 */ + vbox = gtk_vbox_new(FALSE, 12); + gtk_notebook_append_page(GTK_NOTEBOOK(setupac.notebook), vbox, NULL); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 12); + + vbox2 = gtk_vbox_new(FALSE, 8); + gtk_box_pack_start(GTK_BOX(vbox), vbox2, FALSE, FALSE, 8); + + label = gtk_label_new(_("Your new mail account has been set up with the following settings.")); + gtk_box_pack_start(GTK_BOX(vbox2), label, FALSE, FALSE, 0); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); + label = gtk_label_new(_("If you want to modify the settings, select\n" + "'Configuration - Preferences for current account' or\n" + "'Configuration - Edit accounts' in the main menu.")); + gtk_box_pack_start(GTK_BOX(vbox2), label, FALSE, FALSE, 0); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0); + //gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); + + table = gtk_table_new(5, 2, FALSE); + gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); + gtk_table_set_row_spacings(GTK_TABLE(table), 8); + gtk_table_set_col_spacings(GTK_TABLE(table), 8); + + label = gtk_label_new(_("Display name:")); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, + GTK_FILL, GTK_FILL, 0, 0); + gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); + label = gtk_label_new(_("E-mail address:")); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2, + GTK_FILL, GTK_FILL, 0, 0); + gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); + label = gtk_label_new(_("User ID:")); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 2, 3, + GTK_FILL, GTK_FILL, 0, 0); + gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); + setupac.serv_label_name2 = gtk_label_new(_("POP3 server:")); + gtk_table_attach(GTK_TABLE(table), setupac.serv_label_name2, 0, 1, 3, 4, + GTK_FILL, GTK_FILL, 0, 0); + gtk_misc_set_alignment(GTK_MISC(setupac.serv_label_name2), 1, 0.5); + label = gtk_label_new(_("SMTP server:")); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 4, 5, + GTK_FILL, GTK_FILL, 0, 0); + gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5); + + setupac.name_label = gtk_label_new(""); + gtk_table_attach(GTK_TABLE(table), setupac.name_label, 1, 2, 0, 1, + GTK_FILL, GTK_FILL, 0, 0); + gtk_misc_set_alignment(GTK_MISC(setupac.name_label), 0, 0.5); + setupac.addr_label = gtk_label_new(""); + gtk_table_attach(GTK_TABLE(table), setupac.addr_label, 1, 2, 1, 2, + GTK_FILL, GTK_FILL, 0, 0); + gtk_misc_set_alignment(GTK_MISC(setupac.addr_label), 0, 0.5); + setupac.id_label = gtk_label_new(""); + gtk_table_attach(GTK_TABLE(table), setupac.id_label, 1, 2, 2, 3, + GTK_FILL, GTK_FILL, 0, 0); + gtk_misc_set_alignment(GTK_MISC(setupac.id_label), 0, 0.5); + setupac.serv_label = gtk_label_new(""); + gtk_table_attach(GTK_TABLE(table), setupac.serv_label, 1, 2, 3, 4, + GTK_FILL, GTK_FILL, 0, 0); + gtk_misc_set_alignment(GTK_MISC(setupac.serv_label), 0, 0.5); + setupac.smtp_label = gtk_label_new(""); + gtk_table_attach(GTK_TABLE(table), setupac.smtp_label, 1, 2, 4, 5, + GTK_FILL, GTK_FILL, 0, 0); + gtk_misc_set_alignment(GTK_MISC(setupac.smtp_label), 0, 0.5); + + + gtk_widget_show_all(dialog); + + while (!setupac.finished) + result = gtk_dialog_run(GTK_DIALOG(dialog)); + + gtk_widget_destroy(dialog); + + if (setupac.cancelled) { + memset(&setupac, 0, sizeof(setupac)); + return NULL; + } + + /* Create account */ + ac = prefs_account_new(); + + if (!cur_account) { + account_set_as_default(ac); + cur_account = ac; + } + g_free(ac->account_name); + ac->account_name = g_strdup(setupac.addr); + g_free(ac->name); + ac->name = g_strdup(setupac.name); + g_free(ac->address); + ac->address = g_strdup(setupac.addr); + g_free(ac->recv_server); + ac->recv_server = g_strdup(setupac.serv); + g_free(ac->smtp_server); + ac->smtp_server = g_strdup(setupac.smtpserv); + g_free(ac->userid); + ac->userid = g_strdup(setupac.userid); +#if USE_SSL + if (setupac.smtp_ssl) + ac->ssl_smtp = SSL_TUNNEL; +#endif + ac->smtpport = setupac.smtp_port; + ac->use_smtp_auth = setupac.smtp_auth; + + switch (setupac.type) { + case SETUP_TYPE_POP3: + ac->protocol = A_POP3; +#if USE_SSL + if (setupac.serv_ssl) + ac->ssl_pop = SSL_TUNNEL; +#endif + ac->popport = setupac.serv_port; + break; + case SETUP_TYPE_IMAP: + ac->protocol = A_IMAP4; +#if USE_SSL + if (setupac.serv_ssl) + ac->ssl_imap = SSL_TUNNEL; +#endif + ac->imapport = setupac.serv_port; + break; +#if USE_SSL + case SETUP_TYPE_POP3G: + ac->protocol = A_POP3; + ac->ssl_pop = SSL_TUNNEL; + ac->popport = setupac.serv_port; + break; + case SETUP_TYPE_IMAPG: + ac->protocol = A_IMAP4; + ac->ssl_imap = SSL_TUNNEL; + ac->imapport = setupac.serv_port; + break; +#endif /* USE_SSL */ + } + + g_free(ac->sig_text); + ac->sig_text = g_strdup_printf("%s <%s>\\n", ac->name, ac->address); + + account_update_lock(); + account_append(ac); + account_write_config_all(); + account_update_unlock(); + account_updated(); + + g_free(setupac.name); + g_free(setupac.addr); + g_free(setupac.serv); + g_free(setupac.smtpserv); + g_free(setupac.userid); + memset(&setupac, 0, sizeof(setupac)); + + return ac; +} + +#ifdef G_OS_WIN32 +struct Identity +{ + gchar *name; + gchar *path; +}; + +static GSList *get_dbx_source(void) +{ + HKEY reg_key, hkey, hkey2; + wchar_t name[1024]; + DWORD size, type, i; + LPWSTR username, store, path; + GSList *src_list = NULL; + + if (RegOpenKeyExW(HKEY_CURRENT_USER, L"Identities", 0, KEY_READ, ®_key) != ERROR_SUCCESS) + return NULL; + + for (i = 0; ; i++) { + size = sizeof(name); + if (RegEnumKeyExW(reg_key, i, name, &size, 0, 0, 0, 0) != ERROR_SUCCESS) + break; + if (RegOpenKeyExW(reg_key, name, 0, KEY_READ, &hkey) != ERROR_SUCCESS) + continue; + + do { + if (RegQueryValueExW(hkey, L"UserName", 0, &type, 0, &size) != ERROR_SUCCESS) + break; + if (type != REG_SZ) + break; + ++size; + username = g_malloc(size); + if (RegQueryValueExW(hkey, L"UserName", 0, &type, (LPBYTE)username, &size) != ERROR_SUCCESS) { + g_free(username); + break; + } + + if (RegOpenKeyExW(hkey, L"Software\\Microsoft\\Outlook Express\\5.0", 0, KEY_READ, &hkey2) != ERROR_SUCCESS) { + g_free(username); + break; + } + + do { + if (RegQueryValueExW(hkey2, L"Store Root", 0, &type, 0, &size) != ERROR_SUCCESS) + break; + if (type != REG_SZ && type != REG_EXPAND_SZ) + break; + + ++size; + store = g_malloc(size); + if (RegQueryValueExW(hkey2, L"Store Root", 0, &type, (LPBYTE)store, &size) != ERROR_SUCCESS) { + g_free(store); + break; + } + + if (type == REG_EXPAND_SZ) { + size = MAX_PATH * 2; + path = g_malloc(size); + if (!ExpandEnvironmentStringsW(store, path, size)) { + g_free(path); + path = NULL; + } + } else { + path = store; + store = NULL; + } + + if (path) { + struct Identity *ident; + + ident = g_new(struct Identity, 1); + ident->name = g_utf16_to_utf8(username, -1, NULL, NULL, NULL); + ident->path = g_utf16_to_utf8(path, -1, NULL, NULL, NULL); + src_list = g_slist_append(src_list, ident); + debug_print("get_dbx_source: username = %s , path = %s\n", ident->name, ident->path); + g_free(path); + } + g_free(store); + } while (0); + g_free(username); + RegCloseKey(hkey2); + } while (0); + RegCloseKey(hkey); + } + + RegCloseKey(reg_key); + + return src_list; +} +#endif /* G_OS_WIN32 */ + +gint setup_import_data(void) +{ +#ifdef G_OS_WIN32 + AlertValue val; + GSList *src_list, *cur; + struct Identity *ident; + gchar *src; + Folder *folder; + FolderItem *parent, *dest; + gint ok = 0; + + debug_print("setup_import_data\n"); + + src_list = get_dbx_source(); + if (!src_list) + return 0; + + val = alertpanel(_("Importing mail data"), _("The mail store of Outlook Express was found. Do you want to import the mail data of Outlook Express?\n\n(The folder structure will not be reproduced)"), GTK_STOCK_YES, GTK_STOCK_NO, NULL); + if (val != G_ALERTDEFAULT) { + goto finish; + } + + folder = folder_get_default_folder(); + if (!folder) { + g_warning("Cannot get default folder"); + ok = -1; + goto finish; + } + parent = FOLDER_ITEM(folder->node->data); + if (!parent) { + g_warning("Cannot get root folder"); + ok = -1; + goto finish; + } + dest = folder_find_child_item_by_name(parent, _("Imported")); + if (!dest) { + dest = folder->klass->create_folder(folder, parent, _("Imported")); + } + if (!dest) { + g_warning("Cannot create a folder"); + ok = -1; + goto finish; + } + parent = dest; + folderview_append_item(folderview_get(), NULL, parent, TRUE); + folder_write_list(); + + for (cur = src_list; cur != NULL; cur = cur->next) { + ident = (struct Identity *)cur->data; + dest = folder_find_child_item_by_name(parent, ident->name); + if (!dest) + dest = folder->klass->create_folder(folder, parent, ident->name); + if (!dest) + continue; + folderview_append_item(folderview_get(), NULL, dest, TRUE); + folder_write_list(); + ok = import_dbx_folders(dest, ident->path); + if (ok < 0) + break; + } + +finish: + for (cur = src_list; cur != NULL; cur = cur->next) { + ident = (struct Identity *)cur->data; + g_free(ident->name); + g_free(ident->path); + g_free(ident); + } + g_slist_free(src_list); + + if (ok == -1) + alertpanel_error(_("Failed to import the mail data.")); + + return ok; +#else /* G_OS_WIN32 */ + return 0; +#endif /* G_OS_WIN32 */ +} + +#ifdef G_OS_WIN32 +static gchar *get_wab_file(void) +{ + HKEY reg_key; + DWORD type, nbytes; + wchar_t *tmp; + gchar *result = NULL; + + if (RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\Microsoft\\WAB\\WAB4\\Wab File Name", 0, KEY_QUERY_VALUE, ®_key) != ERROR_SUCCESS) + return NULL; + if (RegQueryValueExW(reg_key, L"", 0, &type, NULL, &nbytes) == ERROR_SUCCESS && type == REG_SZ) { + tmp = g_new(wchar_t, (nbytes + 1) / 2 + 1); + RegQueryValueExW(reg_key, L"", 0, &type, (LPBYTE)tmp, &nbytes); + tmp[nbytes / 2] = '\0'; + result = g_utf16_to_utf8(tmp, -1, NULL, NULL, NULL); + g_free(tmp); + } + RegCloseKey(reg_key); + + return result; +} +#endif /* G_OS_WIN32 */ + +gint setup_import_addressbook(void) +{ +#ifdef G_OS_WIN32 + AlertValue val; + gchar *appdata; + gchar *wabfile, *ldiffile; + gchar cmdline[MAX_PATH + 1]; + gchar *cpcmdline; + gint ret = 0; + + debug_print("setup_import_addressbook\n"); + + wabfile = get_wab_file(); + if (!wabfile || !is_file_exist(wabfile)) { + g_free(wabfile); + return 0; + } + + val = alertpanel(_("Importing address book"), _("The Windows address book was found. Do you want to import the address book?"), GTK_STOCK_YES, GTK_STOCK_NO, NULL); + if (val != G_ALERTDEFAULT) { + g_free(wabfile); + return 0; + } + + ldiffile = g_strconcat(get_tmp_dir(), G_DIR_SEPARATOR_S, "impwab.ldif", + NULL); + g_snprintf(cmdline, sizeof(cmdline), "wabread \"%s\" > \"%s\"", + wabfile, ldiffile); + debug_print("setup_import_addressbook: cmdline: %s\n", cmdline); + cpcmdline = g_win32_locale_filename_from_utf8(cmdline); + if (!cpcmdline) { + g_warning("g_win32_locale_filename_from_utf8() failed"); + g_free(ldiffile); + g_free(wabfile); + return -1; + } + ret = system(cpcmdline); + g_free(cpcmdline); + g_free(wabfile); + if (ret != 0 || !is_file_exist(ldiffile)) { + g_warning("system() failed"); + ret = -1; + goto finish; + } + + if (!addressbook_import_ldif_file(ldiffile, _("Imported"))) { + g_warning("setup_import_addressbook: import failed"); + ret = -1; + goto finish; + } + +finish: + g_unlink(ldiffile); + g_free(ldiffile); + if (ret < 0) + alertpanel_error(_("Failed to import the address book.")); + + return ret; +#else /* G_OS_WIN32 */ + return 0; +#endif /* G_OS_WIN32 */ +} -- cgit v1.3