aboutsummaryrefslogblamecommitdiffstats
path: root/plugins/mail-remote/evolution-mail-messagestream.c
blob: a1eeed4979b69c3995436e5dfaee4d2c956c6cfc (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
















                                                                           

                                                                   































                                                                                
                                                            









































































































                                                                                                                           
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
/* 
 * Copyright (C) 2005  Novell, Inc.
 *
 * Authors: Michael Zucchi <notzed@novell.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of version 2 of the GNU General Public
 * License as published by the Free Software Foundation.
 *
 * 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., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

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

#include <errno.h>
#include <string.h>
#include <bonobo/bonobo-i18n.h>
#include <bonobo/bonobo-exception.h>
#include "evolution-mail-messagestream.h"
#include <camel/camel-stream-mem.h>

#include "e-corba-utils.h"

#define PARENT_TYPE bonobo_object_get_type ()

static BonoboObjectClass *parent_class = NULL;

/* GObject methods */

static void
impl_dispose (GObject *object)
{
    (* G_OBJECT_CLASS (parent_class)->dispose) (object);
}

static void
impl_finalize (GObject *object)
{
    EvolutionMailMessageStream *emms = (EvolutionMailMessageStream *)object;

    d(printf("EvolutionMailMessageStream: finalise\n"));

    if (emms->source)
        camel_object_unref(emms->source);
    g_free(emms->buffer);

    (* G_OBJECT_CLASS (parent_class)->finalize) (object);
}

/* Evolution.Mail.MessageStream */

static Evolution_Mail_Buffer *
impl_next(PortableServer_Servant _servant, const CORBA_long limit, CORBA_Environment * ev)
{
    EvolutionMailMessageStream *emf = (EvolutionMailMessageStream *)bonobo_object_from_servant(_servant);
    Evolution_Mail_Buffer *buf;
    ssize_t len;

    buf = Evolution_Mail_Buffer__alloc();
    buf->_maximum = limit;
    buf->_buffer = Evolution_Mail_Buffer_allocbuf(buf->_maximum);

    if (emf->source) {
        len = camel_stream_read(emf->source, buf->_buffer, buf->_maximum);
        if (len == -1) {
            Evolution_Mail_MailException *x;

            x = Evolution_Mail_MailException__alloc();
            x->id = Evolution_Mail_SYSTEM_ERROR;
            x->desc = CORBA_string_dup(g_strerror(errno));
            CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_Evolution_Mail_MailException, x);
            CORBA_free(buf);
            buf = CORBA_OBJECT_NIL;
        } else {
            buf->_length = len;
        }
    } else {
        len = MIN(limit, (emf->len - emf->pos));
        memcpy(buf->_buffer, emf->buffer + emf->pos, len);
        emf->pos += len;
        buf->_length = len;
    }

    return buf;
}

static void
impl_mi_dispose(PortableServer_Servant _servant, CORBA_Environment *ev)
{
    EvolutionMailMessageStream *emmi = (EvolutionMailMessageStream *)bonobo_object_from_servant(_servant);

    bonobo_object_set_immortal((BonoboObject *)emmi, FALSE);
    bonobo_object_unref((BonoboObject *)emmi);
}

/* Initialization */

static void
evolution_mail_messagestream_class_init (EvolutionMailMessageStreamClass *klass)
{
    POA_Evolution_Mail_MessageStream__epv *epv = &klass->epv;
    GObjectClass *object_class = G_OBJECT_CLASS (klass);

    parent_class = g_type_class_peek_parent (klass);

    epv->next = impl_next;
    epv->dispose = impl_mi_dispose;

    object_class->dispose = impl_dispose;
    object_class->finalize = impl_finalize;
}

static void
evolution_mail_messagestream_init(EvolutionMailMessageStream *emi, EvolutionMailMessageStreamClass *klass)
{
    bonobo_object_set_immortal((BonoboObject *)emi, TRUE);
}

BONOBO_TYPE_FUNC_FULL (EvolutionMailMessageStream, Evolution_Mail_MessageStream, PARENT_TYPE, evolution_mail_messagestream)

EvolutionMailMessageStream *
evolution_mail_messagestream_new(CamelStream *source)
{
    /* FIXME: use right poa, thread per object? */
    EvolutionMailMessageStream *emf = g_object_new(evolution_mail_messagestream_get_type(), NULL);

    emf->source = source;
    camel_object_ref(source);

    return emf;
}

EvolutionMailMessageStream *
evolution_mail_messagestream_new_buffer(const char *buffer, size_t len)
{
    /* FIXME: use right poa, thread per object? */
    EvolutionMailMessageStream *emf = g_object_new(evolution_mail_messagestream_get_type(), NULL);

    emf->buffer = g_malloc(len);
    memcpy(emf->buffer, buffer, len);
    emf->len = len;
    emf->pos = 0;

    return emf;
}