* add debugging code to the send-queue and the operations-queue;
[modest] / src / modest-tny-send-queue.c
index 87b997e..5a0e150 100644 (file)
@@ -40,6 +40,7 @@
 #include <modest-platform.h>
 #include <widgets/modest-window-mgr.h>
 #include <modest-marshal.h>
+#include <modest-debug.h>
 #include <string.h> /* strcmp */
 
 /* 'private'/'protected' functions */
@@ -124,12 +125,36 @@ modest_tny_send_queue_info_free(SendInfo *info)
        g_slice_free(SendInfo, info);
 }
 
+static void
+print_queue_item (gpointer data, gpointer user_data)
+{
+       SendInfo *info = (SendInfo*)data;
+       const gchar *status;
+       
+       switch (info->status) {
+       case MODEST_TNY_SEND_QUEUE_UNKNOWN: status = "UNKNOWN"; break;
+       case MODEST_TNY_SEND_QUEUE_WAITING: status = "WAITING"; break;
+       case MODEST_TNY_SEND_QUEUE_SUSPENDED: status = "SUSPENDED"; break;
+       case MODEST_TNY_SEND_QUEUE_SENDING: status = "SENDING"; break;
+       case MODEST_TNY_SEND_QUEUE_FAILED: status = "FAILED"; break;
+       default: status= "UNEXPECTED"; break;
+       }
+
+       g_debug ("\"%s\" => [%s]", info->msg_id, status);
+}
+
 static GList*
 modest_tny_send_queue_lookup_info (ModestTnySendQueue *self, const gchar *msg_id)
 {
        ModestTnySendQueuePrivate *priv;
        priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self);
 
+       MODEST_DEBUG_BLOCK (
+               g_debug ("items in the send queue (%d):",
+                        g_queue_get_length (priv->queue));
+               g_queue_foreach (priv->queue, print_queue_item, NULL);
+       );
+       
        return g_queue_find_custom (priv->queue, msg_id, on_modest_tny_send_queue_compare_id);
 }
 
@@ -159,14 +184,17 @@ 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) {          
                outbox = modest_tny_send_queue_get_outbox (TNY_SEND_QUEUE(self));
+               if (!outbox) {
+                       g_warning ("%s: modest_tny_send_queue_get_outbox(..) returned NULL\n", __FUNCTION__);
+                       goto frees;
+               }
                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));
-                       if (header) {   
-                               tny_header_unset_flags (header, TNY_HEADER_FLAG_PRIORITY);
-                               tny_header_set_flags (header, TNY_HEADER_FLAG_SUSPENDED_PRIORITY);
+                       if (header) {
+                               tny_header_set_flag (header, TNY_HEADER_FLAG_SUSPENDED);
                                tny_iterator_next (iter);
                                g_object_unref (header);
                        }
@@ -235,10 +263,10 @@ modest_tny_send_queue_add (ModestTnySendQueue *self, TnyMsg *msg, GError **err)
        g_return_if_fail (TNY_IS_CAMEL_MSG(msg));
 
        tny_camel_send_queue_add_async (TNY_CAMEL_SEND_QUEUE(self), 
-                                 msg, 
-                                 _on_added_to_outbox, 
-                                 NULL, 
-                                 NULL);
+                                       msg, 
+                                       _on_added_to_outbox, 
+                                       NULL, 
+                                       NULL);
 }
 
 
@@ -250,7 +278,7 @@ _add_message (ModestTnySendQueue *self, TnyHeader *header)
        SendInfo *info = NULL;
        GList* existing = NULL;
        gchar* msg_uid = NULL;
-       ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_UNKNONW;
+       ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_UNKNOWN;
        gboolean editing = FALSE;
 
        g_return_if_fail (TNY_IS_SEND_QUEUE(self));
@@ -261,12 +289,10 @@ _add_message (ModestTnySendQueue *self, TnyHeader *header)
        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_UNKNOWN:
        case MODEST_TNY_SEND_QUEUE_SUSPENDED:
        case MODEST_TNY_SEND_QUEUE_FAILED:
-               if (status != MODEST_TNY_SEND_QUEUE_SUSPENDED)
-                       tny_header_unset_flags (header, TNY_HEADER_FLAG_PRIORITY);
-               
+
                /* Check if it already exists on queue */
                existing = modest_tny_send_queue_lookup_info (MODEST_TNY_SEND_QUEUE(self), msg_uid);
                if(existing != NULL)
@@ -509,31 +535,22 @@ 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_UNKNONW;
+  if(item == NULL) return MODEST_TNY_SEND_QUEUE_UNKNOWN;
   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;
+       const gchar *subject;
+       time_t date_received;
                
        /* Get message uid */
-       uid = tny_header_get_uid (header);
-       if (uid)
-               tmp = g_strsplit (uid, "__", 2);
-       
-       if (tmp) {
-               if (tmp[1] != NULL) 
-                       msg_uid = g_strconcat (tmp[0], "_", NULL);
-               else 
-                       msg_uid = g_strdup(tmp[0]);
-
-               /* free */
-               g_strfreev(tmp);
-       }
+       subject = tny_header_get_subject (header);
+       date_received = tny_header_get_date_received (header);
+
+       msg_uid = g_strdup_printf ("%s %d", subject, (int) date_received);
 
        return msg_uid;
 }
@@ -560,7 +577,8 @@ _on_msg_start_sending (TnySendQueue *self,
        /* Get status info */
        item = modest_tny_send_queue_lookup_info (MODEST_TNY_SEND_QUEUE (self), msg_id);
        if (!item) 
-               g_warning  ("%s: item should not be NULL", __FUNCTION__);
+               g_warning  ("%s: item (%s) should not be NULL",
+                           __FUNCTION__, msg_id ? msg_id : "<none>");
        else {
                info = item->data;
                info->status = MODEST_TNY_SEND_QUEUE_SENDING;
@@ -583,20 +601,19 @@ _on_msg_has_been_sent (TnySendQueue *self,
                       gpointer user_data)
 {
        ModestTnySendQueuePrivate *priv;
-       GList *item;
        gchar *msg_id = NULL;
-
+       GList *item;
        priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self);
 
        /* Get message uid */
        msg_id = modest_tny_send_queue_get_msg_id (header);
-       
+
+       tny_header_set_flag (header, TNY_HEADER_FLAG_SEEN);
+
        /* Get status info */
        item = modest_tny_send_queue_lookup_info (MODEST_TNY_SEND_QUEUE (self), msg_id);
-       if (!item)
-               g_warning ("%s: item should not be NULL", __FUNCTION__);
-       else {
-
+       if (item) {
+               
                /* Remove status info */
                modest_tny_send_queue_info_free (item->data);
                g_queue_delete_link (priv->queue, item);
@@ -629,7 +646,7 @@ _on_msg_error_happened (TnySendQueue *self,
                                                  msg_uid);     
        if (item == NULL) {
                info = g_slice_new (SendInfo);
-               info->msg_id = strdup(msg_uid);
+               info->msg_id = (msg_uid != NULL)? strdup(msg_uid) : NULL;
                g_queue_push_tail (priv->queue, info);
        } else
                info = item->data;
@@ -637,6 +654,7 @@ _on_msg_error_happened (TnySendQueue *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;
+       priv->current = NULL;
        
        /* Notify status has changed */
        g_signal_emit (self, signals[STATUS_CHANGED], 0, info->msg_id, info->status);
@@ -644,3 +662,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;
+}