diff options
author | Not Zed <NotZed@Ximian.com> | 2004-01-14 10:58:24 +0800 |
---|---|---|
committer | Michael Zucci <zucchi@src.gnome.org> | 2004-01-14 10:58:24 +0800 |
commit | df12f97f295e461187793034557ef9d8787ffa4b (patch) | |
tree | 06f0a69306c896b875b8ae2b5b1e3b78a7cb0dec /mail/em-icon-stream.c | |
parent | b7d6b7be91f2348427d1900b011b069abd0fa40a (diff) | |
download | gsoc2013-evolution-df12f97f295e461187793034557ef9d8787ffa4b.tar.gz gsoc2013-evolution-df12f97f295e461187793034557ef9d8787ffa4b.tar.zst gsoc2013-evolution-df12f97f295e461187793034557ef9d8787ffa4b.zip |
** See bug 51660.
2004-01-14 Not Zed <NotZed@Ximian.com>
** See bug 51660.
* em-format-html-quote.c (efhq_multipart_related): setup part_id
appropriately.
* em-format-html-display.c (efhd_output_secure): use part_id in
classid, and add .signed to part_id for subpart.
(efhd_bonobo_unknown): use part_id in classid.
(efhd_format_attachment): use part_id in classid's.
* em-format-html.c (efh_multipart_related)
(emfh_multipart_related_check): setup part_id for each subpart.
(efh_output_secure): as above, and use the part_id for the
classid.
(em_format_html_add_pobject): use part_id for a generated classid.
(efh_text_plain): setup pseudo-parts into part_id.
* em-format.c (emf_format_clone): setup the part_id base, folder +
uid.
(emf_finalise): free the part_id gstring.
(emf_init): allocate the part_id gstring.
(em_format_add_puri): build the cid from the part_id rather than
an arbitrary number, so it is more persistent. Also save the
part_id in the puri for multipart/related use.
(emf_multipart_mixed, emf_multipart_alternative)
(emf_multipart_appledouble, emf_multipart_encrypted)
(emf_multipart_related, emf_multipart_signed): Set the part_id for
each subpart.
(emf_clear_puri_node): free part_id.
2004-01-13 Not Zed <NotZed@Ximian.com>
** See bug 51660.
* em-format-html-print.c (em_format_html_print_print): dont take
message, get the message from the source formatter.
* em-format.c (emf_format_clone): Added folder and uid parameters,
changed camelmedium to a mimemessage.
* em-format-html-display.c (efhd_attachment_button): check the
icon image cache and if the image is there use it.
* em-icon-stream.c (em_icon_stream_get_image): api to lookup
finished images in cache.
(em_icon_stream_new): add a cache key arg.
(emis_sync_close): store the image in the cache once its
completed.
svn path=/trunk/; revision=24210
Diffstat (limited to 'mail/em-icon-stream.c')
-rw-r--r-- | mail/em-icon-stream.c | 60 |
1 files changed, 57 insertions, 3 deletions
diff --git a/mail/em-icon-stream.c b/mail/em-icon-stream.c index ca0e7b64eb..c35026267c 100644 --- a/mail/em-icon-stream.c +++ b/mail/em-icon-stream.c @@ -34,8 +34,16 @@ #include <gtk/gtkimage.h> #include "em-icon-stream.h" +#include "e-util/e-msgport.h" + #define d(x) +struct _emis_cache_node { + EMCacheNode node; + + GdkPixbuf *pixbuf; +}; + static void em_icon_stream_class_init (EMIconStreamClass *klass); static void em_icon_stream_init (CamelObject *object); static void em_icon_stream_finalize (CamelObject *object); @@ -45,6 +53,15 @@ static int emis_sync_close(CamelStream *stream); static int emis_sync_flush(CamelStream *stream); static EMSyncStreamClass *parent_class = NULL; +static EMCache *emis_cache; + +static void +emis_cache_free(void *data) +{ + struct _emis_cache_node *node = data; + + g_object_unref(node->pixbuf); +} CamelType em_icon_stream_get_type (void) @@ -61,6 +78,8 @@ em_icon_stream_get_type (void) NULL, (CamelObjectInitFunc) em_icon_stream_init, (CamelObjectFinalizeFunc) em_icon_stream_finalize); + + emis_cache = em_cache_new(60, sizeof(struct _emis_cache_node), emis_cache_free); } return type; @@ -97,6 +116,9 @@ emis_cleanup(EMIconStream *emis) emis->destroy_id = 0; } + g_free(emis->key); + emis->key = NULL; + emis->image = NULL; emis->sync.cancel = TRUE; } @@ -137,6 +159,7 @@ emis_sync_close(CamelStream *stream) EMIconStream *emis = (EMIconStream *)stream; int width, height, ratio; GdkPixbuf *pixbuf, *mini; + struct _emis_cache_node *node; if (emis->loader == NULL) return -1; @@ -174,11 +197,16 @@ emis_sync_close(CamelStream *stream) mini = gdk_pixbuf_scale_simple(pixbuf, width, height, GDK_INTERP_BILINEAR); #endif gtk_image_set_from_pixbuf(emis->image, mini); - g_object_unref(mini); + pixbuf = mini; } else { + g_object_ref(pixbuf); gtk_image_set_from_pixbuf(emis->image, pixbuf); } + node = (struct _emis_cache_node *)em_cache_node_new(emis_cache, emis->key); + node->pixbuf = pixbuf; + em_cache_add(emis_cache, (EMCacheNode *)node); + g_object_unref(emis->loader); emis->loader = NULL; @@ -195,14 +223,40 @@ emis_image_destroy(struct _GtkImage *image, EMIconStream *emis) } CamelStream * -em_icon_stream_new(GtkImage *image) +em_icon_stream_new(GtkImage *image, const char *key) { EMIconStream *new; - + new = EM_ICON_STREAM(camel_object_new(EM_ICON_STREAM_TYPE)); new->image = image; new->destroy_id = g_signal_connect(image, "destroy", G_CALLBACK(emis_image_destroy), new); new->loader = gdk_pixbuf_loader_new(); + new->key = g_strdup(key); return (CamelStream *)new; } + +GdkPixbuf * +em_icon_stream_get_image(const char *key) +{ + struct _emis_cache_node *node; + GdkPixbuf *pb = NULL; + + /* forces the cache to be setup if not */ + em_icon_stream_get_type(); + + node = (struct _emis_cache_node *)em_cache_lookup(emis_cache, key); + if (node) { + pb = node->pixbuf; + g_object_ref(pb); + em_cache_node_unref(emis_cache, (EMCacheNode *)node); + } + + return pb; +} + +void +em_icon_stream_clear_cache(void) +{ + em_cache_clear(emis_cache); +} |