New class that wraps writing to a GtkHTML stream so that we don't have to

2001-10-22  Jeffrey Stedfast  <fejj@ximian.com>

	* mail-stream-gtkhtml.c (mail_stream_gtkhtml_new): New class that
	wraps writing to a GtkHTML stream so that we don't have to write
	to an intermediate GByteArray.

	* mail-display.c (on_url_requested): Use the new Camel->GtkHTML
	stream - this means we don't have to chew up nearly as much
	memory...yay!

svn path=/trunk/; revision=13911
This commit is contained in:
Jeffrey Stedfast
2001-10-22 23:24:01 +00:00
committed by Jeffrey Stedfast
parent dcc5cbe678
commit 4807a4d7e7
5 changed files with 184 additions and 12 deletions

View File

@ -1,3 +1,13 @@
2001-10-22 Jeffrey Stedfast <fejj@ximian.com>
* mail-stream-gtkhtml.c (mail_stream_gtkhtml_new): New class that
wraps writing to a GtkHTML stream so that we don't have to write
to an intermediate GByteArray.
* mail-display.c (on_url_requested): Use the new Camel->GtkHTML
stream - this means we don't have to chew up nearly as much
memory...yay!
2001-10-22 Ettore Perazzoli <ettore@ximian.com>
* mail-mt.c (do_op_status): Don't free `clientid' as it's

View File

@ -95,6 +95,8 @@ evolution_mail_SOURCES = \
mail-send-recv.h \
mail-session.c \
mail-session.h \
mail-stream-gtkhtml.c \
mail-stream-gtkhtml.h \
mail-tools.c \
mail-tools.h \
mail-types.h \

View File

@ -45,6 +45,7 @@
#include "e-searching-tokenizer.h"
#include "folder-browser-factory.h"
#include "mail-stream-gtkhtml.h"
#include "mail-display.h"
#include "mail-config.h"
#include "mail-ops.h"
@ -1043,7 +1044,6 @@ on_url_requested (GtkHTML *html, const char *url, GtkHTMLStream *handle,
if (medium) {
CamelContentType *content_type;
CamelDataWrapper *data;
CamelStream *stream_mem;
g_return_if_fail (CAMEL_IS_MEDIUM (medium));
@ -1055,18 +1055,17 @@ on_url_requested (GtkHTML *html, const char *url, GtkHTMLStream *handle,
if (header_content_type_is (content_type, "text", "*")) {
ba = mail_format_get_data_wrapper_text (data, md);
if (ba) {
gtk_html_write (html, handle, ba->data, ba->len);
g_byte_array_free (ba, TRUE);
}
} else {
ba = g_byte_array_new ();
stream_mem = camel_stream_mem_new ();
camel_stream_mem_set_byte_array (CAMEL_STREAM_MEM (stream_mem), ba);
camel_data_wrapper_write_to_stream (data, stream_mem);
camel_object_unref (CAMEL_OBJECT (stream_mem));
}
if (ba) {
gtk_html_write (html, handle, ba->data, ba->len);
CamelStream *html_stream;
g_byte_array_free (ba, TRUE);
html_stream = mail_stream_gtkhtml_new (html, handle);
camel_data_wrapper_write_to_stream (data, html_stream);
camel_object_unref (CAMEL_OBJECT (html_stream));
}
gtk_html_end (html, handle, GTK_HTML_STREAM_OK);
@ -1075,7 +1074,7 @@ on_url_requested (GtkHTML *html, const char *url, GtkHTMLStream *handle,
urls = g_datalist_get_data (md->data, "data_urls");
g_return_if_fail (urls != NULL);
/* See if it's some piece of cached data */
ba = g_hash_table_lookup (urls, url);
if (ba) {

View File

@ -0,0 +1,99 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Authors: Jeffrey Stedfast <fejj@ximian.com>
*
* Copyright 2001 Ximain, Inc. (www.ximian.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
*
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "mail-stream-gtkhtml.h"
static CamelStreamClass *parent_class = NULL;
static ssize_t stream_write (CamelStream *stream, const char *buffer, size_t n);
static void
mail_stream_gtkhtml_class_init (MailStreamGtkHTMLClass *mail_stream_gtkhtml_class)
{
CamelStreamClass *camel_stream_class =
CAMEL_STREAM_CLASS (mail_stream_gtkhtml_class);
parent_class = CAMEL_STREAM_CLASS (camel_type_get_global_classfuncs (CAMEL_STREAM_TYPE));
/* virtual method overload */
camel_stream_class->write = stream_write;
}
static void
mail_stream_gtkhtml_init (CamelObject *object)
{
;
}
static void
mail_stream_gtkhtml_finalize (CamelObject *object)
{
;
}
CamelType
mail_stream_gtkhtml_get_type (void)
{
static CamelType type = CAMEL_INVALID_TYPE;
if (type == CAMEL_INVALID_TYPE) {
type = camel_type_register (CAMEL_STREAM_TYPE,
"MailStreamGtkHTML",
sizeof (MailStreamGtkHTML),
sizeof (MailStreamGtkHTMLClass),
(CamelObjectClassInitFunc) mail_stream_gtkhtml_class_init,
NULL,
(CamelObjectInitFunc) mail_stream_gtkhtml_init,
(CamelObjectFinalizeFunc) mail_stream_gtkhtml_finalize);
}
return type;
}
CamelStream *
mail_stream_gtkhtml_new (GtkHTML *html, GtkHTMLStream *html_stream)
{
MailStreamGtkHTML *stream_gtkhtml;
stream_gtkhtml = MAIL_STREAM_GTKHTML (camel_object_new (MAIL_STREAM_GTKHTML_TYPE));
stream_gtkhtml->html = html;
stream_gtkhtml->html_stream = html_stream;
return CAMEL_STREAM (stream_gtkhtml);
}
static ssize_t
stream_write (CamelStream *stream, const char *buffer, size_t n)
{
MailStreamGtkHTML *stream_gtkhtml = MAIL_STREAM_GTKHTML (stream);
gtk_html_write (stream_gtkhtml->html, stream_gtkhtml->html_stream,
buffer, n);
return n;
}

View File

@ -0,0 +1,62 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Authors: Jeffrey Stedfast <fejj@ximian.com>
*
* Copyright 2001 Ximain, Inc. (www.ximian.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
*
*/
#ifndef MAIL_STREAM_GTKHTML_H
#define MAIL_STREAM_GTKHTML_H
#ifdef __cplusplus
extern "C" {
#pragma }
#endif /* __cplusplus } */
#include <camel/camel-stream.h>
#include <gtkhtml/gtkhtml.h>
#define MAIL_STREAM_GTKHTML_TYPE (mail_stream_gtkhtml_get_type ())
#define MAIL_STREAM_GTKHTML(obj) (CAMEL_CHECK_CAST((obj), MAIL_STREAM_GTKHTML_TYPE, MailStreamGtkHTML))
#define MAIL_STREAM_GTKHTML_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), MAIL_STREAM_GTKHTML_TYPE, MailStreamGtkhTMLClass))
#define MAIL_IS_STREAM_GTKHTML(o) (CAMEL_CHECK_TYPE((o), MAIL_STREAM_GTKHTML_TYPE))
typedef struct _MailStreamGtkHTML {
CamelStream parent_stream;
GtkHTML *html;
GtkHTMLStream *html_stream;
} MailStreamGtkHTML;
typedef struct {
CamelStreamClass parent_class;
} MailStreamGtkHTMLClass;
CamelType mail_stream_gtkhtml_get_type (void);
/* Note: stream does not ref these objects! */
CamelStream *mail_stream_gtkhtml_new (GtkHTML *html, GtkHTMLStream *html_stream);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* MAIL_STREAM_GTKHTML_H */