X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmodest-tny-send-queue.c;h=b67a9d9b71d86c567ad1faa928bcbd79e91163fa;hb=871a63abb8f32f2ddec19ca53d015e895b995d69;hp=9db9a6fe3c207a4ab90f2be08c43d358f05f345d;hpb=fd1ac9d405835b12fae2ac050c18d84c1fc3e540;p=modest diff --git a/src/modest-tny-send-queue.c b/src/modest-tny-send-queue.c index 9db9a6f..b67a9d9 100644 --- a/src/modest-tny-send-queue.c +++ b/src/modest-tny-send-queue.c @@ -105,6 +105,9 @@ struct _ModestTnySendQueuePrivate { /* Special folders */ TnyFolder *outbox; TnyFolder *sentbox; + + /* last was send receive operation?*/ + gboolean requested_send_receive; }; #define MODEST_TNY_SEND_QUEUE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ @@ -207,7 +210,10 @@ _on_added_to_outbox (TnySendQueue *self, header = tny_msg_get_header (msg); msg_id = modest_tny_send_queue_get_msg_id (header); - g_return_if_fail(msg_id != NULL); + if (!msg_id) { + g_warning ("%s: No msg_id returned for header", __FUNCTION__); + goto end; + } /* Put newly added message in WAITING state */ existing = modest_tny_send_queue_lookup_info (MODEST_TNY_SEND_QUEUE(self), msg_id); @@ -223,7 +229,8 @@ _on_added_to_outbox (TnySendQueue *self, g_signal_emit (self, signals[STATUS_CHANGED_SIGNAL], 0, info->msg_id, info->status); - g_object_unref(G_OBJECT(header)); + end: + g_object_unref (G_OBJECT(header)); } static void @@ -424,6 +431,8 @@ modest_tny_send_queue_new (TnyCamelTransportAccount *account) priv->sentbox = modest_tny_account_get_special_folder (TNY_ACCOUNT(account), TNY_FOLDER_TYPE_SENT); + priv->requested_send_receive = FALSE; + headers = tny_simple_list_new (); tny_folder_get_headers (priv->outbox, headers, TRUE, NULL); @@ -442,8 +451,7 @@ modest_tny_send_queue_new (TnyCamelTransportAccount *account) modest_tny_send_queue_wakeup (self); /* Frees */ - g_object_unref (G_OBJECT (headers)); - g_object_unref (G_OBJECT (priv->outbox)); + g_object_unref (headers); g_object_unref (iter); /* Do this at the end, because it'll call tny_send_queue_flush @@ -498,28 +506,25 @@ gchar * modest_tny_send_queue_get_msg_id (TnyHeader *header) { gchar* msg_uid = NULL; - const gchar *subject; + gchar *subject; time_t date_received; g_return_val_if_fail (header && TNY_IS_HEADER(header), NULL); /* Get message uid */ - subject = tny_header_get_subject (header); + subject = tny_header_dup_subject (header); date_received = tny_header_get_date_received (header); msg_uid = g_strdup_printf ("%s %d", subject, (int) date_received); + g_free (subject); return msg_uid; } static void -_on_msg_start_sending (TnySendQueue *self, - TnyHeader *header, - TnyMsg *msg, - int done, - int total, - gpointer user_data) +_on_msg_start_sending (TnySendQueue *self, TnyHeader *header, + TnyMsg *msg, int done, int total, gpointer user_data) { ModestTnySendQueuePrivate *priv = NULL; GList *item = NULL; @@ -530,16 +535,20 @@ _on_msg_start_sending (TnySendQueue *self, /* Get message uid */ msg_id = modest_tny_send_queue_get_msg_id (header); - - /* Get status info */ - item = modest_tny_send_queue_lookup_info (MODEST_TNY_SEND_QUEUE (self), msg_id); - - /* Set current status item */ - info = item->data; - info->status = MODEST_TNY_SEND_QUEUE_SENDING; - g_signal_emit (self, signals[STATUS_CHANGED_SIGNAL], 0, info->msg_id, info->status); - priv->current = item; - + if (msg_id) + item = modest_tny_send_queue_lookup_info (MODEST_TNY_SEND_QUEUE (self), msg_id); + else + g_warning ("%s: could not get msg-id for header", __FUNCTION__); + + if (item) { + /* Set current status item */ + info = item->data; + info->status = MODEST_TNY_SEND_QUEUE_SENDING; + g_signal_emit (self, signals[STATUS_CHANGED_SIGNAL], 0, info->msg_id, info->status); + priv->current = item; + } else + g_warning ("%s: could not find item with id '%s'", __FUNCTION__, msg_id); + /* free */ g_free (msg_id); } @@ -592,32 +601,48 @@ _on_msg_error_happened (TnySendQueue *self, gpointer user_data) { 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); - - info = item->data; - /* Keep in queue so that we remember that the opertion has failed */ - /* and was not just cancelled */ - if (err->code == TNY_SYSTEM_ERROR_CANCEL) - info->status = MODEST_TNY_SEND_QUEUE_SUSPENDED; - else - info->status = MODEST_TNY_SEND_QUEUE_FAILED; - priv->current = NULL; - - /* Notify status has changed */ - g_signal_emit (self, signals[STATUS_CHANGED_SIGNAL], 0, info->msg_id, info->status); + /* Note that header could be NULL. Tinymail notifies about + generic send queue errors with this signal as well, and + those notifications are not bound to any particular header + or message */ + if (header && TNY_IS_HEADER (header)) { + SendInfo *info = NULL; + GList *item = NULL; + gchar* msg_uid = NULL; + + /* 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); + + /* TODO: this should not happen (but it does), so the + problem should be located in the way we generate + the message uids */ + if (!item) { + g_warning ("%s: could not find item with id '%s'", __FUNCTION__, msg_uid); + g_free(msg_uid); + return; + } + + info = item->data; + + /* Keep in queue so that we remember that the opertion has failed */ + /* and was not just cancelled */ + if (err->code == TNY_SYSTEM_ERROR_CANCEL) + info->status = MODEST_TNY_SEND_QUEUE_SUSPENDED; + else + info->status = MODEST_TNY_SEND_QUEUE_FAILED; + priv->current = NULL; + + /* Notify status has changed */ + g_signal_emit (self, signals[STATUS_CHANGED_SIGNAL], 0, info->msg_id, info->status); - /* free */ - g_free(msg_uid); + /* free */ + g_free(msg_uid); + } } static void @@ -675,7 +700,7 @@ modest_tny_all_send_queues_get_msg_status (TnyHeader *header) 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)); + send_queue = modest_runtime_get_send_queue(TNY_TRANSPORT_ACCOUNT(account), TRUE); g_object_unref(account); queue_status = modest_tny_send_queue_get_msg_status (send_queue, msg_uid); @@ -749,9 +774,31 @@ modest_tny_send_queue_wakeup (ModestTnySendQueue *self) } /* Make changes persistent on disk */ - tny_folder_sync (priv->outbox, FALSE, NULL); + tny_folder_sync_async (priv->outbox, FALSE, NULL, NULL, NULL); /* Frees */ g_object_unref (iter); g_object_unref (G_OBJECT (headers)); } + +gboolean +modest_tny_send_queue_get_requested_send_receive (ModestTnySendQueue *self) +{ + ModestTnySendQueuePrivate *priv; + + g_return_val_if_fail (MODEST_IS_TNY_SEND_QUEUE (self), FALSE); + priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self); + + return priv->requested_send_receive; +} + +void +modest_tny_send_queue_set_requested_send_receive (ModestTnySendQueue *self, gboolean requested_send_receive) +{ + ModestTnySendQueuePrivate *priv; + + g_return_if_fail (MODEST_IS_TNY_SEND_QUEUE (self)); + priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self); + + priv->requested_send_receive = requested_send_receive; +}