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