From 3e2ea94186a231bfdd2f3cb33085b8442a7b6b1e Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Mon, 27 Apr 2009 11:34:11 +0200 Subject: Define .error files correctly and external-editor crash fix ** Fix for bug #561188 --- plugins/external-editor/ChangeLog | 11 ++ plugins/external-editor/Makefile.am | 6 +- plugins/external-editor/external-editor.c | 141 +++++++++++---------- .../org-gnome-external-editor-errors.xml | 14 -- .../org-gnome-external-editor.error.xml | 14 ++ 5 files changed, 103 insertions(+), 83 deletions(-) delete mode 100644 plugins/external-editor/org-gnome-external-editor-errors.xml create mode 100644 plugins/external-editor/org-gnome-external-editor.error.xml (limited to 'plugins/external-editor') diff --git a/plugins/external-editor/ChangeLog b/plugins/external-editor/ChangeLog index 3bf30a612f..dae79fc9a7 100644 --- a/plugins/external-editor/ChangeLog +++ b/plugins/external-editor/ChangeLog @@ -1,3 +1,14 @@ +2009-04-27 Milan Crha + + ** Fix for bug #561188 + + * external-editor.c: (show_error), (read_file), + (async_external_editor), (show_composer_dialog): + Do more things in main thread. + * Makefile.am: + * org-gnome-external-editor-errors.xml: Renamed to: + * org-gnome-external-editor.error.xml: Create .error file properly. + 2009-01-28 Tor Lillqvist Windows port by Fridrich Strba. diff --git a/plugins/external-editor/Makefile.am b/plugins/external-editor/Makefile.am index bae2c640a5..ff64941a28 100644 --- a/plugins/external-editor/Makefile.am +++ b/plugins/external-editor/Makefile.am @@ -21,7 +21,7 @@ INCLUDES = \ @EVO_PLUGIN_RULE@ -error_DATA = org-gnome-external-editor-errors.xml +error_DATA = org-gnome-external-editor.error errordir = $(privdatadir)/errors plugin_DATA = \ @@ -53,12 +53,12 @@ install-data-local: EXTRA_DIST = \ org-gnome-external-editor.eplug.xml \ - org-gnome-external-editor-errors.xml \ + org-gnome-external-editor.error.xml \ org-gnome-external-editor.xml \ $(schema_in_files) BUILT_SOURCES = org-gnome-external-editor.eplug \ - $(error_i18n) + org-gnome-external-editor.error CLEANFILES = $(BUILT_SOURCES) diff --git a/plugins/external-editor/external-editor.c b/plugins/external-editor/external-editor.c index 5ba4ca7830..c541124e53 100644 --- a/plugins/external-editor/external-editor.c +++ b/plugins/external-editor/external-editor.c @@ -54,8 +54,6 @@ void org_gnome_external_editor (EPlugin *ep, EMMenuTargetSelect *select); void ee_editor_command_changed (GtkWidget *textbox); GtkWidget * e_plugin_lib_get_configure_widget (EPlugin *epl); -void async_external_editor (GArray *array); -static gboolean show_composer_dialog (EMsgComposer *composer); /* Utility function to convert an email address to CamelInternetAddress. May be this should belong to CamelInternetAddress.h file itself. */ @@ -132,7 +130,76 @@ e_plugin_lib_get_configure_widget (EPlugin *epl) return vbox; } -void +static gboolean +show_error (const char *id) +{ + if (id) + e_error_run (NULL, id, NULL); + return FALSE; +} + +static gboolean +read_file (char *filename) +{ + gchar *buf; + CamelMimeMessage *message; + EMsgComposer *composer; + + message = camel_mime_message_new (); + + if (filename && g_file_get_contents (filename, &buf, NULL, NULL)) { + gchar **tokens; + int i, j; + + tokens = g_strsplit (buf, "###|||", 6); + + for (i = 1; tokens[i]; ++i) { + + for (j = 0; tokens[i][j] && tokens[i][j] != '\n'; ++j) { + tokens [i][j] = ' '; + } + + if (tokens[i][j] == '\n') + tokens[i][j] = ' '; + + d(printf ("\nstripped off token[%d] is : %s \n", i, tokens[i])); + } + + camel_mime_message_set_recipients (message, "To", convert_to_camel_internet_address(g_strchug(g_strdup(tokens[1])))); + camel_mime_message_set_recipients (message, "Cc", convert_to_camel_internet_address(g_strchug(g_strdup(tokens[2])))); + camel_mime_message_set_recipients (message, "Bcc", convert_to_camel_internet_address(g_strchug(g_strdup(tokens[3])))); + camel_mime_message_set_subject (message, tokens[4]); + camel_mime_part_set_content ((CamelMimePart *)message, tokens [5], strlen (tokens [5]), "text/plain"); + + /* FIXME: We need to make mail-remote working properly. + So that we neednot invoke composer widget at all. + + May be we can do it now itself by invoking local CamelTransport. + But all that is not needed for the first release. + + People might want to format mails using their editor (80 cols width etc.) + But might want to use evolution addressbook for auto-completion etc. + So starting the composer window anyway. + */ + + composer = e_msg_composer_new_with_message (message); + g_signal_connect (GTK_OBJECT (composer), "send", G_CALLBACK (em_utils_composer_send_cb), NULL); + g_signal_connect (GTK_OBJECT (composer), "save-draft", G_CALLBACK (em_utils_composer_save_draft_cb), NULL); + + gtk_widget_show (GTK_WIDGET (composer)); + + g_strfreev (tokens); + + /* We no longer need that temporary file */ + g_remove (filename); + } + + g_free (filename); + + return FALSE; +} + +static void async_external_editor (GArray *array) { char *filename = NULL; @@ -148,9 +215,9 @@ async_external_editor (GArray *array) if (!g_spawn_sync (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL, &status, NULL)) { g_warning ("Unable to launch %s: ", argv[0]); - e_error_run (NULL, "org.gnome.evolution.plugins.external-editor:editor-not-launchable", NULL); + g_idle_add ((GSourceFunc)show_error, "org.gnome.evolution.plugins.external-editor:editor-not-launchable"); g_free (filename); - return ; + return; } #ifdef HAVE_SYS_WAIT_H @@ -159,71 +226,13 @@ async_external_editor (GArray *array) if (status) { #endif d(printf ("\n\nsome problem here with external editor\n\n")); - return ; + g_free (filename); + return; } else { - gchar *buf; - CamelMimeMessage *message; - EMsgComposer *composer; - - message = camel_mime_message_new (); - - if (g_file_get_contents (filename, &buf, NULL, NULL)) { - gchar **tokens; - int i, j; - - tokens = g_strsplit (buf, "###|||", 6); - - for (i = 1; tokens[i]; ++i) { - - for (j = 0; tokens[i][j] && tokens[i][j] != '\n'; ++j) { - tokens [i][j] = ' '; - } - - if (tokens[i][j] == '\n') - tokens[i][j] = ' '; - - d(printf ("\nstripped off token[%d] is : %s \n", i, tokens[i])); - } - - camel_mime_message_set_recipients (message, "To", convert_to_camel_internet_address(g_strchug(g_strdup(tokens[1])))); - camel_mime_message_set_recipients (message, "Cc", convert_to_camel_internet_address(g_strchug(g_strdup(tokens[2])))); - camel_mime_message_set_recipients (message, "Bcc", convert_to_camel_internet_address(g_strchug(g_strdup(tokens[3])))); - camel_mime_message_set_subject (message, tokens[4]); - camel_mime_part_set_content ((CamelMimePart *)message, tokens [5], strlen (tokens [5]), "text/plain"); - - - /* FIXME: We need to make mail-remote working properly. - So that we neednot invoke composer widget at all. - - May be we can do it now itself by invoking local CamelTransport. - But all that is not needed for the first release. - - People might want to format mails using their editor (80 cols width etc.) - But might want to use evolution addressbook for auto-completion etc. - So starting the composer window anyway. - */ - - composer = e_msg_composer_new_with_message (message); - - /* Composer cannot be shown in any random thread. Should happen in main thread */ - g_idle_add ((GSourceFunc) show_composer_dialog, composer); - - g_strfreev (tokens); - - /* We no longer need that temporary file */ - g_remove (filename); - g_free (filename); - } + g_idle_add ((GSourceFunc)read_file, filename); } } -static gboolean -show_composer_dialog (EMsgComposer *composer) -{ - gtk_widget_show (GTK_WIDGET(composer)); - return FALSE; -} - void org_gnome_external_editor (EPlugin *ep, EMMenuTargetSelect *select) { /* The template to be used in the external editor */ diff --git a/plugins/external-editor/org-gnome-external-editor-errors.xml b/plugins/external-editor/org-gnome-external-editor-errors.xml deleted file mode 100644 index c6f0bebfa3..0000000000 --- a/plugins/external-editor/org-gnome-external-editor-errors.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - <_primary>Editor not launchable - <_secondary>The external editor set in your plugin preferences cannot be launched. Try setting a different editor. - - - - <_primary>Cannot create Temporary File - <_secondary>Evolution is unable to create a temporary file to save your mail. Retry later. - - - diff --git a/plugins/external-editor/org-gnome-external-editor.error.xml b/plugins/external-editor/org-gnome-external-editor.error.xml new file mode 100644 index 0000000000..c6f0bebfa3 --- /dev/null +++ b/plugins/external-editor/org-gnome-external-editor.error.xml @@ -0,0 +1,14 @@ + + + + + <_primary>Editor not launchable + <_secondary>The external editor set in your plugin preferences cannot be launched. Try setting a different editor. + + + + <_primary>Cannot create Temporary File + <_secondary>Evolution is unable to create a temporary file to save your mail. Retry later. + + + -- cgit v1.2.3