X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-tny-stream-gtkhtml.c;h=3bdd6b3339c534888b40818b8773258a461f46d7;hb=fcc836f3307ad7605580274e241cbcd456ad28be;hp=c92cc68ac5247be98f9da8f62021ca5b38c5f4aa;hpb=939b56d916987067976d8ce86c943286d78aac40;p=modest diff --git a/src/widgets/modest-tny-stream-gtkhtml.c b/src/widgets/modest-tny-stream-gtkhtml.c index c92cc68..3bdd6b3 100644 --- a/src/widgets/modest-tny-stream-gtkhtml.c +++ b/src/widgets/modest-tny-stream-gtkhtml.c @@ -31,6 +31,7 @@ /* modest-tny-stream-gtkhtml.c */ #include "modest-tny-stream-gtkhtml.h" +#include "modest-gtkhtml-mime-part-view.h" #include #include #include @@ -42,6 +43,8 @@ static void modest_tny_stream_gtkhtml_finalize (GObject *obj); static void modest_tny_stream_gtkhml_iface_init (gpointer g_iface, gpointer iface_data); +static void stop_streams (ModestGtkhtmlMimePartView *view, gpointer userdata); + /* list my signals */ enum { /* MY_SIGNAL_1, */ @@ -52,6 +55,11 @@ enum { typedef struct _ModestTnyStreamGtkhtmlPrivate ModestTnyStreamGtkhtmlPrivate; struct _ModestTnyStreamGtkhtmlPrivate { GtkHTMLStream *stream; + GtkHTML *html; + guint stop_streams_id; + + gssize max_size; + gssize current_size; }; #define MODEST_TNY_STREAM_GTKHTML_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_TNY_STREAM_GTKHTML, \ @@ -116,6 +124,11 @@ modest_tny_stream_gtkhtml_init (ModestTnyStreamGtkhtml *obj) priv = MODEST_TNY_STREAM_GTKHTML_GET_PRIVATE(obj); priv->stream = NULL; + priv->html = NULL; + priv->stop_streams_id = 0; + + priv->max_size = 0; + priv->current_size = 0; } static void @@ -125,10 +138,20 @@ modest_tny_stream_gtkhtml_finalize (GObject *obj) priv = MODEST_TNY_STREAM_GTKHTML_GET_PRIVATE(obj); priv->stream = NULL; + + if (priv->stop_streams_id > 0) { + g_signal_handler_disconnect (G_OBJECT (priv->html), priv->stop_streams_id); + priv->stop_streams_id = 0; + } + + if (priv->html) { + g_object_unref (priv->html); + priv->html = NULL; + } } GObject* -modest_tny_stream_gtkhtml_new (GtkHTMLStream *stream) +modest_tny_stream_gtkhtml_new (GtkHTMLStream *stream, GtkHTML *html) { GObject *obj; ModestTnyStreamGtkhtmlPrivate *priv; @@ -139,6 +162,11 @@ modest_tny_stream_gtkhtml_new (GtkHTMLStream *stream) g_return_val_if_fail (stream, NULL); priv->stream = stream; + priv->html = g_object_ref (html); + + priv->stop_streams_id = g_signal_connect (G_OBJECT (html), "stop-streams", + G_CALLBACK (stop_streams), obj); + priv->current_size = 0; return obj; } @@ -168,8 +196,30 @@ gtkhtml_write (TnyStream *self, const char *buffer, size_t n) if (n == 0 || !buffer) return 0; - + + if (!priv->html || !GTK_WIDGET_VISIBLE (priv->html)) + return -1; + + if (priv->max_size > 0) { + + /* We only use the maximum size for write method, and even we + * ignore and fake as we would do a successfull read */ + if (priv->current_size >= priv->max_size) + return n; + + if (priv->current_size + n > priv->max_size) + n = priv->max_size - priv->current_size; + } + + if (!g_main_context_is_owner (NULL)) + gdk_threads_enter (); + gtk_html_stream_write (priv->stream, buffer, n); + + if (!g_main_context_is_owner (NULL)) + gdk_threads_leave (); + priv->current_size += n; + return n; /* hmmm */ } @@ -188,8 +238,25 @@ gtkhtml_close (TnyStream *self) g_return_val_if_fail (self, 0); priv = MODEST_TNY_STREAM_GTKHTML_GET_PRIVATE(self); - gtk_html_stream_close (priv->stream, GTK_HTML_STREAM_OK); + if (priv->html && GTK_WIDGET_VISIBLE (priv->html)) { + if (!g_main_context_is_owner (NULL)) + gdk_threads_enter (); + + gtk_html_stream_close (priv->stream, GTK_HTML_STREAM_OK); + + if (!g_main_context_is_owner (NULL)) + gdk_threads_leave (); + + } priv->stream = NULL; + if (priv->html && priv->stop_streams_id > 0) { + g_signal_handler_disconnect (G_OBJECT (priv->html), priv->stop_streams_id); + priv->stop_streams_id = 0; + } + if (priv->html) { + g_object_unref (priv->html); + priv->html = NULL; + } return 0; } @@ -216,6 +283,59 @@ gtkhtml_write_to_stream (TnyStream *self, TnyStream *output) return 0; } +static void +stop_streams (ModestGtkhtmlMimePartView *view, gpointer userdata) +{ + ModestTnyStreamGtkhtml *self = (ModestTnyStreamGtkhtml *) userdata; + ModestTnyStreamGtkhtmlPrivate *priv; + + g_return_if_fail (self); + priv = MODEST_TNY_STREAM_GTKHTML_GET_PRIVATE(self); + + if (priv->html && priv->stop_streams_id > 0) { + g_signal_handler_disconnect (G_OBJECT (priv->html), priv->stop_streams_id); + priv->stop_streams_id = 0; + } + + if (priv->html) { + g_object_unref (priv->html); + priv->html = NULL; + } +} + +void +modest_tny_stream_gtkhtml_set_max_size (ModestTnyStreamGtkhtml *stream, + gssize max_size) +{ + ModestTnyStreamGtkhtmlPrivate *priv; + + g_return_if_fail (MODEST_IS_TNY_STREAM_GTKHTML (stream)); + priv = MODEST_TNY_STREAM_GTKHTML_GET_PRIVATE (stream); + + priv->max_size = max_size; +} + +gssize +modest_tny_stream_gtkhtml_get_max_size (ModestTnyStreamGtkhtml *stream) +{ + ModestTnyStreamGtkhtmlPrivate *priv; + + g_return_val_if_fail (MODEST_IS_TNY_STREAM_GTKHTML (stream), 0); + priv = MODEST_TNY_STREAM_GTKHTML_GET_PRIVATE (stream); + + return priv->max_size; +} + +gboolean +modest_tny_stream_gtkhtml_limit_reached (ModestTnyStreamGtkhtml *self) +{ + ModestTnyStreamGtkhtmlPrivate *priv; + + g_return_val_if_fail (MODEST_IS_TNY_STREAM_GTKHTML (self), 0); + priv = MODEST_TNY_STREAM_GTKHTML_GET_PRIVATE (self); + + return (priv->max_size > 0) && (priv->current_size >= priv->max_size); +} static void modest_tny_stream_gtkhml_iface_init (gpointer g_iface, gpointer iface_data) @@ -226,11 +346,11 @@ modest_tny_stream_gtkhml_iface_init (gpointer g_iface, gpointer iface_data) klass = (TnyStreamIface*) g_iface; - klass->read_func = gtkhtml_read; - klass->write_func = gtkhtml_write; - klass->flush_func = gtkhtml_flush; - klass->close_func = gtkhtml_close; - klass->is_eos_func = gtkhtml_is_eos; - klass->reset_func = gtkhtml_reset; - klass->write_to_stream_func = gtkhtml_write_to_stream; + klass->read = gtkhtml_read; + klass->write = gtkhtml_write; + klass->flush = gtkhtml_flush; + klass->close = gtkhtml_close; + klass->is_eos = gtkhtml_is_eos; + klass->reset = gtkhtml_reset; + klass->write_to_stream = gtkhtml_write_to_stream; }