diff options
Diffstat (limited to 'composer')
-rw-r--r-- | composer/ChangeLog | 26 | ||||
-rw-r--r-- | composer/HTMLEditor.idl | 56 | ||||
-rw-r--r-- | composer/Makefile.am | 13 | ||||
-rw-r--r-- | composer/e-msg-composer-attachment-bar.c | 10 | ||||
-rw-r--r-- | composer/e-msg-composer-attachment-bar.h | 2 | ||||
-rw-r--r-- | composer/e-msg-composer-attachment.c | 12 | ||||
-rw-r--r-- | composer/e-msg-composer-attachment.h | 2 | ||||
-rw-r--r-- | composer/e-msg-composer.c | 16 | ||||
-rw-r--r-- | composer/e-msg-composer.h | 1 | ||||
-rw-r--r-- | composer/listener.c | 73 |
10 files changed, 126 insertions, 85 deletions
diff --git a/composer/ChangeLog b/composer/ChangeLog index c3a8c4bd57..edb13ea3b5 100644 --- a/composer/ChangeLog +++ b/composer/ChangeLog @@ -1,3 +1,29 @@ +2000-11-04 Radek Doulik <rodo@helixcode.com> + + * listener.c (resolve_image_url): use inline images hash table + + * e-msg-composer.c (init): create inlined images hash table + (destroy): destroy it + (clear_inline_images): helper function, used from + g_hash_table_foreach_remove to destroy one inline image record + + * e-msg-composer.h: added hash table with inlined images url -> + cid info + +2000-11-03 Radek Doulik <rodo@helixcode.com> + + * listener.c (impl_event): updated for API changed + implemented image_url event + (resolve_image_url): new helper function, attaches image to mail + and returns new (resolved) url pointing to mime component + + * e-msg-composer-attachment.c (e_msg_composer_attachment_new): + added conponent_id parameter + + * e-msg-composer-attachment-bar.c + (e_msg_composer_attachment_bar_attach): added parameter content_id + (add_from_file): likewise + 2000-11-03 Jeffrey Stedfast <fejj@helixcode.com> * e-msg-composer-attachment.c (e_msg_composer_attachment_new): diff --git a/composer/HTMLEditor.idl b/composer/HTMLEditor.idl deleted file mode 100644 index ec1e971f22..0000000000 --- a/composer/HTMLEditor.idl +++ /dev/null @@ -1,56 +0,0 @@ -/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Interface for the HTML Editor. - * - * Authors: - * Larry Ewing <lewing@helixcode.com> - * Radek Doulik <rodo@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. - */ - -#include <Bonobo.idl> - -module HTMLEditor { - interface Resolver : Bonobo::Unknown { - exception NotFound {}; - - void loadURL (in Bonobo::ProgressiveDataSink sink, in string url) raises (NotFound); - }; - - struct Arg { - any value; - }; - typedef sequence<Arg> ListenerArgs; - - interface Listener : Bonobo::Unknown { - void event (in string name, in ListenerArgs args); - }; - - interface Engine : Bonobo::Unknown { - attribute Listener listener; - - /* - * return data of current paragraph - */ - any get_paragraph_data (in string key); - - /* - * sets data on current paragraph - */ - void set_paragraph_data (in string key, in any value); - - /* - * set data which are set to objects of given type while inserting - * we will use that to mark original text paragraph(s) in composer - * and use that data later in editing to implement better reply - * editing - */ - void set_object_data_by_type (in string type_name, in string key, in any data); - - /* - * execute editor command - */ - void command (in string command); - }; -}; diff --git a/composer/Makefile.am b/composer/Makefile.am index e005697b9d..144c3f85a8 100644 --- a/composer/Makefile.am +++ b/composer/Makefile.am @@ -2,14 +2,15 @@ IDLS = \ Evolution-Composer.idl \ - Composer.idl \ - HTMLEditor.idl + Composer.idl IDL_GENERATED = \ Composer.h \ Composer-common.c \ Composer-skels.c \ - Composer-stubs.c \ + Composer-stubs.c + +HTML_EDITOR_GENERATED = \ HTMLEditor.h \ HTMLEditor-common.c \ HTMLEditor-skels.c \ @@ -20,8 +21,9 @@ selectnamesdir = $(top_srcdir)/addressbook/gui/component/select-names $(IDL_GENERATED): $(IDLS) $(selectnamesdir)/Evolution-Addressbook-SelectNames.idl $(ORBIT_IDL) -I $(datadir)/idl `$(GNOME_CONFIG) --cflags idl` \ -I $(selectnamesdir) -I . $(srcdir)/Composer.idl - $(ORBIT_IDL) -I $(datadir)/idl `$(GNOME_CONFIG) --cflags idl` \ - -I $(selectnamesdir) -I . $(srcdir)/HTMLEditor.idl + +$(HTML_EDITOR_GENERATED): $(GTK_HTML_EDITOR_IDL) + $(ORBIT_IDL) `$(GNOME_CONFIG) --cflags idl` $(GTK_HTML_EDITOR_IDL) ## @@ -58,6 +60,7 @@ INCLUDES = \ libcomposer_la_SOURCES = \ $(IDL_GENERATED) \ + $(HTML_EDITOR_GENERATED) \ e-msg-composer-attachment-bar.c \ e-msg-composer-attachment-bar.h \ e-msg-composer-attachment.c \ diff --git a/composer/e-msg-composer-attachment-bar.c b/composer/e-msg-composer-attachment-bar.c index 93aaf30900..6653fa238f 100644 --- a/composer/e-msg-composer-attachment-bar.c +++ b/composer/e-msg-composer-attachment-bar.c @@ -157,9 +157,9 @@ add_from_mime_part (EMsgComposerAttachmentBar *bar, static void add_from_file (EMsgComposerAttachmentBar *bar, - const gchar *file_name) + const gchar *file_name, const gchar *content_id) { - add_common (bar, e_msg_composer_attachment_new (file_name)); + add_common (bar, e_msg_composer_attachment_new (file_name, content_id)); } static void @@ -395,7 +395,7 @@ add_from_user (EMsgComposerAttachmentBar *bar) file_name = e_msg_composer_select_file (composer, _("Attach a file")); - add_from_file (bar, file_name); + add_from_file (bar, file_name, NULL); g_free (file_name); } @@ -758,14 +758,14 @@ e_msg_composer_attachment_bar_get_num_attachments (EMsgComposerAttachmentBar *ba void e_msg_composer_attachment_bar_attach (EMsgComposerAttachmentBar *bar, - const gchar *file_name) + const gchar *file_name, const gchar *content_id) { g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (bar)); if (file_name == NULL) add_from_user (bar); else - add_from_file (bar, file_name); + add_from_file (bar, file_name, content_id); } void diff --git a/composer/e-msg-composer-attachment-bar.h b/composer/e-msg-composer-attachment-bar.h index 17d717cc10..31a59cc149 100644 --- a/composer/e-msg-composer-attachment-bar.h +++ b/composer/e-msg-composer-attachment-bar.h @@ -66,7 +66,7 @@ GtkType e_msg_composer_attachment_bar_get_type (void); GtkWidget *e_msg_composer_attachment_bar_new (GtkAdjustment *adj); void e_msg_composer_attachment_bar_to_multipart (EMsgComposerAttachmentBar *bar, CamelMultipart *multipart); guint e_msg_composer_attachment_bar_get_num_attachments (EMsgComposerAttachmentBar *bar); -void e_msg_composer_attachment_bar_attach (EMsgComposerAttachmentBar *bar, const gchar *file_name); +void e_msg_composer_attachment_bar_attach (EMsgComposerAttachmentBar *bar, const gchar *file_name, const gchar *content_id); void e_msg_composer_attachment_bar_attach_mime_part (EMsgComposerAttachmentBar *bar, CamelMimePart *part); #ifdef __cplusplus diff --git a/composer/e-msg-composer-attachment.c b/composer/e-msg-composer-attachment.c index b42631cda6..2ec141064b 100644 --- a/composer/e-msg-composer-attachment.c +++ b/composer/e-msg-composer-attachment.c @@ -165,7 +165,7 @@ e_msg_composer_attachment_get_type (void) * Return value: **/ EMsgComposerAttachment * -e_msg_composer_attachment_new (const gchar *file_name) +e_msg_composer_attachment_new (const gchar *file_name, const gchar *content_id) { EMsgComposerAttachment *new; CamelMimePart *part; @@ -199,7 +199,15 @@ e_msg_composer_attachment_new (const gchar *file_name) part = camel_mime_part_new (); camel_medium_set_content_object (CAMEL_MEDIUM (part), wrapper); camel_object_unref (CAMEL_OBJECT (wrapper)); - + + if (content_id) { + gchar *id; + + id = g_strconcat ("<", content_id, ">", NULL); + camel_mime_part_set_content_id (part, id); + g_free (id); + } + camel_mime_part_set_disposition (part, "attachment"); if (strchr (file_name, '/')) camel_mime_part_set_filename (part, strrchr (file_name, '/') + 1); diff --git a/composer/e-msg-composer-attachment.h b/composer/e-msg-composer-attachment.h index 47bc85ece0..f3d8922276 100644 --- a/composer/e-msg-composer-attachment.h +++ b/composer/e-msg-composer-attachment.h @@ -63,7 +63,7 @@ struct _EMsgComposerAttachmentClass { GtkType e_msg_composer_attachment_get_type (void); -EMsgComposerAttachment *e_msg_composer_attachment_new (const gchar *file_name); +EMsgComposerAttachment *e_msg_composer_attachment_new (const gchar *file_name, const gchar *content_id); EMsgComposerAttachment *e_msg_composer_attachment_new_from_mime_part (CamelMimePart *part); void e_msg_composer_attachment_edit (EMsgComposerAttachment *attachment, GtkWidget *parent); diff --git a/composer/e-msg-composer.c b/composer/e-msg-composer.c index dbf37ac0bb..6fd10d578c 100644 --- a/composer/e-msg-composer.c +++ b/composer/e-msg-composer.c @@ -707,7 +707,7 @@ menu_file_add_attachment_cb (BonoboUIComponent *uic, e_msg_composer_attachment_bar_attach (E_MSG_COMPOSER_ATTACHMENT_BAR (composer->attachment_bar), - NULL); + NULL, NULL); } static void @@ -987,6 +987,15 @@ attachment_bar_changed_cb (EMsgComposerAttachmentBar *bar, /* GtkObject methods. */ +static gboolean +clear_inline_images (gpointer key, gpointer value, gpointer user_data) +{ + g_free (key); + g_free (value); + + return TRUE; +} + static void destroy (GtkObject *object) { @@ -1034,6 +1043,7 @@ destroy (GtkObject *object) Bonobo_Unknown_unref (composer->editor_engine, &ev); CORBA_Object_release (composer->editor_engine, &ev); } + g_hash_table_foreach_remove (composer->inline_images, clear_inline_images, NULL); CORBA_exception_free (&ev); @@ -1084,7 +1094,7 @@ drag_data_received (EMsgComposer *composer, e_msg_composer_attachment_bar_attach (E_MSG_COMPOSER_ATTACHMENT_BAR (composer->attachment_bar), - filename); + filename, NULL); g_free (filename); } @@ -1142,7 +1152,9 @@ init (EMsgComposer *composer) composer->persist_file_interface = CORBA_OBJECT_NIL; composer->persist_stream_interface = CORBA_OBJECT_NIL; + composer->editor_engine = CORBA_OBJECT_NIL; + composer->inline_images = g_hash_table_new (g_str_hash, g_str_equal); composer->attachment_bar_visible = FALSE; composer->send_html = FALSE; diff --git a/composer/e-msg-composer.h b/composer/e-msg-composer.h index 0f0a290760..08d7da9906 100644 --- a/composer/e-msg-composer.h +++ b/composer/e-msg-composer.h @@ -67,6 +67,7 @@ struct _EMsgComposer { Bonobo_PersistStream persist_stream_interface; HTMLEditor_Engine editor_engine; BonoboObject *editor_listener; + GHashTable *inline_images; char *sig_file; diff --git a/composer/listener.c b/composer/listener.c index d97dd02df9..3b90e7200f 100644 --- a/composer/listener.c +++ b/composer/listener.c @@ -34,26 +34,73 @@ html_editor_listener_from_servant (PortableServer_Servant servant) return HTML_EDITOR_LISTENER (bonobo_object_from_servant (servant)); } -static void -impl_event (PortableServer_Servant _servant, const CORBA_char * name, - const HTMLEditor_ListenerArgs * args, - CORBA_Environment * ev) +static CORBA_any * +get_any_null () +{ + CORBA_any *rv; + + rv = CORBA_any__alloc (); + rv->_type = TC_null; + + return rv; +} + +static gchar * +resolve_image_url (HTMLEditorListener *l, gchar *url) +{ + gchar *cid = NULL; + + if (!strncmp (url, "file:", 5)) { + gchar *id; + + id = (gchar *) g_hash_table_lookup (l->composer->inline_images, url + 5); + if (!id) { + id = header_msgid_generate (); + e_msg_composer_attachment_bar_attach (E_MSG_COMPOSER_ATTACHMENT_BAR (l->composer->attachment_bar), + url + 5, id); + g_hash_table_insert (l->composer->inline_images, g_strdup (url + 5), id); + } + cid = g_strconcat ("cid:", id, NULL); + } + + return cid; +} + +static CORBA_any * +impl_event (PortableServer_Servant _servant, + const CORBA_char * name, const CORBA_any * arg, + CORBA_Environment * ev) { HTMLEditorListener *l = html_editor_listener_from_servant (_servant); - BonoboArg *arg; + BonoboArg *data; + CORBA_any *rv = NULL; /* printf ("impl_event\n"); */ - arg = HTMLEditor_Engine_get_paragraph_data (l->composer->editor_engine, "orig", ev); - if (ev->_major == CORBA_NO_EXCEPTION && arg) { - if (CORBA_TypeCode_equal (arg->_type, TC_boolean, ev) && BONOBO_ARG_GET_BOOLEAN (arg)) { - HTMLEditor_Engine_command (l->composer->editor_engine, "style-normal", ev); - HTMLEditor_Engine_command (l->composer->editor_engine, "indent-zero", ev); - HTMLEditor_Engine_command (l->composer->editor_engine, "italic-off", ev); + if (!strcmp (name, "command")) { + /* FIXME check for insert-paragraph command */ + data = HTMLEditor_Engine_get_paragraph_data (l->composer->editor_engine, "orig", ev); + if (ev->_major == CORBA_NO_EXCEPTION && data) { + if (CORBA_TypeCode_equal (data->_type, TC_boolean, ev) && BONOBO_ARG_GET_BOOLEAN (data)) { + HTMLEditor_Engine_command (l->composer->editor_engine, "style-normal", ev); + HTMLEditor_Engine_command (l->composer->editor_engine, "indent-zero", ev); + HTMLEditor_Engine_command (l->composer->editor_engine, "italic-off", ev); + } + BONOBO_ARG_SET_BOOLEAN (data, CORBA_FALSE); + HTMLEditor_Engine_set_paragraph_data (l->composer->editor_engine, "orig", data, ev); + } + } else if (!strcmp (name, "image_url")) { + gchar *url; + + if ((url = resolve_image_url (l, BONOBO_ARG_GET_STRING (arg)))) { + rv = bonobo_arg_new (TC_string); + BONOBO_ARG_SET_STRING (rv, url); + printf ("new url: %s\n", url); + g_free (url); } - BONOBO_ARG_SET_BOOLEAN (arg, CORBA_FALSE); - HTMLEditor_Engine_set_paragraph_data (l->composer->editor_engine, "orig", arg, ev); } + + return rv ? rv : get_any_null (); } POA_HTMLEditor_Listener__epv * |