X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-tny-send-queue.c;h=357aa3ea5c62c35f9a9550d34d58eb619fea5f62;hp=25afcc3a599193e066f576b38c62956ae9312429;hb=b3e33b42465084b4e1cf2dbf90302bd1b43d05ad;hpb=a8d4ea1b3505db4744746caadff3a24e9cfb7ef6 diff --git a/src/modest-tny-send-queue.c b/src/modest-tny-send-queue.c index 25afcc3..357aa3e 100644 --- a/src/modest-tny-send-queue.c +++ b/src/modest-tny-send-queue.c @@ -48,12 +48,28 @@ 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, 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); -static TnyFolder*modest_tny_send_queue_get_sentbox (TnySendQueue *self); +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); +static TnyFolder* modest_tny_send_queue_get_sentbox (TnySendQueue *self); /* list my signals */ enum { @@ -96,6 +112,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); } @@ -146,9 +164,8 @@ modest_tny_send_queue_cancel (TnySendQueue *self, gboolean remove, GError **err) 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); } @@ -172,17 +189,58 @@ modest_tny_send_queue_cancel (TnySendQueue *self, gboolean remove, GError **err) } 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 = MODEST_TNY_SEND_QUEUE_GET_PRIVATE(self); + TnyHeader *header = NULL; + SendInfo *info = NULL; + 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)); - TNY_CAMEL_SEND_QUEUE_CLASS(parent_class)->add_func (self, msg, err); /* FIXME */ + header = tny_msg_get_header (msg); + msg_id = modest_tny_send_queue_get_msg_id (header); +/* msg_id = tny_header_get_message_id (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) + { + info = existing->data; + info->status = MODEST_TNY_SEND_QUEUE_WAITING; + } + else + { + + info = g_slice_new (SendInfo); + + info->msg_id = strdup(msg_id); + info->status = MODEST_TNY_SEND_QUEUE_WAITING; + g_queue_push_tail (priv->queue, info); + } + + g_signal_emit (self, signals[STATUS_CHANGED], 0, info->msg_id, info->status); - /* We cannot access the uid of the message here because it might - * just have been created. Wait for it being added to outbox. */ + 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_camel_send_queue_add_async (TNY_CAMEL_SEND_QUEUE(self), + msg, + _on_added_to_outbox, + NULL, + NULL); +} + + static void _add_message (ModestTnySendQueue *self, TnyHeader *header) { @@ -191,7 +249,7 @@ _add_message (ModestTnySendQueue *self, TnyHeader *header) SendInfo *info = NULL; GList* existing = NULL; gchar* msg_uid = NULL; - ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_WAITING; + ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_UNKNOWN; gboolean editing = FALSE; g_return_if_fail (TNY_IS_SEND_QUEUE(self)); @@ -202,20 +260,20 @@ _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) 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) return; + if (editing) + break; /* Add new meesage info */ info = g_slice_new (SendInfo); @@ -224,11 +282,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); } @@ -279,61 +336,6 @@ modest_tny_send_queue_get_outbox (TnySendQueue *self) return folder; } -static void -modest_tny_send_queue_update(TnyFolderObserver *self, - TnyFolderChange *change) -{ - ModestTnySendQueuePrivate *priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE(self); - TnyHeader *header = NULL; - TnyMsg *msg = tny_folder_change_get_received_msg(change); - SendInfo *info = NULL; - GList* existing = NULL; - const gchar* msg_id = NULL; - TnyFolder* outbox = NULL; - - if(msg) - { - outbox = tny_send_queue_get_outbox(TNY_SEND_QUEUE(self)); - header = tny_msg_get_header(msg); - - msg_id = tny_header_get_message_id (header); - g_assert(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) - { - //g_assert(info->status == MODEST_TNY_SEND_QUEUE_SUSPENDED || - // info->status == MODEST_TNY_SEND_QUEUE_FAILED); - - info = existing->data; - info->status = MODEST_TNY_SEND_QUEUE_WAITING; - } - else - { - - info = g_slice_new (SendInfo); - - info->msg_id = strdup(msg_id); - info->status = MODEST_TNY_SEND_QUEUE_WAITING; - g_queue_push_tail (priv->queue, info); - } - - g_signal_emit (self, signals[STATUS_CHANGED], 0, info->msg_id, info->status); - - g_object_unref(G_OBJECT(msg)); - g_object_unref(G_OBJECT(header)); - g_object_unref(G_OBJECT(outbox)); - } -} - -static void -modest_tny_send_queue_folder_observer_init(gpointer g, gpointer iface_data) -{ - TnyFolderObserverIface *klass = (TnyFolderObserverIface *)g; - klass->update_func = modest_tny_send_queue_update; -} - GType modest_tny_send_queue_get_type (void) { @@ -353,18 +355,9 @@ modest_tny_send_queue_get_type (void) NULL }; - static const GInterfaceInfo tny_folder_observer_info = { - (GInterfaceInitFunc) modest_tny_send_queue_folder_observer_init, - NULL, - NULL - }; - my_type = g_type_register_static (TNY_TYPE_CAMEL_SEND_QUEUE, "ModestTnySendQueue", &my_info, 0); - - g_type_add_interface_static(my_type, TNY_TYPE_FOLDER_OBSERVER, - &tny_folder_observer_info); } return my_type; } @@ -380,7 +373,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; @@ -418,8 +410,6 @@ modest_tny_send_queue_finalize (GObject *obj) g_queue_foreach (priv->queue, (GFunc)modest_tny_send_queue_info_free, NULL); g_queue_free (priv->queue); - printf("Finalize called\n"); - G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -435,10 +425,6 @@ modest_tny_send_queue_new (TnyCamelTransportAccount *account) tny_camel_send_queue_set_transport_account (TNY_CAMEL_SEND_QUEUE(self), account); - /* TODO: Does this produce cyclic references? */ - tny_folder_add_observer(modest_tny_send_queue_get_outbox(TNY_SEND_QUEUE(self)), - TNY_FOLDER_OBSERVER(self)); - /* Connect signals to control when a msg is being or has been sent */ g_signal_connect (G_OBJECT(self), "msg-sending", G_CALLBACK(_on_msg_start_sending), @@ -520,31 +506,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; } @@ -570,13 +547,16 @@ _on_msg_start_sending (TnySendQueue *self, /* Get status info */ item = modest_tny_send_queue_lookup_info (MODEST_TNY_SEND_QUEUE (self), msg_id); - g_return_if_fail (item != NULL); - 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; + 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; + } /* free */ g_free (msg_id); @@ -591,24 +571,26 @@ _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); - - /* Get status info */ - item = modest_tny_send_queue_lookup_info (MODEST_TNY_SEND_QUEUE (self), msg_id); - g_return_if_fail(item != NULL); - /* Remove status info */ - modest_tny_send_queue_info_free (item->data); - g_queue_delete_link (priv->queue, item); - priv->current = NULL; + tny_header_set_flag (header, TNY_HEADER_FLAG_SEEN); - modest_platform_information_banner (NULL, NULL, _("mcen_ib_message_sent")); + /* Get status info */ + item = modest_tny_send_queue_lookup_info (MODEST_TNY_SEND_QUEUE (self), msg_id); + if (item) { + + /* 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); @@ -636,10 +618,8 @@ _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 */