diff options
Diffstat (limited to 'shell/e-shell.c')
-rw-r--r-- | shell/e-shell.c | 111 |
1 files changed, 87 insertions, 24 deletions
diff --git a/shell/e-shell.c b/shell/e-shell.c index 57118a4e14..95303b8b39 100644 --- a/shell/e-shell.c +++ b/shell/e-shell.c @@ -46,7 +46,7 @@ struct _EShellPrivate { GHashTable *modules_by_name; GHashTable *modules_by_scheme; - gpointer preparing_for_offline; /* weak pointer */ + gpointer preparing_for_line_change; /* weak pointer */ guint auto_reconnect : 1; guint network_available : 1; @@ -65,6 +65,7 @@ enum { EVENT, HANDLE_URI, PREPARE_FOR_OFFLINE, + PREPARE_FOR_ONLINE, SEND_RECEIVE, WINDOW_CREATED, WINDOW_DESTROYED, @@ -164,27 +165,74 @@ static void shell_prepare_for_offline (EShell *shell) { /* Are preparations already in progress? */ - if (shell->priv->preparing_for_offline != NULL) + if (shell->priv->preparing_for_line_change != NULL) return; g_message ("Preparing for offline mode..."); - shell->priv->preparing_for_offline = + shell->priv->preparing_for_line_change = e_activity_new (_("Preparing to go offline...")); g_object_add_toggle_ref ( - G_OBJECT (shell->priv->preparing_for_offline), + G_OBJECT (shell->priv->preparing_for_line_change), (GToggleNotify) shell_ready_for_offline, shell); g_object_add_weak_pointer ( - G_OBJECT (shell->priv->preparing_for_offline), - &shell->priv->preparing_for_offline); + G_OBJECT (shell->priv->preparing_for_line_change), + &shell->priv->preparing_for_line_change); g_signal_emit ( shell, signals[PREPARE_FOR_OFFLINE], 0, - shell->priv->preparing_for_offline); + shell->priv->preparing_for_line_change); - g_object_unref (shell->priv->preparing_for_offline); + g_object_unref (shell->priv->preparing_for_line_change); +} + +static void +shell_ready_for_online (EShell *shell, + EActivity *activity, + gboolean is_last_ref) +{ + if (!is_last_ref) + return; + + e_activity_complete (activity); + + g_object_remove_toggle_ref ( + G_OBJECT (activity), (GToggleNotify) + shell_ready_for_online, shell); + + shell->priv->online_mode = TRUE; + g_object_notify (G_OBJECT (shell), "online-mode"); + + g_message ("Online preparations complete."); +} + +static void +shell_prepare_for_online (EShell *shell) +{ + /* Are preparations already in progress? */ + if (shell->priv->preparing_for_line_change != NULL) + return; + + g_message ("Preparing for online mode..."); + + shell->priv->preparing_for_line_change = + e_activity_new (_("Preparing to go online...")); + + g_object_add_toggle_ref ( + G_OBJECT (shell->priv->preparing_for_line_change), + (GToggleNotify) shell_ready_for_online, shell); + + g_object_add_weak_pointer ( + G_OBJECT (shell->priv->preparing_for_line_change), + &shell->priv->preparing_for_line_change); + + g_signal_emit ( + shell, signals[PREPARE_FOR_ONLINE], 0, + shell->priv->preparing_for_line_change); + + g_object_unref (shell->priv->preparing_for_line_change); } /* Helper for shell_query_module() */ @@ -535,8 +583,8 @@ shell_class_init (EShellClass *class) * the #EShellModule should reference the @activity until * preparations are complete, and then unreference the @activity. * This will delay Evolution from actually going to offline mode - * until the all modules have unreferenced @activity. - */ + * until all modules have unreferenced @activity. + **/ signals[PREPARE_FOR_OFFLINE] = g_signal_new ( "prepare-for-offline", G_OBJECT_CLASS_TYPE (object_class), @@ -547,6 +595,31 @@ shell_class_init (EShellClass *class) E_TYPE_ACTIVITY); /** + * EShell:prepare-for-online + * @shell: the #EShell which emitted the signal + * @activity: the #EActivity for offline preparations + * + * Emitted when the user elects to work online. An #EShellModule + * should listen for this signal and make preparations for working + * in online mode. + * + * If preparations for working online cannot immediately be + * completed (such as when re-connecting to a remote server), the + * #EShellModule should reference the @activity until preparations + * are complete, and then unreference the @activity. This will + * delay Evolution from actually going to online mode until all + * modules have unreferenced @activity. + **/ + signals[PREPARE_FOR_ONLINE] = g_signal_new ( + "prepare-for-online", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, + 0, NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + E_TYPE_ACTIVITY); + + /** * EShell:send-receive * @shell: the #EShell which emitted the signal * @parent: a parent #GtkWindow @@ -957,7 +1030,7 @@ e_shell_get_online_mode (EShell *shell) * @shell: an #EShell * @online_mode: whether to put Evolution in online mode * - * Puts Evolution in online or offline mode. + * Asynchronously places Evolution in online or offline mode. **/ void e_shell_set_online_mode (EShell *shell, @@ -968,20 +1041,10 @@ e_shell_set_online_mode (EShell *shell, if (online_mode == shell->priv->online_mode) return; - if (!online_mode && e_shell_get_network_available (shell)) + if (online_mode) + shell_prepare_for_online (shell); + else shell_prepare_for_offline (shell); - else { - EActivity *activity; - - shell->priv->online_mode = online_mode; - g_object_notify (G_OBJECT (shell), "online-mode"); - - /* If we're being forced offline and we've already started - * preparing for offline mode, cancel the preparations. */ - activity = shell->priv->preparing_for_offline; - if (!online_mode && activity != NULL) - e_activity_cancel (activity); - } } GtkWidget * |