aboutsummaryrefslogtreecommitdiffstats
path: root/mail/mail-display.c
diff options
context:
space:
mode:
authorLarry Ewing <lewing@ximian.com>2001-10-10 13:43:40 +0800
committerLarry Ewing <lewing@src.gnome.org>2001-10-10 13:43:40 +0800
commit14124e1c1639ef555dd0829ea74799525caf4374 (patch)
tree1bf2e95264d697bc4485d27473d83aca03cc3fc7 /mail/mail-display.c
parentb620893135720a2be38428dd1a403f2184cc04d5 (diff)
downloadgsoc2013-evolution-14124e1c1639ef555dd0829ea74799525caf4374.tar
gsoc2013-evolution-14124e1c1639ef555dd0829ea74799525caf4374.tar.gz
gsoc2013-evolution-14124e1c1639ef555dd0829ea74799525caf4374.tar.bz2
gsoc2013-evolution-14124e1c1639ef555dd0829ea74799525caf4374.tar.lz
gsoc2013-evolution-14124e1c1639ef555dd0829ea74799525caf4374.tar.xz
gsoc2013-evolution-14124e1c1639ef555dd0829ea74799525caf4374.tar.zst
gsoc2013-evolution-14124e1c1639ef555dd0829ea74799525caf4374.zip
ref the part. (save_destroy_cb): new function to unref the part when we
2001-10-09 Larry Ewing <lewing@ximian.com> * mail-display.c (save_part): ref the part. (save_destroy_cb): new function to unref the part when we have closed the dialog. (save_url): fake a mime part so that we can save data urls without extra effort. This is less sucky than it seems since it handles filenames and ref counting with minimal fuss. svn path=/trunk/; revision=13544
Diffstat (limited to 'mail/mail-display.c')
-rw-r--r--mail/mail-display.c71
1 files changed, 60 insertions, 11 deletions
diff --git a/mail/mail-display.c b/mail/mail-display.c
index 005159f981..d673ae3b61 100644
--- a/mail/mail-display.c
+++ b/mail/mail-display.c
@@ -173,6 +173,12 @@ save_data_cb (GtkWidget *widget, gpointer user_data)
gtk_widget_destroy (GTK_WIDGET (file_select));
}
+static void
+save_destroy_cb (GtkWidget *widget, CamelMimePart *part)
+{
+ camel_object_unref (CAMEL_OBJECT (part));
+}
+
static gboolean
idle_redisplay (gpointer data)
{
@@ -193,6 +199,17 @@ mail_display_queue_redisplay (MailDisplay *md)
}
static void
+mail_display_jump_to_anchor (MailDisplay *md, const char *url)
+{
+ char *anchor = strstr (url, "#");
+
+ g_return_if_fail (anchor != NULL);
+
+ if (anchor)
+ gtk_html_jump_to_anchor (md->html, anchor + 1);
+}
+
+static void
on_link_clicked (GtkHTML *html, const char *url, MailDisplay *md)
{
if (!g_strncasecmp (url, "news:", 5) ||
@@ -204,7 +221,9 @@ on_link_clicked (GtkHTML *html, const char *url, MailDisplay *md)
g_datalist_set_data (md->data, "show_pgp",
GINT_TO_POINTER (1));
mail_display_queue_redisplay (md);
- } else
+ } else if (*url == '#')
+ mail_display_jump_to_anchor (md, url);
+ else
gnome_url_show (url);
}
@@ -214,6 +233,9 @@ save_part (CamelMimePart *part)
GtkFileSelection *file_select;
char *filename;
+ g_return_if_fail (part != NULL);
+ camel_object_ref (CAMEL_OBJECT (part));
+
if (save_pathname == NULL)
save_pathname = g_strdup (g_get_home_dir ());
@@ -233,6 +255,9 @@ save_part (CamelMimePart *part)
GTK_SIGNAL_FUNC (gtk_widget_destroy),
GTK_OBJECT (file_select));
+ gtk_signal_connect (GTK_OBJECT (file_select), "destroy",
+ GTK_SIGNAL_FUNC (save_destroy_cb), part);
+
gtk_widget_show (GTK_WIDGET (file_select));
}
@@ -694,6 +719,39 @@ save_url (MailDisplay *md, const char *url)
g_return_val_if_fail (urls != NULL, NULL);
part = g_hash_table_lookup (urls, url);
+ if (part == NULL) {
+ GByteArray *ba;
+
+ urls = g_datalist_get_data (md->data, "data_urls");
+ g_return_val_if_fail (urls != NULL, NULL);
+
+ /* See if it's some piece of cached data if it is then pretend it
+ * is a mime part so that we can use the mime part saveing routines.
+ * It is gross but it keeps duplicated code to a minimum and helps
+ * out with ref counting and the like.
+ */
+ ba = g_hash_table_lookup (urls, url);
+ if (ba) {
+ CamelStream *memstream;
+ CamelDataWrapper *wrapper;
+ const char *name;
+
+ name = strrchr (url, '/');
+ name = name ? name : url;
+
+ memstream = camel_stream_mem_new_with_byte_array (ba);
+ wrapper = camel_data_wrapper_new ();
+ camel_data_wrapper_construct_from_stream (wrapper, memstream);
+ camel_object_unref (CAMEL_OBJECT (memstream));
+ part = camel_mime_part_new ();
+ camel_medium_set_content_object (CAMEL_MEDIUM (part), wrapper);
+ camel_object_unref (CAMEL_OBJECT (wrapper));
+ camel_mime_part_set_filename (part, name);
+ }
+ } else {
+ camel_object_ref (CAMEL_OBJECT (part));
+ }
+
if (part) {
CamelDataWrapper *data;
@@ -705,20 +763,11 @@ save_url (MailDisplay *md, const char *url)
}
save_part (part);
+ camel_object_unref (CAMEL_OBJECT (part));
return NULL;
}
g_warning ("part not found");
-#if 0
- urls = g_datalist_get_data (md->data, "data_urls");
- g_return_val_if_fail (urls != NULL, NULL);
-
- /* See if it's some piece of cached data */
- ba = g_hash_table_lookup (urls, url);
- if (ba) {
- return ba;
- }
-#endif
return NULL;
}