1 /*
2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2014 Hiroyuki Yamamoto
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 */
19
20 /*
21 * DBX file conversion engine is based on OutlookExpress-To by Tietew.
22 * OutlookExpress-To - OE5/6 Multi Converter
23 * Copyright (C) 2002 by Tietew
24 * http://www.tietew.net/
25 */
26
27 #ifdef HAVE_CONFIG_H
28 # include "config.h"
29 #endif
30
31 #include "defs.h"
32
33 #include <glib.h>
34 #include <glib/gi18n.h>
35 #include <gdk/gdkkeysyms.h>
36 #include <gtk/gtkmain.h>
37 #include <gtk/gtkwidget.h>
38 #include <gtk/gtkwindow.h>
39 #include <gtk/gtkvbox.h>
40 #include <gtk/gtktable.h>
41 #include <gtk/gtkmenuitem.h>
42 #include <gtk/gtkoptionmenu.h>
43 #include <gtk/gtklabel.h>
44 #include <gtk/gtkentry.h>
45 #include <gtk/gtkhbbox.h>
46 #include <gtk/gtkbutton.h>
47 #include <gtk/gtkstock.h>
48 #include <gtk/gtkprogressbar.h>
49 #include <gtk/gtkmenu.h>
50
51 #include <stdio.h>
52
53 #include "main.h"
54 #include "inc.h"
55 #include "mbox.h"
56 #include "folderview.h"
57 #include "menu.h"
58 #include "filesel.h"
59 #include "foldersel.h"
60 #include "gtkutils.h"
61 #include "manage_window.h"
62 #include "folder.h"
63 #include "procmsg.h"
64 #include "procheader.h"
65 #include "progressdialog.h"
66 #include "alertpanel.h"
67
68 enum
69 {
70 IMPORT_MBOX,
71 IMPORT_EML_FOLDER,
72 IMPORT_DBX
73 };
74
75 static GtkWidget *window;
76 static GtkWidget *format_optmenu;
77 static GtkWidget *desc_label;
78 static GtkWidget *file_label;
79 static GtkWidget *file_entry;
80 static GtkWidget *dest_entry;
81 static GtkWidget *file_button;
82 static GtkWidget *dest_button;
83 static GtkWidget *ok_button;
84 static GtkWidget *cancel_button;
85 static gboolean import_finished;
86 static gboolean import_ack;
87 static ProgressDialog *progress;
88 static gboolean import_progress_cancelled;
89
90 static void import_create (void);
91 static gint import_do (void);
92 static gint import_eml_folder (FolderItem *dest,
93 const gchar *path);
94 static gint import_dbx (FolderItem *dest,
95 const gchar *file);
96
97 static void import_format_menu_cb (GtkWidget *widget,
98 gpointer data);
99
100 static void import_ok_cb (GtkWidget *widget,
101 gpointer data);
102 static void import_cancel_cb (GtkWidget *widget,
103 gpointer data);
104 static void import_filesel_cb (GtkWidget *widget,
105 gpointer data);
106 static void import_destsel_cb (GtkWidget *widget,
107 gpointer data);
108 static gint delete_event (GtkWidget *widget,
109 GdkEventAny *event,
110 gpointer data);
111 static gboolean key_pressed (GtkWidget *widget,
112 GdkEventKey *event,
113 gpointer data);
114
115 static void import_progress_cancel_cb (GtkWidget *widget,
116 gpointer data);
117 static gint import_progress_delete_event(GtkWidget *widget,
118 GdkEventAny *event,
119 gpointer data);
120
121
import_mbox_func(Folder * folder,FolderItem * item,guint count,guint total,gpointer data)122 static gboolean import_mbox_func(Folder *folder, FolderItem *item, guint count, guint total, gpointer data)
123 {
124 gchar str[64];
125 static GTimeVal tv_prev = {0, 0};
126 GTimeVal tv_cur;
127
128 g_get_current_time(&tv_cur);
129 g_snprintf(str, sizeof(str), "%u", count);
130 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress->progressbar), str);
131
132 if (tv_prev.tv_sec == 0 ||
133 (tv_cur.tv_sec - tv_prev.tv_sec) * G_USEC_PER_SEC +
134 tv_cur.tv_usec - tv_prev.tv_usec > 100 * 1000) {
135 gtk_progress_bar_pulse(GTK_PROGRESS_BAR(progress->progressbar));
136 ui_update();
137 tv_prev = tv_cur;
138 }
139
140 if (import_progress_cancelled)
141 return FALSE;
142 else
143 return TRUE;
144 }
145
import_mail(FolderItem * default_dest)146 gint import_mail(FolderItem *default_dest)
147 {
148 gint ok = 0;
149 gchar *dest_id = NULL;
150
151 import_create();
152
153 if (default_dest && default_dest->path)
154 dest_id = folder_item_get_identifier(default_dest);
155
156 if (dest_id) {
157 gtk_entry_set_text(GTK_ENTRY(dest_entry), dest_id);
158 g_free(dest_id);
159 }
160 gtk_widget_grab_focus(file_entry);
161
162 manage_window_set_transient(GTK_WINDOW(window));
163
164 import_finished = FALSE;
165 import_ack = FALSE;
166 import_progress_cancelled = FALSE;
167
168 inc_lock();
169
170 while (!import_finished)
171 gtk_main_iteration();
172
173 if (import_ack)
174 ok = import_do();
175
176 gtk_widget_destroy(window);
177 window = NULL;
178 format_optmenu = NULL;
179 desc_label = file_label = NULL;
180 file_entry = dest_entry = NULL;
181 file_button = dest_button = ok_button = cancel_button = NULL;
182
183 inc_unlock();
184
185 return ok;
186 }
187
import_do(void)188 static gint import_do(void)
189 {
190 gint ok = 0;
191 const gchar *utf8filename, *destdir;
192 FolderItem *dest;
193 gchar *filename;
194 gchar *msg;
195 gint type;
196
197 type = menu_get_option_menu_active_index
198 (GTK_OPTION_MENU(format_optmenu));
199
200 utf8filename = gtk_entry_get_text(GTK_ENTRY(file_entry));
201 destdir = gtk_entry_get_text(GTK_ENTRY(dest_entry));
202 if (!utf8filename || !*utf8filename)
203 return -1;
204
205 filename = g_filename_from_utf8(utf8filename, -1, NULL, NULL, NULL);
206 if (!filename) {
207 g_warning("failed to convert character set.");
208 filename = g_strdup(utf8filename);
209 }
210 if (!g_file_test(filename, G_FILE_TEST_EXISTS)) {
211 alertpanel_error(_("The source file does not exist."));
212 g_free(filename);
213 return -1;
214 }
215
216 if (!destdir || !*destdir) {
217 dest = folder_find_item_from_path(INBOX_DIR);
218 } else
219 dest = folder_find_item_from_identifier(destdir);
220
221 if (!dest) {
222 alertpanel_error(_("Can't find the destination folder."));
223 g_free(filename);
224 return -1;
225 }
226
227 msg = g_strdup_printf(_("Importing %s ..."), g_basename(utf8filename));
228 progress = progress_dialog_simple_create();
229 gtk_window_set_title(GTK_WINDOW(progress->window), _("Importing"));
230 progress_dialog_set_label(progress, msg);
231 g_free(msg);
232 gtk_window_set_modal(GTK_WINDOW(progress->window), TRUE);
233 manage_window_set_transient(GTK_WINDOW(progress->window));
234 g_signal_connect(G_OBJECT(progress->cancel_btn), "clicked",
235 G_CALLBACK(import_progress_cancel_cb), NULL);
236 g_signal_connect(G_OBJECT(progress->window), "delete_event",
237 G_CALLBACK(import_progress_delete_event), NULL);
238 gtk_widget_show(progress->window);
239 ui_update();
240
241 if (type == IMPORT_MBOX) {
242 folder_set_ui_func2(dest->folder, import_mbox_func, NULL);
243 ok = proc_mbox(dest, filename, NULL);
244 folder_set_ui_func2(dest->folder, NULL, NULL);
245 } else if (type == IMPORT_EML_FOLDER) {
246 ok = import_eml_folder(dest, filename);
247 } else if (type == IMPORT_DBX) {
248 ok = import_dbx(dest, filename);
249 }
250
251 progress_dialog_set_label(progress, _("Scanning folder..."));
252 ui_update();
253 folder_item_scan(dest);
254 folderview_update_item(dest, TRUE);
255
256 progress_dialog_destroy(progress);
257 progress = NULL;
258
259 g_free(filename);
260
261 if (ok == -1)
262 alertpanel_error(_("Error occurred on import."));
263
264 return ok;
265 }
266
import_eml_folder(FolderItem * dest,const gchar * path)267 static gint import_eml_folder(FolderItem *dest, const gchar *path)
268 {
269 GDir *dir;
270 const gchar *dir_name, *p;
271 gchar *file;
272 MsgInfo *msginfo;
273 MsgFlags flags = {MSG_NEW|MSG_UNREAD, MSG_RECEIVED};
274 gint count = 0;
275 gint ok = 0;
276
277 g_return_val_if_fail(dest != NULL, -1);
278 g_return_val_if_fail(path != NULL, -1);
279
280 if ((dir = g_dir_open(path, 0, NULL)) == NULL) {
281 g_warning("failed to open directory: %s", path);
282 return -1;
283 }
284
285 while ((dir_name = g_dir_read_name(dir)) != NULL) {
286 if (((p = strrchr(dir_name, '.')) &&
287 !g_ascii_strcasecmp(p + 1, "eml")) ||
288 to_number(dir_name) > 0) {
289 file = g_strconcat(path, G_DIR_SEPARATOR_S, dir_name,
290 NULL);
291 if (!g_file_test(file, G_FILE_TEST_IS_REGULAR)) {
292 g_free(file);
293 continue;
294 }
295
296 msginfo = procheader_parse_file(file, flags, FALSE);
297 if (!msginfo) {
298 g_warning("import_eml_folder(): procheader_parse_file() failed.");
299 g_free(file);
300 continue;
301 }
302 msginfo->file_path = file;
303 file = NULL;
304 count++;
305 if (import_mbox_func(dest->folder, dest, count, 0, NULL) == FALSE) {
306 ok = -2;
307 break;
308 }
309 ok = folder_item_add_msg_msginfo(dest, msginfo, FALSE);
310 procmsg_msginfo_free(msginfo);
311 if (ok < 0) {
312 g_warning("import_eml_folder(): folder_item_add_msg_msginfo() failed.");
313 break;
314 }
315 }
316 }
317
318 g_dir_close(dir);
319
320 return ok;
321 }
322
read_dword(FILE * fp,off_t offset)323 static gint32 read_dword(FILE *fp, off_t offset)
324 {
325 gint32 dw;
326
327 if (fseek(fp, offset, SEEK_SET) < 0) {
328 perror("read_dword: fseek");
329 return 0;
330 }
331
332 if (fread(&dw, sizeof(dw), 1, fp) != 1)
333 return 0;
334
335 dw = GINT32_FROM_LE(dw);
336
337 return dw;
338 }
339
get_dbx_index(FILE * fp,gint32 table_pos,GArray * array)340 static void get_dbx_index(FILE *fp, gint32 table_pos, GArray *array)
341 {
342 gint32 another_pos, data_pos;
343 gint32 num_index, num_elems;
344 gint i;
345
346 debug_print("get_dbx_index(%08x)\n", table_pos);
347
348 another_pos = read_dword(fp, table_pos + 0x08);
349 num_elems = read_dword(fp, table_pos + 0x11) & 0x00ffffff;
350 num_index = read_dword(fp, table_pos + 0x14);
351 debug_print("table_pos: %08x another_pos: %08x num_elems: %08x num_index: %08x\n", table_pos, another_pos, num_elems, num_index);
352 if (another_pos > 0 && num_index > 0)
353 get_dbx_index(fp, another_pos, array);
354
355 table_pos += 0x18;
356 for (i = 0; i < num_elems; i++) {
357 data_pos = read_dword(fp, table_pos);
358 if (data_pos == 0) {
359 g_warning("get_dbx_index: null data_pos at %08x",
360 table_pos);
361 break;
362 }
363 g_array_append_val(array, data_pos);
364 another_pos = read_dword(fp, table_pos + 0x04);
365 num_index = read_dword(fp, table_pos + 0x08);
366 debug_print("data_pos: %08x another_pos: %08x num_index: %08x\n", data_pos, another_pos, num_index);
367 table_pos += 0x0c;
368 if (another_pos > 0 && num_index > 0)
369 get_dbx_index(fp, another_pos, array);
370 }
371
372 debug_print("get_dbx_index end\n");
373 }
374
get_dbx_data(FILE * fp,gint32 data_pos,FolderItem * dest)375 static gint get_dbx_data(FILE *fp, gint32 data_pos, FolderItem *dest)
376 {
377 gchar *tmp;
378 FILE *outfp;
379 gint32 mail_flag, news_flag;
380 gint32 data_ptr, data_len, next_ptr;
381 MsgFlags flags = {MSG_NEW|MSG_UNREAD, MSG_RECEIVED};
382 gint ok = 0;
383
384 debug_print("get_dbx_data(%08x)\n", data_pos);
385
386 mail_flag = read_dword(fp, data_pos + 0x18);
387 news_flag = read_dword(fp, data_pos + 0x1c);
388 if ((news_flag & 0x0f) == 4)
389 data_ptr = news_flag;
390 else if ((mail_flag & 0x0f) == 4)
391 data_ptr = mail_flag;
392 else
393 return 0;
394
395 if ((data_ptr & 0xff) >= 0x80)
396 data_ptr >>= 8;
397 else {
398 guchar b1 = (guchar)(data_ptr >>= 8);
399 guchar b2 = (guchar)read_dword(fp, data_pos + 0x0a);
400 data_ptr = read_dword(fp, data_pos + 0x0c + b2 * 4 + b1);
401 }
402 if (data_ptr == 0) {
403 g_warning("get_dbx_data(%08x): could not get data_ptr.", data_pos);
404 return 0;
405 }
406
407 tmp = get_tmp_file();
408 if ((outfp = g_fopen(tmp, "wb")) == NULL) {
409 FILE_OP_ERROR(tmp, "fopen");
410 ok = -1;
411 goto finish;
412 }
413
414 while (data_ptr) {
415 data_len = read_dword(fp, data_ptr + 0x08);
416 next_ptr = read_dword(fp, data_ptr + 0x0c);
417 if (append_file_part(fp, data_ptr + 0x10, data_len, outfp) < 0) {
418 fclose(outfp);
419 g_unlink(tmp);
420 ok = -1;
421 goto finish;
422 }
423 data_ptr = next_ptr;
424 }
425
426 if (fclose(outfp) == EOF) {
427 FILE_OP_ERROR(tmp, "fclose");
428 g_unlink(tmp);
429 ok = -1;
430 goto finish;
431 }
432
433 if (folder_item_add_msg(dest, tmp, &flags, TRUE) < 0) {
434 g_warning("get_dbx_data: folder_item_add_msg() failed.");
435 g_unlink(tmp);
436 ok = -1;
437 }
438
439 finish:
440 g_free(tmp);
441 return ok;
442 }
443
import_dbx(FolderItem * dest,const gchar * file)444 static gint import_dbx(FolderItem *dest, const gchar *file)
445 {
446 FILE *fp;
447 gint32 dw;
448 gint32 table_pos;
449 guint count = 0;
450 GArray *array;
451 gint i;
452
453 g_return_val_if_fail(dest != NULL, -1);
454 g_return_val_if_fail(file != NULL, -1);
455
456 if ((fp = g_fopen(file, "rb")) == NULL) {
457 FILE_OP_ERROR(file, "fopen");
458 return -1;
459 }
460
461 if ((dw = read_dword(fp, 0xc4)) == 0) {
462 fclose(fp);
463 return -1;
464 }
465
466 array = g_array_sized_new(FALSE, FALSE, sizeof(gint32), 1024);
467
468 table_pos = read_dword(fp, 0xe4);
469 if (table_pos > 0)
470 get_dbx_index(fp, table_pos, array);
471
472 for (i = 0; i < array->len; i++) {
473 if (import_mbox_func(dest->folder, dest, count + 1, 0, NULL) == FALSE)
474 break;
475 if (get_dbx_data(fp, g_array_index(array, gint32, i), dest) < 0)
476 break;
477 count++;
478 }
479
480 debug_print("import_dbx: %u imported\n", count);
481
482 g_array_free(array, TRUE);
483 fclose(fp);
484
485 return 0;
486 }
487
import_dbx_folders(FolderItem * dest,const gchar * path)488 gint import_dbx_folders(FolderItem *dest, const gchar *path)
489 {
490 GDir *dir;
491 const gchar *dir_name, *p;
492 gchar *orig_name, *folder_name, *file;
493 gchar *msg;
494 FolderItem *sub_folder;
495 gint count;
496 gint ok = 0;
497
498 g_return_val_if_fail(dest != NULL, -1);
499 g_return_val_if_fail(dest->folder != NULL, -1);
500 g_return_val_if_fail(path != NULL, -1);
501
502 if ((dir = g_dir_open(path, 0, NULL)) == NULL) {
503 g_warning("failed to open directory: %s", path);
504 return -1;
505 }
506
507 import_progress_cancelled = FALSE;
508
509 progress = progress_dialog_simple_create();
510 gtk_window_set_title(GTK_WINDOW(progress->window), _("Importing"));
511 progress_dialog_set_label(progress, _("Importing Outlook Express folders"));
512 gtk_window_set_modal(GTK_WINDOW(progress->window), TRUE);
513 manage_window_set_transient(GTK_WINDOW(progress->window));
514 g_signal_connect(G_OBJECT(progress->cancel_btn), "clicked",
515 G_CALLBACK(import_progress_cancel_cb), NULL);
516 g_signal_connect(G_OBJECT(progress->window), "delete_event",
517 G_CALLBACK(import_progress_delete_event), NULL);
518 gtk_widget_show(progress->window);
519 ui_update();
520
521 while ((dir_name = g_dir_read_name(dir)) != NULL) {
522 if ((p = strrchr(dir_name, '.')) &&
523 !g_ascii_strcasecmp(p + 1, "dbx")) {
524 file = g_strconcat(path, G_DIR_SEPARATOR_S, dir_name,
525 NULL);
526 orig_name = g_strndup(dir_name, p - dir_name);
527 if (!g_file_test(file, G_FILE_TEST_IS_REGULAR) ||
528 !g_ascii_strcasecmp(orig_name, "Folders") ||
529 !g_ascii_strcasecmp(orig_name, "Offline") ||
530 !g_ascii_strcasecmp(orig_name, "Pop3uidl")) {
531 g_free(orig_name);
532 g_free(file);
533 continue;
534 }
535
536 folder_name = g_strdup(orig_name);
537 count = 1;
538 while (folder_find_child_item_by_name(dest, folder_name)) {
539 g_free(folder_name);
540 folder_name = g_strdup_printf("%s (%d)", orig_name, count++);
541 }
542 debug_print("orig_name: %s , folder_name: %s\n", orig_name, folder_name);
543
544 sub_folder = dest->folder->klass->create_folder(dest->folder, dest, folder_name);
545 if (!sub_folder) {
546 alertpanel_error(_("Cannot create the folder '%s'."), folder_name);
547 ok = -1;
548 break;
549 }
550 folderview_append_item(folderview_get(), NULL, sub_folder, TRUE);
551 folder_write_list();
552 msg = g_strdup_printf(_("Importing %s ..."), orig_name);
553 progress_dialog_set_label(progress, msg);
554 g_free(msg);
555 import_dbx(sub_folder, file);
556
557 progress_dialog_set_label(progress, _("Scanning folder..."));
558 ui_update();
559 folder_item_scan(sub_folder);
560 folderview_update_item(sub_folder, TRUE);
561
562 g_free(folder_name);
563 g_free(orig_name);
564 g_free(file);
565 if (import_progress_cancelled) {
566 ok = -2;
567 break;
568 }
569 }
570 }
571
572 g_dir_close(dir);
573
574 progress_dialog_destroy(progress);
575 progress = NULL;
576
577 folder_write_list();
578
579 return ok;
580 }
581
import_create(void)582 static void import_create(void)
583 {
584 GtkWidget *vbox;
585 GtkWidget *hbox;
586 GtkWidget *table;
587 GtkWidget *menu;
588 GtkWidget *menuitem;
589 GtkWidget *format_label;
590 GtkWidget *dest_label;
591 GtkWidget *confirm_area;
592
593 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
594 gtk_window_set_title(GTK_WINDOW(window), _("Import"));
595 gtk_container_set_border_width(GTK_CONTAINER(window), 5);
596 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
597 gtk_window_set_modal(GTK_WINDOW(window), TRUE);
598 gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, FALSE);
599 g_signal_connect(G_OBJECT(window), "delete_event",
600 G_CALLBACK(delete_event), NULL);
601 g_signal_connect(G_OBJECT(window), "key_press_event",
602 G_CALLBACK(key_pressed), NULL);
603 MANAGE_WINDOW_SIGNALS_CONNECT(window);
604
605 vbox = gtk_vbox_new(FALSE, 4);
606 gtk_container_add(GTK_CONTAINER(window), vbox);
607
608 hbox = gtk_hbox_new(FALSE, 0);
609 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
610 gtk_container_set_border_width(GTK_CONTAINER(hbox), 4);
611
612 desc_label = gtk_label_new
613 (_("Specify source file and destination folder."));
614 gtk_box_pack_start(GTK_BOX(hbox), desc_label, FALSE, FALSE, 0);
615
616 table = gtk_table_new(2, 3, FALSE);
617 gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
618 gtk_container_set_border_width(GTK_CONTAINER(table), 8);
619 gtk_table_set_row_spacings(GTK_TABLE(table), 8);
620 gtk_table_set_col_spacings(GTK_TABLE(table), 8);
621 gtk_widget_set_size_request(table, 420 * gtkut_get_dpi_multiplier(), -1);
622
623 format_label = gtk_label_new(_("File format:"));
624 gtk_table_attach(GTK_TABLE(table), format_label, 0, 1, 0, 1,
625 GTK_FILL, GTK_EXPAND|GTK_FILL, 0, 0);
626 gtk_misc_set_alignment(GTK_MISC(format_label), 1, 0.5);
627
628 file_label = gtk_label_new(_("Source:"));
629 gtk_table_attach(GTK_TABLE(table), file_label, 0, 1, 1, 2,
630 GTK_FILL, GTK_EXPAND|GTK_FILL, 0, 0);
631 gtk_misc_set_alignment(GTK_MISC(file_label), 1, 0.5);
632
633 dest_label = gtk_label_new(_("Destination folder:"));
634 gtk_table_attach(GTK_TABLE(table), dest_label, 0, 1, 2, 3,
635 GTK_FILL, GTK_EXPAND|GTK_FILL, 0, 0);
636 gtk_misc_set_alignment(GTK_MISC(dest_label), 1, 0.5);
637
638 format_optmenu = gtk_option_menu_new();
639 gtk_table_attach(GTK_TABLE(table), format_optmenu, 1, 2, 0, 1,
640 GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
641
642 menu = gtk_menu_new();
643 MENUITEM_ADD(menu, menuitem, _("UNIX mbox"), IMPORT_MBOX);
644 g_signal_connect(G_OBJECT(menuitem), "activate",
645 G_CALLBACK(import_format_menu_cb), NULL);
646 MENUITEM_ADD(menu, menuitem, _("eml (folder)"), IMPORT_EML_FOLDER);
647 g_signal_connect(G_OBJECT(menuitem), "activate",
648 G_CALLBACK(import_format_menu_cb), NULL);
649 MENUITEM_ADD(menu, menuitem, _("Outlook Express (dbx)"), IMPORT_DBX);
650 g_signal_connect(G_OBJECT(menuitem), "activate",
651 G_CALLBACK(import_format_menu_cb), NULL);
652
653 gtk_option_menu_set_menu(GTK_OPTION_MENU(format_optmenu), menu);
654
655 file_entry = gtk_entry_new();
656 gtk_table_attach(GTK_TABLE(table), file_entry, 1, 2, 1, 2,
657 GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
658
659 dest_entry = gtk_entry_new();
660 gtk_table_attach(GTK_TABLE(table), dest_entry, 1, 2, 2, 3,
661 GTK_EXPAND|GTK_SHRINK|GTK_FILL, 0, 0, 0);
662
663 file_button = gtk_button_new_with_label(_(" Select... "));
664 gtk_table_attach(GTK_TABLE(table), file_button, 2, 3, 1, 2,
665 0, 0, 0, 0);
666 g_signal_connect(G_OBJECT(file_button), "clicked",
667 G_CALLBACK(import_filesel_cb), NULL);
668
669 dest_button = gtk_button_new_with_label(_(" Select... "));
670 gtk_table_attach(GTK_TABLE(table), dest_button, 2, 3, 2, 3,
671 0, 0, 0, 0);
672 g_signal_connect(G_OBJECT(dest_button), "clicked",
673 G_CALLBACK(import_destsel_cb), NULL);
674
675 gtkut_stock_button_set_create(&confirm_area,
676 &ok_button, GTK_STOCK_OK,
677 &cancel_button, GTK_STOCK_CANCEL,
678 NULL, NULL);
679 gtk_box_pack_end(GTK_BOX(vbox), confirm_area, FALSE, FALSE, 0);
680 gtk_widget_grab_default(ok_button);
681
682 g_signal_connect(G_OBJECT(ok_button), "clicked",
683 G_CALLBACK(import_ok_cb), NULL);
684 g_signal_connect(G_OBJECT(cancel_button), "clicked",
685 G_CALLBACK(import_cancel_cb), NULL);
686
687 gtk_widget_show_all(window);
688 }
689
import_format_menu_cb(GtkWidget * widget,gpointer data)690 static void import_format_menu_cb(GtkWidget *widget, gpointer data)
691 {
692 gint type;
693
694 type = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget),
695 MENU_VAL_ID));
696 if (type == IMPORT_EML_FOLDER) {
697 gtk_label_set_text(GTK_LABEL(desc_label),
698 _("Specify source folder including eml files and destination folder."));
699 } else {
700 gtk_label_set_text(GTK_LABEL(desc_label),
701 _("Specify source file and destination folder."));
702 }
703 }
704
import_ok_cb(GtkWidget * widget,gpointer data)705 static void import_ok_cb(GtkWidget *widget, gpointer data)
706 {
707 import_finished = TRUE;
708 import_ack = TRUE;
709 }
710
import_cancel_cb(GtkWidget * widget,gpointer data)711 static void import_cancel_cb(GtkWidget *widget, gpointer data)
712 {
713 import_finished = TRUE;
714 import_ack = FALSE;
715 }
716
import_filesel_cb(GtkWidget * widget,gpointer data)717 static void import_filesel_cb(GtkWidget *widget, gpointer data)
718 {
719 gchar *filename;
720 gchar *utf8_filename;
721 gint type;
722
723 type = menu_get_option_menu_active_index
724 (GTK_OPTION_MENU(format_optmenu));
725
726 if (type == IMPORT_EML_FOLDER)
727 filename = filesel_select_file
728 (_("Select importing folder"), NULL,
729 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
730 else
731 filename = filesel_select_file(_("Select importing file"), NULL,
732 GTK_FILE_CHOOSER_ACTION_OPEN);
733 if (!filename) return;
734
735 utf8_filename = g_filename_to_utf8(filename, -1, NULL, NULL, NULL);
736 if (!utf8_filename) {
737 g_warning("import_filesel_cb(): failed to convert characer set.");
738 utf8_filename = g_strdup(filename);
739 }
740 gtk_entry_set_text(GTK_ENTRY(file_entry), utf8_filename);
741 g_free(utf8_filename);
742
743 g_free(filename);
744 }
745
import_destsel_cb(GtkWidget * widget,gpointer data)746 static void import_destsel_cb(GtkWidget *widget, gpointer data)
747 {
748 FolderItem *dest;
749 gchar *dest_id;
750
751 dest = foldersel_folder_sel(NULL, FOLDER_SEL_COPY, NULL);
752 if (dest && dest->path) {
753 dest_id = folder_item_get_identifier(dest);
754 if (dest_id) {
755 gtk_entry_set_text(GTK_ENTRY(dest_entry), dest_id);
756 g_free(dest_id);
757 }
758 }
759 }
760
delete_event(GtkWidget * widget,GdkEventAny * event,gpointer data)761 static gint delete_event(GtkWidget *widget, GdkEventAny *event, gpointer data)
762 {
763 import_cancel_cb(NULL, NULL);
764 return TRUE;
765 }
766
key_pressed(GtkWidget * widget,GdkEventKey * event,gpointer data)767 static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data)
768 {
769 if (event && event->keyval == GDK_Escape)
770 import_cancel_cb(NULL, NULL);
771 return FALSE;
772 }
773
import_progress_cancel_cb(GtkWidget * widget,gpointer data)774 static void import_progress_cancel_cb(GtkWidget *widget, gpointer data)
775 {
776 debug_print("import cancelled\n");
777 import_progress_cancelled = TRUE;
778 }
779
import_progress_delete_event(GtkWidget * widget,GdkEventAny * event,gpointer data)780 static gint import_progress_delete_event(GtkWidget *widget, GdkEventAny *event,
781 gpointer data)
782 {
783 import_progress_cancel_cb(NULL, NULL);
784 return TRUE;
785 }
786