X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-tny-send-queue.c;h=b5a430d4f57ac2bf2b8f0f5651b30f3594a1372d;hp=9fec6ce72205f08d2d42f3073a325ace1d961389;hb=85b45045c6b46f9a8e3f2e4b5d5500be17892e42;hpb=62f8285e03dc843ff4cdfd88e61860d73aed7c54 diff --git a/src/modest-tny-send-queue.c b/src/modest-tny-send-queue.c index 9fec6ce..b5a430d 100644 --- a/src/modest-tny-send-queue.c +++ b/src/modest-tny-send-queue.c @@ -113,6 +113,8 @@ struct _ModestTnySendQueuePrivate { gboolean requested_send_receive; gboolean sending; + + GSList *sighandlers; }; #define MODEST_TNY_SEND_QUEUE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ @@ -407,6 +409,7 @@ modest_tny_send_queue_instance_init (GTypeInstance *instance, gpointer g_class) priv->outbox = NULL; priv->sentbox = NULL; priv->sending = FALSE; + priv->sighandlers = NULL; } static void @@ -416,6 +419,9 @@ modest_tny_send_queue_finalize (GObject *obj) priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (obj); + modest_signal_mgr_disconnect_all_and_destroy (priv->sighandlers); + priv->sighandlers = NULL; + g_queue_foreach (priv->queue, (GFunc)modest_tny_send_queue_info_free, NULL); g_queue_free (priv->queue); @@ -439,6 +445,7 @@ new_queue_get_headers_async_cb (TnyFolder *folder, ModestTnySendQueue *self; TnyIterator *iter; GetHeadersInfo *info; + ModestMailOperation *wakeup_op; info = (GetHeadersInfo *) user_data; self = MODEST_TNY_SEND_QUEUE (info->queue); @@ -457,7 +464,10 @@ new_queue_get_headers_async_cb (TnyFolder *folder, } /* Reenable suspended items */ - modest_tny_send_queue_wakeup (self); + wakeup_op = modest_mail_operation_new (NULL); + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), + wakeup_op); + modest_mail_operation_queue_wakeup (wakeup_op, MODEST_TNY_SEND_QUEUE (self)); /* Frees */ g_object_unref (iter); @@ -483,9 +493,9 @@ modest_tny_send_queue_new (TnyCamelTransportAccount *account) ModestTnySendQueuePrivate *priv = NULL; TnyList *headers = NULL; GetHeadersInfo *info; - + g_return_val_if_fail (TNY_IS_CAMEL_TRANSPORT_ACCOUNT(account), NULL); - + self = MODEST_TNY_SEND_QUEUE(g_object_new(MODEST_TYPE_TNY_SEND_QUEUE, NULL)); /* Set outbox and sentbox */ @@ -503,24 +513,27 @@ modest_tny_send_queue_new (TnyCamelTransportAccount *account) } /* 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), - NULL); - g_signal_connect (G_OBJECT(self), "msg-sent", - G_CALLBACK(_on_msg_has_been_sent), - NULL); - g_signal_connect (G_OBJECT(self), "error-happened", - G_CALLBACK(_on_msg_error_happened), - NULL); - - g_signal_connect (G_OBJECT (self), "queue-start", - G_CALLBACK (_on_queue_start), - NULL); - - g_signal_connect (G_OBJECT (self), "queue-stop", - G_CALLBACK (_on_queue_stop), - NULL); - + priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, + G_OBJECT(self), + "msg-sending", + G_CALLBACK(_on_msg_start_sending), + NULL); + priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, + G_OBJECT(self), "msg-sent", + G_CALLBACK(_on_msg_has_been_sent), + NULL); + priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, + G_OBJECT(self), "error-happened", + G_CALLBACK(_on_msg_error_happened), + NULL); + priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, + G_OBJECT (self), "queue-start", + G_CALLBACK (_on_queue_start), + NULL); + priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, + G_OBJECT (self), "queue-stop", + G_CALLBACK (_on_queue_stop), + NULL); priv->requested_send_receive = FALSE; headers = tny_simple_list_new (); @@ -699,7 +712,7 @@ _on_msg_error_happened (TnySendQueue *self, g_free(msg_uid); return; } - + info = item->data; /* Keep in queue so that we remember that the opertion has failed */ @@ -707,37 +720,10 @@ _on_msg_error_happened (TnySendQueue *self, if (err->code == TNY_SYSTEM_ERROR_CANCEL) { info->status = MODEST_TNY_SEND_QUEUE_SUSPENDED; } else { - if (err->code == TNY_SERVICE_ERROR_CONNECT) { - TnyCamelTransportAccount* transport; - TnyTransportAccount *conn_specific; - - transport = tny_camel_send_queue_get_transport_account (TNY_CAMEL_SEND_QUEUE (self)); - if (transport) { - gchar *message; - ModestTnyAccountStore *acc_store; - const gchar *acc_name; - - acc_store = modest_runtime_get_account_store(); - acc_name = modest_tny_account_get_parent_modest_account_name_for_server_account (TNY_ACCOUNT (transport)); - conn_specific = (TnyTransportAccount *) - modest_tny_account_store_get_transport_account_for_open_connection (acc_store, acc_name); - if (conn_specific) { - message = g_strdup_printf (_("emev_ib_ui_smtp_server_invalid"), - tny_account_get_hostname (TNY_ACCOUNT (conn_specific))); - g_object_unref (conn_specific); - } else { - message = g_strdup_printf (_("emev_ib_ui_smtp_server_invalid"), - tny_account_get_hostname (TNY_ACCOUNT (transport))); - } - modest_platform_run_alert_dialog (message, FALSE); - g_free (message); - g_object_unref (transport); - } - } 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); @@ -846,6 +832,24 @@ modest_tny_all_send_queues_get_msg_status (TnyHeader *header) return status; } +typedef struct _WakeupHelper { + ModestTnySendQueue *self; + ModestTnySendQueueWakeupFunc callback; + gpointer userdata; +} WakeupHelper; + +static void +wakeup_sync_cb (TnyFolder *self, gboolean cancelled, GError *err, gpointer userdata) +{ + WakeupHelper *helper = (WakeupHelper *) userdata; + + if (helper->callback) { + helper->callback (helper->self, cancelled, err, helper->userdata); + } + g_object_unref (helper->self); + g_slice_free (WakeupHelper, helper); +} + static void wakeup_get_headers_async_cb (TnyFolder *folder, gboolean cancelled, @@ -856,13 +860,19 @@ wakeup_get_headers_async_cb (TnyFolder *folder, ModestTnySendQueue *self; ModestTnySendQueuePrivate *priv; TnyIterator *iter; + WakeupHelper *helper = (WakeupHelper *) user_data; - self = MODEST_TNY_SEND_QUEUE (user_data); + self = MODEST_TNY_SEND_QUEUE (helper->self); priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self); if (cancelled || err) { g_debug ("Failed to wake up the headers of the send queue"); g_object_unref (self); + if (helper->callback) { + helper->callback (helper->self, cancelled, err, helper->userdata); + } + g_object_unref (helper->self); + g_slice_free (WakeupHelper, helper); return; } @@ -900,29 +910,34 @@ wakeup_get_headers_async_cb (TnyFolder *folder, } /* Make changes persistent on disk */ - tny_folder_sync_async (priv->outbox, FALSE, NULL, NULL, NULL); + tny_folder_sync_async (priv->outbox, FALSE, wakeup_sync_cb, NULL, helper); /* Frees */ g_object_unref (iter); g_object_unref (headers); - g_object_unref (self); } - void -modest_tny_send_queue_wakeup (ModestTnySendQueue *self) +modest_tny_send_queue_wakeup (ModestTnySendQueue *self, + ModestTnySendQueueWakeupFunc callback, + gpointer userdata) { ModestTnySendQueuePrivate *priv; TnyList *headers; + WakeupHelper *helper; g_return_if_fail (MODEST_IS_TNY_SEND_QUEUE (self)); - priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self); + helper = g_slice_new (WakeupHelper); + helper->self = g_object_ref (self); + helper->callback = callback; + helper->userdata = userdata; + headers = tny_simple_list_new (); tny_folder_get_headers_async (priv->outbox, headers, TRUE, wakeup_get_headers_async_cb, - NULL, g_object_ref (self)); + NULL, helper); } gboolean