[evolution] Bug #530335 - Allow Reply to selected address only



commit f5794eff3613afe5082ab15bd6dbb14806ce5fdc
Author: Rathin <rathinusa yahoo co in>
Date:   Tue Jun 14 14:26:30 2011 +0200

    Bug #530335 - Allow Reply to selected address only

 mail/e-mail-display.c                    |    8 +++++++
 mail/e-mail-enums.h                      |    1 +
 mail/e-mail-reader-utils.c               |   34 ++++++++++++++++++++++++++++-
 mail/e-mail-reader.c                     |   14 ++++++++++++
 mail/em-composer-utils.c                 |   34 +++++++++++++++++++++++++++++-
 mail/em-composer-utils.h                 |    3 +-
 modules/mail/e-mail-attachment-handler.c |    4 +-
 7 files changed, 92 insertions(+), 6 deletions(-)
---
diff --git a/mail/e-mail-display.c b/mail/e-mail-display.c
index ed88fec..aa3c4bd 100644
--- a/mail/e-mail-display.c
+++ b/mail/e-mail-display.c
@@ -48,6 +48,7 @@ static const gchar *ui =
 "  <popup name='context'>"
 "    <placeholder name='custom-actions-1'>"
 "      <menuitem action='add-to-address-book'/>"
+"      <menuitem action='send-reply'/>"
 "    </placeholder>"
 "    <placeholder name='custom-actions-3'>"
 "      <menu action='search-folder-menu'>"
@@ -81,6 +82,13 @@ static GtkActionEntry mailto_entries[] = {
 	  NULL,  /* XXX Add a tooltip! */
 	  NULL   /* Handled by EMailReader */ },
 
+	{ "send-reply",
+	  NULL,
+	  N_("Send _Reply To..."),
+	  NULL,
+	  N_("Send a reply message to this address"),  
+	  NULL   /* Handled by EMailReader */ },
+
 	/*** Menus ***/
 
 	{ "search-folder-menu",
diff --git a/mail/e-mail-enums.h b/mail/e-mail-enums.h
index 1e2e4a2..e0ad3ad 100644
--- a/mail/e-mail-enums.h
+++ b/mail/e-mail-enums.h
@@ -63,6 +63,7 @@ typedef enum {
 
 typedef enum {
 	E_MAIL_REPLY_TO_SENDER,
+	E_MAIL_REPLY_TO_RECIPIENT,
 	E_MAIL_REPLY_TO_FROM,
 	E_MAIL_REPLY_TO_ALL,
 	E_MAIL_REPLY_TO_LIST
diff --git a/mail/e-mail-reader-utils.c b/mail/e-mail-reader-utils.c
index 178b6ae..fe4e406 100644
--- a/mail/e-mail-reader-utils.c
+++ b/mail/e-mail-reader-utils.c
@@ -787,6 +787,7 @@ e_mail_reader_reply_to_message (EMailReader *reader,
 	EMFormatHTML *formatter;
 	GtkWidget *message_list;
 	CamelMimeMessage *new_message;
+	CamelInternetAddress *address = NULL;
 	CamelFolder *folder;
 	EMailReplyStyle reply_style;
 	EWebView *web_view;
@@ -812,6 +813,29 @@ e_mail_reader_reply_to_message (EMailReader *reader,
 
 	web_view = em_format_html_get_web_view (formatter);
 
+	if (reply_type == E_MAIL_REPLY_TO_RECIPIENT) {
+		const gchar *uri;
+
+		uri = e_web_view_get_selected_uri (web_view);
+
+		if (uri) {
+			CamelURL *curl;
+
+			curl = camel_url_new (uri, NULL);
+
+			if (curl && curl->path && *curl->path) {
+				address = camel_internet_address_new ();
+				if (camel_address_decode (CAMEL_ADDRESS (address), curl->path) < 0) {
+					g_object_unref (address);
+					address = NULL;
+				}
+			}
+
+			if (curl)
+				camel_url_free (curl);
+		}
+	}
+
 	uid = MESSAGE_LIST (message_list)->cursor_uid;
 	g_return_if_fail (uid != NULL);
 
@@ -859,7 +883,10 @@ e_mail_reader_reply_to_message (EMailReader *reader,
 
 	em_utils_reply_to_message (
 		shell, new_message, folder, uid,
-		reply_type, reply_style, NULL);
+		reply_type, reply_style, NULL, address);
+
+	if (address)
+		g_object_unref (address);
 
 	g_object_unref (new_message);
 
@@ -870,7 +897,10 @@ e_mail_reader_reply_to_message (EMailReader *reader,
 whole_message:
 	em_utils_reply_to_message (
 		shell, src_message, folder, uid,
-		reply_type, reply_style, EM_FORMAT (formatter));
+		reply_type, reply_style, EM_FORMAT (formatter), address);
+
+	if (address)
+		g_object_unref (address);
 }
 
 static void
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
index 9d32ddb..313e0f5 100644
--- a/mail/e-mail-reader.c
+++ b/mail/e-mail-reader.c
@@ -1502,6 +1502,14 @@ action_mail_reply_sender_cb (GtkAction *action,
 }
 
 static void
+action_mail_reply_recipient_cb (GtkAction *action,
+				EMailReader *reader)
+{
+	e_mail_reader_reply_to_message (reader, NULL, E_MAIL_REPLY_TO_RECIPIENT);
+	check_close_browser_reader (reader);
+}
+
+static void
 action_mail_save_as_cb (GtkAction *action,
                         EMailReader *reader)
 {
@@ -3513,6 +3521,12 @@ e_mail_reader_init (EMailReader *reader,
 		action, "activate",
 		G_CALLBACK (action_add_to_address_book_cb), reader);
 
+	action_name = "send-reply";
+	action = e_web_view_get_action (web_view, action_name);
+	g_signal_connect (
+		action, "activate",
+		G_CALLBACK (action_mail_reply_recipient_cb), reader);
+
 	action_name = "search-folder-recipient";
 	action = e_web_view_get_action (web_view, action_name);
 	g_signal_connect (
diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c
index 841fb77..2dcc687 100644
--- a/mail/em-composer-utils.c
+++ b/mail/em-composer-utils.c
@@ -2389,6 +2389,30 @@ get_reply_from (CamelMimeMessage *message,
 }
 
 static void
+get_reply_recipient (CamelMimeMessage *message,
+		     CamelInternetAddress *to,
+		     CamelNNTPAddress *postto,
+		     CamelInternetAddress *address)
+{
+	const gchar *name, *addr, *posthdr;
+	gint i;
+	
+	/* check whether there is a 'Newsgroups: ' header in there */
+	if (postto
+	    && ((posthdr = camel_medium_get_header((CamelMedium *)message, "Followup-To"))
+		 || (posthdr = camel_medium_get_header((CamelMedium *)message, "Newsgroups")))) {
+		camel_address_decode ((CamelAddress *)postto, posthdr);
+		return;
+	}
+
+	if (address) {
+		for (i = 0; camel_internet_address_get (address, i, &name, &addr); i++)
+			camel_internet_address_add (to, name, addr);
+	}
+
+}
+
+static void
 concat_unique_addrs (CamelInternetAddress *dest,
                      CamelInternetAddress *src,
                      GHashTable *rcpt_hash)
@@ -2792,6 +2816,7 @@ em_utils_construct_composer_text (CamelMimeMessage *message, EMFormat *source)
  * @type: the type of reply to create
  * @style: the reply style to use
  * @source: source to inherit view settings from
+ * @address: used for E_MAIL_REPLY_TO_RECIPIENT @type
  *
  * Creates a new composer ready to reply to @message.
  *
@@ -2805,7 +2830,8 @@ em_utils_reply_to_message (EShell *shell,
                            const gchar *message_uid,
                            EMailReplyType type,
                            EMailReplyStyle style,
-                           EMFormat *source)
+                           EMFormat *source,
+			   CamelInternetAddress *address)
 {
 	CamelInternetAddress *to, *cc;
 	CamelNNTPAddress *postto = NULL;
@@ -2829,6 +2855,12 @@ em_utils_reply_to_message (EShell *shell,
 
 		get_reply_from (message, to, postto);
 		break;
+	case E_MAIL_REPLY_TO_RECIPIENT:
+		if (folder)
+			postto = camel_nntp_address_new ();
+
+		get_reply_recipient (message, to, postto, address);
+		break;
 	case E_MAIL_REPLY_TO_SENDER:
 		if (folder)
 			postto = camel_nntp_address_new ();
diff --git a/mail/em-composer-utils.h b/mail/em-composer-utils.h
index be76148..59b6e16 100644
--- a/mail/em-composer-utils.h
+++ b/mail/em-composer-utils.h
@@ -81,7 +81,8 @@ EMsgComposer *	em_utils_reply_to_message	(EShell *shell,
 						 const gchar *message_uid,
 						 EMailReplyType type,
 						 EMailReplyStyle style,
-						 EMFormat *source);
+						 EMFormat *source,
+						 CamelInternetAddress *address);
 EDestination **	em_utils_camel_address_to_destination
 						(CamelInternetAddress *iaddr);
 void		em_configure_new_composer	(EMsgComposer *composer);
diff --git a/modules/mail/e-mail-attachment-handler.c b/modules/mail/e-mail-attachment-handler.c
index 69a9e8f..e65e687 100644
--- a/modules/mail/e-mail-attachment-handler.c
+++ b/modules/mail/e-mail-attachment-handler.c
@@ -121,7 +121,7 @@ mail_attachment_handler_reply_all (GtkAction *action,
 
 	em_utils_reply_to_message (
 		priv->shell, CAMEL_MIME_MESSAGE (wrapper),
-		NULL, NULL, E_MAIL_REPLY_TO_ALL, style, NULL);
+		NULL, NULL, E_MAIL_REPLY_TO_ALL, style, NULL, NULL);
 
 	g_list_foreach (selected, (GFunc) g_object_unref, NULL);
 	g_list_free (selected);
@@ -157,7 +157,7 @@ mail_attachment_handler_reply_sender (GtkAction *action,
 
 	em_utils_reply_to_message (
 		priv->shell, CAMEL_MIME_MESSAGE (wrapper),
-		NULL, NULL, E_MAIL_REPLY_TO_SENDER, style, NULL);
+		NULL, NULL, E_MAIL_REPLY_TO_SENDER, style, NULL, NULL);
 
 	g_list_foreach (selected, (GFunc) g_object_unref, NULL);
 	g_list_free (selected);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]