New function that implements the Redirect feature.

2002-01-29  Jeffrey Stedfast  <fejj@ximian.com>

	* mail-callbacks.c (redirect): New function that implements the
	Redirect feature.

	* mail-ops.c (mail_send_message): If we are redirecting a message,
	get the Resent-* recipients otherwise get the normal To/Cc/Bcc
	recipients and use them in the CamelTransport::send_to() method.

	* mail-session.c (main_get_filter_driver): Set the beep_func to
	the beep_cb, not the play_sound_func. Oops ;-)

	* folder-browser-ui.c: Add Redirect bonobo verb thingy here.
	(folder_browser_ui_set_selection_state): Add MessageRedirect to
	the proper string arrays.

svn path=/trunk/; revision=15511
This commit is contained in:
Jeffrey Stedfast
2002-01-29 21:06:01 +00:00
committed by Jeffrey Stedfast
parent 85610de9fe
commit 865606984f
6 changed files with 143 additions and 4 deletions

View File

@ -1,3 +1,19 @@
2002-01-29 Jeffrey Stedfast <fejj@ximian.com>
* mail-callbacks.c (redirect): New function that implements the
Redirect feature.
* mail-ops.c (mail_send_message): If we are redirecting a message,
get the Resent-* recipients otherwise get the normal To/Cc/Bcc
recipients and use them in the CamelTransport::send_to() method.
* mail-session.c (main_get_filter_driver): Set the beep_func to
the beep_cb, not the play_sound_func. Oops ;-)
* folder-browser-ui.c: Add Redirect bonobo verb thingy here.
(folder_browser_ui_set_selection_state): Add MessageRedirect to
the proper string arrays.
2002-01-29 Radek Doulik <rodo@ximian.com>
* mail-callbacks.c (do_mail_print): initialize line to 0 to make

View File

@ -51,6 +51,7 @@ static BonoboUIVerb message_verbs [] = {
BONOBO_UI_UNSAFE_VERB ("MessageForwardAttached", forward_attached),
BONOBO_UI_UNSAFE_VERB ("MessageForwardInline", forward_inline),
BONOBO_UI_UNSAFE_VERB ("MessageForwardQuoted", forward_quoted),
BONOBO_UI_UNSAFE_VERB ("MessageRedirect", redirect),
BONOBO_UI_UNSAFE_VERB ("MessageMarkAsRead", mark_as_seen),
BONOBO_UI_UNSAFE_VERB ("MessageMarkAsUnRead", mark_as_unseen),
BONOBO_UI_UNSAFE_VERB ("MessageMarkAsImportant", mark_as_important),
@ -549,6 +550,7 @@ folder_browser_ui_set_selection_state (FolderBrowser *fb, FolderBrowserSelection
"MessageMarkAsImportant", "MessageMarkAsUnimportant",
"MessageOpen", "MessageSaveAs",
"MessageForward", "MessageForwardAttached",
"MessageRedirect",
"EditCut", "EditCopy", "EditPaste", "ViewHideSelected",
@ -561,7 +563,7 @@ folder_browser_ui_set_selection_state (FolderBrowser *fb, FolderBrowserSelection
static const char *multiple_disables[] = {
/* actions that work on exactly 1 message */
"MessageReplyAll", "MessageReplyList", "MessageReplySender", "MessageResend",
"MessageForwardInline", "MessageForwardQuoted", "MessageSearch",
"MessageForwardInline", "MessageForwardQuoted", "MessageRedirect", "MessageSearch",
"PrintMessage", "PrintPreviewMessage",

View File

@ -1285,6 +1285,89 @@ forward (GtkWidget *widget, gpointer user_data)
forward_message (user_data, style);
}
static EMsgComposer *
redirect_get_composer (CamelMimeMessage *message)
{
const MailConfigAccount *account = NULL;
const CamelInternetAddress *to_addrs, *cc_addrs;
const GSList *accounts = NULL;
EMsgComposer *composer;
g_return_val_if_fail (message != NULL, NULL);
accounts = mail_config_get_accounts ();
to_addrs = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_TO);
cc_addrs = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_CC);
account = guess_me (to_addrs, cc_addrs, accounts);
if (!account) {
const char *source;
source = camel_mime_message_get_source (message);
account = mail_config_get_account_by_source_url (source);
}
if (!account)
account = mail_config_get_default_account ();
composer = e_msg_composer_new_redirect (message, account->name);
if (composer) {
gtk_signal_connect (GTK_OBJECT (composer), "send",
GTK_SIGNAL_FUNC (composer_send_cb), NULL);
gtk_signal_connect (GTK_OBJECT (composer), "postpone",
GTK_SIGNAL_FUNC (composer_postpone_cb), NULL);
gtk_signal_connect (GTK_OBJECT (composer), "save-draft",
GTK_SIGNAL_FUNC (composer_save_draft_cb), NULL);
} else {
g_warning ("Could not create composer");
}
return composer;
}
static void
do_redirect (CamelFolder *folder, char *uid, CamelMimeMessage *message, void *data)
{
EMsgComposer *composer;
if (!message)
return;
composer = redirect_get_composer (message);
if (composer) {
CamelDataWrapper *wrapper;
wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (message));
if (CAMEL_IS_MULTIPART (wrapper))
e_msg_composer_add_message_attachments (composer, message, FALSE);
gtk_widget_show (GTK_WIDGET (composer));
e_msg_composer_unset_changed (composer);
}
}
void
redirect (GtkWidget *widget, gpointer user_data)
{
FolderBrowser *fb = (FolderBrowser *) user_data;
if (FOLDER_BROWSER_IS_DESTROYED (fb))
return;
if (!check_send_configuration (fb))
return;
if (fb->mail_display && fb->mail_display->current_message) {
do_redirect (fb->folder, NULL,
fb->mail_display->current_message,
NULL);
} else {
mail_get_message (fb->folder, fb->message_list->cursor_uid,
do_redirect, NULL, mail_thread_new);
}
}
static void
transfer_msg_done (gboolean ok, void *data)
{

View File

@ -54,6 +54,8 @@ void forward_quoted (GtkWidget *widget, gpointer user_data);
void forward_attached (GtkWidget *widget, gpointer user_data);
void forward (GtkWidget *widget, gpointer user_data);
void redirect (GtkWidget *widget, gpointer user_data);
void reply_to_sender (GtkWidget *widget, gpointer user_data);
void reply_to_list (GtkWidget *widget, gpointer user_data);
void reply_to_all (GtkWidget *widget, gpointer user_data);

View File

@ -426,19 +426,35 @@ mail_fetch_mail (const char *source, int keep, const char *type, CamelOperation
extern CamelFolder *sent_folder;
static char *normal_recipients[] = {
CAMEL_RECIPIENT_TYPE_TO,
CAMEL_RECIPIENT_TYPE_CC,
CAMEL_RECIPIENT_TYPE_BCC
};
static char *resent_recipients[] = {
CAMEL_RECIPIENT_TYPE_RESENT_TO,
CAMEL_RECIPIENT_TYPE_RESENT_CC,
CAMEL_RECIPIENT_TYPE_RESENT_BCC
};
/* send 1 message to a specific transport */
static void
mail_send_message (CamelMimeMessage *message, const char *destination,
CamelFilterDriver *driver, CamelException *ex)
{
const CamelInternetAddress *iaddr;
CamelAddress *from, *recipients;
CamelMessageInfo *info;
CamelTransport *xport = NULL;
char *transport_url = NULL;
char *sent_folder_uri = NULL;
const char *resent_from;
CamelFolder *folder;
XEvolution *xev;
int i;
camel_medium_add_header (CAMEL_MEDIUM (message), "X-Mailer",
camel_medium_set_header (CAMEL_MEDIUM (message), "X-Mailer",
"Evolution/" VERSION SUB_VERSION " " VERSION_COMMENT);
camel_mime_message_set_date (message, CAMEL_MESSAGE_DATE_CURRENT, 0);
@ -471,7 +487,27 @@ mail_send_message (CamelMimeMessage *message, const char *destination,
return;
}
camel_transport_send (xport, CAMEL_MEDIUM (message), ex);
from = (CamelAddress *) camel_internet_address_new ();
resent_from = camel_medium_get_header (CAMEL_MEDIUM (message), "Resent-From");
if (resent_from) {
camel_address_decode (from, resent_from);
} else {
iaddr = camel_mime_message_get_from (message);
camel_address_copy (from, CAMEL_ADDRESS (iaddr));
}
recipients = (CamelAddress *) camel_internet_address_new ();
for (i = 0; i < 3; i++) {
const char *type;
type = resent_from ? resent_recipients[i] : normal_recipients[i];
iaddr = camel_mime_message_get_recipients (message, type);
camel_address_cat (recipients, CAMEL_ADDRESS (iaddr));
}
camel_transport_send_to (xport, CAMEL_MEDIUM (message), from, recipients, ex);
camel_object_unref (CAMEL_OBJECT (recipients));
camel_object_unref (CAMEL_OBJECT (from));
mail_tool_restore_xevolution_headers (message, xev);
mail_tool_destroy_xevolution (xev);

View File

@ -857,7 +857,7 @@ main_get_filter_driver (CamelSession *session, const char *type, CamelException
camel_filter_driver_set_shell_exec_func (driver, mail_execute_shell_command, NULL);
camel_filter_driver_set_play_sound_func (driver, session_play_sound, NULL);
camel_filter_driver_set_play_sound_func (driver, session_system_beep, NULL);
camel_filter_driver_set_system_beep_func (driver, session_system_beep, NULL);
fsearch = g_string_new ("");
faction = g_string_new ("");