119
composer_autosave_finish_cb (EMsgComposer *composer,
120
GAsyncResult *result)
122
GError *error = NULL;
124
e_composer_autosave_snapshot_finish (composer, result, &error);
128
GTK_WINDOW (composer),
129
"mail-composer:no-autosave",
130
"", error->message, NULL);
131
g_error_free (error);
119
136
composer_autosave_foreach (EMsgComposer *composer)
121
138
/* Make sure the composer is still alive. */
122
139
g_return_if_fail (E_IS_MSG_COMPOSER (composer));
124
141
if (e_composer_autosave_get_enabled (composer))
125
e_composer_autosave_snapshot_async (composer, NULL, NULL);
142
e_composer_autosave_snapshot_async (
143
composer, (GAsyncReadyCallback)
144
composer_autosave_finish_cb, NULL);
262
281
autosave_data_free (AutosaveData *data)
264
283
g_object_unref (data->composer);
285
if (data->input_stream != NULL)
286
g_object_unref (data->input_stream);
265
288
g_slice_free (AutosaveData, data);
269
autosave_snapshot_check_for_error (AutosaveData *data, GError *error)
292
autosave_snapshot_check_for_error (AutosaveData *data,
295
GSimpleAsyncResult *simple;
271
297
if (error == NULL)
274
g_simple_async_result_set_from_error (data->result, error);
275
g_simple_async_result_set_op_res_gboolean (data->result, FALSE);
276
g_simple_async_result_complete (data->result);
300
/* Steal the result. */
301
simple = data->simple;
304
g_simple_async_result_set_from_error (simple, error);
305
g_simple_async_result_set_op_res_gboolean (simple, FALSE);
306
g_simple_async_result_complete (simple);
277
307
g_error_free (error);
279
309
autosave_data_free (data);
285
autosave_snapshot_splice_cb (GOutputStream *autosave_stream,
286
GSimpleAsyncResult *result,
315
autosave_snapshot_splice_cb (GOutputStream *output_stream,
316
GAsyncResult *result,
287
317
AutosaveData *data)
319
GSimpleAsyncResult *simple;
290
320
GError *error = NULL;
292
length = g_output_stream_splice_finish (
293
autosave_stream, G_ASYNC_RESULT (result), &error);
294
g_object_unref (data->input_stream);
322
g_output_stream_splice_finish (output_stream, result, &error);
295
324
if (autosave_snapshot_check_for_error (data, error))
300
329
* which doesn't mean it's saved permanently */
301
330
e_composer_autosave_set_saved (data->composer, TRUE);
332
/* Steal the result. */
333
simple = data->simple;
336
g_simple_async_result_set_op_res_gboolean (simple, TRUE);
337
g_simple_async_result_complete (simple);
304
339
autosave_data_free (data);
308
autosave_snapshot_cb (GFile *autosave_file,
309
GSimpleAsyncResult *result,
343
autosave_snapshot_cb (GFile *file,
344
GAsyncResult *result,
310
345
AutosaveData *data)
312
347
CamelMimeMessage *message;
316
351
GByteArray *buffer;
317
352
GError *error = NULL;
319
output_stream = g_file_replace_finish (
320
autosave_file, G_ASYNC_RESULT (result), &error);
354
output_stream = g_file_replace_finish (file, result, &error);
321
356
if (autosave_snapshot_check_for_error (data, error))
324
359
/* Extract a MIME message from the composer. */
325
360
message = e_msg_composer_get_message_draft (data->composer);
326
361
if (message == NULL) {
327
/* If we don't set an error, but return FALSE, the error message
328
* in this odd case (we don't have an error domain or code)
329
* will be set in the _finish() function. */
330
g_simple_async_result_set_op_res_gboolean (result, FALSE);
362
GSimpleAsyncResult *simple;
364
/* Steal the result. */
365
simple = data->simple;
368
/* FIXME Need to set a GError here. */
369
g_simple_async_result_set_op_res_gboolean (simple, FALSE);
370
g_simple_async_result_complete (simple);
331
371
g_object_unref (output_stream);
332
372
autosave_data_free (data);
336
376
/* Decode the MIME part to an in-memory buffer. We have to do
337
377
* this because CamelStream is synchronous-only, and using threads
338
* (as we do with foo()) is dangerous because CamelDataWrapper
339
* is not reentrant. */
378
* is dangerous because CamelDataWrapper is not reentrant. */
340
379
buffer = g_byte_array_new ();
341
380
camel_stream = camel_stream_mem_new ();
342
381
camel_stream_mem_set_byte_array (
364
403
G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET,
365
404
G_PRIORITY_DEFAULT, NULL, (GAsyncReadyCallback)
366
405
autosave_snapshot_splice_cb, data);
367
407
g_object_unref (output_stream);
375
415
AutosaveData *data;
376
416
AutosaveState *state;
377
GSimpleAsyncResult *result;
417
GSimpleAsyncResult *simple;
379
419
g_return_if_fail (E_IS_MSG_COMPOSER (composer));
381
result = g_simple_async_result_new (
421
simple = g_simple_async_result_new (
382
422
G_OBJECT (composer), callback, user_data,
383
423
e_composer_autosave_snapshot_async);
385
425
/* If the contents are unchanged, exit early. */
386
426
if (!gtkhtml_editor_get_changed (GTKHTML_EDITOR (composer))) {
387
g_simple_async_result_set_op_res_gboolean (result, TRUE);
388
g_simple_async_result_complete (result);
427
g_simple_async_result_set_op_res_gboolean (simple, TRUE);
428
g_simple_async_result_complete (simple);
397
437
if (!composer_autosave_state_open (state)) {
398
438
g_simple_async_result_set_error (
399
result, G_FILE_ERROR,
439
simple, G_FILE_ERROR,
400
440
g_file_error_from_errno (errno),
401
441
"%s", g_strerror (errno));
402
g_simple_async_result_set_op_res_gboolean (result, FALSE);
403
g_simple_async_result_complete (result);
442
g_simple_async_result_set_op_res_gboolean (simple, FALSE);
443
g_simple_async_result_complete (simple);
407
447
/* Overwrite the file */
408
448
data = g_slice_new (AutosaveData);
409
data->composer = composer;
410
data->result = result;
449
data->composer = g_object_ref (composer);
450
data->simple = simple;
411
451
data->state = state;
413
453
g_file_replace_async (
420
460
e_composer_autosave_snapshot_finish (EMsgComposer *composer,
421
GAsyncResult *async_result,
461
GAsyncResult *result,
424
GSimpleAsyncResult *result;
464
GSimpleAsyncResult *simple;
426
467
g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
427
g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (async_result), FALSE);
468
g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), FALSE);
428
469
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
430
result = G_SIMPLE_ASYNC_RESULT (async_result);
431
g_warn_if_fail (g_simple_async_result_get_source_tag (result) ==
432
e_composer_autosave_snapshot_async);
434
if (g_simple_async_result_propagate_error (result, error) ||
435
!g_simple_async_result_get_op_res_gboolean (result)) {
439
/* Sort out the error message; use the GError message if
440
* possible. The only case where is isn't is where we couldn't
441
* get the message from the editor. */
443
errmsg = (*error)->message;
445
errmsg = _("Unable to retrieve message from editor");
447
filename = e_composer_autosave_get_filename (composer);
449
GTK_WINDOW (composer), "mail-composer:no-autosave",
450
(filename != NULL) ? filename : "", errmsg, NULL);
471
simple = G_SIMPLE_ASYNC_RESULT (result);
472
success = g_simple_async_result_get_op_res_gboolean (simple);
473
g_simple_async_result_propagate_error (simple, error);
474
g_object_unref (simple);