aboutsummaryrefslogblamecommitdiffstats
path: root/mail/em-html-stream.c
blob: 096e1c9aa59d17709607cc63fc715d0fde2a0a67 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
  

                                                                


                                                               



                                                                    



                                                                               
  





                                                        







                    
                    

                           
            
 

                                              
           
                                 
 
                                                   


                                                                  

                                 

                                                                   



                          

                                         
 

                                 


              


                                     


                                                     
                               

                          
                                      

                                                             
 
                                                             











                                                    
                                    




                 
                                     





                                                    

                                                                      




                 
                                                    
 









































                                                                             




                                                                 

                                               

                          
 

                                                        

                                                                      
                                        
                       


                                                        
 
                                                          
 
                                  
 



                                                                      

                                                    

                            
/*
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) version 3.
 *
 * 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with the program; if not, see <http://www.gnu.org/licenses/>  
 *
 *
 * Authors:
 *      Jeffrey Stedfast <fejj@ximian.com>
 *      Michael Zucchi <notzed@ximian.com>
 *
 * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
 *
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <gtk/gtk.h>
#include "em-html-stream.h"

#define d(x)

static EMSyncStreamClass *parent_class = NULL;

static void
emhs_cleanup (EMHTMLStream *emhs)
{
    if (emhs->sync.cancel && emhs->html_stream)
        gtk_html_stream_close (
            emhs->html_stream, GTK_HTML_STREAM_ERROR);

    emhs->html_stream = NULL;
    emhs->sync.cancel = TRUE;
    g_signal_handler_disconnect (emhs->html, emhs->destroy_id);
    g_object_unref (emhs->html);
    emhs->html = NULL;
}

static void
emhs_gtkhtml_destroy (GtkHTML *html,
                      EMHTMLStream *emhs)
{
    emhs->sync.cancel = TRUE;
    emhs_cleanup (emhs);
}

static ssize_t
emhs_sync_write (CamelStream *stream,
                 const char *buffer,
                 size_t n)
{
    EMHTMLStream *emhs = EM_HTML_STREAM (stream);

    if (emhs->html == NULL)
        return -1;

    if (emhs->html_stream == NULL)
        emhs->html_stream = gtk_html_begin_full (
            emhs->html, NULL, NULL, emhs->flags);

    gtk_html_stream_write (emhs->html_stream, buffer, n);

    return (ssize_t) n;
}

static int
emhs_sync_flush(CamelStream *stream)
{
    EMHTMLStream *emhs = (EMHTMLStream *)stream;

    if (emhs->html_stream == NULL)
        return -1;

    gtk_html_flush (emhs->html);

    return 0;
}

static int
emhs_sync_close (CamelStream *stream)
{
    EMHTMLStream *emhs = (EMHTMLStream *)stream;

    if (emhs->html_stream == NULL)
        return -1;

    gtk_html_stream_close (emhs->html_stream, GTK_HTML_STREAM_OK);
    emhs_cleanup (emhs);

    return 0;
}

static void
em_html_stream_class_init (EMHTMLStreamClass *class)
{
    EMSyncStreamClass *sync_stream_class;

    parent_class = (EMSyncStreamClass *)em_sync_stream_get_type();

    sync_stream_class = EM_SYNC_STREAM_CLASS (class);
    sync_stream_class->sync_write = emhs_sync_write;
    sync_stream_class->sync_flush = emhs_sync_flush;
    sync_stream_class->sync_close = emhs_sync_close;
}

static void
em_html_stream_init (EMHTMLStream *emhs)
{
}

static void
em_html_stream_finalize (EMHTMLStream *emhs)
{
    if (emhs->html_stream) {
        /* set 'in finalise' flag */
        camel_stream_close (CAMEL_STREAM (emhs));
    }
}

CamelType
em_html_stream_get_type (void)
{
    static CamelType type = CAMEL_INVALID_TYPE;

    if (G_UNLIKELY (type == CAMEL_INVALID_TYPE)) {
        type = camel_type_register (
            em_sync_stream_get_type(),
            "EMHTMLStream",
            sizeof (EMHTMLStream),
            sizeof (EMHTMLStreamClass),
            (CamelObjectClassInitFunc) em_html_stream_class_init,
            NULL,
            (CamelObjectInitFunc) em_html_stream_init,
            (CamelObjectFinalizeFunc) em_html_stream_finalize);
    }

    return type;
}

/* TODO: Could pass NULL for html_stream, and do a gtk_html_begin
   on first data -> less flashing */
CamelStream *
em_html_stream_new (GtkHTML *html,
                    GtkHTMLStream *html_stream)
{
    EMHTMLStream *new;

    g_return_val_if_fail (GTK_IS_HTML (html), NULL);

    new = EM_HTML_STREAM (camel_object_new (EM_HTML_STREAM_TYPE));
    new->html_stream = html_stream;
    new->html = g_object_ref (html);
    new->flags = 0;
    new->destroy_id = g_signal_connect (
        html, "destroy",
        G_CALLBACK (emhs_gtkhtml_destroy), new);

    em_sync_stream_set_buffer_size (&new->sync, 8192);

    return CAMEL_STREAM (new);
}

void
em_html_stream_set_flags (EMHTMLStream *emhs, GtkHTMLBeginFlags flags)
{
    g_return_if_fail (EM_IS_HTML_STREAM (emhs));

    emhs->flags = flags;
}