diff options
author | Milan Crha <mcrha@redhat.com> | 2009-04-27 17:34:11 +0800 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2009-04-27 17:34:11 +0800 |
commit | 0f7060ee7dcceac8d10aaa9100c919712de491ff (patch) | |
tree | d9eb5b7f00d21884f4b6add882d3371863ca85e4 /plugins/external-editor | |
parent | 631d0bfd080409da87545d42de7bc4588abdf5b7 (diff) | |
download | gsoc2013-evolution-0f7060ee7dcceac8d10aaa9100c919712de491ff.tar.gz gsoc2013-evolution-0f7060ee7dcceac8d10aaa9100c919712de491ff.tar.zst gsoc2013-evolution-0f7060ee7dcceac8d10aaa9100c919712de491ff.zip |
Define .error files correctly and external-editor crash fix
** Fix for bug #561188
Diffstat (limited to 'plugins/external-editor')
-rw-r--r-- | plugins/external-editor/ChangeLog | 11 | ||||
-rw-r--r-- | plugins/external-editor/Makefile.am | 6 | ||||
-rw-r--r-- | plugins/external-editor/external-editor.c | 143 | ||||
-rw-r--r-- | plugins/external-editor/org-gnome-external-editor.error.xml (renamed from plugins/external-editor/org-gnome-external-editor-errors.xml) | 0 |
4 files changed, 89 insertions, 71 deletions
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 <mcrha@redhat.com> + + ** 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 <tml@novell.com> 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 140eff1089..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,73 +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); - 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); - - /* 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.error.xml index c6f0bebfa3..c6f0bebfa3 100644 --- a/plugins/external-editor/org-gnome-external-editor-errors.xml +++ b/plugins/external-editor/org-gnome-external-editor.error.xml |