+ SaveToDraftstCallback callback;
+ gpointer user_data;
+ TnyFolder *drafts;
+ TnyMsg *msg;
+ ModestMailOperation *mailop;
+} SaveToDraftsAddMsgInfo;
+
+static void
+modest_mail_operation_save_to_drafts_add_msg_cb(TnyFolder *self,
+ gboolean canceled,
+ GError *err,
+ gpointer userdata)
+{
+ ModestMailOperationPrivate *priv = NULL;
+ SaveToDraftsAddMsgInfo *info = (SaveToDraftsAddMsgInfo *) userdata;
+
+ priv = MODEST_MAIL_OPERATION_GET_PRIVATE(info->mailop);
+
+ if (priv->error) {
+ g_warning ("%s: priv->error != NULL", __FUNCTION__);
+ g_error_free(priv->error);
+ }
+
+ priv->error = g_error_copy(err);
+
+ if ((!priv->error) && (info->draft_msg != NULL)) {
+ TnyHeader *header = tny_msg_get_header (info->draft_msg);
+ TnyFolder *src_folder = tny_header_get_folder (header);
+
+ /* Remove the old draft */
+ tny_folder_remove_msg (src_folder, header, NULL);
+
+ /* Synchronize to expunge and to update the msg counts */
+ tny_folder_sync_async (info->drafts, TRUE, NULL, NULL, NULL);
+ tny_folder_sync_async (src_folder, TRUE, NULL, NULL, NULL);
+
+ g_object_unref (G_OBJECT(header));
+ g_object_unref (G_OBJECT(src_folder));
+ }
+
+ if (!priv->error)
+ priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
+ else
+ priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
+
+ /* Call the user callback */
+ if (info->callback)
+ info->callback (info->mailop, info->msg, info->user_data);
+
+ if (info->transport_account)
+ g_object_unref (G_OBJECT(info->transport_account));
+ if (info->draft_msg)
+ g_object_unref (G_OBJECT (info->draft_msg));
+ if (info->drafts)
+ g_object_unref (G_OBJECT(info->drafts));
+ if (info->msg)
+ g_object_unref (G_OBJECT (info->msg));
+ g_slice_free (SaveToDraftsAddMsgInfo, info);
+
+ modest_mail_operation_notify_end (info->mailop);
+ g_object_unref(info->mailop);
+}
+
+typedef struct
+{
+ TnyTransportAccount *transport_account;
+ TnyMsg *draft_msg;
+ SaveToDraftstCallback callback;
+ gpointer user_data;