From 9b9efa32a2edc633130c4df8967dee7abc0ec41a Mon Sep 17 00:00:00 2001 From: Javier Fernandez Garcia-Boente Date: Mon, 9 Jul 2007 08:30:17 +0000 Subject: [PATCH] * Enable modest-tny-send-queue to store information about mails to be sent. * Sending operation wont show progress information. * Implement cancel sending operation by setting SUSPENDED priority flags on all outbox headers. * Fixes: NB#58571, NB#60517, NB#60916, NB#62448 pmo-trunk-r2638 --- src/maemo/modest-main-window.c | 2 +- src/maemo/modest-msg-view-window.c | 2 +- src/maemo/modest-progress-bar-widget.c | 28 +++--- src/modest-mail-operation.c | 6 +- src/modest-tny-send-queue.c | 161 ++++++++++++++++++++++--------- src/modest-tny-send-queue.h | 4 + src/widgets/modest-header-view-render.c | 64 +++++++----- 7 files changed, 176 insertions(+), 91 deletions(-) diff --git a/src/maemo/modest-main-window.c b/src/maemo/modest-main-window.c index 8c4778b..a7696f1 100644 --- a/src/maemo/modest-main-window.c +++ b/src/maemo/modest-main-window.c @@ -1971,7 +1971,7 @@ on_queue_changed (ModestMailOperationQueue *queue, /* Get toolbar mode from operation id*/ op_type = modest_mail_operation_get_type_operation (mail_op); switch (op_type) { - case MODEST_MAIL_OPERATION_TYPE_SEND: +/* case MODEST_MAIL_OPERATION_TYPE_SEND: */ case MODEST_MAIL_OPERATION_TYPE_RECEIVE: case MODEST_MAIL_OPERATION_TYPE_OPEN: mode = TOOLBAR_MODE_TRANSFER; diff --git a/src/maemo/modest-msg-view-window.c b/src/maemo/modest-msg-view-window.c index b7960a4..b92cab2 100644 --- a/src/maemo/modest-msg-view-window.c +++ b/src/maemo/modest-msg-view-window.c @@ -1576,7 +1576,7 @@ on_queue_changed (ModestMailOperationQueue *queue, /* Get toolbar mode from operation id*/ op_type = modest_mail_operation_get_type_operation (mail_op); switch (op_type) { - case MODEST_MAIL_OPERATION_TYPE_SEND: +/* case MODEST_MAIL_OPERATION_TYPE_SEND: */ case MODEST_MAIL_OPERATION_TYPE_RECEIVE: case MODEST_MAIL_OPERATION_TYPE_OPEN: mode = TOOLBAR_MODE_TRANSFER; diff --git a/src/maemo/modest-progress-bar-widget.c b/src/maemo/modest-progress-bar-widget.c index ab685c6..33b54bd 100644 --- a/src/maemo/modest-progress-bar-widget.c +++ b/src/maemo/modest-progress-bar-widget.c @@ -236,19 +236,19 @@ modest_progress_bar_add_operation (ModestProgressObject *self, "progress-changed", G_CALLBACK (on_progress_changed), me); - if (priv->observables == NULL) { - priv->current = mail_op; - - /* Call progress_change handler to initialize progress message */ - state = g_malloc0(sizeof(ModestMailOperationState)); - state->done = 0; - state->total = 0; - state->op_type = modest_mail_operation_get_type_operation (mail_op);; - on_progress_changed (mail_op, state, me); - g_free(state); - } - priv->observables = g_slist_append (priv->observables, data); - + /* Set curent operation */ + priv->current = mail_op; + + /* Call progress_change handler to initialize progress message */ + state = g_malloc0(sizeof(ModestMailOperationState)); + state->done = 0; + state->total = 0; + state->op_type = modest_mail_operation_get_type_operation (mail_op);; +/* on_progress_changed (mail_op, state, me); */ + g_free(state); + + /* Add operation to obserbable objects list */ + priv->observables = g_slist_prepend (priv->observables, data); } static gint @@ -369,7 +369,7 @@ on_progress_changed (ModestMailOperation *mail_op, if (determined) msg = g_strdup_printf(_("mcen_me_sending"), state->done, state->total); - else + else msg = g_strdup(_("mail_me_sending")); break; diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index 9dfcaf8..0c53c1e 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -1096,7 +1096,7 @@ update_account_thread (gpointer thr_user_data) /* Perform send (if operation was not cancelled) */ if (did_a_cancel) goto out; - priv->op_type = MODEST_MAIL_OPERATION_TYPE_SEND; +/* priv->op_type = MODEST_MAIL_OPERATION_TYPE_SEND; */ priv->done = 0; priv->total = 0; if (priv->account != NULL) @@ -1105,9 +1105,9 @@ update_account_thread (gpointer thr_user_data) send_queue = modest_runtime_get_send_queue (info->transport_account); if (send_queue) { - timeout = g_timeout_add (250, idle_notify_progress, info->mail_op); +/* timeout = g_timeout_add (250, idle_notify_progress, info->mail_op); */ modest_tny_send_queue_try_to_send (send_queue); - g_source_remove (timeout); +/* g_source_remove (timeout); */ } else { g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR, MODEST_MAIL_OPERATION_ERROR_INSTANCE_CREATION_FAILED, diff --git a/src/modest-tny-send-queue.c b/src/modest-tny-send-queue.c index bbad202..17a7b25 100644 --- a/src/modest-tny-send-queue.c +++ b/src/modest-tny-send-queue.c @@ -131,23 +131,9 @@ modest_tny_send_queue_cancel (TnySendQueue *self, gboolean remove, GError **err) /* Set flags to supend sending operaiton (if removed, this is not necessary) */ if (!remove) { - TnyIterator *iter = NULL; - TnyFolder *outbox = NULL; - TnyList *headers = tny_simple_list_new (); - outbox = modest_tny_send_queue_get_outbox (self); - tny_folder_get_headers (outbox, headers, TRUE, err); - if (err != NULL && *err != NULL) goto frees; - iter = tny_list_create_iterator (headers); - while (!tny_iterator_is_done (iter)) { - TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter)); - tny_header_unset_flags (header, TNY_HEADER_FLAG_PRIORITY); - tny_header_set_flags (header, TNY_HEADER_FLAG_SUSPENDED_PRIORITY); - g_object_unref (header); - tny_iterator_next (iter); - } - frees: - g_object_unref (G_OBJECT (headers)); - g_object_unref (G_OBJECT (outbox)); + g_queue_foreach (priv->queue, (GFunc)modest_tny_send_queue_info_free, NULL); + g_queue_free (priv->queue); + priv->queue = g_queue_new(); } /* Dont call super class implementaiton, becasue camel removes messages from outbox */ @@ -176,7 +162,8 @@ modest_tny_send_queue_add (TnySendQueue *self, TnyMsg *msg, GError **err) TNY_CAMEL_SEND_QUEUE_CLASS(parent_class)->add_func (self, msg, err); /* FIXME */ /* Check whether the mail is already in the queue */ - msg_id = tny_header_get_message_id (header); +/* msg_id = tny_header_get_message_id (header); */ + msg_id = tny_header_get_uid (header); existing = modest_tny_send_queue_lookup_info (MODEST_TNY_SEND_QUEUE(self), msg_id); if(existing != NULL) { @@ -199,6 +186,45 @@ modest_tny_send_queue_add (TnySendQueue *self, TnyMsg *msg, GError **err) g_signal_emit (self, signals[STATUS_CHANGED], 0, info->msg_id, info->status); } +static void +_add_message (ModestTnySendQueue *self, TnyHeader *header) +{ + ModestTnySendQueuePrivate *priv; + SendInfo *info = NULL; + GList* existing = NULL; + gchar* msg_uid = NULL; + ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_WAITING; + + g_return_if_fail (TNY_IS_SEND_QUEUE(self)); + g_return_if_fail (TNY_IS_HEADER(header)); + priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self); + + /* Check whether the mail is already in the queue */ + msg_uid = modest_tny_send_queue_get_msg_id (header); + status = modest_tny_send_queue_get_msg_status (self, msg_uid); + switch (status) { + case MODEST_TNY_SEND_QUEUE_UNKNONW: + case MODEST_TNY_SEND_QUEUE_SUSPENDED: + case MODEST_TNY_SEND_QUEUE_FAILED: + tny_header_unset_flags (header, TNY_HEADER_FLAG_PRIORITY); + existing = modest_tny_send_queue_lookup_info (MODEST_TNY_SEND_QUEUE(self), msg_uid); + if(existing != NULL) return; + + /* Add new meesage info */ + info = g_slice_new (SendInfo); + info->msg_id = strdup(msg_uid); + info->status = MODEST_TNY_SEND_QUEUE_WAITING; + g_queue_push_tail (priv->queue, info); + break; + default: + goto frees; + } + + /* Free */ + frees: + g_free(msg_uid); +} + static TnyFolder* modest_tny_send_queue_get_sentbox (TnySendQueue *self) { @@ -358,8 +384,29 @@ modest_tny_send_queue_new (TnyCamelTransportAccount *account) void modest_tny_send_queue_try_to_send (ModestTnySendQueue* self) { + TnyIterator *iter = NULL; + TnyFolder *outbox = NULL; + TnyList *headers = tny_simple_list_new (); + TnyHeader *header = NULL; + GError *err = NULL; + + outbox = modest_tny_send_queue_get_outbox (TNY_SEND_QUEUE(self)); + tny_folder_get_headers (outbox, headers, TRUE, &err); + if (err != NULL) goto frees; + iter = tny_list_create_iterator (headers); + while (!tny_iterator_is_done (iter)) { + header = TNY_HEADER (tny_iterator_get_current (iter)); + _add_message (self, header); + tny_iterator_next (iter); + g_object_unref (header); + } + /* Flush send queue */ tny_camel_send_queue_flush (TNY_CAMEL_SEND_QUEUE(self)); + + frees: + g_object_unref (G_OBJECT (headers)); + g_object_unref (G_OBJECT (outbox)); } gboolean @@ -388,10 +435,32 @@ modest_tny_send_queue_get_msg_status (ModestTnySendQueue *self, const gchar *msg { GList *item; item = modest_tny_send_queue_lookup_info (self, msg_id); - if(item == NULL) return MODEST_TNY_SEND_QUEUE_SUSPENDED; + if(item == NULL) return MODEST_TNY_SEND_QUEUE_UNKNONW; return ((SendInfo*)item->data)->status; } +gchar * +modest_tny_send_queue_get_msg_id (TnyHeader *header) +{ + const gchar *uid = NULL; + gchar* msg_uid = NULL; + gchar **tmp = NULL; + + /* Get message uid */ + uid = tny_header_get_uid (header); + tmp = g_strsplit (uid, "__", 2); + if (tmp[1] != NULL) + msg_uid = g_strconcat (tmp[0], "_", NULL); + else + msg_uid = g_strdup(tmp[0]); + + /* free */ + g_strfreev(tmp); + + return msg_uid; +} + + /* static void */ /* _on_msg_start_sending (TnySendQueue *self, */ /* TnyMsg *msg, */ @@ -452,33 +521,33 @@ static void _on_msg_error_happened (TnySendQueue *self, GError *err, gpointer user_data) { -/* ModestTnySendQueuePrivate *priv; */ -/* SendInfo *info; */ -/* GList *item; */ -/* TnyHeader *msg_header; */ + ModestTnySendQueuePrivate *priv = NULL; + SendInfo *info = NULL; + GList *item = NULL; + gchar* msg_uid = NULL; + + priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self); + + /* Get sending info (create new if it doesn not exist) */ + msg_uid = modest_tny_send_queue_get_msg_id (header); + item = modest_tny_send_queue_lookup_info (MODEST_TNY_SEND_QUEUE (self), + msg_uid); + if (item == NULL) { + info = g_slice_new (SendInfo); + info->msg_id = strdup(msg_uid); + g_queue_push_tail (priv->queue, info); + } + else { + info = item->data; + } -/* priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self); */ + /* Keep in queue so that we remember that the opertion has failed */ + /* and was not just cancelled */ + info->status = MODEST_TNY_SEND_QUEUE_FAILED; + + /* Notify status has changed */ + g_signal_emit (self, signals[STATUS_CHANGED], 0, info->msg_id, info->status); - /* TODO: Use this version as soon as the msg-sending - * notification works */ -/* #if 0 */ -/* item = priv->current; */ -/* g_assert(item != NULL); */ -/* info = priv->current->data; */ -/* #else */ -/* /\* TODO: Why do we get the msg and its header separately? The docs */ -/* * don't really tell. *\/ */ -/* g_assert(header == tny_msg_get_header (msg)); // ???? */ -/* msg_header = tny_msg_get_header (msg); */ -/* item = modest_tny_send_queue_lookup_info (MODEST_TNY_SEND_QUEUE (self), */ -/* tny_header_get_message_id (msg_header)); */ -/* g_object_unref (msg_header); */ -/* g_assert(item != NULL); */ -/* info = item->data; */ -/* #endif */ - - /* Keep in queue so that we remember that the opertion has failed - * and was not just cancelled */ -/* info->status = MODEST_TNY_SEND_QUEUE_FAILED; */ -/* g_signal_emit (self, signals[STATUS_CHANGED], 0, info->msg_id, info->status); */ + /* free */ + g_free(msg_uid); } diff --git a/src/modest-tny-send-queue.h b/src/modest-tny-send-queue.h index 8b9af1b..5688ebe 100644 --- a/src/modest-tny-send-queue.h +++ b/src/modest-tny-send-queue.h @@ -51,6 +51,7 @@ typedef struct _ModestTnySendQueue ModestTnySendQueue; typedef struct _ModestTnySendQueueClass ModestTnySendQueueClass; typedef enum { + MODEST_TNY_SEND_QUEUE_UNKNONW, MODEST_TNY_SEND_QUEUE_WAITING, MODEST_TNY_SEND_QUEUE_SUSPENDED, MODEST_TNY_SEND_QUEUE_SENDING, @@ -130,6 +131,9 @@ gboolean modest_tny_send_queue_msg_is_being_sent (ModestTnySendQueue* self, cons ModestTnySendQueueStatus modest_tny_send_queue_get_msg_status (ModestTnySendQueue *self, const gchar *msg_id); +gchar * +modest_tny_send_queue_get_msg_id (TnyHeader *header); + G_END_DECLS #endif /* __MODEST_TNY_SEND_QUEUE_H__ */ diff --git a/src/widgets/modest-header-view-render.c b/src/widgets/modest-header-view-render.c index d4954a3..9301faf 100644 --- a/src/widgets/modest-header-view-render.c +++ b/src/widgets/modest-header-view-render.c @@ -47,31 +47,38 @@ fill_list_of_caches (gpointer key, gpointer value, gpointer userdata) *send_queues = g_slist_prepend (*send_queues, value); } -/* static ModestTnySendQueueStatus */ -/* get_status_of_uid (const gchar *uid) */ -/* { */ -/* ModestCacheMgr *cache_mgr; */ -/* GHashTable *send_queue_cache; */ -/* GSList *send_queues = NULL, *node; */ -/* /\* get_msg_status returns suspended by default, so we want to detect changes *\/ */ -/* ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_SUSPENDED; */ +static ModestTnySendQueueStatus +get_status_of_uid (TnyHeader *header) +{ + ModestCacheMgr *cache_mgr; + GHashTable *send_queue_cache; + GSList *send_queues = NULL, *node; + /* get_msg_status returns suspended by default, so we want to detect changes */ + ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_SUSPENDED; + ModestTnySendQueueStatus queue_status = MODEST_TNY_SEND_QUEUE_SUSPENDED; + gchar *msg_uid = NULL; + + msg_uid = modest_tny_send_queue_get_msg_id (header); + cache_mgr = modest_runtime_get_cache_mgr (); + send_queue_cache = modest_cache_mgr_get_cache (cache_mgr, + MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE); -/* cache_mgr = modest_runtime_get_cache_mgr (); */ -/* send_queue_cache = modest_cache_mgr_get_cache (cache_mgr, */ -/* MODEST_CACHE_MGR_CACHE_TYPE_SEND_QUEUE); */ - -/* g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues); */ - -/* for (node = send_queues; node != NULL; node = g_slist_next (node)) { */ -/* ModestTnySendQueueStatus queue_status = modest_tny_send_queue_get_msg_status ( */ -/* MODEST_TNY_SEND_QUEUE (node->data), uid); */ -/* if (queue_status != MODEST_TNY_SEND_QUEUE_SUSPENDED) */ -/* status = queue_status; */ -/* break; */ -/* } */ -/* g_slist_free (send_queues); */ -/* return status; */ -/* } */ + g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues); + + for (node = send_queues; node != NULL; node = g_slist_next (node)) { + ModestTnySendQueue *send_queue = MODEST_TNY_SEND_QUEUE (node->data); + + queue_status = modest_tny_send_queue_get_msg_status (send_queue, msg_uid); + if (queue_status != MODEST_TNY_SEND_QUEUE_UNKNONW) { + status = queue_status; + break; + } + } + + g_free(msg_uid); + g_slist_free (send_queues); + return status; +} static const gchar * get_status_string (ModestTnySendQueueStatus status) @@ -330,8 +337,13 @@ _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCe if (msg_header != NULL) { /* TODO: ask send queue for msg sending status */ /* status = get_status_of_uid (tny_header_get_message_id (msg_header)); */ - if (prior_flags == TNY_HEADER_FLAG_SUSPENDED_PRIORITY) - status = MODEST_TNY_SEND_QUEUE_SUSPENDED; + status = get_status_of_uid (msg_header); + if (status == MODEST_TNY_SEND_QUEUE_SUSPENDED) { + tny_header_unset_flags (msg_header, TNY_HEADER_FLAG_PRIORITY); + tny_header_set_flags (msg_header, TNY_HEADER_FLAG_SUSPENDED_PRIORITY); + } +/* if (prior_flags == TNY_HEADER_FLAG_SUSPENDED_PRIORITY) */ +/* status = MODEST_TNY_SEND_QUEUE_SUSPENDED; */ } status_str = get_status_string (status); /* TODO: for now we set the status to waiting always, we need a way to -- 1.7.9.5