67 lines
2.2 KiB
Diff
67 lines
2.2 KiB
Diff
diff -up evolution-3.2.3/mail/e-mail-folder-utils.c.save-as-mbox evolution-3.2.3/mail/e-mail-folder-utils.c
|
|
--- evolution-3.2.3/mail/e-mail-folder-utils.c.save-as-mbox 2011-09-28 02:22:16.000000000 +0200
|
|
+++ evolution-3.2.3/mail/e-mail-folder-utils.c 2012-04-23 09:20:46.594366070 +0200
|
|
@@ -1178,8 +1178,8 @@ e_mail_folder_save_messages_sync (CamelF
|
|
GError **error)
|
|
{
|
|
GFileOutputStream *file_output_stream;
|
|
+ CamelStream *base_stream = NULL;
|
|
GByteArray *byte_array;
|
|
- CamelStream *base_stream;
|
|
gboolean success = TRUE;
|
|
guint ii;
|
|
|
|
@@ -1208,9 +1208,7 @@ e_mail_folder_save_messages_sync (CamelF
|
|
return FALSE;
|
|
}
|
|
|
|
- /* CamelStreamMem takes ownership of the GByteArray. */
|
|
byte_array = g_byte_array_new ();
|
|
- base_stream = camel_stream_mem_new_with_byte_array (byte_array);
|
|
|
|
for (ii = 0; ii < message_uids->len; ii++) {
|
|
CamelMimeMessage *message;
|
|
@@ -1221,6 +1219,17 @@ e_mail_folder_save_messages_sync (CamelF
|
|
gint percent;
|
|
gint retval;
|
|
|
|
+ if (base_stream != NULL)
|
|
+ g_object_unref (base_stream);
|
|
+
|
|
+ /* CamelStreamMem does NOT take ownership of the byte
|
|
+ * array when set with camel_stream_mem_set_byte_array().
|
|
+ * This allows us to reuse the same memory slab for each
|
|
+ * message, which is slightly more efficient. */
|
|
+ base_stream = camel_stream_mem_new ();
|
|
+ camel_stream_mem_set_byte_array (
|
|
+ CAMEL_STREAM_MEM (base_stream), byte_array);
|
|
+
|
|
uid = g_ptr_array_index (message_uids, ii);
|
|
|
|
message = camel_folder_get_message_sync (
|
|
@@ -1278,18 +1287,19 @@ e_mail_folder_save_messages_sync (CamelF
|
|
percent = ((ii + 1) * 100) / message_uids->len;
|
|
camel_operation_progress (cancellable, percent);
|
|
|
|
- /* Flush the buffer for the next message.
|
|
- * For memory streams this never fails. */
|
|
- g_seekable_seek (
|
|
- G_SEEKABLE (base_stream),
|
|
- 0, G_SEEK_SET, NULL, NULL);
|
|
+ /* Reset the byte array for the next message. */
|
|
+ g_byte_array_set_size (byte_array, 0);
|
|
|
|
g_object_unref (message);
|
|
}
|
|
|
|
exit:
|
|
+ if (base_stream != NULL)
|
|
+ g_object_unref (base_stream);
|
|
+
|
|
+ g_byte_array_free (byte_array, TRUE);
|
|
+
|
|
g_object_unref (file_output_stream);
|
|
- g_object_unref (base_stream);
|
|
|
|
camel_operation_pop_message (cancellable);
|
|
|