Files
evolution/composer/evolution-composer.c
Dan Winship c91f7c6b59 [pulled up from evolution-1-0-branch]
Mailer side of 14705.

	* Evolution-Composer.idl (setBody): Change setBodyText to setBody
	and take a MIME type as well.
	(show): Add an exception.

	* evolution-composer.c (impl_Composer_set_body, etc): Update for
	IDL change. While I'm here, fix this to DTRT with both plaintext
	and HTML bodies. (It claimed to take plain text before, but then
	passed it to the composer as HTML.)
	(impl_Composer_show): Raise an exception if setBody has been
	called, since the composer window will not display the real data
	in that case.

	* e-msg-composer.c (e_msg_composer_set_body): interface for
	impl_Composer_set_body.
	(build_message): If e_msg_composer_set_body has been called, use
	the body and MIME type supplied to it rather than the contents of
	the HTML editor.

svn path=/trunk/; revision=15833
2002-02-25 16:36:59 +00:00

405 lines
11 KiB
C

/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
/* evolution-composer.c
*
* Copyright (C) 2000 Ximian, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of version 2 of the GNU General Public
* published by the Free Software Foundation; either version 2 of the
* 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., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
* Author: Dan Winship <danw@ximian.com>
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <gtk/gtksignal.h>
#include <bonobo/bonobo-item-handler.h>
#include <bonobo/bonobo-generic-factory.h>
#include <gal/util/e-util.h>
#include <gal/widgets/e-gui-utils.h>
#include <camel/camel.h>
#include "evolution-composer.h"
#include "mail/mail-config.h"
#include "e-util/e-html-utils.h"
#define PARENT_TYPE BONOBO_OBJECT_TYPE
static BonoboObjectClass *parent_class = NULL;
static void (*send_cb) (EMsgComposer *, gpointer);
static void (*postpone_cb) (EMsgComposer *, gpointer);
/* CORBA interface implementation. */
static POA_GNOME_Evolution_Composer__vepv Composer_vepv;
static EDestination **
corba_recipientlist_to_destv (const GNOME_Evolution_Composer_RecipientList *cl)
{
GNOME_Evolution_Composer_Recipient *recip;
EDestination **destv;
int i;
if (cl->_length == 0)
return NULL;
destv = g_new (EDestination *, cl->_length+1);
for (i = 0; i < cl->_length; ++i) {
recip = &(cl->_buffer[i]);
destv[i] = e_destination_new ();
if (*recip->name)
e_destination_set_name (destv[i], recip->name);
e_destination_set_email (destv[i], recip->address);
}
destv[cl->_length] = NULL;
return destv;
}
static void
impl_Composer_set_headers (PortableServer_Servant servant,
const GNOME_Evolution_Composer_RecipientList *to,
const GNOME_Evolution_Composer_RecipientList *cc,
const GNOME_Evolution_Composer_RecipientList *bcc,
const CORBA_char *subject,
CORBA_Environment *ev)
{
BonoboObject *bonobo_object;
EvolutionComposer *composer;
EDestination **tov, **ccv, **bccv;
bonobo_object = bonobo_object_from_servant (servant);
composer = EVOLUTION_COMPOSER (bonobo_object);
tov = corba_recipientlist_to_destv (to);
ccv = corba_recipientlist_to_destv (cc);
bccv = corba_recipientlist_to_destv (bcc);
e_msg_composer_set_headers (composer->composer, NULL, tov, ccv, bccv, subject);
e_destination_freev (tov);
e_destination_freev (ccv);
e_destination_freev (bccv);
}
static void
impl_Composer_set_multipart_type (PortableServer_Servant servant,
GNOME_Evolution_Composer_MultipartType type,
CORBA_Environment *ev)
{
BonoboObject *bonobo_object;
EvolutionComposer *composer;
bonobo_object = bonobo_object_from_servant (servant);
composer = EVOLUTION_COMPOSER (bonobo_object);
if (type == GNOME_Evolution_Composer_ALTERNATIVE) {
composer->composer->is_alternative = TRUE;
composer->composer->send_html = FALSE;
}
}
static void
impl_Composer_set_body (PortableServer_Servant servant,
const CORBA_char *body,
const CORBA_char *mime_type,
CORBA_Environment *ev)
{
BonoboObject *bonobo_object;
EvolutionComposer *composer;
bonobo_object = bonobo_object_from_servant (servant);
composer = EVOLUTION_COMPOSER (bonobo_object);
if (!g_strcasecmp (mime_type, "text/plain")) {
char *htmlbody = e_text_to_html (body, E_TEXT_TO_HTML_PRE);
e_msg_composer_set_body_text (composer->composer, htmlbody);
g_free (htmlbody);
} else if (!g_strcasecmp (mime_type, "text/html"))
e_msg_composer_set_body_text (composer->composer, body);
else
e_msg_composer_set_body (composer->composer, body, mime_type);
}
static void
impl_Composer_attach_MIME (PortableServer_Servant servant,
const CORBA_char *data,
CORBA_Environment *ev)
{
BonoboObject *bonobo_object;
EvolutionComposer *composer;
CamelMimePart *attachment;
CamelStream *mem_stream;
int status;
bonobo_object = bonobo_object_from_servant (servant);
composer = EVOLUTION_COMPOSER (bonobo_object);
mem_stream = camel_stream_mem_new_with_buffer (data, strlen (data));
attachment = camel_mime_part_new ();
status = camel_data_wrapper_construct_from_stream (
CAMEL_DATA_WRAPPER (attachment), mem_stream);
camel_object_unref (CAMEL_OBJECT (mem_stream));
if (status == -1) {
CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
ex_GNOME_Evolution_Composer_CouldNotParse,
NULL);
return;
}
e_msg_composer_attach (composer->composer, attachment);
camel_object_unref (CAMEL_OBJECT (attachment));
}
static void
impl_Composer_attach_data (PortableServer_Servant servant,
const CORBA_char *content_type,
const CORBA_char *filename,
const CORBA_char *description,
const CORBA_boolean show_inline,
const GNOME_Evolution_Composer_AttachmentData *data,
CORBA_Environment *ev)
{
BonoboObject *bonobo_object;
EvolutionComposer *composer;
CamelMimePart *attachment;
bonobo_object = bonobo_object_from_servant (servant);
composer = EVOLUTION_COMPOSER (bonobo_object);
attachment = camel_mime_part_new ();
camel_mime_part_set_content (attachment, data->_buffer, data->_length,
content_type);
if (*filename)
camel_mime_part_set_filename (attachment, filename);
if (*description)
camel_mime_part_set_description (attachment, description);
camel_mime_part_set_disposition (attachment, show_inline ?
"inline" : "attachment");
e_msg_composer_attach (composer->composer, attachment);
camel_object_unref (CAMEL_OBJECT (attachment));
}
static void
impl_Composer_show (PortableServer_Servant servant,
CORBA_Environment *ev)
{
BonoboObject *bonobo_object;
EvolutionComposer *composer;
bonobo_object = bonobo_object_from_servant (servant);
composer = EVOLUTION_COMPOSER (bonobo_object);
if (composer->composer->mime_body) {
CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
ex_GNOME_Evolution_Composer_CannotShow,
NULL);
return;
}
gtk_widget_show (GTK_WIDGET (composer->composer));
}
static void
impl_Composer_send (PortableServer_Servant servant,
CORBA_Environment *ev)
{
BonoboObject *bonobo_object;
EvolutionComposer *composer;
bonobo_object = bonobo_object_from_servant (servant);
composer = EVOLUTION_COMPOSER (bonobo_object);
send_cb (composer->composer, NULL);
}
POA_GNOME_Evolution_Composer__epv *
evolution_composer_get_epv (void)
{
POA_GNOME_Evolution_Composer__epv *epv;
epv = g_new0 (POA_GNOME_Evolution_Composer__epv, 1);
epv->setHeaders = impl_Composer_set_headers;
epv->setMultipartType = impl_Composer_set_multipart_type;
epv->setBody = impl_Composer_set_body;
epv->attachMIME = impl_Composer_attach_MIME;
epv->attachData = impl_Composer_attach_data;
epv->show = impl_Composer_show;
epv->send = impl_Composer_send;
return epv;
}
/* GtkObject stuff */
static void
destroy (GtkObject *object)
{
EvolutionComposer *composer = EVOLUTION_COMPOSER (object);
if (composer->composer)
gtk_object_unref (GTK_OBJECT (composer->composer));
GTK_OBJECT_CLASS (parent_class)->destroy (object);
}
static void
class_init (EvolutionComposerClass *klass)
{
GtkObjectClass *object_class;
object_class = GTK_OBJECT_CLASS (klass);
object_class->destroy = destroy;
parent_class = gtk_type_class (bonobo_object_get_type ());
Composer_vepv.Bonobo_Unknown_epv = bonobo_object_get_epv ();
Composer_vepv.GNOME_Evolution_Composer_epv = evolution_composer_get_epv ();
}
static void
init (EvolutionComposer *composer)
{
const MailConfigAccount *account;
account = mail_config_get_default_account ();
composer->composer = e_msg_composer_new ();
gtk_signal_connect (GTK_OBJECT (composer->composer), "send",
GTK_SIGNAL_FUNC (send_cb), NULL);
gtk_signal_connect (GTK_OBJECT (composer->composer), "postpone",
GTK_SIGNAL_FUNC (postpone_cb), NULL);
}
#if 0
static Bonobo_ItemContainer_ObjectNames *
enum_objects (BonoboItemHandler *handler, gpointer data, CORBA_Environment *ev)
{
}
#endif
static Bonobo_Unknown
get_object (BonoboItemHandler *h, const char *item_name, gboolean only_if_exists,
gpointer data, CORBA_Environment *ev)
{
EvolutionComposer *composer = data;
GSList *options, *l;
options = bonobo_item_option_parse (item_name);
for (l = options; l; l = l->next){
BonoboItemOption *option = l->data;
if (strcmp (option->key, "visible") == 0){
gboolean show = 1;
if (option->value)
show = atoi (option->value);
if (show)
gtk_widget_show (GTK_WIDGET (composer->composer));
else
gtk_widget_hide (GTK_WIDGET (composer->composer));
}
}
return bonobo_object_dup_ref (
BONOBO_OBJECT (composer)->corba_objref, ev);
}
void
evolution_composer_construct (EvolutionComposer *composer,
GNOME_Evolution_Composer corba_object)
{
BonoboObject *item_handler;
g_return_if_fail (composer != NULL);
g_return_if_fail (EVOLUTION_IS_COMPOSER (composer));
g_return_if_fail (corba_object != CORBA_OBJECT_NIL);
bonobo_object_construct (BONOBO_OBJECT (composer), corba_object);
item_handler = BONOBO_OBJECT (
bonobo_item_handler_new (NULL, get_object, composer));
bonobo_object_add_interface (BONOBO_OBJECT (composer), BONOBO_OBJECT (item_handler));
}
EvolutionComposer *
evolution_composer_new (void)
{
EvolutionComposer *new;
POA_GNOME_Evolution_Composer *servant;
CORBA_Environment ev;
GNOME_Evolution_Composer corba_object;
servant = (POA_GNOME_Evolution_Composer *) g_new0 (BonoboObjectServant, 1);
servant->vepv = &Composer_vepv;
CORBA_exception_init (&ev);
POA_GNOME_Evolution_Composer__init ((PortableServer_Servant) servant, &ev);
if (ev._major != CORBA_NO_EXCEPTION) {
g_free (servant);
CORBA_exception_free (&ev);
return NULL;
}
CORBA_exception_free (&ev);
new = gtk_type_new (evolution_composer_get_type ());
corba_object = bonobo_object_activate_servant (BONOBO_OBJECT (new),
servant);
evolution_composer_construct (new, corba_object);
return new;
}
E_MAKE_TYPE (evolution_composer, "EvolutionComposer", EvolutionComposer, class_init, init, PARENT_TYPE)
#define GNOME_EVOLUTION_MAIL_COMPOSER_FACTORY_ID "OAFIID:GNOME_Evolution_Mail_ComposerFactory"
static BonoboObject *
factory_fn (BonoboGenericFactory *factory, void *closure)
{
if (!mail_config_is_configured ()) {
e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
_("Could not create composer window, because you "
"have not yet\nconfigured any identities in the "
"mail component."));
return NULL;
}
return BONOBO_OBJECT (evolution_composer_new ());
}
void
evolution_composer_factory_init (void (*send) (EMsgComposer *, gpointer),
void (*postpone) (EMsgComposer *, gpointer))
{
if (bonobo_generic_factory_new (GNOME_EVOLUTION_MAIL_COMPOSER_FACTORY_ID,
factory_fn, NULL) == NULL) {
e_notice (NULL, GNOME_MESSAGE_BOX_ERROR,
_("Cannot initialize Evolution's composer."));
exit (1);
}
send_cb = send;
postpone_cb = postpone;
}