Revision 3142
| libsylph/folder.c (revision 3142) | ||
|---|---|---|
| 1 | 1 |
/* |
| 2 | 2 |
* LibSylph -- E-Mail client library |
| 3 |
* Copyright (C) 1999-2011 Hiroyuki Yamamoto
|
|
| 3 |
* Copyright (C) 1999-2012 Hiroyuki Yamamoto
|
|
| 4 | 4 |
* |
| 5 | 5 |
* This library is free software; you can redistribute it and/or |
| 6 | 6 |
* modify it under the terms of the GNU Lesser General Public |
| ... | ... | |
| 48 | 48 |
struct _FolderPrivData {
|
| 49 | 49 |
Folder *folder; |
| 50 | 50 |
FolderItem *junk; |
| 51 |
|
|
| 52 |
FolderUIFunc2 ui_func2; |
|
| 53 |
gpointer ui_func2_data; |
|
| 54 |
|
|
| 51 | 55 |
gpointer data; |
| 52 | 56 |
}; |
| 53 | 57 |
|
| ... | ... | |
| 442 | 446 |
folder->ui_func_data = data; |
| 443 | 447 |
} |
| 444 | 448 |
|
| 449 |
void folder_set_ui_func2(Folder *folder, FolderUIFunc2 func, gpointer data) |
|
| 450 |
{
|
|
| 451 |
FolderPrivData *priv; |
|
| 452 |
|
|
| 453 |
priv = folder_get_priv(folder); |
|
| 454 |
if (priv) {
|
|
| 455 |
priv->ui_func2 = func; |
|
| 456 |
priv->ui_func2_data = data; |
|
| 457 |
} |
|
| 458 |
} |
|
| 459 |
|
|
| 460 |
FolderUIFunc2 folder_get_ui_func2(Folder *folder) |
|
| 461 |
{
|
|
| 462 |
FolderPrivData *priv; |
|
| 463 |
|
|
| 464 |
priv = folder_get_priv(folder); |
|
| 465 |
if (priv) |
|
| 466 |
return priv->ui_func2; |
|
| 467 |
|
|
| 468 |
return NULL; |
|
| 469 |
} |
|
| 470 |
|
|
| 471 |
gboolean folder_call_ui_func2(Folder *folder, FolderItem *item, guint count, |
|
| 472 |
guint total) |
|
| 473 |
{
|
|
| 474 |
FolderPrivData *priv; |
|
| 475 |
|
|
| 476 |
priv = folder_get_priv(folder); |
|
| 477 |
if (priv && priv->ui_func2) {
|
|
| 478 |
return priv->ui_func2(folder, item, count, total, |
|
| 479 |
priv->ui_func2_data); |
|
| 480 |
} |
|
| 481 |
|
|
| 482 |
return TRUE; |
|
| 483 |
} |
|
| 484 |
|
|
| 445 | 485 |
void folder_set_name(Folder *folder, const gchar *name) |
| 446 | 486 |
{
|
| 447 | 487 |
g_return_if_fail(folder != NULL); |
| libsylph/folder.h (revision 3142) | ||
|---|---|---|
| 1 | 1 |
/* |
| 2 | 2 |
* LibSylph -- E-Mail client library |
| 3 |
* Copyright (C) 1999-2011 Hiroyuki Yamamoto
|
|
| 3 |
* Copyright (C) 1999-2012 Hiroyuki Yamamoto
|
|
| 4 | 4 |
* |
| 5 | 5 |
* This library is free software; you can redistribute it and/or |
| 6 | 6 |
* modify it under the terms of the GNU Lesser General Public |
| ... | ... | |
| 115 | 115 |
typedef void (*FolderUIFunc) (Folder *folder, |
| 116 | 116 |
FolderItem *item, |
| 117 | 117 |
gpointer data); |
| 118 |
typedef gboolean (*FolderUIFunc2) (Folder *folder, |
|
| 119 |
FolderItem *item, |
|
| 120 |
guint count, |
|
| 121 |
guint total, |
|
| 122 |
gpointer data); |
|
| 118 | 123 |
typedef void (*FolderDestroyNotify) (Folder *folder, |
| 119 | 124 |
FolderItem *item, |
| 120 | 125 |
gpointer data); |
| ... | ... | |
| 354 | 359 |
gint folder_item_compare (FolderItem *item_a, |
| 355 | 360 |
FolderItem *item_b); |
| 356 | 361 |
|
| 357 |
void folder_set_ui_func (Folder *folder, |
|
| 358 |
FolderUIFunc func, |
|
| 359 |
gpointer data); |
|
| 362 |
void folder_set_ui_func (Folder *folder, |
|
| 363 |
FolderUIFunc func, |
|
| 364 |
gpointer data); |
|
| 365 |
void folder_set_ui_func2 (Folder *folder, |
|
| 366 |
FolderUIFunc2 func, |
|
| 367 |
gpointer data); |
|
| 368 |
FolderUIFunc2 folder_get_ui_func2 (Folder *folder); |
|
| 369 |
gboolean folder_call_ui_func2 (Folder *folder, |
|
| 370 |
FolderItem *item, |
|
| 371 |
guint count, |
|
| 372 |
guint total); |
|
| 373 |
|
|
| 360 | 374 |
void folder_set_name (Folder *folder, |
| 361 | 375 |
const gchar *name); |
| 362 | 376 |
void folder_tree_destroy (Folder *folder); |
| libsylph/mbox.c (revision 3142) | ||
|---|---|---|
| 1 | 1 |
/* |
| 2 | 2 |
* LibSylph -- E-Mail client library |
| 3 |
* Copyright (C) 1999-2010 Hiroyuki Yamamoto
|
|
| 3 |
* Copyright (C) 1999-2012 Hiroyuki Yamamoto
|
|
| 4 | 4 |
* |
| 5 | 5 |
* This library is free software; you can redistribute it and/or |
| 6 | 6 |
* modify it under the terms of the GNU Lesser General Public |
| ... | ... | |
| 71 | 71 |
gchar buf[BUFFSIZE], from_line[BUFFSIZE]; |
| 72 | 72 |
gchar *tmp_file; |
| 73 | 73 |
gint new_msgs = 0; |
| 74 |
gint count = 0; |
|
| 74 |
guint count = 0;
|
|
| 75 | 75 |
Folder *folder; |
| 76 | 76 |
FilterRule *junk_rule = NULL; |
| 77 | 77 |
GSList junk_fltlist = {NULL, NULL};
|
| ... | ... | |
| 132 | 132 |
|
| 133 | 133 |
count++; |
| 134 | 134 |
if (folder->ui_func) |
| 135 |
folder->ui_func(folder, dest, folder->ui_func_data ? dest->folder->ui_func_data : GINT_TO_POINTER(count)); |
|
| 135 |
folder->ui_func(folder, dest, folder->ui_func_data ? dest->folder->ui_func_data : GUINT_TO_POINTER(count)); |
|
| 136 |
if (folder_call_ui_func2(folder, dest, count, 0) == FALSE) {
|
|
| 137 |
debug_print("Import of mbox cancelled at %u\n", count);
|
|
| 138 |
break; |
|
| 139 |
} |
|
| 136 | 140 |
|
| 137 | 141 |
if ((tmp_fp = g_fopen(tmp_file, "wb")) == NULL) {
|
| 138 | 142 |
FILE_OP_ERROR(tmp_file, "fopen"); |
| ... | ... | |
| 494 | 498 |
FILE *mbox_fp; |
| 495 | 499 |
gchar buf[BUFFSIZE]; |
| 496 | 500 |
PrefsAccount *cur_ac; |
| 497 |
gint count = 0, length; |
|
| 501 |
guint count = 0, length;
|
|
| 498 | 502 |
|
| 499 | 503 |
g_return_val_if_fail(src != NULL, -1); |
| 500 | 504 |
g_return_val_if_fail(src->folder != NULL, -1); |
| ... | ... | |
| 518 | 522 |
|
| 519 | 523 |
count++; |
| 520 | 524 |
if (src->folder->ui_func) |
| 521 |
src->folder->ui_func(src->folder, src, src->folder->ui_func_data ? src->folder->ui_func_data : GINT_TO_POINTER(count)); |
|
| 525 |
src->folder->ui_func(src->folder, src, src->folder->ui_func_data ? src->folder->ui_func_data : GUINT_TO_POINTER(count)); |
|
| 526 |
if (folder_call_ui_func2(src->folder, src, count, length) == FALSE) {
|
|
| 527 |
debug_print("Export to mbox cancelled at %u/%u\n", count, length);
|
|
| 528 |
break; |
|
| 529 |
} |
|
| 522 | 530 |
|
| 523 | 531 |
msg_fp = procmsg_open_message(msginfo); |
| 524 | 532 |
if (!msg_fp) |
| src/export.c (revision 3142) | ||
|---|---|---|
| 81 | 81 |
static gboolean export_ack; |
| 82 | 82 |
static ProgressDialog *progress; |
| 83 | 83 |
|
| 84 |
static gboolean progress_cancel = FALSE; |
|
| 85 |
|
|
| 84 | 86 |
static void export_create (void); |
| 85 | 87 |
static gint export_do (void); |
| 86 | 88 |
static gint export_eml (FolderItem *src, |
| ... | ... | |
| 106 | 108 |
GdkEventKey *event, |
| 107 | 109 |
gpointer data); |
| 108 | 110 |
|
| 111 |
static void export_progress_cancel_cb (GtkWidget *widget, |
|
| 112 |
gpointer data); |
|
| 109 | 113 |
|
| 110 |
static void export_mbox_func(Folder *folder, FolderItem *item, gpointer data) |
|
| 114 |
|
|
| 115 |
static gboolean export_mbox_func(Folder *folder, FolderItem *item, guint count, guint total, gpointer data) |
|
| 111 | 116 |
{
|
| 112 | 117 |
gchar str[64]; |
| 113 |
gint count = GPOINTER_TO_INT(data); |
|
| 114 | 118 |
static GTimeVal tv_prev = {0, 0};
|
| 115 | 119 |
GTimeVal tv_cur; |
| 116 | 120 |
|
| 117 | 121 |
g_get_current_time(&tv_cur); |
| 118 |
if (item->total > 0) |
|
| 119 |
g_snprintf(str, sizeof(str), "%d / %d", count, item->total); |
|
| 120 |
else |
|
| 121 |
g_snprintf(str, sizeof(str), "%d", count); |
|
| 122 |
g_snprintf(str, sizeof(str), "%u / %d", count, total); |
|
| 122 | 123 |
gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress->progressbar), str); |
| 123 | 124 |
|
| 124 | 125 |
if (tv_prev.tv_sec == 0 || |
| ... | ... | |
| 131 | 132 |
ui_update(); |
| 132 | 133 |
tv_prev = tv_cur; |
| 133 | 134 |
} |
| 135 |
|
|
| 136 |
if (progress_cancel) |
|
| 137 |
return FALSE; |
|
| 138 |
else |
|
| 139 |
return TRUE; |
|
| 134 | 140 |
} |
| 135 | 141 |
|
| 136 | 142 |
gint export_mail(FolderItem *default_src) |
| ... | ... | |
| 215 | 221 |
g_free(msg); |
| 216 | 222 |
gtk_window_set_modal(GTK_WINDOW(progress->window), TRUE); |
| 217 | 223 |
manage_window_set_transient(GTK_WINDOW(progress->window)); |
| 218 |
gtk_widget_hide(progress->cancel_btn); |
|
| 224 |
g_signal_connect(G_OBJECT(progress->cancel_btn), "clicked", |
|
| 225 |
G_CALLBACK(export_progress_cancel_cb), NULL); |
|
| 219 | 226 |
g_signal_connect(G_OBJECT(progress->window), "delete_event", |
| 220 | 227 |
G_CALLBACK(gtk_true), NULL); |
| 221 | 228 |
gtk_widget_show(progress->window); |
| ... | ... | |
| 228 | 235 |
mlist = summary_get_selected_msg_list(mainwin->summaryview); |
| 229 | 236 |
} |
| 230 | 237 |
|
| 238 |
progress_cancel = FALSE; |
|
| 239 |
|
|
| 231 | 240 |
if (type == EXPORT_MBOX) {
|
| 232 |
folder_set_ui_func(src->folder, export_mbox_func, NULL); |
|
| 241 |
folder_set_ui_func2(src->folder, export_mbox_func, NULL);
|
|
| 233 | 242 |
if (mlist) |
| 234 | 243 |
ok = export_msgs_to_mbox(src, mlist, mbox); |
| 235 | 244 |
else |
| 236 | 245 |
ok = export_to_mbox(src, mbox); |
| 237 |
folder_set_ui_func(src->folder, NULL, NULL); |
|
| 246 |
folder_set_ui_func2(src->folder, NULL, NULL);
|
|
| 238 | 247 |
} else if (type == EXPORT_EML || type == EXPORT_MH) {
|
| 239 | 248 |
ok = export_eml(src, mlist, mbox, type); |
| 240 | 249 |
} |
| ... | ... | |
| 246 | 255 |
g_slist_free(mlist); |
| 247 | 256 |
g_free(mbox); |
| 248 | 257 |
|
| 249 |
if (ok < 0)
|
|
| 258 |
if (ok == -1)
|
|
| 250 | 259 |
alertpanel_error(_("Error occurred on export."));
|
| 251 | 260 |
|
| 252 | 261 |
return ok; |
| ... | ... | |
| 259 | 268 |
GSList *mlist, *cur; |
| 260 | 269 |
MsgInfo *msginfo; |
| 261 | 270 |
gchar *file, *dest; |
| 262 |
gint count = 0; |
|
| 271 |
guint count = 0; |
|
| 272 |
guint total; |
|
| 263 | 273 |
gint ok = 0; |
| 264 | 274 |
|
| 265 | 275 |
g_return_val_if_fail(src != NULL, -1); |
| ... | ... | |
| 287 | 297 |
if (!mlist) |
| 288 | 298 |
return 0; |
| 289 | 299 |
} |
| 300 |
total = g_slist_length(mlist); |
|
| 290 | 301 |
|
| 291 | 302 |
for (cur = mlist; cur != NULL; cur = cur->next) {
|
| 292 | 303 |
msginfo = (MsgInfo *)cur->data; |
| 293 | 304 |
|
| 294 | 305 |
count++; |
| 295 |
export_mbox_func(src->folder, src, GINT_TO_POINTER(count)); |
|
| 306 |
if (export_mbox_func(src->folder, src, count, total, NULL) == FALSE) {
|
|
| 307 |
ok = -2; |
|
| 308 |
break; |
|
| 309 |
} |
|
| 296 | 310 |
|
| 297 | 311 |
file = folder_item_fetch_msg(src, msginfo->msgnum); |
| 298 | 312 |
if (!file) {
|
| 299 | 313 |
ok = -1; |
| 300 | 314 |
break; |
| 301 | 315 |
} |
| 302 |
dest = g_strdup_printf("%s%c%d%s", path, G_DIR_SEPARATOR,
|
|
| 316 |
dest = g_strdup_printf("%s%c%u%s", path, G_DIR_SEPARATOR,
|
|
| 303 | 317 |
count, ext); |
| 304 | 318 |
if (g_file_test(dest, G_FILE_TEST_EXISTS)) {
|
| 305 | 319 |
g_warning("export_eml(): %s already exists.", dest);
|
| ... | ... | |
| 528 | 542 |
export_cancel_cb(NULL, NULL); |
| 529 | 543 |
return FALSE; |
| 530 | 544 |
} |
| 545 |
|
|
| 546 |
static void export_progress_cancel_cb(GtkWidget *widget, gpointer data) |
|
| 547 |
{
|
|
| 548 |
progress_cancel = TRUE; |
|
| 549 |
} |
|
| src/import.c (revision 3142) | ||
|---|---|---|
| 1 | 1 |
/* |
| 2 | 2 |
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client |
| 3 |
* Copyright (C) 1999-2010 Hiroyuki Yamamoto
|
|
| 3 |
* Copyright (C) 1999-2012 Hiroyuki Yamamoto
|
|
| 4 | 4 |
* |
| 5 | 5 |
* This program is free software; you can redistribute it and/or modify |
| 6 | 6 |
* it under the terms of the GNU General Public License as published by |
| ... | ... | |
| 119 | 119 |
gpointer data); |
| 120 | 120 |
|
| 121 | 121 |
|
| 122 |
static void proc_mbox_func(Folder *folder, FolderItem *item, gpointer data)
|
|
| 122 |
static gboolean import_mbox_func(Folder *folder, FolderItem *item, guint count, guint total, gpointer data)
|
|
| 123 | 123 |
{
|
| 124 | 124 |
gchar str[64]; |
| 125 |
gint count = GPOINTER_TO_INT(data); |
|
| 126 | 125 |
static GTimeVal tv_prev = {0, 0};
|
| 127 | 126 |
GTimeVal tv_cur; |
| 128 | 127 |
|
| 129 | 128 |
g_get_current_time(&tv_cur); |
| 130 |
g_snprintf(str, sizeof(str), "%d", count);
|
|
| 129 |
g_snprintf(str, sizeof(str), "%u", count);
|
|
| 131 | 130 |
gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress->progressbar), str); |
| 132 | 131 |
|
| 133 | 132 |
if (tv_prev.tv_sec == 0 || |
| ... | ... | |
| 137 | 136 |
ui_update(); |
| 138 | 137 |
tv_prev = tv_cur; |
| 139 | 138 |
} |
| 139 |
|
|
| 140 |
if (import_progress_cancelled) |
|
| 141 |
return FALSE; |
|
| 142 |
else |
|
| 143 |
return TRUE; |
|
| 140 | 144 |
} |
| 141 | 145 |
|
| 142 | 146 |
gint import_mail(FolderItem *default_dest) |
| ... | ... | |
| 235 | 239 |
ui_update(); |
| 236 | 240 |
|
| 237 | 241 |
if (type == IMPORT_MBOX) {
|
| 238 |
gtk_widget_set_sensitive(progress->cancel_btn, FALSE); |
|
| 239 |
folder_set_ui_func(dest->folder, proc_mbox_func, NULL); |
|
| 242 |
folder_set_ui_func2(dest->folder, import_mbox_func, NULL); |
|
| 240 | 243 |
ok = proc_mbox(dest, filename, NULL); |
| 241 |
folder_set_ui_func(dest->folder, NULL, NULL); |
|
| 244 |
folder_set_ui_func2(dest->folder, NULL, NULL);
|
|
| 242 | 245 |
} else if (type == IMPORT_EML_FOLDER) {
|
| 243 | 246 |
ok = import_eml_folder(dest, filename); |
| 244 | 247 |
} else if (type == IMPORT_DBX) {
|
| ... | ... | |
| 255 | 258 |
|
| 256 | 259 |
g_free(filename); |
| 257 | 260 |
|
| 258 |
if (ok < 0)
|
|
| 261 |
if (ok == -1)
|
|
| 259 | 262 |
alertpanel_error(_("Error occurred on import."));
|
| 260 | 263 |
|
| 261 | 264 |
return ok; |
| ... | ... | |
| 299 | 302 |
msginfo->file_path = file; |
| 300 | 303 |
file = NULL; |
| 301 | 304 |
count++; |
| 302 |
proc_mbox_func(dest->folder, dest, |
|
| 303 |
GINT_TO_POINTER(count)); |
|
| 305 |
if (import_mbox_func(dest->folder, dest, count, 0, NULL) == FALSE) {
|
|
| 306 |
ok = -2; |
|
| 307 |
break; |
|
| 308 |
} |
|
| 304 | 309 |
ok = folder_item_add_msg_msginfo(dest, msginfo, FALSE); |
| 305 | 310 |
procmsg_msginfo_free(msginfo); |
| 306 | 311 |
if (ok < 0) {
|
| 307 | 312 |
g_warning("import_eml_folder(): folder_item_add_msg_msginfo() failed.");
|
| 308 | 313 |
break; |
| 309 | 314 |
} |
| 310 |
if (import_progress_cancelled) |
|
| 311 |
break; |
|
| 312 | 315 |
} |
| 313 | 316 |
} |
| 314 | 317 |
|
| ... | ... | |
| 443 | 446 |
FILE *fp; |
| 444 | 447 |
gint32 dw; |
| 445 | 448 |
gint32 table_pos; |
| 446 |
gint count = 0; |
|
| 449 |
guint count = 0;
|
|
| 447 | 450 |
GArray *array; |
| 448 | 451 |
gint i; |
| 449 | 452 |
|
| ... | ... | |
| 467 | 470 |
get_dbx_index(fp, table_pos, array); |
| 468 | 471 |
|
| 469 | 472 |
for (i = 0; i < array->len; i++) {
|
| 470 |
proc_mbox_func(dest->folder, dest, GINT_TO_POINTER(count + 1)); |
|
| 473 |
if (import_mbox_func(dest->folder, dest, count + 1, 0, NULL) == FALSE) |
|
| 474 |
break; |
|
| 471 | 475 |
if (get_dbx_data(fp, g_array_index(array, gint32, i), dest) < 0) |
| 472 | 476 |
break; |
| 473 | 477 |
count++; |
| 474 |
if (import_progress_cancelled) |
|
| 475 |
break; |
|
| 476 | 478 |
} |
| 477 | 479 |
|
| 478 |
debug_print("import_dbx: %d imported\n", count);
|
|
| 480 |
debug_print("import_dbx: %u imported\n", count);
|
|
| 479 | 481 |
|
| 480 | 482 |
g_array_free(array, TRUE); |
| 481 | 483 |
fclose(fp); |
| ChangeLog (revision 3142) | ||
|---|---|---|
| 1 | 1 |
2012-07-27 |
| 2 | 2 |
|
| 3 |
* libsylph/folder.[ch] |
|
| 4 |
libsylph/mbox.c: added interface to cancel mbox import/export. |
|
| 5 |
* src/export.c |
|
| 6 |
src/import.c: made export/import progress dialog cancellable. |
|
| 7 |
|
|
| 8 |
2012-07-27 |
|
| 9 |
|
|
| 3 | 10 |
* libsylph/mbox.[ch] |
| 4 | 11 |
src/export.c: added 'Export only selected messages' option to |
| 5 | 12 |
the export dialog. |
Also available in: Unified diff