diff options
author | Matthew Barnes <mbarnes@redhat.com> | 2010-09-03 01:21:08 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@redhat.com> | 2010-09-03 01:37:31 +0800 |
commit | 429234ff213ba04b6d0b02a28ed68aaa8af7c02c (patch) | |
tree | 69fd485d98a78148137ab29e5c1e8d16add7c0f1 /composer | |
parent | cccdb143a571cde36db9fe906864647aab546cff (diff) | |
download | gsoc2013-evolution-429234ff213ba04b6d0b02a28ed68aaa8af7c02c.tar gsoc2013-evolution-429234ff213ba04b6d0b02a28ed68aaa8af7c02c.tar.gz gsoc2013-evolution-429234ff213ba04b6d0b02a28ed68aaa8af7c02c.tar.bz2 gsoc2013-evolution-429234ff213ba04b6d0b02a28ed68aaa8af7c02c.tar.lz gsoc2013-evolution-429234ff213ba04b6d0b02a28ed68aaa8af7c02c.tar.xz gsoc2013-evolution-429234ff213ba04b6d0b02a28ed68aaa8af7c02c.tar.zst gsoc2013-evolution-429234ff213ba04b6d0b02a28ed68aaa8af7c02c.zip |
Convert composer autosave to an EExtension.
Given the way the autosave feature was awkwardly bolted on to the
composer, an EExtension seemed like a natural fit. And it helped
clean up some object lifecycle hacks (and bugs).
What we have now is a new module consisting of two EExtensions:
EComposerAutosave extends EMsgComposer and determines when to
kick off an asynchronous autosave operation.
EComposerRegistry extends EShell and offers to restore orphaned
autosave files on startup (which is also asynchronous now).
e-autosave-utils.c holds the actual asynchronous functions and a few
other miscellaneous utility functions.
Source code for the new module lives in /modules/composer-autosave.
Diffstat (limited to 'composer')
-rw-r--r-- | composer/Makefile.am | 2 | ||||
-rw-r--r-- | composer/e-composer-autosave.c | 511 | ||||
-rw-r--r-- | composer/e-composer-autosave.h | 45 | ||||
-rw-r--r-- | composer/e-composer-private.h | 1 | ||||
-rw-r--r-- | composer/e-msg-composer.c | 142 | ||||
-rw-r--r-- | composer/e-msg-composer.h | 5 |
6 files changed, 17 insertions, 689 deletions
diff --git a/composer/Makefile.am b/composer/Makefile.am index 68a7ec142c..5caea41ee7 100644 --- a/composer/Makefile.am +++ b/composer/Makefile.am @@ -18,7 +18,6 @@ libcomposerinclude_HEADERS = \ e-composer-text-header.h \ e-composer-common.h \ e-composer-actions.h \ - e-composer-autosave.h \ e-msg-composer.h libcomposer_la_CPPFLAGS = \ @@ -43,7 +42,6 @@ libcomposer_la_CPPFLAGS = \ libcomposer_la_SOURCES = \ $(libcomposerinclude_HEADERS) \ e-composer-actions.c \ - e-composer-autosave.c \ e-composer-header.c \ e-composer-header-table.c \ e-composer-from-header.c \ diff --git a/composer/e-composer-autosave.c b/composer/e-composer-autosave.c deleted file mode 100644 index 82a44d570a..0000000000 --- a/composer/e-composer-autosave.c +++ /dev/null @@ -1,511 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with the program; if not, see <http://www.gnu.org/licenses/> - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - */ - -#include "e-composer-autosave.h" - -#include <errno.h> -#include <sys/stat.h> -#include <glib/gi18n.h> -#include <glib/gstdio.h> - -#include <e-util/e-alert-dialog.h> -#include <e-util/e-util.h> - -#define AUTOSAVE_PREFIX ".evolution-composer.autosave" -#define AUTOSAVE_SEED AUTOSAVE_PREFIX "-XXXXXX" -#define AUTOSAVE_INTERVAL 60 /* seconds */ - -typedef struct _AutosaveState AutosaveState; - -struct _AutosaveState { - EMsgComposer *composer; - GFile *file; - gboolean changed; - guint source_id; /* timeout source ID */ - gboolean enabled; - gboolean error_shown; -}; - -static GList *autosave_registry; - -static void composer_changed_cb (EMsgComposer *composer); - -static EMsgComposer * -composer_autosave_registry_lookup (const gchar *basename) -{ - GList *iter; - - /* Find the composer with the given autosave filename. */ - for (iter = autosave_registry; iter != NULL; iter = iter->next) { - EMsgComposer *composer = iter->data; - AutosaveState *state; - gchar *_basename; - - state = g_object_get_data (G_OBJECT (composer), "autosave"); - if (state == NULL || state->file == NULL) - continue; - - _basename = g_file_get_basename (state->file); - if (strcmp (_basename, basename) == 0) { - g_free (_basename); - return composer; - } - g_free (_basename); - } - - return NULL; -} - -static AutosaveState * -composer_autosave_state_new (EMsgComposer *composer) -{ - AutosaveState *state; - - state = g_slice_new0 (AutosaveState); - state->enabled = TRUE; - state->changed = FALSE; - state->source_id = 0; - state->composer = composer; - - g_signal_connect ( - composer, "notify::changed", - G_CALLBACK (composer_changed_cb), NULL); - - return state; -} - -static void -composer_autosave_state_free (AutosaveState *state) -{ - if (state->source_id) - g_source_remove (state->source_id); - if (state->file) - g_object_unref (state->file); - g_slice_free (AutosaveState, state); -} - -static gboolean -composer_autosave_state_open (AutosaveState *state, - GError **error) -{ - const gchar *user_data_dir; - gchar *path; - gint fd; - - if (state->file != NULL) - return TRUE; - - user_data_dir = e_get_user_data_dir (); - path = g_build_filename (user_data_dir, AUTOSAVE_SEED, NULL); - - /* Since GIO doesn't have support for creating temporary files - * from a template (and in a given directory), we have to use - * g_mkstemp(), which brings a small risk of overwriting another - * autosave file. The risk is, however, miniscule. */ - errno = 0; - fd = g_mkstemp (path); - if (fd == -1) { - g_set_error ( - error, G_FILE_ERROR, - g_file_error_from_errno (errno), - "%s", g_strerror (errno)); - g_free (path); - return FALSE; - } - - close (fd); - - /* Create the GFile */ - state->file = g_file_new_for_path (path); - g_free (path); - - return TRUE; -} - -static void -composer_autosave_finish_cb (EMsgComposer *composer, - GAsyncResult *result) -{ - AutosaveState *state; - GError *error = NULL; - - state = g_object_get_data (G_OBJECT (composer), "autosave"); - g_return_if_fail (state != NULL); - - e_composer_autosave_snapshot_finish (composer, result, &error); - - if (error != NULL) { - gchar *basename; - - if (G_IS_FILE (state->file)) - basename = g_file_get_basename (state->file); - else - basename = g_strdup (" "); - - /* Only show one error dialog at a - * time to avoid cascading dialogs. */ - if (!state->error_shown) { - state->error_shown = TRUE; - e_alert_run_dialog_for_args ( - GTK_WINDOW (composer), - "mail-composer:no-autosave", - basename, error->message, NULL); - state->error_shown = FALSE; - } else - g_warning ("%s: %s", basename, error->message); - - g_free (basename); - g_error_free (error); - } -} - -static gboolean -composer_autosave_timeout (EMsgComposer *composer) -{ - AutosaveState *state; - - g_return_val_if_fail (composer != NULL, FALSE); - g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE); - - state = g_object_get_data (G_OBJECT (composer), "autosave"); - g_return_val_if_fail (state != NULL, FALSE); - g_return_val_if_fail (state->composer == composer, FALSE); - - if (!state->changed) { - state->source_id = 0; - return FALSE; - } - - composer = state->composer; - - if (e_composer_autosave_get_enabled (composer)) { - state->changed = FALSE; - e_composer_autosave_snapshot_async ( - composer, (GAsyncReadyCallback) - composer_autosave_finish_cb, NULL); - } - - return TRUE; -} - -static void -composer_changed_cb (EMsgComposer *composer) -{ - AutosaveState *state; - - g_return_if_fail (composer != NULL); - g_return_if_fail (E_IS_MSG_COMPOSER (composer)); - - state = g_object_get_data (G_OBJECT (composer), "autosave"); - g_return_if_fail (state != NULL); - g_return_if_fail (state->composer == composer); - - g_object_get (G_OBJECT (composer), "changed", &state->changed, NULL); - - if (state->changed && state->source_id == 0) { - state->source_id = g_timeout_add_seconds ( - AUTOSAVE_INTERVAL, (GSourceFunc) - composer_autosave_timeout, state->composer); - } -} - -static void -composer_autosave_notify (gpointer unused, - GObject *where_the_object_was) -{ - /* Remove the dead composer from the registry. */ - autosave_registry = g_list_remove ( - autosave_registry, where_the_object_was); -} - -GList * -e_composer_autosave_find_orphans (GError **error) -{ - GDir *dir; - const gchar *dirname; - const gchar *basename; - GList *orphans = NULL; - - dirname = e_get_user_data_dir (); - dir = g_dir_open (dirname, 0, error); - if (dir == NULL) - return NULL; - - /* Scan the user directory for autosave files. */ - while ((basename = g_dir_read_name (dir)) != NULL) { - const gchar *errmsg; - gchar *filename; - struct stat st; - - /* Is this an autosave file? */ - if (!g_str_has_prefix (basename, AUTOSAVE_PREFIX)) - continue; - - /* Is this an orphaned autosave file? */ - if (composer_autosave_registry_lookup (basename) != NULL) - continue; - - filename = g_build_filename (dirname, basename, NULL); - - /* Try to examine the autosave file. Failure here - * is non-fatal; just emit a warning and move on. */ - errno = 0; - if (g_stat (filename, &st) < 0) { - errmsg = g_strerror (errno); - g_warning ("%s: %s", filename, errmsg); - g_free (filename); - continue; - } - - /* If the file is empty, delete it. Failure here - * is non-fatal; just emit a warning and move on. */ - if (st.st_size == 0) { - errno = 0; - if (g_unlink (filename) < 0) { - errmsg = g_strerror (errno); - g_warning ("%s: %s", filename, errmsg); - } - g_free (filename); - continue; - } - - orphans = g_list_prepend (orphans, filename); - } - - g_dir_close (dir); - - return g_list_reverse (orphans); -} - -void -e_composer_autosave_register (EMsgComposer *composer) -{ - g_return_if_fail (E_IS_MSG_COMPOSER (composer)); - - g_object_set_data_full ( - G_OBJECT (composer), "autosave", - composer_autosave_state_new (composer), - (GDestroyNotify) composer_autosave_state_free); - - autosave_registry = g_list_prepend (autosave_registry, composer); - - g_object_weak_ref ( - G_OBJECT (composer), (GWeakNotify) - composer_autosave_notify, NULL); -} - -void -e_composer_autosave_unregister (EMsgComposer *composer) -{ - AutosaveState *state; - - g_return_if_fail (E_IS_MSG_COMPOSER (composer)); - - state = g_object_get_data (G_OBJECT (composer), "autosave"); - if (state == NULL || state->file == NULL) - return; - - g_file_delete (state->file, NULL, NULL); - - g_object_set_data (G_OBJECT (composer), "autosave", NULL); -} - -static void -autosave_snapshot_splice_cb (GOutputStream *output_stream, - GAsyncResult *result, - GSimpleAsyncResult *simple) -{ - GError *error = NULL; - - g_output_stream_splice_finish (output_stream, result, &error); - - if (error != NULL) { - g_simple_async_result_set_from_error (simple, error); - g_error_free (error); - } - - g_simple_async_result_complete (simple); - g_object_unref (simple); -} - -static void -autosave_snapshot_cb (GFile *file, - GAsyncResult *result, - GSimpleAsyncResult *simple) -{ - GObject *object; - EMsgComposer *composer; - CamelMimeMessage *message; - GFileOutputStream *output_stream; - GInputStream *input_stream; - CamelStream *camel_stream; - GByteArray *buffer; - GError *error = NULL; - - object = g_async_result_get_source_object (G_ASYNC_RESULT (simple)); - - output_stream = g_file_replace_finish (file, result, &error); - - if (error != NULL) { - g_simple_async_result_set_from_error (simple, error); - g_simple_async_result_complete (simple); - g_object_unref (simple); - g_error_free (error); - return; - } - - /* Extract a MIME message from the composer. */ - composer = E_MSG_COMPOSER (object); - message = e_msg_composer_get_message_draft (composer, &error); - if (error != NULL) { - g_simple_async_result_set_from_error (simple, error); - g_simple_async_result_complete (simple); - g_object_unref (output_stream); - g_object_unref (simple); - return; - } - - /* Decode the MIME part to an in-memory buffer. We have to do - * this because CamelStream is synchronous-only, and using threads - * is dangerous because CamelDataWrapper is not reentrant. */ - buffer = g_byte_array_new (); - camel_stream = camel_stream_mem_new (); - camel_stream_mem_set_byte_array ( - CAMEL_STREAM_MEM (camel_stream), buffer); - camel_data_wrapper_decode_to_stream ( - CAMEL_DATA_WRAPPER (message), camel_stream, NULL); - g_object_unref (message); - g_object_unref (camel_stream); - - /* Load the buffer into a GMemoryInputStream. - * But watch out for zero length MIME parts. */ - input_stream = g_memory_input_stream_new (); - if (buffer->len > 0) - g_memory_input_stream_add_data ( - G_MEMORY_INPUT_STREAM (input_stream), - buffer->data, (gssize) buffer->len, - (GDestroyNotify) g_free); - g_byte_array_free (buffer, FALSE); - - /* Splice the input and output streams */ - g_output_stream_splice_async ( - G_OUTPUT_STREAM (output_stream), input_stream, - G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE | - G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET, - G_PRIORITY_DEFAULT, NULL, (GAsyncReadyCallback) - autosave_snapshot_splice_cb, simple); - - g_object_unref (output_stream); - g_object_unref (input_stream); -} - -void -e_composer_autosave_snapshot_async (EMsgComposer *composer, - GAsyncReadyCallback callback, - gpointer user_data) -{ - AutosaveState *state; - GSimpleAsyncResult *simple; - GError *error = NULL; - - g_return_if_fail (E_IS_MSG_COMPOSER (composer)); - - state = g_object_get_data (G_OBJECT (composer), "autosave"); - g_return_if_fail (state != NULL); - - simple = g_simple_async_result_new ( - G_OBJECT (composer), callback, user_data, - e_composer_autosave_snapshot_async); - - /* If the contents are unchanged, exit early. */ - if (!gtkhtml_editor_get_changed (GTKHTML_EDITOR (composer))) { - g_simple_async_result_complete (simple); - g_object_unref (simple); - return; - } - - /* Open the autosave file on-demand. */ - if (!composer_autosave_state_open (state, &error)) { - g_simple_async_result_set_from_error (simple, error); - g_simple_async_result_complete (simple); - g_object_unref (simple); - return; - } - - /* Overwrite the file. */ - g_file_replace_async ( - state->file, NULL, FALSE, G_FILE_CREATE_PRIVATE, - G_PRIORITY_DEFAULT, NULL, (GAsyncReadyCallback) - autosave_snapshot_cb, simple); -} - -gboolean -e_composer_autosave_snapshot_finish (EMsgComposer *composer, - GAsyncResult *result, - GError **error) -{ - GSimpleAsyncResult *simple; - - g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE); - g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), FALSE); - g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - - simple = G_SIMPLE_ASYNC_RESULT (result); - - /* Success is assumed in the absense of a GError. */ - return !g_simple_async_result_propagate_error (simple, error); -} - -gchar * -e_composer_autosave_get_filename (EMsgComposer *composer) -{ - AutosaveState *state; - - g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL); - - state = g_object_get_data (G_OBJECT (composer), "autosave"); - g_return_val_if_fail (state != NULL, NULL); - - return g_file_get_path (state->file); -} - -gboolean -e_composer_autosave_get_enabled (EMsgComposer *composer) -{ - AutosaveState *state; - - g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE); - - state = g_object_get_data (G_OBJECT (composer), "autosave"); - g_return_val_if_fail (state != NULL, FALSE); - - return state->enabled; -} - -void -e_composer_autosave_set_enabled (EMsgComposer *composer, - gboolean enabled) -{ - AutosaveState *state; - - g_return_if_fail (E_IS_MSG_COMPOSER (composer)); - - state = g_object_get_data (G_OBJECT (composer), "autosave"); - g_return_if_fail (state != NULL); - - state->enabled = enabled; -} diff --git a/composer/e-composer-autosave.h b/composer/e-composer-autosave.h deleted file mode 100644 index 6f55f10b1a..0000000000 --- a/composer/e-composer-autosave.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with the program; if not, see <http://www.gnu.org/licenses/> - * - * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - */ - -#ifndef E_COMPOSER_AUTOSAVE_H -#define E_COMPOSER_AUTOSAVE_H - -#include "e-composer-common.h" -#include "e-msg-composer.h" - -G_BEGIN_DECLS - -GList * e_composer_autosave_find_orphans (GError **error); - -void e_composer_autosave_register (EMsgComposer *composer); -void e_composer_autosave_unregister (EMsgComposer *composer); -void e_composer_autosave_snapshot_async - (EMsgComposer *composer, - GAsyncReadyCallback callback, - gpointer user_data); -gboolean e_composer_autosave_snapshot_finish - (EMsgComposer *composer, - GAsyncResult *result, - GError **error); -gchar * e_composer_autosave_get_filename (EMsgComposer *composer); -gboolean e_composer_autosave_get_enabled (EMsgComposer *composer); -void e_composer_autosave_set_enabled (EMsgComposer *composer, - gboolean enabled); - -G_END_DECLS - -#endif /* E_COMPOSER_AUTOSAVE_H */ diff --git a/composer/e-composer-private.h b/composer/e-composer-private.h index 8d1408956d..026ed96954 100644 --- a/composer/e-composer-private.h +++ b/composer/e-composer-private.h @@ -28,7 +28,6 @@ #include <glib/gstdio.h> #include "e-composer-actions.h" -#include "e-composer-autosave.h" #include "e-composer-header-table.h" #include "e-util/e-binding.h" #include "e-util/e-charset.h" diff --git a/composer/e-msg-composer.c b/composer/e-msg-composer.c index 65523677e9..480bfbe3bd 100644 --- a/composer/e-msg-composer.c +++ b/composer/e-msg-composer.c @@ -45,12 +45,13 @@ #include <gconf/gconf.h> #include <gconf/gconf-client.h> -#include "e-util/e-dialog-utils.h" +#include "e-util/e-account-utils.h" #include "e-util/e-alert-dialog.h" +#include "e-util/e-dialog-utils.h" +#include "e-util/e-extensible.h" #include "e-util/e-plugin-ui.h" -#include "e-util/e-util-private.h" -#include "e-util/e-account-utils.h" #include "e-util/e-signature-utils.h" +#include "e-util/e-util-private.h" #include "e-signature-combo-box.h" #include "shell/e-shell.h" #include "em-format/em-format.h" @@ -59,7 +60,6 @@ #include "e-msg-composer.h" #include "e-attachment.h" -#include "e-composer-autosave.h" #include "e-composer-private.h" #include "e-composer-header-table.h" @@ -113,10 +113,11 @@ static void handle_multipart_signed (EMsgComposer *composer, CamelMultipart *multipart, gint depth); -G_DEFINE_TYPE ( +G_DEFINE_TYPE_WITH_CODE ( EMsgComposer, e_msg_composer, - GTKHTML_TYPE_EDITOR) + GTKHTML_TYPE_EDITOR, + G_IMPLEMENT_INTERFACE (E_TYPE_EXTENSIBLE, NULL)) /** * emcu_part_to_html: @@ -1439,71 +1440,6 @@ set_editor_text (EMsgComposer *composer, g_free (body); } -/* Commands. */ - -static void -autosave_load_draft_cb (EMsgComposer *composer, - GAsyncResult *result, - gchar *filename) -{ - GError *error = NULL; - - if (e_composer_autosave_snapshot_finish (composer, result, &error)) - g_unlink (filename); - - else { - e_alert_run_dialog_for_args ( - GTK_WINDOW (composer), - "mail-composer:no-autosave", - (filename != NULL) ? filename : "", - (error != NULL) ? error->message : - _("Unable to reconstruct message from autosave file"), - NULL); - - if (error != NULL) - g_error_free (error); - } - - g_free (filename); -} - -static EMsgComposer * -autosave_load_draft (EShell *shell, - const gchar *filename) -{ - CamelStream *stream; - CamelMimeMessage *message; - EMsgComposer *composer; - - g_return_val_if_fail (E_IS_SHELL (shell), NULL); - g_return_val_if_fail (filename != NULL, NULL); - - stream = camel_stream_fs_new_with_name ( - filename, O_RDONLY, 0, NULL); - if (stream == NULL) - return NULL; - - message = camel_mime_message_new (); - camel_data_wrapper_construct_from_stream ( - CAMEL_DATA_WRAPPER (message), stream, NULL); - g_object_unref (stream); - - composer = e_msg_composer_new_with_message (shell, message); - if (composer) { - /* Mark the message as changed so it gets autosaved again, - * then we can safely remove the old autosave file in the - * callback function. */ - gtkhtml_editor_set_changed (GTKHTML_EDITOR (composer), TRUE); - e_composer_autosave_snapshot_async ( - composer, (GAsyncReadyCallback) - autosave_load_draft_cb, g_strdup (filename)); - - gtk_widget_show (GTK_WIDGET (composer)); - } - - return composer; -} - /* Miscellaneous callbacks. */ static void @@ -1830,7 +1766,6 @@ msg_composer_finalize (GObject *object) { EMsgComposer *composer = E_MSG_COMPOSER (object); - e_composer_autosave_unregister (composer); e_composer_private_finalize (composer); /* Chain up to parent's finalize() method. */ @@ -1980,14 +1915,14 @@ msg_composer_constructed (GObject *object) store, "row-inserted", G_CALLBACK (attachment_store_changed_cb), composer); - e_composer_autosave_register (composer); - /* Initialization may have tripped the "changed" state. */ gtkhtml_editor_set_changed (editor, FALSE); id = "org.gnome.evolution.composer"; e_plugin_ui_register_manager (ui_manager, id, composer); e_plugin_ui_enable_manager (ui_manager, id); + + e_extensible_load_extensions (E_EXTENSIBLE (composer)); } static void @@ -2068,7 +2003,7 @@ msg_composer_key_press_event (GtkWidget *widget, #ifdef HAVE_XFREE if (event->keyval == XF86XK_Send) { - g_signal_emit (G_OBJECT (composer), signals[SEND], 0); + e_msg_composer_send (composer); return TRUE; } #endif /* HAVE_XFREE */ @@ -3250,9 +3185,16 @@ e_msg_composer_get_shell (EMsgComposer *composer) void e_msg_composer_send (EMsgComposer *composer) { + GtkhtmlEditor *editor; + g_return_if_fail (E_IS_MSG_COMPOSER (composer)); + editor = GTKHTML_EDITOR (composer); + g_signal_emit (composer, signals[SEND], 0); + + /* XXX This should be elsewhere. */ + gtkhtml_editor_set_changed (editor, FALSE); } /** @@ -4093,13 +4035,6 @@ e_msg_composer_get_raw_message_text (EMsgComposer *composer) return array; } -void -e_msg_composer_set_enable_autosave (EMsgComposer *composer, - gboolean enabled) -{ - e_composer_autosave_set_enabled (composer, enabled); -} - gboolean e_msg_composer_is_exiting (EMsgComposer *composer) { @@ -4202,49 +4137,6 @@ e_msg_composer_load_from_file (EShell *shell, } void -e_msg_composer_check_autosave (EShell *shell) -{ - GtkWindow *parent; - GList *orphans = NULL; - gint response; - GError *error = NULL; - - g_return_if_fail (E_IS_SHELL (shell)); - - parent = e_shell_get_active_window (shell); - - /* Look for orphaned autosave files. */ - orphans = e_composer_autosave_find_orphans (&error); - if (orphans == NULL) { - if (error != NULL) { - g_warning ("%s", error->message); - g_error_free (error); - } - return; - } - - /* Ask if the user wants to recover the orphaned files. */ - response = e_alert_run_dialog_for_args ( - parent, "mail-composer:recover-autosave", NULL); - - /* Based on the user's response, recover or delete them. */ - while (orphans != NULL) { - const gchar *filename = orphans->data; - EMsgComposer *composer; - - if (response == GTK_RESPONSE_YES) { - /* FIXME: composer is never used */ - composer = autosave_load_draft (shell, filename); - } else { - g_unlink (filename); - } - - g_free (orphans->data); - orphans = g_list_delete_link (orphans, orphans); - } -} - -void e_msg_composer_set_alternative (EMsgComposer *composer, gboolean alt) { diff --git a/composer/e-msg-composer.h b/composer/e-msg-composer.h index 4c51929f06..5cb439512c 100644 --- a/composer/e-msg-composer.h +++ b/composer/e-msg-composer.h @@ -133,10 +133,6 @@ CamelInternetAddress * void e_msg_composer_clear_inlined_table (EMsgComposer *composer); -void e_msg_composer_set_enable_autosave - (EMsgComposer *composer, - gboolean enabled); - void e_msg_composer_add_message_attachments (EMsgComposer *composer, CamelMimeMessage *message, @@ -148,7 +144,6 @@ gboolean e_msg_composer_can_close (EMsgComposer *composer, EMsgComposer * e_msg_composer_load_from_file (EShell *shell, const gchar *filename); -void e_msg_composer_check_autosave (EShell *shell); void e_msg_composer_reply_indent (EMsgComposer *composer); |