/* modest-tny-stream-gtkhtml.c */
#include "modest-tny-stream-gtkhtml.h"
+#include "modest-gtkhtml-mime-part-view.h"
#include <tny-stream.h>
#include <gtkhtml/gtkhtml-stream.h>
#include <gtkhtml/gtkhtml-search.h>
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, */
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, \
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
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;
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;
}
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 */
}
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;
}
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)
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;
}