aboutsummaryrefslogtreecommitdiffstats
path: root/mail
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@src.gnome.org>2009-02-16 08:44:40 +0800
committerMatthew Barnes <mbarnes@src.gnome.org>2009-02-16 08:44:40 +0800
commit03d8740213e324efaf7b774b0c7497ced2fa626b (patch)
tree590073927ce64831efba1b4039404e7f5a5a49df /mail
parentf7e298665b02f72890c6681e6d21ef5601beccbb (diff)
downloadgsoc2013-evolution-03d8740213e324efaf7b774b0c7497ced2fa626b.tar
gsoc2013-evolution-03d8740213e324efaf7b774b0c7497ced2fa626b.tar.gz
gsoc2013-evolution-03d8740213e324efaf7b774b0c7497ced2fa626b.tar.bz2
gsoc2013-evolution-03d8740213e324efaf7b774b0c7497ced2fa626b.tar.lz
gsoc2013-evolution-03d8740213e324efaf7b774b0c7497ced2fa626b.tar.xz
gsoc2013-evolution-03d8740213e324efaf7b774b0c7497ced2fa626b.tar.zst
gsoc2013-evolution-03d8740213e324efaf7b774b0c7497ced2fa626b.zip
Move signature script execution to e-util/e-signature-utils.s so the
composer can invoke it. Composer no longer needs mail-config.h. Split signature preview into a new widget: ESignaturePreview. svn path=/branches/kill-bonobo/; revision=37272
Diffstat (limited to 'mail')
-rw-r--r--mail/em-composer-prefs.c126
-rw-r--r--mail/mail-config.c126
-rw-r--r--mail/mail-config.h4
3 files changed, 13 insertions, 243 deletions
diff --git a/mail/em-composer-prefs.c b/mail/em-composer-prefs.c
index ef73c23355..9b81935e90 100644
--- a/mail/em-composer-prefs.c
+++ b/mail/em-composer-prefs.c
@@ -49,6 +49,7 @@
#include "misc/e-charset-picker.h"
#include "misc/e-signature-manager.h"
+#include "misc/e-signature-preview.h"
#include "e-util/e-error.h"
#include "e-util/e-util-private.h"
@@ -213,49 +214,6 @@ em_composer_prefs_get_type (void)
return type;
}
-static void
-sig_load_preview (EMComposerPrefs *prefs,
- ESignature *signature)
-{
- GtkHTML *html;
- gchar *str;
-
- html = prefs->sig_preview;
-
- if (signature == NULL) {
- gtk_html_load_from_string (html, " ", 1);
- return;
- }
-
- if (signature->script)
- str = mail_config_signature_run_script (signature->filename);
- else
- /* FIXME Show an error in the preview area. */
- str = e_read_signature_file (signature, FALSE, NULL);
- if (!str || !*str) {
- /* make html stream happy and write at least one character */
- g_free (str);
- str = g_strdup (" ");
- }
-
- if (signature->html) {
- gtk_html_load_from_string (html, str, strlen (str));
- } else {
- GtkHTMLStream *stream;
- int len;
-
- len = strlen (str);
- stream = gtk_html_begin_content (html, "text/html; charset=utf-8");
- gtk_html_write (html, stream, "<PRE>", 5);
- if (len)
- gtk_html_write (html, stream, str, len);
- gtk_html_write (html, stream, "</PRE>", 6);
- gtk_html_end (html, stream, GTK_HTML_STREAM_OK);
- }
-
- g_free (str);
-}
-
void
em_composer_prefs_new_signature (GtkWindow *parent,
gboolean html_mode)
@@ -269,59 +227,6 @@ em_composer_prefs_new_signature (GtkWindow *parent,
}
static void
-sig_selection_changed (GtkTreeSelection *selection,
- EMComposerPrefs *prefs)
-{
- ESignature *signature;
- GtkTreeView *tree_view;
-
- tree_view = gtk_tree_selection_get_tree_view (selection);
-
- signature = e_signature_tree_view_get_selected (
- E_SIGNATURE_TREE_VIEW (tree_view));
-
- sig_load_preview (prefs, signature);
-
- if (signature != NULL)
- g_object_unref (signature);
-}
-
-static void
-url_requested (GtkHTML *html,
- const gchar *url,
- GtkHTMLStream *handle)
-{
- GtkHTMLStreamStatus status;
- gchar buf[128];
- gssize size;
- gint fd;
- gchar *filename;
-
- if (strncmp (url, "file:", 5) == 0)
- filename = g_filename_from_uri (url, NULL, NULL);
- else
- filename = g_strdup (url);
- fd = g_open (filename, O_RDONLY | O_BINARY, 0);
- g_free (filename);
-
- status = GTK_HTML_STREAM_OK;
- if (fd != -1) {
- while ((size = read (fd, buf, sizeof (buf)))) {
- if (size == -1) {
- status = GTK_HTML_STREAM_ERROR;
- break;
- } else
- gtk_html_write (html, handle, buf, size);
- }
- } else
- status = GTK_HTML_STREAM_ERROR;
-
- gtk_html_end (html, handle, status);
- if (fd > 0)
- close (fd);
-}
-
-static void
spell_language_toggled_cb (GtkCellRendererToggle *renderer,
const gchar *path_string,
EMComposerPrefs *prefs)
@@ -383,10 +288,8 @@ spell_setup (EMComposerPrefs *prefs)
{
const GList *available_languages;
GList *active_languages;
- GConfClient *client;
GtkListStore *store;
- client = mail_config_get_gconf_client ();
store = GTK_LIST_STORE (prefs->language_model);
available_languages = gtkhtml_spell_language_get_available ();
@@ -681,22 +584,19 @@ em_composer_prefs_construct (EMComposerPrefs *prefs,
signature_tree_view = e_signature_manager_get_tree_view (
E_SIGNATURE_MANAGER (widget));
- selection = gtk_tree_view_get_selection (
- GTK_TREE_VIEW (signature_tree_view));
- g_signal_connect (
- selection, "changed",
- G_CALLBACK (sig_selection_changed), prefs);
- /* preview GtkHTML widget */
- widget = glade_xml_get_widget (gui, "scrolled-sig");
- prefs->sig_preview = (GtkHTML *) gtk_html_new ();
- g_signal_connect (
- prefs->sig_preview, "url_requested",
- G_CALLBACK (url_requested), NULL);
- gtk_widget_show (GTK_WIDGET (prefs->sig_preview));
- gtk_container_add (
- GTK_CONTAINER (widget),
- GTK_WIDGET (prefs->sig_preview));
+ container = glade_xml_get_widget (gui, "scrolled-sig");
+ widget = e_signature_preview_new ();
+ gtk_container_add (GTK_CONTAINER (container), widget);
+ gtk_widget_show (widget);
+
+ e_binding_new_with_negation (
+ G_OBJECT (shell_settings), "disable-command-line",
+ G_OBJECT (widget), "allow-scripts");
+
+ e_binding_new (
+ G_OBJECT (signature_tree_view), "selected",
+ G_OBJECT (widget), "signature");
/* get our toplevel widget */
target = em_config_target_new_prefs (ec, client);
diff --git a/mail/mail-config.c b/mail/mail-config.c
index a7e8bb908c..3c39791dfa 100644
--- a/mail/mail-config.c
+++ b/mail/mail-config.c
@@ -39,10 +39,6 @@
#include <glib/gstdio.h>
#include <glib/gi18n-lib.h>
-#ifndef G_OS_WIN32
-#include <sys/wait.h>
-#endif
-
#include <gtkhtml/gtkhtml.h>
#include <glade/glade.h>
@@ -983,125 +979,3 @@ mail_config_get_lookup_book_local_only (void)
return config->book_lookup_local_only;
}
-
-char *
-mail_config_signature_run_script (const char *script)
-{
-#ifndef G_OS_WIN32
- int result, status;
- int in_fds[2];
- pid_t pid;
-
- if (config == NULL)
- mail_config_init ();
-
- if (config->scripts_disabled)
- return NULL;
-
- if (pipe (in_fds) == -1) {
- g_warning ("Failed to create pipe to '%s': %s", script, g_strerror (errno));
- return NULL;
- }
-
- if (!(pid = fork ())) {
- /* child process */
- int maxfd, i;
-
- close (in_fds [0]);
- if (dup2 (in_fds[1], STDOUT_FILENO) < 0)
- _exit (255);
- close (in_fds [1]);
-
- setsid ();
-
- maxfd = sysconf (_SC_OPEN_MAX);
- for (i = 3; i < maxfd; i++) {
- if (i != STDIN_FILENO && i != STDOUT_FILENO && i != STDERR_FILENO)
- fcntl (i, F_SETFD, FD_CLOEXEC);
- }
-
- execlp("/bin/sh", "/bin/sh", "-c", script, NULL);
- g_warning ("Could not execute %s: %s\n", script, g_strerror (errno));
- _exit (255);
- } else if (pid < 0) {
- g_warning ("Failed to create create child process '%s': %s", script, g_strerror (errno));
- close (in_fds [0]);
- close (in_fds [1]);
- return NULL;
- } else {
- CamelStreamFilter *filtered_stream;
- CamelStreamMem *memstream;
- CamelMimeFilter *charenc;
- CamelStream *stream;
- GByteArray *buffer;
- char *charset;
- char *content;
-
- /* parent process */
- close (in_fds[1]);
-
- stream = camel_stream_fs_new_with_fd (in_fds[0]);
-
- memstream = (CamelStreamMem *) camel_stream_mem_new ();
- buffer = g_byte_array_new ();
- camel_stream_mem_set_byte_array (memstream, buffer);
-
- camel_stream_write_to_stream (stream, (CamelStream *) memstream);
- camel_object_unref (stream);
-
- /* signature scripts are supposed to generate UTF-8 content, but because users
- are known to not ever read the manual... we try to do our best if the
- content isn't valid UTF-8 by assuming that the content is in the user's
- preferred charset. */
- if (!g_utf8_validate ((char *)buffer->data, buffer->len, NULL)) {
- stream = (CamelStream *) memstream;
- memstream = (CamelStreamMem *) camel_stream_mem_new ();
- camel_stream_mem_set_byte_array (memstream, g_byte_array_new ());
-
- filtered_stream = camel_stream_filter_new_with_stream (stream);
- camel_object_unref (stream);
-
- charset = gconf_client_get_string (config->gconf, "/apps/evolution/mail/composer/charset", NULL);
- if (charset && *charset) {
- if ((charenc = (CamelMimeFilter *) camel_mime_filter_charset_new_convert (charset, "utf-8"))) {
- camel_stream_filter_add (filtered_stream, charenc);
- camel_object_unref (charenc);
- }
- }
- g_free (charset);
-
- camel_stream_write_to_stream ((CamelStream *) filtered_stream, (CamelStream *) memstream);
- camel_object_unref (filtered_stream);
- g_byte_array_free (buffer, TRUE);
-
- buffer = memstream->buffer;
- }
-
- camel_object_unref (memstream);
-
- g_byte_array_append (buffer, (const unsigned char *)"", 1);
- content = (char *)buffer->data;
- g_byte_array_free (buffer, FALSE);
-
- /* wait for the script process to terminate */
- result = waitpid (pid, &status, 0);
-
- if (result == -1 && errno == EINTR) {
- /* child process is hanging... */
- kill (pid, SIGTERM);
- sleep (1);
- result = waitpid (pid, &status, WNOHANG);
- if (result == 0) {
- /* ...still hanging, set phasers to KILL */
- kill (pid, SIGKILL);
- sleep (1);
- result = waitpid (pid, &status, WNOHANG);
- }
- }
-
- return content;
- }
-#else
- return NULL;
-#endif
-}
diff --git a/mail/mail-config.h b/mail/mail-config.h
index ecbdb198ea..6c4683113f 100644
--- a/mail/mail-config.h
+++ b/mail/mail-config.h
@@ -110,10 +110,6 @@ gboolean mail_config_get_enable_magic_spacebar (void);
struct _EAccountService *mail_config_get_default_transport (void);
-/* signatures */
-char *mail_config_signature_run_script (const char *script);
-
-
/* uri's got changed by the store, etc */
void mail_config_uri_renamed (GCompareFunc uri_cmp, const char *old, const char *new);
void mail_config_uri_deleted (GCompareFunc uri_cmp, const char *uri);