From 552c5bdc8724e0a166337f9c6e6e78488bfa95e5 Mon Sep 17 00:00:00 2001 From: Javier Fernandez Garcia-Boente Date: Wed, 13 Jun 2007 08:48:42 +0000 Subject: [PATCH] * Added two new signal handlers to detect when messages are bieng processed to be sent and when they have been finnaly sent. * Add new dimming rules to detect sending operation in progress. * Fixes: NB#60176 pmo-trunk-r2194 --- src/maemo/modest-main-window-ui-dimming.h | 8 +- src/maemo/modest-main-window.c | 8 +- src/modest-tny-send-queue.c | 98 +++++++++++++++++- src/modest-tny-send-queue.h | 18 ++++ src/modest-ui-dimming-rules.c | 157 ++++++++++++++++++++--------- src/modest-ui-dimming-rules.h | 3 +- 6 files changed, 231 insertions(+), 61 deletions(-) diff --git a/src/maemo/modest-main-window-ui-dimming.h b/src/maemo/modest-main-window-ui-dimming.h index b4c278a..8602852 100644 --- a/src/maemo/modest-main-window-ui-dimming.h +++ b/src/maemo/modest-main-window-ui-dimming.h @@ -49,8 +49,8 @@ static const ModestDimmingEntry modest_main_window_menu_dimming_entries [] = { { "/MenuBar/ToolsMenu/ToolsAccountsMenu", NULL }, { "/MenuBar/ToolsMenu/ToolsSMTPServersMenu", G_CALLBACK(modest_ui_dimming_rules_on_tools_smtp_servers) }, { "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu", NULL }, - { "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveAllMenu", NULL }, - { "/MenuBar/ToolsMenu/ToolsSendReceiveCancelSendingMenu", NULL }, + { "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveAllMenu", G_CALLBACK(modest_ui_dimming_rules_on_send_receive) }, + { "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveCancelSendingMenu", G_CALLBACK(modest_ui_dimming_rules_on_cancel_sending) }, { "/MenuBar/ToolsMenu/ToolsContactsMenu", NULL }, { "/MenuBar/ToolsMenu/ToolsSearchMessagesMenu", NULL }, { "/MenuBar/ToolsMenu/ToolsHelpMenu", NULL }, @@ -69,7 +69,7 @@ static const ModestDimmingEntry modest_main_window_menu_dimming_entries [] = { { "/HeaderViewCSM/HeaderViewCSMCopy", NULL }, { "/HeaderViewCSM/HeaderViewCSMPaste", G_CALLBACK(modest_ui_dimming_rules_on_paste_msgs) }, { "/HeaderViewCSM/HeaderViewCSMDelete", G_CALLBACK(modest_ui_dimming_rules_on_delete_msg) }, - { "/HeaderViewCSM/HeaderViewCSMCancelSending", NULL }, + { "/HeaderViewCSM/HeaderViewCSMCancelSending", G_CALLBACK(modest_ui_dimming_rules_on_cancel_sending) }, { "/HeaderViewCSM/HeaderViewCSMHelp", NULL }, /* Contextual Menus (Folder View) */ @@ -96,7 +96,7 @@ static const ModestDimmingEntry modest_main_window_toolbar_dimming_entries [] = { "/ToolBar/ToolbarDeleteMessage", G_CALLBACK(modest_ui_dimming_rules_on_delete_msg) }, { "/ToolBar/ToolbarToggleView", NULL }, { "/ToolBar/ToolbarSort", G_CALLBACK(modest_ui_dimming_rules_on_sort) }, - { "/ToolBar/ToolbarSendReceive", NULL }, + { "/ToolBar/ToolbarSendReceive", G_CALLBACK(modest_ui_dimming_rules_on_send_receive) }, { "/ToolBar/ToolbarCancel", NULL }, }; diff --git a/src/maemo/modest-main-window.c b/src/maemo/modest-main-window.c index 63191d5..7202d4f 100644 --- a/src/maemo/modest-main-window.c +++ b/src/maemo/modest-main-window.c @@ -1410,8 +1410,8 @@ modest_main_window_notify_send_receive_initied (ModestMainWindow *self) action = modest_window_get_action (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveAllMenu"); gtk_action_set_sensitive (action, FALSE); - action = modest_window_get_action (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveCancelSendingMenu"); - gtk_action_set_sensitive (action, FALSE); +/* action = modest_window_get_action (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveCancelSendingMenu"); */ +/* gtk_action_set_sensitive (action, FALSE); */ widget = modest_window_get_action_widget (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsMenuAdditions"); gtk_widget_set_sensitive (widget, FALSE); } @@ -1426,8 +1426,8 @@ modest_main_window_notify_send_receive_completed (ModestMainWindow *self) action = modest_window_get_action (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveAllMenu"); gtk_action_set_sensitive (action, TRUE); - action = modest_window_get_action (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveCancelSendingMenu"); - gtk_action_set_sensitive (action, TRUE); +/* action = modest_window_get_action (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsSendReceiveCancelSendingMenu"); */ +/* gtk_action_set_sensitive (action, TRUE); */ widget = modest_window_get_action_widget (MODEST_WINDOW(self), "/MenuBar/ToolsMenu/ToolsSendReceiveMainMenu/ToolsMenuAdditions"); gtk_widget_set_sensitive (widget, TRUE); } diff --git a/src/modest-tny-send-queue.c b/src/modest-tny-send-queue.c index b1216be..01f4c77 100644 --- a/src/modest-tny-send-queue.c +++ b/src/modest-tny-send-queue.c @@ -40,6 +40,11 @@ static void modest_tny_send_queue_class_init (ModestTnySendQueueClass *klass); 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, guint processed, guint total); +static void _on_msg_has_been_sent (TnySendQueue *self, TnyMsg *msg, guint processed, guint total); + + /* list my signals */ enum { /* MY_SIGNAL_1, */ @@ -47,15 +52,15 @@ enum { LAST_SIGNAL }; -#if 0 typedef struct _ModestTnySendQueuePrivate ModestTnySendQueuePrivate; struct _ModestTnySendQueuePrivate { - /* empty */ + gchar *current_msg_id; + }; + #define MODEST_TNY_SEND_QUEUE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_TNY_SEND_QUEUE, \ ModestTnySendQueuePrivate)) -#endif /* globals */ static TnyCamelSendQueueClass *parent_class = NULL; @@ -168,18 +173,28 @@ modest_tny_send_queue_class_init (ModestTnySendQueueClass *klass) 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; - /* g_type_class_add_private (gobject_class, sizeof(ModestTnySendQueuePrivate)); */ + g_type_class_add_private (gobject_class, sizeof(ModestTnySendQueuePrivate)); } static void modest_tny_send_queue_instance_init (GTypeInstance *instance, gpointer g_class) { - + ModestTnySendQueuePrivate *priv; + + priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (instance); + priv->current_msg_id = NULL; + } static void modest_tny_send_queue_finalize (GObject *obj) { + ModestTnySendQueuePrivate *priv; + + priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (obj); + if (priv->current_msg_id != NULL) + g_free(priv->current_msg_id); + G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -194,6 +209,15 @@ modest_tny_send_queue_new (TnyCamelTransportAccount *account) tny_camel_send_queue_set_transport_account (TNY_CAMEL_SEND_QUEUE(self), 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); return self; } @@ -206,3 +230,67 @@ modest_tny_send_queue_try_to_send (ModestTnySendQueue* self) and check that it works, without creating a second worker. */ /* tny_camel_send_queue_flush (TNY_CAMEL_SEND_QUEUE(self)); */ } + +gboolean +modest_tny_send_queue_msg_is_being_sent (ModestTnySendQueue* self, + const gchar *msg_id) +{ + ModestTnySendQueuePrivate *priv; + + g_return_val_if_fail (msg_id != NULL, FALSE); + priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self); + + if (modest_tny_send_queue_sending_in_progress(self)) + return g_ascii_strcasecmp(priv->current_msg_id, msg_id); + else + return FALSE; +} + +gboolean +modest_tny_send_queue_sending_in_progress (ModestTnySendQueue* self) +{ + ModestTnySendQueuePrivate *priv; + + priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self); + + return priv->current_msg_id != NULL; +} + + +static void +_on_msg_start_sending (TnySendQueue *self, + TnyMsg *msg, + guint processed, + guint total) +{ + ModestTnySendQueuePrivate *priv; + TnyHeader *header = NULL; + + priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self); + + /* Delete previous msg_id */ + if (priv->current_msg_id != NULL) + g_free(priv->current_msg_id); + + /* Set current msg_id */ + header = tny_msg_get_header(msg); + priv->current_msg_id = g_strdup(tny_header_get_message_id (header)); +} + +static void +_on_msg_has_been_sent (TnySendQueue *self, + TnyMsg *msg, + guint processed, + guint total) +{ + ModestTnySendQueuePrivate *priv; + + priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self); + + /* Delete previous msg_id */ + if (priv->current_msg_id != NULL) + g_free(priv->current_msg_id); + + /* Unset current msg_id */ + priv->current_msg_id = NULL; +} diff --git a/src/modest-tny-send-queue.h b/src/modest-tny-send-queue.h index 41ecdfc..a82dcd2 100644 --- a/src/modest-tny-send-queue.h +++ b/src/modest-tny-send-queue.h @@ -93,6 +93,24 @@ ModestTnySendQueue* modest_tny_send_queue_new (TnyCamelTransportAccoun void modest_tny_send_queue_try_to_send (ModestTnySendQueue* self); +/** + * modest_tny_send_queue_sending_in_progress: + * @self: a valid #ModestTnySendQueue instance + * + * Checks if sending operation is currently in progress on @self send queue. + */ +gboolean modest_tny_send_queue_sending_in_progress (ModestTnySendQueue* self); + +/** + * modest_tny_send_queue_msg_is_being_sent: + * @self: a valid #ModestTnySendQueue instance + * @msg_id: the message id ti check. + * + * Checks if message identifies with @msg_id is currently being sent. + */ +gboolean modest_tny_send_queue_msg_is_being_sent (ModestTnySendQueue* self, const gchar *msg_id); + + G_END_DECLS #endif /* __MODEST_TNY_SEND_QUEUE_H__ */ diff --git a/src/modest-ui-dimming-rules.c b/src/modest-ui-dimming-rules.c index 8f9fbc7..36f3413 100644 --- a/src/modest-ui-dimming-rules.c +++ b/src/modest-ui-dimming-rules.c @@ -54,7 +54,8 @@ static gboolean _selected_folder_is_root (ModestMainWindow *win); static gboolean _selected_folder_is_empty (ModestMainWindow *win); static gboolean _msg_download_in_progress (ModestMsgViewWindow *win); static gboolean _msg_download_completed (ModestMainWindow *win); -static gboolean _msg_sent_in_progress (ModestWindow *win); +static gboolean _selected_msg_sent_in_progress (ModestWindow *win); +static gboolean _sending_in_progress (ModestWindow *win); static gboolean _marked_as_deleted (ModestWindow *win); @@ -200,7 +201,7 @@ modest_ui_dimming_rules_on_open_msg (ModestWindow *win, gpointer user_data) if (!dimmed) dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW(win), TRUE, user_data); if (!dimmed) { - dimmed = _msg_sent_in_progress (win); + dimmed = _selected_msg_sent_in_progress (win); if (dimmed) modest_dimming_rule_set_notification (rule, _("TEST")); } @@ -314,7 +315,7 @@ modest_ui_dimming_rules_on_delete_msg (ModestWindow *win, gpointer user_data) modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete")); } if (!dimmed) { - dimmed = _msg_sent_in_progress (win); + dimmed = _selected_msg_sent_in_progress (win); if (dimmed) modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_delete")); } @@ -613,7 +614,8 @@ modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data) } -gboolean modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data) +gboolean +modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data) { const gboolean dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), @@ -622,6 +624,36 @@ gboolean modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpoin return dimmed; } +gboolean +modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data) +{ + gboolean dimmed = FALSE; + + /* Check dimmed rule */ + if (!dimmed) + dimmed = !_sending_in_progress (win); + + return dimmed; +} + +gboolean +modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data) +{ + ModestDimmingRule *rule = NULL; + gboolean dimmed = FALSE; + + g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE); + rule = MODEST_DIMMING_RULE (user_data); + + /* Check dimmed rule */ + if (!dimmed) { + dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(), + TRUE); + modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined")); + } + + return dimmed; +} /* *********************** static utility functions ******************** */ @@ -1130,66 +1162,97 @@ _msg_download_completed (ModestMainWindow *win) } static gboolean -_msg_sent_in_progress (ModestWindow *win) +_selected_msg_sent_in_progress (ModestWindow *win) { -/* ModestTnySendQueue *send_queue = NULL; */ -/* GtkWidget *header_view = NULL; */ -/* ModestTnyAccountStore *acc_store = NULL; */ -/* TnyAccount *account = NULL; */ -/* TnyList *header_list = NULL; */ -/* TnyIterator *iter = NULL; */ -/* TnyHeader *header = NULL; */ -/* const gchar *account_name = NULL; */ + ModestTnySendQueue *send_queue = NULL; + GtkWidget *header_view = NULL; + ModestTnyAccountStore *acc_store = NULL; + TnyAccount *account = NULL; + TnyList *header_list = NULL; + TnyIterator *iter = NULL; + TnyHeader *header = NULL; + const gchar *account_name = NULL; gboolean result = FALSE; -/* gchar *id = NULL; */ + gchar *id = NULL; -/* g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE); */ + g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (win), FALSE); + + /* Get transport account */ + acc_store = modest_runtime_get_account_store(); + account_name = modest_window_get_active_account (win); -/* /\* Get transport account *\/ */ -/* acc_store = modest_runtime_get_account_store(); */ -/* account_name = modest_window_get_active_account (win); */ -/* account = modest_tny_account_store_get_transport_account_for_open_connection (acc_store, account_name); */ + /* If no account defined, this action must be always dimmed */ + if (account_name == NULL) return FALSE; + account = modest_tny_account_store_get_transport_account_for_open_connection (acc_store, account_name); + if (!TNY_IS_TRANSPORT_ACCOUNT (account)) return FALSE; -/* /\* Get send queue for current ransport account *\/ */ -/* send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT(account)); */ -/* g_return_val_if_fail (MODEST_IS_TNY_SEND_QUEUE (send_queue), FALSE); */ + /* Get send queue for current ransport account */ + send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT(account)); + g_return_val_if_fail (MODEST_IS_TNY_SEND_QUEUE (send_queue), FALSE); -/* if (MODEST_IS_MAIN_WINDOW(win)) { */ + if (MODEST_IS_MAIN_WINDOW(win)) { -/* /\* Get header view to check selected messages *\/ */ -/* header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win), */ -/* MODEST_WIDGET_TYPE_HEADER_VIEW); */ + /* Get header view to check selected messages */ + header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win), + MODEST_WIDGET_TYPE_HEADER_VIEW); -/* /\* Get selected headers *\/ */ -/* header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view)); */ + /* Get selected headers */ + header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view)); -/* /\* Get message header *\/ */ -/* if (!header_list) return FALSE; */ -/* iter = tny_list_create_iterator (header_list); */ -/* header = TNY_HEADER (tny_iterator_get_current (iter)); */ + /* Get message header */ + if (!header_list) return FALSE; + iter = tny_list_create_iterator (header_list); + header = TNY_HEADER (tny_iterator_get_current (iter)); -/* /\* Get message id *\/ */ -/* id = g_strdup(tny_header_get_message_id (header)); */ + /* Get message id */ + id = g_strdup(tny_header_get_message_id (header)); -/* } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) { */ + } else if (MODEST_IS_MSG_VIEW_WINDOW(win)) { -/* /\* Get message header *\/ */ -/* header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win)); */ + /* Get message header */ + header = modest_msg_view_window_get_header (MODEST_MSG_VIEW_WINDOW(win)); -/* /\* Get message id *\/ */ -/* id = g_strdup(tny_header_get_message_id (header)); */ -/* } */ + /* Get message id */ + id = g_strdup(tny_header_get_message_id (header)); + } -/* /\* Check if msg id is being processed inside send queue *\/ */ -/* result = modest_tny_send_queue_msg_is_being_sent (send_queue, id); */ + /* Check if msg id is being processed inside send queue */ + result = modest_tny_send_queue_msg_is_being_sent (send_queue, id); -/* /\* Free *\/ */ -/* g_free(id); */ -/* g_object_unref (header); */ -/* g_free(header_list); */ -/* g_free(iter); */ + /* Free */ + g_free(id); + g_object_unref (header); + g_free(header_list); + g_free(iter); return result; } +static gboolean +_sending_in_progress (ModestWindow *win) +{ + ModestTnySendQueue *send_queue = NULL; + ModestTnyAccountStore *acc_store = NULL; + TnyAccount *account = NULL; + const gchar *account_name = NULL; + gboolean result = FALSE; + + /* Get transport account */ + acc_store = modest_runtime_get_account_store(); + account_name = modest_window_get_active_account (win); + + /* If no account defined, this action must be always dimmed */ + if (account_name == NULL) return FALSE; + account = modest_tny_account_store_get_transport_account_for_open_connection (acc_store, account_name); + if (!TNY_IS_TRANSPORT_ACCOUNT (account)) return FALSE; + + /* Get send queue for current ransport account */ + send_queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT(account)); + g_return_val_if_fail (MODEST_IS_TNY_SEND_QUEUE (send_queue), FALSE); + + /* Check if send queue is perfimring any send operation */ + result = modest_tny_send_queue_sending_in_progress (send_queue); + + return result; +} diff --git a/src/modest-ui-dimming-rules.h b/src/modest-ui-dimming-rules.h index a744af5..5acc342 100644 --- a/src/modest-ui-dimming-rules.h +++ b/src/modest-ui-dimming-rules.h @@ -62,8 +62,9 @@ gboolean modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpoin gboolean modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data); gboolean modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data); gboolean modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data); - gboolean modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data); +gboolean modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data); +gboolean modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data); G_END_DECLS #endif -- 1.7.9.5