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 {
/* 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,
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;
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);
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));
}
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)
{
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));
}
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);
}
&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;
}
/* 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;
+}
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__ */
#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)
{
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);
}