* src/widgets/modest-header-view-render.c,
authorJose Dapena Paz <jdapena@igalia.com>
Tue, 4 Dec 2007 22:38:18 +0000 (22:38 +0000)
committerJose Dapena Paz <jdapena@igalia.com>
Tue, 4 Dec 2007 22:38:18 +0000 (22:38 +0000)
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

src/maemo/modest-msg-view-window.c
src/modest-tny-send-queue.c
src/modest-tny-send-queue.h
src/widgets/modest-header-view-render.c

index e0e972a..758b0ad 100644 (file)
@@ -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;
                }
index 357aa3e..3bc2861 100644 (file)
@@ -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;
+}
index 1c3f4b6..345cf64 100644 (file)
@@ -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__ */
index 515564b..7c41c95 100644 (file)
 #include <string.h>
 
 
-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);
                        }