X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmodest-mail-operation.c;h=3a1384f071597bea63d02e365dd586684a177324;hb=960da3f965a39552b47357edba59a3a9d748fba6;hp=08469674cb1a27d745391d51c22f49738818b555;hpb=3285f757a2d0b68fde83bef43422f217cc5b3216;p=modest diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index 0846967..3a1384f 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -850,77 +850,126 @@ typedef struct TnyMsg *draft_msg; SaveToDraftstCallback callback; gpointer user_data; -} SaveToDraftsInfo; + TnyFolder *drafts; + TnyMsg *msg; + ModestMailOperation *mailop; +} SaveToDraftsAddMsgInfo; static void -modest_mail_operation_save_to_drafts_cb (ModestMailOperation *self, - TnyMsg *msg, - gpointer userdata) +modest_mail_operation_save_to_drafts_add_msg_cb(TnyFolder *self, + gboolean canceled, + GError *err, + gpointer userdata) { - TnyFolder *src_folder = NULL; - TnyFolder *drafts = NULL; - TnyHeader *header = NULL; ModestMailOperationPrivate *priv = NULL; - SaveToDraftsInfo *info = (SaveToDraftsInfo *) userdata; - - priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self); + SaveToDraftsAddMsgInfo *info = (SaveToDraftsAddMsgInfo *) userdata; - if (!msg) { - priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; - g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR, - MODEST_MAIL_OPERATION_ERROR_INSTANCE_CREATION_FAILED, - "modest: failed to create a new msg\n"); - goto end; - } + priv = MODEST_MAIL_OPERATION_GET_PRIVATE(info->mailop); - drafts = modest_tny_account_get_special_folder (TNY_ACCOUNT (info->transport_account), - TNY_FOLDER_TYPE_DRAFTS); - if (!drafts) { - priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; - g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR, - MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND, - "modest: failed to create a new msg\n"); - goto end; + if (priv->error) { + g_warning ("%s: priv->error != NULL", __FUNCTION__); + g_error_free(priv->error); } - if (!priv->error) - tny_folder_add_msg (drafts, msg, &(priv->error)); + priv->error = (err == NULL) ? NULL : g_error_copy(err); if ((!priv->error) && (info->draft_msg != NULL)) { - header = tny_msg_get_header (info->draft_msg); - src_folder = tny_header_get_folder (header); + 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 (drafts, TRUE, NULL, NULL, NULL); + tny_folder_sync_async (info->drafts, TRUE, NULL, NULL, NULL); tny_folder_sync_async (src_folder, TRUE, NULL, NULL, NULL); - g_object_unref (header); + 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; -end: /* Call the user callback */ if (info->callback) - info->callback (self, msg, info->user_data); + 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; +} SaveToDraftsInfo; + +static void +modest_mail_operation_save_to_drafts_cb (ModestMailOperation *self, + TnyMsg *msg, + gpointer userdata) +{ + TnyFolder *drafts = NULL; + ModestMailOperationPrivate *priv = NULL; + SaveToDraftsInfo *info = (SaveToDraftsInfo *) userdata; + + priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self); + + if (!msg) { + g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR, + MODEST_MAIL_OPERATION_ERROR_INSTANCE_CREATION_FAILED, + "modest: failed to create a new msg\n"); + } else { + drafts = modest_tny_account_get_special_folder (TNY_ACCOUNT (info->transport_account), + TNY_FOLDER_TYPE_DRAFTS); + if (!drafts) { + g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR, + MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND, + "modest: failed to create a new msg\n"); + } + } + + if (!priv->error) { + SaveToDraftsAddMsgInfo *cb_info = g_slice_new(SaveToDraftsAddMsgInfo); + cb_info->transport_account = g_object_ref(info->transport_account); + cb_info->draft_msg = g_object_ref(info->draft_msg); + cb_info->callback = info->callback; + cb_info->user_data = info->user_data; + cb_info->drafts = g_object_ref(drafts); + cb_info->msg = g_object_ref(msg); + cb_info->mailop = g_object_ref(self); + tny_folder_add_msg_async(drafts, msg, modest_mail_operation_save_to_drafts_add_msg_cb, + NULL, cb_info); + } else { + /* Call the user callback */ + priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; + if (info->callback) + info->callback (self, msg, info->user_data); + modest_mail_operation_notify_end (self); + } if (drafts) g_object_unref (G_OBJECT(drafts)); - if (src_folder) - g_object_unref (G_OBJECT(src_folder)); if (info->draft_msg) g_object_unref (G_OBJECT (info->draft_msg)); if (info->transport_account) g_object_unref (G_OBJECT(info->transport_account)); g_slice_free (SaveToDraftsInfo, info); - - modest_mail_operation_notify_end (self); } void @@ -1151,8 +1200,9 @@ idle_notify_queue (gpointer data) { ModestMailOperation *mail_op = MODEST_MAIL_OPERATION (data); - /* Do not need to block, the notify end will do it for us */ + gdk_threads_enter (); modest_mail_operation_notify_end (mail_op); + gdk_threads_leave (); g_object_unref (mail_op); return FALSE; @@ -1606,7 +1656,7 @@ modest_mail_operation_create_folder (ModestMailOperation *self, modest_tny_folder_get_account (TNY_FOLDER (parent)); /* Check for already existing folder */ - if (modest_tny_folder_has_subfolder_with_name (parent, name)) { + if (modest_tny_folder_has_subfolder_with_name (parent, name, TRUE)) { priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR, MODEST_MAIL_OPERATION_ERROR_FOLDER_EXISTS, @@ -1893,7 +1943,7 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self, /* Do not move a parent into a child */ goto error; } else if (TNY_IS_FOLDER_STORE (parent) && - modest_tny_folder_has_subfolder_with_name (parent, folder_name)) { + modest_tny_folder_has_subfolder_with_name (parent, folder_name, TRUE)) { /* Check that the new folder name is not used by any parent subfolder */ goto error; @@ -2791,7 +2841,7 @@ on_refresh_folder (TnyFolder *folder, } /* Free */ - g_slice_free (RefreshAsyncHelper, helper); + g_slice_free (RefreshAsyncHelper, helper); /* Notify about operation end */ modest_mail_operation_notify_end (self);