X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-tny-send-queue.c;h=aa30899b498f2eed082eae0294967b386d0e85cf;hp=17a7b25f6c9647efa7ca506aa7319accbb0674dc;hb=a7decb707f783a7de18e83f4085a42d018b018c3;hpb=9b9efa32a2edc633130c4df8967dee7abc0ec41a diff --git a/src/modest-tny-send-queue.c b/src/modest-tny-send-queue.c index 17a7b25..aa30899 100644 --- a/src/modest-tny-send-queue.c +++ b/src/modest-tny-send-queue.c @@ -33,7 +33,12 @@ #include #include #include +#include +#include #include +#include +#include +#include #include #include /* strcmp */ @@ -43,8 +48,8 @@ static void modest_tny_send_queue_finalize (GObject *obj); static void modest_tny_send_queue_instance_init (GTypeInstance *instance, gpointer g_class); /* Signal handlers */ -/* static void _on_msg_start_sending (TnySendQueue *self, TnyMsg *msg, gpointer user_data); */ -static void _on_msg_has_been_sent (TnySendQueue *self, TnyMsg *msg, gpointer user_data); +static void _on_msg_start_sending (TnySendQueue *self, TnyHeader *header, TnyMsg *msg, int done, int total, gpointer user_data); +static void _on_msg_has_been_sent (TnySendQueue *self, TnyHeader *header, TnyMsg *msg, int done, int total, gpointer user_data); static void _on_msg_error_happened (TnySendQueue *self, TnyHeader *header, TnyMsg *msg, GError *err, gpointer user_data); static TnyFolder*modest_tny_send_queue_get_outbox (TnySendQueue *self); @@ -91,6 +96,8 @@ static guint signals[LAST_SIGNAL] = {0}; static int on_modest_tny_send_queue_compare_id(gconstpointer info, gconstpointer msg_id) { + g_return_val_if_fail (info && ((SendInfo*)info)->msg_id && msg_id, -1); + return strcmp( ((SendInfo*)info)->msg_id, msg_id); } @@ -115,6 +122,10 @@ modest_tny_send_queue_cancel (TnySendQueue *self, gboolean remove, GError **err) { ModestTnySendQueuePrivate *priv; SendInfo *info; + TnyIterator *iter = NULL; + TnyFolder *outbox = NULL; + TnyList *headers = tny_simple_list_new (); + TnyHeader *header = NULL; priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self); if(priv->current != NULL) @@ -130,7 +141,21 @@ 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) { + if (!remove) { + outbox = modest_tny_send_queue_get_outbox (TNY_SEND_QUEUE(self)); + 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); + tny_iterator_next (iter); + g_object_unref (header); + } + } + g_queue_foreach (priv->queue, (GFunc)modest_tny_send_queue_info_free, NULL); g_queue_free (priv->queue); priv->queue = g_queue_new(); @@ -138,32 +163,34 @@ modest_tny_send_queue_cancel (TnySendQueue *self, gboolean remove, GError **err) /* Dont call super class implementaiton, becasue camel removes messages from outbox */ TNY_CAMEL_SEND_QUEUE_CLASS(parent_class)->cancel_func (self, remove, err); /* FIXME */ + + frees: + if (headers != NULL) + g_object_unref (G_OBJECT (headers)); + if (outbox != NULL) + g_object_unref (G_OBJECT (outbox)); + if (iter != NULL) + g_object_unref (iter); } static void -modest_tny_send_queue_add (TnySendQueue *self, TnyMsg *msg, GError **err) +_on_added_to_outbox (TnySendQueue *self, gboolean cancelled, TnyMsg *msg, GError *err, gpointer user_data) { - ModestTnySendQueuePrivate *priv; - TnyHeader *header; + ModestTnySendQueuePrivate *priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE(self); + TnyHeader *header = NULL; SendInfo *info = NULL; - GList* existing; - const gchar* msg_id; + GList* existing = NULL; + const gchar* msg_id = NULL; g_return_if_fail (TNY_IS_SEND_QUEUE(self)); g_return_if_fail (TNY_IS_CAMEL_MSG(msg)); - priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self); header = tny_msg_get_header (msg); - - /* FIXME: do something smart here... */ - - /* Note that this call actually sets the message id to something - * sensible. */ - TNY_CAMEL_SEND_QUEUE_CLASS(parent_class)->add_func (self, msg, err); /* FIXME */ - - /* Check whether the mail is already in the queue */ + msg_id = modest_tny_send_queue_get_msg_id (header); /* msg_id = tny_header_get_message_id (header); */ - msg_id = tny_header_get_uid (header); + g_return_if_fail(msg_id != NULL); + + /* Put newly added message in WAITING state */ existing = modest_tny_send_queue_lookup_info (MODEST_TNY_SEND_QUEUE(self), msg_id); if(existing != NULL) { @@ -184,16 +211,34 @@ modest_tny_send_queue_add (TnySendQueue *self, TnyMsg *msg, GError **err) } g_signal_emit (self, signals[STATUS_CHANGED], 0, info->msg_id, info->status); + + g_object_unref(G_OBJECT(header)); } +void +modest_tny_send_queue_add (ModestTnySendQueue *self, TnyMsg *msg, GError **err) +{ + g_return_if_fail (MODEST_IS_TNY_SEND_QUEUE(self)); + g_return_if_fail (TNY_IS_CAMEL_MSG(msg)); + + tny_send_queue_add_async (TNY_SEND_QUEUE(self), + msg, + _on_added_to_outbox, + NULL, + NULL); +} + + static void _add_message (ModestTnySendQueue *self, TnyHeader *header) { + ModestWindowMgr *mgr = NULL; ModestTnySendQueuePrivate *priv; SendInfo *info = NULL; GList* existing = NULL; gchar* msg_uid = NULL; ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_WAITING; + gboolean editing = FALSE; g_return_if_fail (TNY_IS_SEND_QUEUE(self)); g_return_if_fail (TNY_IS_HEADER(header)); @@ -206,10 +251,20 @@ _add_message (ModestTnySendQueue *self, TnyHeader *header) case MODEST_TNY_SEND_QUEUE_UNKNONW: case MODEST_TNY_SEND_QUEUE_SUSPENDED: case MODEST_TNY_SEND_QUEUE_FAILED: - tny_header_unset_flags (header, TNY_HEADER_FLAG_PRIORITY); + 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) return; - + if(existing != NULL) + break; + + /* Check if its being edited */ + mgr = modest_runtime_get_window_mgr (); + editing = modest_window_mgr_find_registered_header (mgr, header, NULL); + if (editing) + break; + /* Add new meesage info */ info = g_slice_new (SendInfo); info->msg_id = strdup(msg_uid); @@ -217,11 +272,10 @@ _add_message (ModestTnySendQueue *self, TnyHeader *header) g_queue_push_tail (priv->queue, info); break; default: - goto frees; + break; } /* Free */ - frees: g_free(msg_uid); } @@ -290,6 +344,7 @@ modest_tny_send_queue_get_type (void) (GInstanceInitFunc) modest_tny_send_queue_instance_init, NULL }; + my_type = g_type_register_static (TNY_TYPE_CAMEL_SEND_QUEUE, "ModestTnySendQueue", &my_info, 0); @@ -308,7 +363,6 @@ modest_tny_send_queue_class_init (ModestTnySendQueueClass *klass) parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = modest_tny_send_queue_finalize; - TNY_CAMEL_SEND_QUEUE_CLASS(klass)->add_func = modest_tny_send_queue_add; TNY_CAMEL_SEND_QUEUE_CLASS(klass)->get_outbox_func = modest_tny_send_queue_get_outbox; TNY_CAMEL_SEND_QUEUE_CLASS(klass)->get_sentbox_func = modest_tny_send_queue_get_sentbox; TNY_CAMEL_SEND_QUEUE_CLASS(klass)->cancel_func = modest_tny_send_queue_cancel; @@ -362,14 +416,9 @@ modest_tny_send_queue_new (TnyCamelTransportAccount *account) account); /* Connect signals to control when a msg is being or has been sent */ - /* TODO: this signal was implemented in tinymail camel send queue, but im - waiting for implement some unit tests nbefore commited changes */ -/* if (FALSE) { */ -/* g_signal_connect (G_OBJECT(self), "msg-sending", */ -/* G_CALLBACK(_on_msg_start_sending), */ -/* NULL); */ -/* } */ - + g_signal_connect (G_OBJECT(self), "msg-sending", + G_CALLBACK(_on_msg_start_sending), + NULL); g_signal_connect (G_OBJECT(self), "msg-sent", G_CALLBACK(_on_msg_has_been_sent), NULL); @@ -391,22 +440,34 @@ modest_tny_send_queue_try_to_send (ModestTnySendQueue* self) GError *err = NULL; outbox = modest_tny_send_queue_get_outbox (TNY_SEND_QUEUE(self)); + if (!outbox) + return; + tny_folder_get_headers (outbox, headers, TRUE, &err); - if (err != NULL) goto frees; + 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)); - _add_message (self, header); + header = TNY_HEADER (tny_iterator_get_current (iter)); + if (header) { + _add_message (self, header); + g_object_unref (header); + } + tny_iterator_next (iter); - g_object_unref (header); } /* Flush send queue */ tny_camel_send_queue_flush (TNY_CAMEL_SEND_QUEUE(self)); frees: - g_object_unref (G_OBJECT (headers)); - g_object_unref (G_OBJECT (outbox)); + if (headers != NULL) + g_object_unref (G_OBJECT (headers)); + if (outbox != NULL) + g_object_unref (G_OBJECT (outbox)); + if (iter != NULL) + g_object_unref (iter); } gboolean @@ -448,78 +509,99 @@ modest_tny_send_queue_get_msg_id (TnyHeader *header) /* Get message uid */ uid = tny_header_get_uid (header); - tmp = g_strsplit (uid, "__", 2); - if (tmp[1] != NULL) - msg_uid = g_strconcat (tmp[0], "_", NULL); - else - msg_uid = g_strdup(tmp[0]); - - /* free */ - g_strfreev(tmp); + 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); + } return msg_uid; } -/* static void */ -/* _on_msg_start_sending (TnySendQueue *self, */ -/* TnyMsg *msg, */ -/* gpointer user_data) */ -/* { */ -/* ModestTnySendQueuePrivate *priv; */ -/* TnyHeader *header; */ -/* GList *item; */ -/* SendInfo *info; */ - -/* priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self); */ - -/* header = tny_msg_get_header(msg); */ -/* item = modest_tny_send_queue_lookup_info (MODEST_TNY_SEND_QUEUE (self), tny_header_get_message_id (header)); */ +static void +_on_msg_start_sending (TnySendQueue *self, + TnyHeader *header, + TnyMsg *msg, + int done, + int total, + gpointer user_data) +{ + ModestTnySendQueuePrivate *priv = NULL; + GList *item = NULL; + SendInfo *info = NULL; + gchar *msg_id = NULL; -/* if (item != NULL) */ -/* { */ -/* info = item->data; */ -/* info->status = MODEST_TNY_SEND_QUEUE_SENDING; */ + priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self); + + /* Get message uid */ + msg_id = modest_tny_send_queue_get_msg_id (header); -/* g_signal_emit (self, signals[STATUS_CHANGED], 0, info->msg_id, info->status); */ -/* } */ + /* 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 { + info = item->data; + info->status = MODEST_TNY_SEND_QUEUE_SENDING; + + /* Set current status item */ + g_signal_emit (self, signals[STATUS_CHANGED], 0, info->msg_id, info->status); + priv->current = item; + } -/* priv->current = item; */ -/* } */ + /* free */ + g_free (msg_id); +} static void _on_msg_has_been_sent (TnySendQueue *self, + TnyHeader *header, TnyMsg *msg, + int done, + int total, gpointer user_data) { ModestTnySendQueuePrivate *priv; - TnyHeader *header; GList *item; + gchar *msg_id = NULL; priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self); - header = tny_msg_get_header (msg); + /* 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); + if (!item) + g_warning ("%s: item should not be NULL", __FUNCTION__); + else { - /* TODO: Use this version as soon as the msg-sending - * notification works */ -#if 0 - item = priv->current; - g_assert(item != NULL); -#else - item = modest_tny_send_queue_lookup_info (MODEST_TNY_SEND_QUEUE (self), tny_header_get_message_id(header)); - g_assert(item != NULL); -#endif - - modest_tny_send_queue_info_free (item->data); - g_queue_delete_link (priv->queue, item); - priv->current = NULL; + /* Remove status info */ + modest_tny_send_queue_info_free (item->data); + g_queue_delete_link (priv->queue, item); + priv->current = NULL; + + modest_platform_information_banner (NULL, NULL, _("mcen_ib_message_sent")); + } + + /* free */ + g_free(msg_id); } -static void _on_msg_error_happened (TnySendQueue *self, - TnyHeader *header, - TnyMsg *msg, - GError *err, - gpointer user_data) +static void +_on_msg_error_happened (TnySendQueue *self, + TnyHeader *header, + TnyMsg *msg, + GError *err, + gpointer user_data) { ModestTnySendQueuePrivate *priv = NULL; SendInfo *info = NULL; @@ -536,10 +618,8 @@ static void _on_msg_error_happened (TnySendQueue *self, info = g_slice_new (SendInfo); info->msg_id = strdup(msg_uid); g_queue_push_tail (priv->queue, info); - } - else { + } else info = item->data; - } /* Keep in queue so that we remember that the opertion has failed */ /* and was not just cancelled */