aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/external-editor
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2009-04-27 17:34:11 +0800
committerMilan Crha <mcrha@redhat.com>2009-04-27 17:34:11 +0800
commit0f7060ee7dcceac8d10aaa9100c919712de491ff (patch)
treed9eb5b7f00d21884f4b6add882d3371863ca85e4 /plugins/external-editor
parent631d0bfd080409da87545d42de7bc4588abdf5b7 (diff)
downloadgsoc2013-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/ChangeLog11
-rw-r--r--plugins/external-editor/Makefile.am6
-rw-r--r--plugins/external-editor/external-editor.c143
-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