Modified webpage: now tinymail repository is in gitorious.
[modest] / src / modest-mail-operation.c
index 39b57af..20f58fc 100644 (file)
@@ -246,6 +246,7 @@ static void          modest_mail_operation_create_msg (ModestMailOperation *self
                                                       const GList *images_list,
                                                       TnyHeaderFlags priority_flags,
                                                       const gchar *references, const gchar *in_reply_to,
+                                                      TnyList *header_pairs,
                                                       ModestMailOperationCreateMsgCallback callback,
                                                       gpointer userdata);
 
@@ -265,6 +266,7 @@ typedef struct
        GList *attachments_list;
        GList *images_list;
        TnyHeaderFlags priority_flags;
+       TnyList *header_pairs;
        ModestMailOperationCreateMsgCallback callback;
        gpointer userdata;
 } CreateMsgInfo;
@@ -853,6 +855,7 @@ create_msg_thread (gpointer thread_data)
                                              info->references, info->in_reply_to,
                                              info->plain_body, 
                                              info->attachments_list, &attached,
+                                             info->header_pairs,
                                              &(priv->error));
        } else {
                new_msg = modest_tny_msg_new_html_plain (info->to, info->from, info->cc,
@@ -861,6 +864,7 @@ create_msg_thread (gpointer thread_data)
                                                         info->html_body,
                                                         info->plain_body, info->attachments_list,
                                                         info->images_list, &attached,
+                                                        info->header_pairs,
                                                         &(priv->error));
        }
 
@@ -898,6 +902,7 @@ create_msg_thread (gpointer thread_data)
        g_list_free (info->attachments_list);
        g_list_foreach (info->images_list, (GFunc) g_object_unref, NULL);
        g_list_free (info->images_list);
+       g_object_unref (info->header_pairs);
 
        if (info->callback) {
                CreateMsgIdleInfo *idle_info;
@@ -929,6 +934,7 @@ modest_mail_operation_create_msg (ModestMailOperation *self,
                                  TnyHeaderFlags priority_flags,
                                  const gchar *references,
                                  const gchar *in_reply_to,
+                                 TnyList *header_pairs,
                                  ModestMailOperationCreateMsgCallback callback,
                                  gpointer userdata)
 {
@@ -951,6 +957,7 @@ modest_mail_operation_create_msg (ModestMailOperation *self,
        info->images_list = g_list_copy ((GList *) images_list);
        g_list_foreach (info->images_list, (GFunc) g_object_ref, NULL);
        info->priority_flags = 0 | priority_flags;
+       info->header_pairs = tny_list_copy (header_pairs);
 
        info->callback = callback;
        info->userdata = userdata;
@@ -1096,6 +1103,56 @@ end:
 }
 
 void
+modest_mail_operation_send_mail (ModestMailOperation *self,
+                                TnyTransportAccount *transport_account,
+                                TnyMsg *msg)
+{
+       TnySendQueue *send_queue = NULL;
+       ModestMailOperationPrivate *priv = NULL;
+
+       priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
+
+       if (!msg) {
+               priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
+               modest_mail_operation_notify_end (self);
+               return;
+       }
+
+       if (priv->error && priv->error->code != MODEST_MAIL_OPERATION_ERROR_FILE_IO) {
+               priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
+               modest_mail_operation_notify_end (self);
+               return;
+       }
+
+       /* Add message to send queue */
+       send_queue = TNY_SEND_QUEUE (modest_runtime_get_send_queue (transport_account, TRUE));
+       if (!TNY_IS_SEND_QUEUE(send_queue)) {
+               if (priv->error) {
+                       g_error_free (priv->error);
+                       priv->error = NULL;
+               }
+               g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
+                            MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND,
+                            "modest: could not find send queue for account\n");
+               priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
+               modest_mail_operation_notify_end (self);
+               return;
+       } else {
+               SendNewMailHelper *helper = g_slice_new (SendNewMailHelper);
+               helper->mail_op = g_object_ref (self);
+               helper->notify = TRUE;
+
+               /* Add the msg to the queue. The callback will free
+                  the helper */
+               modest_tny_send_queue_set_requested_send_receive (MODEST_TNY_SEND_QUEUE (send_queue), 
+                                                                 FALSE);
+               tny_send_queue_add_async (send_queue, msg, send_mail_on_added_to_outbox, 
+                                         NULL, helper);
+       }
+
+}
+
+void
 modest_mail_operation_send_new_mail (ModestMailOperation *self,
                                     TnyTransportAccount *transport_account,
                                     TnyMsg *draft_msg,
@@ -1107,7 +1164,8 @@ modest_mail_operation_send_new_mail (ModestMailOperation *self,
                                     const GList *images_list,
                                     const gchar *references,
                                     const gchar *in_reply_to,
-                                    TnyHeaderFlags priority_flags)
+                                    TnyHeaderFlags priority_flags,
+                                    TnyList *header_pairs)
 {
        ModestMailOperationPrivate *priv = NULL;
        SendNewMailInfo *info;
@@ -1144,6 +1202,7 @@ modest_mail_operation_send_new_mail (ModestMailOperation *self,
        modest_mail_operation_create_msg (self, from, to, cc, bcc, subject, plain_body, html_body,
                                          attachments_list, images_list, priority_flags,
                                          references, in_reply_to,
+                                         header_pairs,
                                          modest_mail_operation_send_new_mail_cb, info);
 
 }
@@ -1375,6 +1434,7 @@ modest_mail_operation_save_to_drafts (ModestMailOperation *self,
                                      TnyHeaderFlags priority_flags,
                                      const gchar *references,
                                      const gchar *in_reply_to,
+                                     TnyList *header_pairs,
                                      SaveToDraftstCallback callback,
                                      gpointer user_data)
 {
@@ -1401,6 +1461,7 @@ modest_mail_operation_save_to_drafts (ModestMailOperation *self,
        modest_mail_operation_create_msg (self, from, to, cc, bcc, subject, plain_body, html_body,
                                          attachments_list, images_list, priority_flags,
                                          references, in_reply_to,
+                                         header_pairs,
                                          modest_mail_operation_save_to_drafts_cb, info);
 }
 
@@ -1710,6 +1771,11 @@ inbox_refreshed_cb (TnyFolder *inbox,
        new_headers_array = g_ptr_array_new ();
        if (info->inbox_observer) {
                new_headers_iter = tny_list_create_iterator (((InternalFolderObserver *) info->inbox_observer)->new_headers);
+               if (!tny_iterator_is_done (new_headers_iter)) {
+                       modest_platform_emit_folder_updated_signal (info->account_name, tny_folder_get_id (TNY_FOLDER (inbox)));
+                       modest_account_mgr_set_has_new_mails (modest_runtime_get_account_mgr (),
+                                                             info->account_name, TRUE);
+               }
                while (!tny_iterator_is_done (new_headers_iter)) {
                        TnyHeader *header = NULL;
 
@@ -3279,6 +3345,23 @@ modest_mail_operation_remove_msgs (ModestMailOperation *self,
        if (!remove_headers)
                remove_headers = g_object_ref (headers);
 
+       /* Notify messages are "read" */
+       iter = tny_list_create_iterator (remove_headers);
+       while (!tny_iterator_is_done (iter)) {
+               gchar *msg_uid;
+               TnyHeader *header;
+
+               header = TNY_HEADER (tny_iterator_get_current (iter));
+               msg_uid =  modest_tny_folder_get_header_unique_id (header);
+               if (msg_uid) {
+                       modest_platform_emit_msg_read_changed_signal (msg_uid, TRUE);
+                       g_free (msg_uid);
+               }
+               g_object_unref (header);
+               tny_iterator_next (iter);
+       }
+       g_object_unref (iter);
+
        /* remove message from folder */
        modest_mail_operation_notify_start (self);
        tny_folder_remove_msgs_async (folder, remove_headers, remove_msgs_async_cb, 
@@ -3433,6 +3516,34 @@ transfer_msgs_cb (TnyFolder *folder, gboolean cancelled, GError *err, gpointer u
        }
 
        if (finished) {
+               TnyAccount *src_account;
+               TnyAccount *dest_account;
+
+               /* send the notification that the source folder might have changed */
+               src_account = modest_tny_folder_get_account (folder);
+               if (src_account) {
+                       const gchar *src_folder_id;
+                       const gchar *src_account_name;
+
+                       src_folder_id = tny_folder_get_id (folder);
+                       src_account_name =
+                               modest_tny_account_get_parent_modest_account_name_for_server_account (src_account);
+                       modest_platform_emit_folder_updated_signal (src_account_name, src_folder_id);
+                       g_object_unref (src_account);
+               }
+               /* send the notification that the destination folder might have changed */
+               dest_account = modest_tny_folder_get_account (helper->dest_folder);
+               if (dest_account) {
+                       const gchar *dest_folder_id;
+                       const gchar *dest_account_name;
+
+                       dest_folder_id = tny_folder_get_id (helper->dest_folder);
+                       dest_account_name =
+                               modest_tny_account_get_parent_modest_account_name_for_server_account (dest_account);
+                       modest_platform_emit_folder_updated_signal (dest_account_name, dest_folder_id);
+                       g_object_unref (dest_account);
+               }
+
                /* Synchronize the source folder contents. This should
                   be done by tinymail but the camel_folder_sync it's
                   actually disabled in transfer_msgs_thread_clean