From: Jose Dapena Paz Date: Tue, 4 Dec 2007 22:38:18 +0000 (+0000) Subject: * src/widgets/modest-header-view-render.c, X-Git-Tag: git_migration_finished~1970 X-Git-Url: http://git.maemo.org/git/?p=modest;a=commitdiff_plain;h=995626854ed69de2db9146812d8bd61b88228b57 * src/widgets/modest-header-view-render.c, src/modest-tny-send-queue.[ch]: * Removed internal method get_status_of_uid, as it's now public in modest-tny-send-queue, with name modest_tny_all_send_queues_get_msg_status. * src/maemo/modest-msg-view-window.c: * Now we skip failed messages in outbox for next/prev messages (fixes NB#78132). pmo-trunk-r3867 --- diff --git a/src/maemo/modest-msg-view-window.c b/src/maemo/modest-msg-view-window.c index e0e972a..758b0ad 100644 --- a/src/maemo/modest-msg-view-window.c +++ b/src/maemo/modest-msg-view-window.c @@ -154,6 +154,8 @@ static void update_window_title (ModestMsgViewWindow *window); static gboolean set_toolbar_transfer_mode (ModestMsgViewWindow *self); static void init_window (ModestMsgViewWindow *obj); +static gboolean msg_is_visible (TnyHeader *header, gboolean check_outbox); + /* list my signals */ enum { @@ -199,6 +201,9 @@ struct _ModestMsgViewWindowPrivate { /* Whether this was created via the *_new_for_search_result() function. */ gboolean is_search_result; + + /* Whether the message is in outbox */ + gboolean is_outbox; /* A reference to the @model of the header view * to allow selecting previous/next messages, @@ -393,6 +398,7 @@ modest_msg_view_window_init (ModestMsgViewWindow *obj) gtk_ui_manager_get_accel_group (parent_priv->ui_manager)); priv->is_search_result = FALSE; + priv->is_outbox = FALSE; priv->msg_view = NULL; priv->header_model = NULL; @@ -871,6 +877,7 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW)); if (header_view != NULL){ header_folder = modest_header_view_get_folder(header_view); + priv->is_outbox = (modest_tny_folder_guess_folder_type (header_folder) == TNY_FOLDER_TYPE_OUTBOX); g_assert(header_folder != NULL); priv->header_folder_id = tny_folder_get_id(header_folder); g_assert(priv->header_folder_id != NULL); @@ -1477,7 +1484,7 @@ modest_msg_view_window_last_message_selected (ModestMsgViewWindow *window) TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header, -1); if (header) { - if (!(tny_header_get_flags(header) & TNY_HEADER_FLAG_DELETED)) + if (msg_is_visible (header, priv->is_outbox)) is_last_selected = FALSE; g_object_unref(G_OBJECT(header)); } @@ -1508,6 +1515,14 @@ modest_msg_view_window_is_search_result (ModestMsgViewWindow *window) return priv->is_search_result; } +static gboolean +msg_is_visible (TnyHeader *header, gboolean check_outbox) +{ + return (!(tny_header_get_flags(header) & TNY_HEADER_FLAG_DELETED)) && + ( (!check_outbox) || (modest_tny_all_send_queues_get_msg_status (header) != MODEST_TNY_SEND_QUEUE_FAILED)) ; + +} + gboolean modest_msg_view_window_first_message_selected (ModestMsgViewWindow *window) { @@ -1549,7 +1564,7 @@ modest_msg_view_window_first_message_selected (ModestMsgViewWindow *window) TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header, -1); if (header) { - if (!(tny_header_get_flags(header) & TNY_HEADER_FLAG_DELETED)) + if (msg_is_visible (header, priv->is_outbox)) is_first_selected = FALSE; g_object_unref(G_OBJECT(header)); } @@ -1709,7 +1724,7 @@ modest_msg_view_window_select_first_message (ModestMsgViewWindow *self) TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header, -1); g_return_val_if_fail (TNY_IS_HEADER (header), FALSE); - if (tny_header_get_flags (header) & TNY_HEADER_FLAG_DELETED) { + if (!msg_is_visible (header, priv->is_outbox)) { g_object_unref (header); return modest_msg_view_window_select_next_message (self); } @@ -1752,7 +1767,7 @@ modest_msg_view_window_select_previous_message (ModestMsgViewWindow *window) &header, -1); if (!header) break; - if (tny_header_get_flags (header) & TNY_HEADER_FLAG_DELETED) { + if (!msg_is_visible (header, priv->is_outbox)) { g_object_unref (header); continue; } diff --git a/src/modest-tny-send-queue.c b/src/modest-tny-send-queue.c index 357aa3e..3bc2861 100644 --- a/src/modest-tny-send-queue.c +++ b/src/modest-tny-send-queue.c @@ -631,3 +631,72 @@ _on_msg_error_happened (TnySendQueue *self, /* free */ g_free(msg_uid); } + +static void +fill_list_of_caches (gpointer key, gpointer value, gpointer userdata) +{ + GSList **send_queues = (GSList **) userdata; + *send_queues = g_slist_prepend (*send_queues, value); +} + +ModestTnySendQueueStatus +modest_tny_all_send_queues_get_msg_status (TnyHeader *header) +{ + ModestCacheMgr *cache_mgr = NULL; + GHashTable *send_queue_cache = NULL; + ModestTnyAccountStore *accounts_store = NULL; + TnyList *accounts = NULL; + TnyIterator *iter = NULL; + TnyTransportAccount *account = NULL; + GSList *send_queues = NULL, *node; + /* get_msg_status returns suspended by default, so we want to detect changes */ + ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_UNKNOWN; + ModestTnySendQueueStatus queue_status = MODEST_TNY_SEND_QUEUE_UNKNOWN; + gchar *msg_uid = NULL; + ModestTnySendQueue *send_queue = 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); + + g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues); + if (send_queues == NULL) { + accounts = tny_simple_list_new (); + accounts_store = modest_runtime_get_account_store (); + tny_account_store_get_accounts (TNY_ACCOUNT_STORE(accounts_store), + accounts, + TNY_ACCOUNT_STORE_TRANSPORT_ACCOUNTS); + + iter = tny_list_create_iterator (accounts); + while (!tny_iterator_is_done (iter)) { + account = TNY_TRANSPORT_ACCOUNT(tny_iterator_get_current (iter)); + send_queue = modest_runtime_get_send_queue(TNY_TRANSPORT_ACCOUNT(account)); + g_object_unref(account); + + queue_status = modest_tny_send_queue_get_msg_status (send_queue, msg_uid); + if (queue_status != MODEST_TNY_SEND_QUEUE_UNKNOWN) { + status = queue_status; + break; + } + tny_iterator_next (iter); + } + g_object_unref (iter); + g_object_unref (accounts); + } + else { + for (node = send_queues; node != NULL; node = g_slist_next (node)) { + 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_UNKNOWN) { + status = queue_status; + break; + } + } + } + + g_free(msg_uid); + g_slist_free (send_queues); + return status; +} diff --git a/src/modest-tny-send-queue.h b/src/modest-tny-send-queue.h index 1c3f4b6..345cf64 100644 --- a/src/modest-tny-send-queue.h +++ b/src/modest-tny-send-queue.h @@ -144,6 +144,17 @@ modest_tny_send_queue_get_msg_status (ModestTnySendQueue *self, const gchar *msg gchar * modest_tny_send_queue_get_msg_id (TnyHeader *header); +/** + * modest_tny_all_send_queues_get_msg_status: + * @header: a #TnyHeader + * + * obtain status of message (searching for it in all queues) + * + * Returns: a #ModestTnySendQueueStatus + */ +ModestTnySendQueueStatus +modest_tny_all_send_queues_get_msg_status (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 515564b..7c41c95 100644 --- a/src/widgets/modest-header-view-render.c +++ b/src/widgets/modest-header-view-render.c @@ -42,75 +42,6 @@ #include -static void -fill_list_of_caches (gpointer key, gpointer value, gpointer userdata) -{ - GSList **send_queues = (GSList **) userdata; - *send_queues = g_slist_prepend (*send_queues, value); -} - -static ModestTnySendQueueStatus -get_status_of_uid (TnyHeader *header) -{ - ModestCacheMgr *cache_mgr = NULL; - GHashTable *send_queue_cache = NULL; - ModestTnyAccountStore *accounts_store = NULL; - TnyList *accounts = NULL; - TnyIterator *iter = NULL; - TnyTransportAccount *account = NULL; - GSList *send_queues = NULL, *node; - /* get_msg_status returns suspended by default, so we want to detect changes */ - ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_UNKNOWN; - ModestTnySendQueueStatus queue_status = MODEST_TNY_SEND_QUEUE_UNKNOWN; - gchar *msg_uid = NULL; - ModestTnySendQueue *send_queue = 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); - - g_hash_table_foreach (send_queue_cache, (GHFunc) fill_list_of_caches, &send_queues); - if (send_queues == NULL) { - accounts = tny_simple_list_new (); - accounts_store = modest_runtime_get_account_store (); - tny_account_store_get_accounts (TNY_ACCOUNT_STORE(accounts_store), - accounts, - TNY_ACCOUNT_STORE_TRANSPORT_ACCOUNTS); - - iter = tny_list_create_iterator (accounts); - while (!tny_iterator_is_done (iter)) { - account = TNY_TRANSPORT_ACCOUNT(tny_iterator_get_current (iter)); - send_queue = modest_runtime_get_send_queue(TNY_TRANSPORT_ACCOUNT(account)); - g_object_unref(account); - - queue_status = modest_tny_send_queue_get_msg_status (send_queue, msg_uid); - if (queue_status != MODEST_TNY_SEND_QUEUE_UNKNOWN) { - status = queue_status; - break; - } - tny_iterator_next (iter); - } - g_object_unref (iter); - g_object_unref (accounts); - } - else { - for (node = send_queues; node != NULL; node = g_slist_next (node)) { - 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_UNKNOWN) { - status = queue_status; - break; - } - } - } - - g_free(msg_uid); - g_slist_free (send_queues); - return status; -} - static const gchar * get_status_string (ModestTnySendQueueStatus status) { @@ -389,7 +320,7 @@ _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCe ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_UNKNOWN; const gchar *status_str = ""; if (msg_header != NULL) { - status = get_status_of_uid (msg_header); + status = modest_tny_all_send_queues_get_msg_status (msg_header); if (status == MODEST_TNY_SEND_QUEUE_SUSPENDED) { tny_header_set_flag (msg_header, TNY_HEADER_FLAG_SUSPENDED); }