aboutsummaryrefslogtreecommitdiffstats
path: root/mail/mail-display.c
diff options
context:
space:
mode:
authorDan Winship <danw@src.gnome.org>2000-08-12 06:22:27 +0800
committerDan Winship <danw@src.gnome.org>2000-08-12 06:22:27 +0800
commitb9cc4db255609621b7e238faa64667ca3860475f (patch)
treeacfc98f9d7875d6c38dccee7e25507f6066c6da8 /mail/mail-display.c
parentc587247b201eea444d2831832f157a489b6daecc (diff)
downloadgsoc2013-evolution-b9cc4db255609621b7e238faa64667ca3860475f.tar
gsoc2013-evolution-b9cc4db255609621b7e238faa64667ca3860475f.tar.gz
gsoc2013-evolution-b9cc4db255609621b7e238faa64667ca3860475f.tar.bz2
gsoc2013-evolution-b9cc4db255609621b7e238faa64667ca3860475f.tar.lz
gsoc2013-evolution-b9cc4db255609621b7e238faa64667ca3860475f.tar.xz
gsoc2013-evolution-b9cc4db255609621b7e238faa64667ca3860475f.tar.zst
gsoc2013-evolution-b9cc4db255609621b7e238faa64667ca3860475f.zip
Redo this again. Get rid of struct mail_format_data and move most of that
* mail-display.c, mail-format.c: Redo this again. Get rid of struct mail_format_data and move most of that info into MailDisplay itself, and pass the MailDisplay around. Add a GData** to MailDisplay, and put the urls hash table into that. Also add the ability to redisplay the currently-displayed message (with the same GData**), and add a "show_pgp" datum to it that controls whether or not to decrypt PGP messages, and redo the PGP stuff (again) to take that into account. Now you don't get the annoying PGP password dialog box without any warning. svn path=/trunk/; revision=4757
Diffstat (limited to 'mail/mail-display.c')
-rw-r--r--mail/mail-display.c155
1 files changed, 96 insertions, 59 deletions
diff --git a/mail/mail-display.c b/mail/mail-display.c
index e22010b202..a24d258511 100644
--- a/mail/mail-display.c
+++ b/mail/mail-display.c
@@ -29,8 +29,7 @@
static GtkObjectClass *mail_display_parent_class;
-/* Sigh... gtk_object_set_data is nice to have... */
-extern GHashTable *mail_lookup_url_table (CamelMimeMessage *mime_message);
+static void redisplay (MailDisplay *md);
/*----------------------------------------------------------------------*
* Callbacks
@@ -127,21 +126,21 @@ make_safe_filename (const char *prefix, CamelMimePart *part)
}
static CamelMimePart *
-part_for_url (const char *url, CamelMimeMessage *message)
+part_for_url (const char *url, MailDisplay *md)
{
GHashTable *urls;
- urls = mail_lookup_url_table (message);
+ urls = g_datalist_get_data (md->data, "urls");
g_return_val_if_fail (urls != NULL, NULL);
return g_hash_table_lookup (urls, url);
}
static void
-launch_external (const char *url, CamelMimeMessage *message)
+launch_external (const char *url, MailDisplay *md)
{
const char *command = url + 21;
char *tmpl, *tmpdir, *filename, *argv[2];
- CamelMimePart *part = part_for_url (url, message);
+ CamelMimePart *part = part_for_url (url, md);
tmpl = g_strdup ("/tmp/evolution.XXXXXX");
#ifdef HAVE_MKDTEMP
@@ -191,13 +190,13 @@ save_data_cb (GtkWidget *widget, gpointer user_data)
}
static void
-save_data (const char *cid, CamelMimeMessage *message)
+save_data (const char *cid, MailDisplay *md)
{
GtkFileSelection *file_select;
char *filename;
CamelMimePart *part;
- part = part_for_url (cid, message);
+ part = part_for_url (cid, md);
g_return_if_fail (part != NULL);
filename = make_safe_filename (g_get_home_dir (), part);
@@ -215,30 +214,51 @@ save_data (const char *cid, CamelMimeMessage *message)
gtk_widget_show (GTK_WIDGET (file_select));
}
+static gboolean
+idle_redisplay (gpointer data)
+{
+ MailDisplay *md = data;
+
+ md->idle_id = 0;
+ redisplay (md);
+ return FALSE;
+}
+
static void
-on_link_clicked (GtkHTML *html, const char *url, gpointer user_data)
+queue_redisplay (MailDisplay *md)
{
- CamelMimeMessage *message;
+ if (!md->idle_id) {
+ md->idle_id = g_idle_add_full (G_PRIORITY_LOW, idle_redisplay,
+ md, NULL);
+ }
+}
- message = gtk_object_get_data (GTK_OBJECT (html), "message");
+static void
+on_link_clicked (GtkHTML *html, const char *url, gpointer user_data)
+{
+ MailDisplay *md = user_data;
if (!g_strncasecmp (url, "news:", 5) ||
!g_strncasecmp (url, "nntp:", 5))
g_warning ("Can't handle news URLs yet.");
else if (!g_strncasecmp (url, "mailto:", 7))
send_to_url (url);
- else if (!g_strncasecmp (url, "cid:", 4))
- save_data (url, message);
- else if (!g_strncasecmp (url, "x-evolution-external:", 21))
- launch_external (url, message);
- else
+ else if (!strncmp (url, "cid:", 4))
+ save_data (url, md);
+ else if (!strncmp (url, "x-evolution-external:", 21))
+ launch_external (url, md);
+ else if (!strcmp (url, "x-evolution-decode-pgp:")) {
+ g_datalist_set_data (md->data, "show_pgp",
+ GINT_TO_POINTER (1));
+ queue_redisplay (md);
+ } else
gnome_url_show (url);
}
static gboolean
on_object_requested (GtkHTML *html, GtkHTMLEmbedded *eb, gpointer data)
{
- CamelMimeMessage *message;
+ MailDisplay *md = data;
GHashTable *urls;
CamelMedium *medium;
CamelDataWrapper *wrapper;
@@ -253,8 +273,9 @@ on_object_requested (GtkHTML *html, GtkHTMLEmbedded *eb, gpointer data)
if (strncmp (eb->classid, "cid:", 4) != 0)
return FALSE;
- message = gtk_object_get_data (GTK_OBJECT (html), "message");
- urls = mail_lookup_url_table (message);
+ urls = g_datalist_get_data (md->data, "urls");
+ g_return_val_if_fail (urls != NULL, FALSE);
+
medium = g_hash_table_lookup (urls, eb->classid);
g_return_val_if_fail (CAMEL_IS_MEDIUM (medium), FALSE);
wrapper = camel_medium_get_content_object (medium);
@@ -314,11 +335,11 @@ static void
on_url_requested (GtkHTML *html, const char *url, GtkHTMLStream *handle,
gpointer user_data)
{
- CamelMimeMessage *message;
+ MailDisplay *md = user_data;
GHashTable *urls;
- message = gtk_object_get_data (GTK_OBJECT (html), "message");
- urls = mail_lookup_url_table (message);
+ urls = g_datalist_get_data (md->data, "urls");
+ g_return_if_fail (urls != NULL);
user_data = g_hash_table_lookup (urls, url);
if (user_data == NULL)
@@ -401,6 +422,40 @@ mail_error_write (GtkHTML *html, GtkHTMLStream *stream,
g_free (buf);
}
+static void
+clear_data (CamelObject *object, gpointer event_data, gpointer user_data)
+{
+ GData *data = user_data;
+
+ g_datalist_clear (&data);
+}
+
+static void
+redisplay (MailDisplay *md)
+{
+ GtkAdjustment *adj;
+
+ md->stream = gtk_html_begin (md->html);
+ mail_html_write (md->html, md->stream, "%s%s", HTML_HEADER,
+ "<BODY TEXT=\"#000000\" BGCOLOR=\"#FFFFFF\">\n");
+
+ if (md->current_message) {
+ camel_object_ref (CAMEL_OBJECT (md->current_message));
+ mail_format_mime_message (md->current_message, md);
+ }
+
+ mail_html_write (md->html, md->stream, "</BODY></HTML>\n");
+ gtk_html_end (md->html, md->stream, GTK_HTML_STREAM_OK);
+ md->stream = NULL;
+
+ adj = e_scroll_frame_get_vadjustment (md->scroll);
+ gtk_adjustment_set_value (adj, 0);
+ e_scroll_frame_set_vadjustment (md->scroll, adj);
+
+ adj = e_scroll_frame_get_hadjustment (md->scroll);
+ gtk_adjustment_set_value (adj, 0);
+ e_scroll_frame_set_hadjustment (md->scroll, adj);
+}
/**
* mail_display_set_message:
@@ -408,53 +463,29 @@ mail_error_write (GtkHTML *html, GtkHTMLStream *stream,
* @medium: the input camel medium, or %NULL
*
* Makes the mail_display object show the contents of the medium
- * param. This means feeding mail_display->body_stream and
- * mail_display->headers_stream with html.
- *
+ * param.
**/
void
-mail_display_set_message (MailDisplay *mail_display,
- CamelMedium *medium)
+mail_display_set_message (MailDisplay *md, CamelMedium *medium)
{
- GtkHTMLStream *stream;
- GtkAdjustment *adj;
-
- /*
- * For the moment, we deal only with CamelMimeMessage, but in
+ /* For the moment, we deal only with CamelMimeMessage, but in
* the future, we should be able to deal with any medium.
*/
if (medium && !CAMEL_IS_MIME_MESSAGE (medium))
return;
/* Clean up from previous message. */
- if (mail_display->current_message)
- camel_object_unref (CAMEL_OBJECT (mail_display->current_message));
+ if (md->current_message)
+ camel_object_unref (CAMEL_OBJECT (md->current_message));
- mail_display->current_message = (CamelMimeMessage*)medium;
-
- stream = gtk_html_begin (mail_display->html);
- mail_html_write (mail_display->html, stream, "%s%s", HTML_HEADER,
- "<BODY TEXT=\"#000000\" BGCOLOR=\"#FFFFFF\">\n");
+ md->current_message = (CamelMimeMessage*)medium;
+ g_datalist_init (md->data);
+ redisplay (md);
if (medium) {
- camel_object_ref (CAMEL_OBJECT (medium));
- gtk_object_set_data (GTK_OBJECT (mail_display->html),
- "message", medium);
- mail_format_mime_message (CAMEL_MIME_MESSAGE (medium),
- mail_display->html, stream,
- CAMEL_MIME_MESSAGE (medium));
+ camel_object_hook_event (CAMEL_OBJECT (medium), "finalize",
+ clear_data, *(md->data));
}
-
- mail_html_write (mail_display->html, stream, "</BODY></HTML>\n");
- gtk_html_end (mail_display->html, stream, GTK_HTML_STREAM_OK);
-
- adj = e_scroll_frame_get_vadjustment (mail_display->scroll);
- gtk_adjustment_set_value (adj, 0);
- e_scroll_frame_set_vadjustment (mail_display->scroll, adj);
-
- adj = e_scroll_frame_get_hadjustment (mail_display->scroll);
- gtk_adjustment_set_value (adj, 0);
- e_scroll_frame_set_hadjustment (mail_display->scroll, adj);
}
@@ -505,16 +536,22 @@ mail_display_new (void)
html = gtk_html_new ();
gtk_html_set_editable (GTK_HTML (html), FALSE);
gtk_signal_connect (GTK_OBJECT (html), "url_requested",
- GTK_SIGNAL_FUNC (on_url_requested), NULL);
+ GTK_SIGNAL_FUNC (on_url_requested),
+ mail_display);
gtk_signal_connect (GTK_OBJECT (html), "object_requested",
- GTK_SIGNAL_FUNC (on_object_requested), NULL);
+ GTK_SIGNAL_FUNC (on_object_requested),
+ mail_display);
gtk_signal_connect (GTK_OBJECT (html), "link_clicked",
- GTK_SIGNAL_FUNC (on_link_clicked), NULL);
+ GTK_SIGNAL_FUNC (on_link_clicked),
+ mail_display);
gtk_container_add (GTK_CONTAINER (scroll), html);
gtk_widget_show (GTK_WIDGET (html));
mail_display->scroll = E_SCROLL_FRAME (scroll);
mail_display->html = GTK_HTML (html);
+ mail_display->stream = NULL;
+ mail_display->data = g_new0 (GData *, 1);
+ g_datalist_init (mail_display->data);
return GTK_WIDGET (mail_display);
}