aboutsummaryrefslogtreecommitdiffstats
path: root/composer/e-msg-composer.c
diff options
context:
space:
mode:
Diffstat (limited to 'composer/e-msg-composer.c')
-rw-r--r--composer/e-msg-composer.c165
1 files changed, 86 insertions, 79 deletions
diff --git a/composer/e-msg-composer.c b/composer/e-msg-composer.c
index 95bfc1541a..55f4595c61 100644
--- a/composer/e-msg-composer.c
+++ b/composer/e-msg-composer.c
@@ -165,7 +165,7 @@ best_encoding (GByteArray *buf, const char *charset)
if (!charset)
return -1;
-
+
cd = iconv_open (charset, "utf-8");
g_return_val_if_fail (cd != (iconv_t)-1, -1);
@@ -250,31 +250,30 @@ add_inlined_image (gpointer key, gpointer value, gpointer data)
CamelDataWrapper *wrapper;
CamelMimePart *part;
struct stat statbuf;
-
+
/* check for regular file */
if (stat (file_name, &statbuf) < 0 || !S_ISREG (statbuf.st_mode))
return;
-
+
if (!(stream = camel_stream_fs_new_with_name (file_name, O_RDONLY, 0)))
return;
-
+
wrapper = camel_data_wrapper_new ();
camel_data_wrapper_construct_from_stream (wrapper, stream);
camel_object_unref (CAMEL_OBJECT (stream));
-
+
mime_type = e_msg_composer_guess_mime_type (file_name);
camel_data_wrapper_set_mime_type (wrapper, mime_type ? mime_type : "application/octet-stream");
g_free (mime_type);
-
+
part = camel_mime_part_new ();
camel_medium_set_content_object (CAMEL_MEDIUM (part), wrapper);
camel_object_unref (CAMEL_OBJECT (wrapper));
-
+
camel_mime_part_set_content_id (part, cid);
- /* FIXME: should this use g_basename (file_name)? */
- camel_mime_part_set_filename (part, strchr (file_name, '/') ? strrchr (file_name, '/') + 1 : file_name);
+ camel_mime_part_set_filename (part, g_basename (file_name));
camel_mime_part_set_encoding (part, CAMEL_MIME_PART_ENCODING_BASE64);
-
+
camel_multipart_add_part (multipart, part);
camel_object_unref (CAMEL_OBJECT (part));
}
@@ -662,27 +661,27 @@ get_file_content (const gchar *file_name, gboolean convert, guint flags)
gint fd;
char *raw;
char *html;
-
+
fd = open (file_name, O_RDONLY);
if (fd == -1) {
char *msg;
-
+
msg = g_strdup_printf (_("Could not open file %s:\n"
"%s"), file_name, g_strerror (errno));
-
+
gnome_error_dialog (msg);
g_free (msg);
return NULL;
- }
-
+ }
+
raw = read_file_content (fd);
-
+
if (raw == NULL) {
char *msg;
-
+
msg = g_strdup_printf (_("Error while reading file %s:\n"
"%s"), file_name, g_strerror (errno));
-
+
gnome_error_dialog (msg);
g_free (msg);
close (fd);
@@ -691,10 +690,10 @@ get_file_content (const gchar *file_name, gboolean convert, guint flags)
close (fd);
html = convert ? e_text_to_html (raw, flags) : raw;
-
+
if (convert)
g_free (raw);
-
+
return html;
}
@@ -704,7 +703,7 @@ e_msg_composer_get_sig_file_content (const char *sigfile, gboolean in_html)
if (!sigfile || !*sigfile) {
return NULL;
}
-
+
return get_file_content (sigfile, !in_html, 0);
}
@@ -820,9 +819,9 @@ set_config (EMsgComposer *composer, char *key, int val)
if (composer->config_db == CORBA_OBJECT_NIL)
return;
-
+
full_key = g_strconcat ("/Mail/Composer/", key, NULL);
-
+
bonobo_config_set_long (composer->config_db, full_key, val, NULL);
g_free (full_key);
@@ -842,11 +841,11 @@ show_attachments (EMsgComposer *composer,
gtk_widget_hide (composer->attachment_scroll_frame);
gtk_widget_hide (composer->attachment_bar);
}
-
+
composer->attachment_bar_visible = show;
-
+
/* Update the GUI. */
-
+
#if 0
gtk_check_menu_item_set_active
(GTK_CHECK_MENU_ITEM
@@ -854,7 +853,7 @@ show_attachments (EMsgComposer *composer,
"menu_view_attachments")),
show);
#endif
-
+
/* XXX we should update the toggle toolbar item as well. At
this point, it is not a toggle because Glade is broken. */
}
@@ -916,15 +915,15 @@ load (EMsgComposer *composer,
const char *file_name)
{
CORBA_Environment ev;
-
+
CORBA_exception_init (&ev);
-
+
Bonobo_PersistFile_load (composer->persist_file_interface, file_name, &ev);
-
+
if (ev._major != CORBA_NO_EXCEPTION)
e_notice (GTK_WINDOW (composer), GNOME_MESSAGE_BOX_ERROR,
_("Error loading file: %s"), g_basename (file_name));
-
+
CORBA_exception_free (&ev);
}
@@ -941,12 +940,12 @@ static void
save_done (CamelFolder *folder, CamelMimeMessage *msg, CamelMessageInfo *info, int ok, void *data)
{
struct _save_info *si = data;
-
+
if (ok && si->quitok)
gtk_widget_destroy (GTK_WIDGET (si->composer));
else
gtk_object_unref (GTK_OBJECT (si->composer));
-
+
g_free (info);
g_free (si);
}
@@ -1038,48 +1037,49 @@ autosave_save_draft (EMsgComposer *composer)
char *file;
gint fd;
gboolean success = TRUE;
-
+
fd = composer->autosave_fd;
file = composer->autosave_file;
-
+
if (fd == -1) {
e_notice (GTK_WINDOW (composer), GNOME_MESSAGE_BOX_ERROR,
_("Error accessing file: %s"), file);
return FALSE;
}
-
+
msg = e_msg_composer_get_message_draft (composer);
-
+
if (msg == NULL) {
e_notice (GTK_WINDOW (composer), GNOME_MESSAGE_BOX_ERROR,
_("Unable to retrieve message from editor"));
return FALSE;
}
-
+
if (lseek (fd, (off_t)0, SEEK_SET) == -1) {
e_notice (GTK_WINDOW (composer), GNOME_MESSAGE_BOX_ERROR,
- _("Unable to seek on file: %s\n%s"), file, strerror(errno));
+ _("Unable to seek on file: %s\n%s"), file, g_strerror (errno));
return FALSE;
}
-
+
if (ftruncate (fd, (off_t)0) == -1) {
e_notice (GTK_WINDOW (composer), GNOME_MESSAGE_BOX_ERROR,
- _("Unable to truncate file: %s\n%s"), file, strerror(errno));
+ _("Unable to truncate file: %s\n%s"), file, g_strerror (errno));
return FALSE;
}
/* this does an lseek so we don't have to */
- stream = camel_stream_fs_new_with_fd(fd);
- if (camel_data_wrapper_write_to_stream((CamelDataWrapper *)msg, stream) == -1
- || camel_stream_flush((CamelStream *)stream) == -1) {
+ stream = camel_stream_fs_new_with_fd (fd);
+ if (camel_data_wrapper_write_to_stream ((CamelDataWrapper *)msg, stream) == -1
+ || camel_stream_flush (CAMEL_STREAM (stream)) == -1) {
e_notice (GTK_WINDOW (composer), GNOME_MESSAGE_BOX_ERROR,
_("Error autosaving message: %s\n %s"), file, strerror(errno));
success = FALSE;
}
+
/* set the fd to -1 in the stream so camel doesn't close it we want to keep it open */
CAMEL_STREAM_FS (stream)->fd = -1;
- camel_object_unref((CamelObject *)stream);
+ camel_object_unref (CAMEL_OBJECT (stream));
return success;
}
@@ -1090,13 +1090,13 @@ autosave_load_draft (const char *filename)
CamelStream *stream;
CamelMimeMessage *msg;
EMsgComposer *composer;
-
+
g_return_val_if_fail (filename != NULL, NULL);
-
+
g_warning ("autosave load filename = \"%s\"", filename);
stream = camel_stream_fs_new_with_name (filename, O_RDONLY, 0);
-
+
if (stream == NULL)
return NULL;
@@ -1112,10 +1112,10 @@ autosave_load_draft (const char *filename)
GTK_SIGNAL_FUNC (composer_send_cb), NULL);
gtk_signal_connect (GTK_OBJECT (composer), "postpone",
GTK_SIGNAL_FUNC (composer_postpone_cb), NULL);
-
+
gtk_widget_show (GTK_WIDGET (composer));
}
-
+
camel_object_unref ((CamelObject *)stream);
return composer;
}
@@ -1130,7 +1130,7 @@ static void
autosave_query_cb (gint reply, gpointer data)
{
int *yes = data;
-
+
*yes = !reply;
}
@@ -1176,7 +1176,7 @@ autosave_manager_query_load_orphans (AutosaveManager *am, EMsgComposer *composer
gnome_dialog_run_and_close (GNOME_DIALOG (dialog));
}
-
+
while (match != NULL) {
GSList *next = match->next;
char *filename = match->data;
@@ -1198,7 +1198,7 @@ static void
autosave_run_foreach_cb (gpointer key, gpointer value, gpointer data)
{
EMsgComposer *composer = E_MSG_COMPOSER (value);
-
+
autosave_save_draft (composer);
}
@@ -1206,9 +1206,9 @@ static gint
autosave_run (gpointer data)
{
AutosaveManager *am = data;
-
+
g_hash_table_foreach (am->table, (GHFunc)autosave_run_foreach_cb, am);
-
+
return TRUE;
}
@@ -1247,7 +1247,7 @@ autosave_manager_new ()
am->table = g_hash_table_new (g_str_hash, g_str_equal);
am->id = 0;
am->ask = TRUE;
-
+
return am;
}
@@ -1255,9 +1255,9 @@ static void
autosave_manager_register (AutosaveManager *am, EMsgComposer *composer)
{
char *key;
-
+
g_return_if_fail (composer != NULL);
-
+
if (autosave_init_file (composer)) {
key = g_basename (composer->autosave_file);
g_hash_table_insert (am->table, key, composer);
@@ -1445,7 +1445,7 @@ menu_edit_delete_all_cb (BonoboUIComponent *uic, void *data, const char *path)
composer = E_MSG_COMPOSER (data);
CORBA_exception_init (&ev);
-
+
GNOME_GtkHTML_Editor_Engine_undo_begin (composer->editor_engine, "Delete all but signature", "Undelete all", &ev);
GNOME_GtkHTML_Editor_Engine_freeze (composer->editor_engine, &ev);
GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "disable-selection", &ev);
@@ -1462,7 +1462,7 @@ menu_edit_delete_all_cb (BonoboUIComponent *uic, void *data, const char *path)
GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "style-normal", &ev);
GNOME_GtkHTML_Editor_Engine_thaw (composer->editor_engine, &ev);
GNOME_GtkHTML_Editor_Engine_undo_end (composer->editor_engine, &ev);
-
+
CORBA_exception_free (&ev);
printf ("delete all\n");
}
@@ -1494,9 +1494,9 @@ menu_file_insert_file_cb (BonoboUIComponent *uic,
char *file_name;
char *html;
CORBA_Environment ev;
-
+
composer = E_MSG_COMPOSER (data);
-
+
file_name = e_msg_composer_select_file (composer, _("Insert File"));
if (file_name == NULL)
return;
@@ -1504,7 +1504,7 @@ menu_file_insert_file_cb (BonoboUIComponent *uic,
html = get_file_content (file_name, TRUE, E_TEXT_TO_HTML_PRE);
if (html == NULL)
return;
-
+
CORBA_exception_init (&ev);
GNOME_GtkHTML_Editor_Engine_freeze (composer->editor_engine, &ev);
GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "cursor-position-save", &ev);
@@ -1516,7 +1516,7 @@ menu_file_insert_file_cb (BonoboUIComponent *uic,
GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "cursor-position-restore", &ev);
GNOME_GtkHTML_Editor_Engine_thaw (composer->editor_engine, &ev);
CORBA_exception_free (&ev);
-
+
g_free (html);
}
@@ -1600,7 +1600,7 @@ menu_view_from_cb (BonoboUIComponent *component,
{
if (type != Bonobo_UIComponent_STATE_CHANGED)
return;
-
+
e_msg_composer_set_view_from (E_MSG_COMPOSER (user_data), atoi (state));
}
@@ -1613,7 +1613,7 @@ menu_view_replyto_cb (BonoboUIComponent *component,
{
if (type != Bonobo_UIComponent_STATE_CHANGED)
return;
-
+
e_msg_composer_set_view_replyto (E_MSG_COMPOSER (user_data), atoi (state));
}
@@ -1626,7 +1626,7 @@ menu_view_bcc_cb (BonoboUIComponent *component,
{
if (type != Bonobo_UIComponent_STATE_CHANGED)
return;
-
+
e_msg_composer_set_view_bcc (E_MSG_COMPOSER (user_data), atoi (state));
}
@@ -1639,7 +1639,7 @@ menu_view_cc_cb (BonoboUIComponent *component,
{
if (type != Bonobo_UIComponent_STATE_CHANGED)
return;
-
+
e_msg_composer_set_view_cc (E_MSG_COMPOSER (user_data), atoi (state));
}
@@ -1676,20 +1676,20 @@ static BonoboUIVerb verbs [] = {
BONOBO_UI_VERB ("FileSendLater", menu_file_send_later_cb),
BONOBO_UI_VERB ("DeleteAll", menu_edit_delete_all_cb),
-
+
BONOBO_UI_VERB_END
};
static EPixmap pixcache [] = {
E_PIXMAP ("/Toolbar/FileAttach", "buttons/add-attachment.png"),
E_PIXMAP ("/Toolbar/FileSend", "buttons/send-24.png"),
-
+
/* E_PIXMAP ("/menu/Insert/FileAttach", "buttons/add-attachment.png"), */
E_PIXMAP ("/commands/FileSend", "send-16.png"),
E_PIXMAP ("/commands/FileSendLater", "send-later-16.png"),
E_PIXMAP ("/commands/FileSave", "save-16.png"),
E_PIXMAP ("/commands/FileSaveAs", "save-as-16.png"),
-
+
E_PIXMAP_END
};
@@ -1697,6 +1697,7 @@ static void
setup_ui (EMsgComposer *composer)
{
BonoboUIContainer *container;
+ char *default_charset;
gboolean hide_smime;
container = bonobo_ui_container_new ();
@@ -1708,7 +1709,7 @@ setup_ui (EMsgComposer *composer)
bonobo_ui_component_add_verb_list_with_data (
composer->uic, verbs, composer);
-
+
/* Customize Toolbar thingie */
bonobo_ui_engine_config_set_path (bonobo_window_get_ui_engine (BONOBO_WINDOW (composer)),
"/evolution/UIConf/composer");
@@ -1721,9 +1722,15 @@ setup_ui (EMsgComposer *composer)
e_pixmaps_update (composer->uic, pixcache);
- e_charset_picker_bonobo_ui_populate (composer->uic, NULL,
+ /* Populate the Charset Encoding menu and default it to whatever the user
+ chose as his default charset in the mailer */
+ default_charset = bonobo_config_get_string (composer->config_db,
+ "/Mail/Format/default_charset",
+ NULL);
+ e_charset_picker_bonobo_ui_populate (composer->uic, default_charset,
menu_changed_charset_cb,
composer);
+ g_free (default_charset);
if (!camel_session_is_online (session)) {
/* Move the accelerator from Send to Send Later */
@@ -1949,7 +1956,7 @@ destroy (GtkObject *object)
g_hash_table_destroy (composer->inline_images);
g_free (composer->charset);
-
+
CORBA_exception_init (&ev);
if (composer->persist_stream_interface != CORBA_OBJECT_NIL) {
@@ -2147,7 +2154,7 @@ init (EMsgComposer *composer)
composer->charset = NULL;
composer->autosave_file = NULL;
composer->autosave_fd = -1;
-
+
if (am == NULL) {
am = autosave_manager_new ();
}
@@ -2200,17 +2207,17 @@ e_msg_composer_load_config (EMsgComposer *composer)
{
Bonobo_ConfigDatabase db;
CORBA_Environment ev;
-
+
CORBA_exception_init (&ev);
-
+
db = bonobo_get_object ( "wombat:", "Bonobo/ConfigDatabase", &ev);
-
+
if (ev._major == CORBA_NO_EXCEPTION && db != CORBA_OBJECT_NIL){
composer->config_db = db;
load_from_config_db (composer);
} else
composer->config_db = CORBA_OBJECT_NIL;
-
+
CORBA_exception_free (&ev);
}