[Evolution-hackers] Mailing list Actions Bounty



Hi, 

I appointed me to try this bounty so I did it, even Jorge has
delivered a patch, I had it too advanced to letting in my own computer
only, maybe this could help too.

This patch fill the requirement in this statements:

Gives Options for:
- Unsubscribe
- Subscribe
- Help
- Archives
It consider that maybe could be many url into each header so try for
the first to the last (left to right order), and even
that a header could not exist in the mail, so it don't show the
option.

This options are displayed in:

A sub-menu on Actions menu, and in the popup of mail list.
I could not do it to link on the Preview Message. Just I can't figure
how to send parameter to To: <mailto:here> so it could change the list
of options that will show in the popup menu.

The uri management code isn't the best, but I can change it.

Best regards.
? semantic.cache
? mail/e the list parameters
Index: camel/camel-mime-message.c
===================================================================
RCS file: /cvs/gnome/evolution/camel/camel-mime-message.c,v
retrieving revision 1.127
diff -u -r1.127 camel-mime-message.c
--- camel/camel-mime-message.c	23 Oct 2003 19:57:58 -0000	1.127
+++ camel/camel-mime-message.c	2 Dec 2003 10:42:36 -0000
@@ -76,7 +76,8 @@
 static CamelMimePartClass *parent_class = NULL;
 
 static char *recipient_names[] = {
-	"To", "Cc", "Bcc", "Resent-To", "Resent-Cc", "Resent-Bcc", NULL
+	"To", "Cc", "Bcc", "Resent-To", "Resent-Cc", "Resent-Bcc", "List-Post",
+	NULL
 };
 
 static ssize_t write_to_stream (CamelDataWrapper *data_wrapper, CamelStream *stream);
Index: camel/camel-mime-message.h
===================================================================
RCS file: /cvs/gnome/evolution/camel/camel-mime-message.h,v
retrieving revision 1.52
diff -u -r1.52 camel-mime-message.h
--- camel/camel-mime-message.h	20 Mar 2003 16:43:26 -0000	1.52
+++ camel/camel-mime-message.h	2 Dec 2003 10:42:36 -0000
@@ -44,6 +44,8 @@
 #define CAMEL_RECIPIENT_TYPE_RESENT_CC "Resent-Cc"
 #define CAMEL_RECIPIENT_TYPE_RESENT_BCC "Resent-Bcc"
 
+#define CAMEL_RECIPIENT_LIST_POST "List-Post"
+
 #define CAMEL_MIME_MESSAGE_TYPE     (camel_mime_message_get_type ())
 #define CAMEL_MIME_MESSAGE(obj)     (CAMEL_CHECK_CAST((obj), CAMEL_MIME_MESSAGE_TYPE, CamelMimeMessage))
 #define CAMEL_MIME_MESSAGE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), CAMEL_MIME_MESSAGE_TYPE, CamelMimeMessageClass))
Index: mail/em-folder-view.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/em-folder-view.c,v
retrieving revision 1.14
diff -u -r1.14 em-folder-view.c
--- mail/em-folder-view.c	14 Nov 2003 16:20:17 -0000	1.14
+++ mail/em-folder-view.c	2 Dec 2003 10:42:38 -0000
@@ -97,6 +97,7 @@
 static void emfv_activate(EMFolderView *emfv, BonoboUIComponent *uic, int state);
 
 static void emfv_message_reply(EMFolderView *emfv, int mode);
+static void emfv_mailing_list_commands (EMFolderView *emfv, gchar *command);
 static void vfolder_type_current (EMFolderView *emfv, int type);
 static void filter_type_current (EMFolderView *emfv, int type);
 
@@ -451,6 +452,32 @@
 	emfv_message_reply(emfv, REPLY_MODE_LIST);
 }
 
+/* Mailing_list callbacks */
+//EMFolderView was before
+static void
+emfv_popup_list_help(GtkWidget *w, void *emfv)
+{
+	emfv_mailing_list_commands (emfv, LIST_COMMAND_HELP);
+}
+
+static void
+emfv_popup_list_subscribe(GtkWidget *w, void *emfv)
+{
+	emfv_mailing_list_commands (emfv, LIST_COMMAND_SUBSCRIBE);
+}
+
+static void
+emfv_popup_list_unsubscribe(GtkWidget *w, void *emfv)
+{
+	emfv_mailing_list_commands (emfv, LIST_COMMAND_UNSUBSCRIBE);
+}
+
+static void
+emfv_popup_list_archives(GtkWidget *w, void *emfv)
+{
+	emfv_mailing_list_commands (emfv, LIST_COMMAND_ARCHIVE);
+}
+
 static void
 emfv_popup_reply_all(GtkWidget *w, EMFolderView *emfv)
 {
@@ -675,8 +702,18 @@
 	{ EM_POPUP_BAR, "10.emfv" },
 	{ EM_POPUP_ITEM, "10.emfv.00", N_("_Reply to Sender"), G_CALLBACK(emfv_popup_reply_sender), NULL, "reply.xpm", EM_POPUP_SELECT_ONE },
 	{ EM_POPUP_ITEM, "10.emfv.01", N_("Reply to _List"), G_CALLBACK(emfv_popup_reply_list), NULL, NULL, EM_POPUP_SELECT_ONE|EM_POPUP_SELECT_MAILING_LIST },
-	{ EM_POPUP_ITEM, "10.emfv.02", N_("Reply to _All"), G_CALLBACK(emfv_popup_reply_all), NULL, "reply_to_all.xpm", EM_POPUP_SELECT_ONE },
-	{ EM_POPUP_ITEM, "10.emfv.03", N_("_Forward"), G_CALLBACK(emfv_popup_forward), NULL, "forward.xpm", EM_POPUP_SELECT_MANY },
+	{ EM_POPUP_SUBMENU, "10.emfv.02", N_("List Actions"), NULL, NULL, NULL,  EM_POPUP_SELECT_ONE|EM_POPUP_SELECT_MLIST_ACTIONS},
+	{ EM_POPUP_ITEM, "10.emfv.02/00.01", N_("_Request List Help"), G_CALLBACK(emfv_popup_list_help), NULL, NULL,
+	  EM_POPUP_SELECT_ONE|EM_POPUP_SELECT_MLIST_HELP },
+	{ EM_POPUP_ITEM, "10.emfv.02/00.02", N_("_Subscribe to list"), G_CALLBACK(emfv_popup_list_subscribe), NULL, NULL,
+	  EM_POPUP_SELECT_ONE|EM_POPUP_SELECT_MLIST_SUBSCRIBE },
+	{ EM_POPUP_ITEM, "10.emfv.02/00.03", N_("_Unsubscribe to list"), G_CALLBACK(emfv_popup_list_unsubscribe), NULL, NULL,
+	  EM_POPUP_SELECT_ONE|EM_POPUP_SELECT_MLIST_UNSUBSCRIBE},
+	{ EM_POPUP_ITEM, "10.emfv.02/00.01", N_("_View List Archives"), G_CALLBACK(emfv_popup_list_archives), NULL, NULL,
+	  EM_POPUP_SELECT_ONE|EM_POPUP_SELECT_MLIST_ARCHIVES },
+
+	{ EM_POPUP_ITEM, "10.emfv.03", N_("Reply to _All"), G_CALLBACK(emfv_popup_reply_all), NULL, "reply_to_all.xpm", EM_POPUP_SELECT_ONE },
+	{ EM_POPUP_ITEM, "10.emfv.04", N_("_Forward"), G_CALLBACK(emfv_popup_forward), NULL, "forward.xpm", EM_POPUP_SELECT_MANY },
 
 	{ EM_POPUP_BAR, "20.emfv", NULL, NULL, NULL, NULL, EM_POPUP_SELECT_FLAG_FOLLOWUP|EM_POPUP_SELECT_FLAG_COMPLETED|EM_POPUP_SELECT_FLAG_CLEAR },
 	{ EM_POPUP_ITEM, "20.emfv.00", N_("Follo_w Up..."), G_CALLBACK(emfv_popup_flag_followup), NULL, "flag-for-followup-16.png",  EM_POPUP_SELECT_FLAG_FOLLOWUP },
@@ -1066,6 +1103,19 @@
 	/*g_object_unref(clip);*/
 }
 
+/* Mailing list general function*/
+static void
+emfv_mailing_list_commands (EMFolderView *emfv, gchar *command)
+{
+	if (emfv->list->cursor_uid == NULL)
+		return;
+	
+	if (!em_utils_check_user_can_send_mail ((GtkWidget *) emfv))
+		return;
+	
+	em_utils_mailing_list_command(emfv->folder, emfv->list->cursor_uid, command);
+}
+
 static void
 emfv_message_search(BonoboUIComponent *uic, void *data, const char *path)
 {
@@ -1224,6 +1274,12 @@
 EMFV_MAP_CALLBACK(emfv_tools_vfolder_mlist, emfv_popup_vfolder_mlist)
 EMFV_MAP_CALLBACK(emfv_tools_vfolder_thread, emfv_popup_vfolder_thread)
 
+/* Callbacks for Mailing list commans */
+EMFV_MAP_CALLBACK(emfv_list_help, emfv_popup_list_help)
+EMFV_MAP_CALLBACK(emfv_list_subscribe, emfv_popup_list_subscribe)
+EMFV_MAP_CALLBACK(emfv_list_unsubscribe, emfv_popup_list_unsubscribe)
+EMFV_MAP_CALLBACK(emfv_list_archives, emfv_popup_list_archives)
+
 /* ********************************************************************** */
 
 static void
@@ -1298,6 +1354,11 @@
 	BONOBO_UI_UNSAFE_VERB ("ViewLoadImages", emfv_view_load_images),
 	/* ViewHeaders stuff is a radio */
 	/* CaretMode is a toggle */
+	/* Maling List verbs */
+	BONOBO_UI_UNSAFE_VERB ("MailingListHelp", emfv_list_help),
+	BONOBO_UI_UNSAFE_VERB ("MailingListSubscribe", emfv_list_subscribe),
+	BONOBO_UI_UNSAFE_VERB ("MailingListUnsubscribe", emfv_list_unsubscribe),
+	BONOBO_UI_UNSAFE_VERB ("MailingListArchives", emfv_list_archives),
 
 	BONOBO_UI_VERB_END
 };
@@ -1382,6 +1443,11 @@
 	{ "PrintMessage",             EM_POPUP_SELECT_ONE },
 	{ "PrintPreviewMessage",      EM_POPUP_SELECT_ONE },
 
+	{ "ListCommands",             EM_POPUP_SELECT_ONE|EM_POPUP_SELECT_MLIST_ACTIONS },
+	{ "MailingListHelp",          EM_POPUP_SELECT_ONE|EM_POPUP_SELECT_MLIST_HELP },
+	{ "MailingListSubscribe",     EM_POPUP_SELECT_ONE|EM_POPUP_SELECT_MLIST_SUBSCRIBE },
+	{ "MailingListUnsubscribe",   EM_POPUP_SELECT_ONE|EM_POPUP_SELECT_MLIST_UNSUBSCRIBE },
+	{ "MailingListArchives",      EM_POPUP_SELECT_ONE|EM_POPUP_SELECT_MLIST_ARCHIVES },
 	{ "TextZoomIn",		      EM_POPUP_SELECT_ONE },
 	{ "TextZoomOut",	      EM_POPUP_SELECT_ONE },
 	{ "TextZoomReset",	      EM_POPUP_SELECT_ONE },
@@ -2013,3 +2079,4 @@
 								emfv, NULL, NULL);
 	g_object_unref(gconf);
 }
+
Index: mail/em-format-html.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/em-format-html.c,v
retrieving revision 1.14
diff -u -r1.14 em-format-html.c
--- mail/em-format-html.c	24 Nov 2003 01:38:11 -0000	1.14
+++ mail/em-format-html.c	2 Dec 2003 10:42:39 -0000
@@ -1452,6 +1452,37 @@
 }
 
 static void
+efh_format_list_post(EMFormat *emf, CamelStream *stream, const CamelInternetAddress *cia, CamelMedium *part, guint32 flags)
+{
+	const gchar *text, *list_post, *header;
+	CamelURL *url;
+	
+	if (cia == NULL || !camel_internet_address_get(cia, 0, NULL, NULL))
+		return;
+	
+	list_post = camel_address_format((CamelAddress *)cia);
+	list_post = g_strdup_printf("mailto:%s";, list_post);
+	url = camel_url_new(list_post, NULL);
+
+	if (!(header = camel_medium_get_header (part, URI_PARAM_LIST_HELP)))
+		camel_url_set_param(url, "x-list-help", header);
+
+	if (!(header = camel_medium_get_header (part, URI_PARAM_LIST_ARCHIVE)))
+		camel_url_set_param(url, "x-list-archive", header);
+
+	if (!(header = camel_medium_get_header (part, URI_PARAM_LIST_SUBSCRIBE)))
+		camel_url_set_param(url, "x-list-subscribe", header);
+
+	if (!(header = camel_medium_get_header (part, URI_PARAM_LIST_UNSUBSCRIBE)))
+		camel_url_set_param(url, "x-list-unsubscribe", header);
+
+	text = camel_url_to_string(url, 0);
+	camel_url_free(url);
+	g_print("url: %s\n",text);
+	efh_format_text_header(emf, stream, _("List Post"), text, flags | EM_FORMAT_HTML_HEADER_HTML);
+}
+
+static void
 efh_format_header(EMFormat *emf, CamelStream *stream, CamelMedium *part, const char *namein, guint32 flags, const char *charset)
 {
 #define msg ((CamelMimeMessage *)part)
@@ -1461,18 +1492,21 @@
 	name = alloca(strlen(namein)+1);
 	strcpy(name, namein);
 	camel_strdown(name);
-
 	if (!strcmp(name, "from"))
 		efh_format_address(emf, stream, camel_mime_message_get_from(msg), _("From"), flags);
 	else if (!strcmp(name, "reply-to"))
 		efh_format_address(emf, stream, camel_mime_message_get_reply_to(msg), _("Reply-To"), flags);
 	else if (!strcmp(name, "to"))
-		efh_format_address(emf, stream, camel_mime_message_get_recipients(msg, CAMEL_RECIPIENT_TYPE_TO), _("To"), flags);
+			efh_format_address(emf, stream, camel_mime_message_get_recipients(msg, CAMEL_RECIPIENT_TYPE_TO), _("To"), flags);
 	else if (!strcmp(name, "cc"))
 		efh_format_address(emf, stream, camel_mime_message_get_recipients(msg, CAMEL_RECIPIENT_TYPE_CC), _("Cc"), flags);
 	else if (!strcmp(name, "bcc"))
 		efh_format_address(emf, stream, camel_mime_message_get_recipients(msg, CAMEL_RECIPIENT_TYPE_BCC), _("Bcc"), flags);
-	else {
+	else if (!strcmp(name, "list-post")) {
+		/* Mailing list do this ensure ?*/
+		if (camel_medium_get_header (part, "List-Post"))
+			efh_format_list_post(emf, stream, camel_mime_message_get_recipients(msg, CAMEL_RECIPIENT_LIST_POST), part, flags);
+	} else {
 		const char *txt, *label;
 		char *value = NULL;
 
Index: mail/em-popup.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/em-popup.c,v
retrieving revision 1.7
diff -u -r1.7 em-popup.c
--- mail/em-popup.c	12 Nov 2003 21:12:59 -0000	1.7
+++ mail/em-popup.c	2 Dec 2003 10:42:40 -0000
@@ -22,8 +22,13 @@
 #include <camel/camel-folder.h>
 #include <camel/camel-mime-message.h>
 #include <camel/camel-string-utils.h>
+#include <camel/camel-url.h>
 
 static void emp_standard_menu_factory(EMPopup *emp, EMPopupTarget *target, void *data);
+guint32 em_mailing_list_mask_headers (CamelMimeMessage *message, guint32 *rmask);
+guint32 em_mailing_list_set_mask(CamelFolder *folder, const gchar *uid, guint32 *rmask);
+guint32 em_uri_mailing_list_set_mask(CamelURL *url, guint32 *rmask);
+static void emp_list_uri_by_action(gchar *uri, const gchar *param_name);
 
 struct _EMPopupFactory {
 	struct _EMPopupFactory *next, *prev;
@@ -476,8 +481,10 @@
 
 		if (i == 0 && uids->len == 1
 		    && (tmp = camel_message_info_mlist(info))
-		    && tmp[0] != 0)
+		    && tmp[0] != 0) {
 			mask &= ~EM_POPUP_SELECT_MAILING_LIST;
+			em_mailing_list_set_mask(folder, uids->pdata[i], &mask);
+		}
 
 		camel_folder_free_message_info(folder, info);
 	}
@@ -487,6 +494,76 @@
 	return t;
 }
 
+guint32
+em_mailing_list_mask_headers (CamelMimeMessage *message, guint32 *rmask)
+{
+	CamelMedium *medium = (CamelMedium *)message;
+	if(camel_medium_get_header (medium, "List-Help")) {
+		*rmask &= ~EM_POPUP_SELECT_MLIST_HELP;
+	}
+
+	if(camel_medium_get_header (medium, "List-Subscribe")) {
+		*rmask &= ~EM_POPUP_SELECT_MLIST_SUBSCRIBE;
+	}
+
+	if(camel_medium_get_header (medium, "List-Unsubscribe")) {
+		*rmask &= ~EM_POPUP_SELECT_MLIST_UNSUBSCRIBE;
+	}
+
+	if(camel_medium_get_header (medium, "List-Archive")) {
+		*rmask &= ~EM_POPUP_SELECT_MLIST_ARCHIVES;
+	}
+
+	if(camel_medium_get_header (medium, "List-Owner")) {
+		*rmask &= ~EM_POPUP_SELECT_MLIST_OWNER;
+	}
+
+	if (((EM_POPUP_SELECT_MLIST_OWNER
+	     | EM_POPUP_SELECT_MLIST_ARCHIVES
+	     | EM_POPUP_SELECT_MLIST_SUBSCRIBE
+	     | EM_POPUP_SELECT_MLIST_UNSUBSCRIBE
+	     | EM_POPUP_SELECT_MLIST_HELP) & *rmask) > 0) {
+		*rmask &= ~EM_POPUP_SELECT_MLIST_ACTIONS;
+	}
+	
+	return *rmask > 0;
+}
+
+
+guint32
+em_mailing_list_set_mask(CamelFolder *folder, const gchar *uid, guint32 *rmask)
+{
+	CamelMimeMessage *message = camel_folder_get_message ( folder, uid, NULL);
+	return em_mailing_list_mask_headers (message, rmask);
+}
+
+guint32
+em_uri_mailing_list_set_mask(CamelURL *url, guint32 *rmask)
+{
+	if(camel_url_get_param (url, "List-Help")) {
+		*rmask &= ~EM_POPUP_URI_LIST_HELP;
+	}
+
+	if(camel_url_get_param (url, "List-Subscribe")) {
+		*rmask &= ~EM_POPUP_URI_LIST_SUBSCRIBE;
+	}
+
+	if(camel_url_get_param (url, "List-Unsubscribe")) {
+		*rmask &= ~EM_POPUP_URI_LIST_UNSUBSCRIBE;
+	}
+
+	if(camel_url_get_param (url, "List-Archive")) {
+		*rmask &= ~EM_POPUP_URI_LIST_ARCHIVES;
+	}
+
+	if(camel_url_get_param (url, "List-Owner")) {
+		*rmask &= ~EM_POPUP_URI_LIST_OWNER;
+	}
+
+	return *rmask > 0;
+
+}
+
 EMPopupTarget *
 em_popup_target_new_uri(const char *uri)
 {
@@ -499,9 +576,13 @@
 	if (g_ascii_strncasecmp(uri, "http:", 5) == 0
 	    || g_ascii_strncasecmp(uri, "https:", 6) == 0)
 		mask &= ~EM_POPUP_URI_HTTP;
-	if (g_ascii_strncasecmp(uri, "mailto:";, 7) == 0)
+	if (g_ascii_strncasecmp(uri, "mailto:";, 7) == 0) {
+		CamelURL * url;
 		mask &= ~EM_POPUP_URI_MAILTO;
-	else
+		url = camel_url_new(uri, NULL);
+		em_uri_mailing_list_set_mask(url, &mask);
+		// eald here pending set mask
+	} else
 		mask &= ~EM_POPUP_URI_NOT_MAILTO;
 
 	t->mask = mask;
@@ -509,6 +590,7 @@
 	return t;
 }
 
+
 EMPopupTarget *
 em_popup_target_new_part(struct _CamelMimePart *part, const char *mime_type)
 {
@@ -553,6 +635,8 @@
 		camel_object_unref(t->data.part.part);
 		g_free(t->data.part.mime_type);
 		break;
+	case EM_POPUP_TARGET_FOLDER:
+		break;
 	}
 
 	g_free(t);
@@ -681,10 +765,53 @@
 	printf("UNIMPLEMENTED: Add address '%s'\n", t->data.uri);
 }
 
+static void
+emp_popup_mailing_list_help(GtkWidget *w, EMPopupTarget *t)
+{
+	emp_list_uri_by_action(t->data.uri, URI_PARAM_LIST_HELP);
+}
+
+static void
+emp_popup_mailing_list_subscribe(GtkWidget *w, EMPopupTarget *t) 
+{
+	emp_list_uri_by_action(t->data.uri, URI_PARAM_LIST_UNSUBSCRIBE);
+}
+
+static void
+emp_popup_mailing_list_unsubscribe(GtkWidget *w, EMPopupTarget *t) 
+{
+	emp_list_uri_by_action(t->data.uri, URI_PARAM_LIST_UNSUBSCRIBE);
+}
+
+static void
+emp_popup_mailing_list_archives(GtkWidget *w, EMPopupTarget *t) 
+{
+	emp_list_uri_by_action(t->data.uri, URI_PARAM_LIST_ARCHIVE);
+}
+
+static void
+emp_list_uri_by_action(gchar *uri, const gchar *param_name)
+{
+	CamelURL *url;
+	const gchar *param;
+	url = camel_url_new(uri, NULL);
+	param = camel_url_get_param(url, param_name);
+	mailing_list_run_action(param);
+	camel_url_free(url);
+}
+
 static EMPopupItem emp_standard_uri_popups[] = {
 	{ EM_POPUP_ITEM, "00.uri.00", N_("_Open Link in Browser"), G_CALLBACK(emp_uri_popup_link_open), NULL, NULL, EM_POPUP_URI_NOT_MAILTO },
 	{ EM_POPUP_ITEM, "00.uri.10", N_("Se_nd message to..."), G_CALLBACK(emp_uri_popup_address_send), NULL, NULL, EM_POPUP_URI_MAILTO },
 	{ EM_POPUP_ITEM, "00.uri.20", N_("_Add to Addressbook"), G_CALLBACK(emp_uri_popup_address_add), NULL, NULL, EM_POPUP_URI_MAILTO },
+	{ EM_POPUP_ITEM, "00.uri.00", N_("_Request List Help"), G_CALLBACK(emp_popup_mailing_list_help), NULL, NULL,
+	  EM_POPUP_URI_MAILTO|EM_POPUP_URI_LIST_HELP },
+	{ EM_POPUP_ITEM, "00.uri.01", N_("_Subscribe to list"), G_CALLBACK(emp_popup_mailing_list_subscribe), NULL, NULL,
+	  EM_POPUP_URI_MAILTO|EM_POPUP_URI_LIST_SUBSCRIBE },
+	{ EM_POPUP_ITEM, "00.uri.02", N_("_Unsubscribe to list"), G_CALLBACK(emp_popup_mailing_list_unsubscribe), NULL, NULL,
+	  EM_POPUP_URI_MAILTO|EM_POPUP_URI_LIST_UNSUBSCRIBE},
+	{ EM_POPUP_ITEM, "00.uri.03", N_("_View List Archives"), G_CALLBACK(emp_popup_mailing_list_archives), NULL, NULL,
+	  EM_POPUP_URI_MAILTO|EM_POPUP_URI_LIST_ARCHIVES }
 };
 
 /* ********************************************************************** */
Index: mail/em-popup.h
===================================================================
RCS file: /cvs/gnome/evolution/mail/em-popup.h,v
retrieving revision 1.4
diff -u -r1.4 em-popup.h
--- mail/em-popup.h	12 Nov 2003 21:12:59 -0000	1.4
+++ mail/em-popup.h	2 Dec 2003 10:42:40 -0000
@@ -69,35 +69,46 @@
 	EM_POPUP_TARGET_SELECT,
 	EM_POPUP_TARGET_URI,
 	EM_POPUP_TARGET_PART,
-	EM_POPUP_TARGET_FOLDER,
+	EM_POPUP_TARGET_FOLDER
 };
 
 /* Flags that describe a TARGET_SELECT */
 enum {
-	EM_POPUP_SELECT_ONE		    = 1<<1,
-	EM_POPUP_SELECT_MANY		    = 1<<2,
+	EM_POPUP_SELECT_ONE		       = 1<<1,
+	EM_POPUP_SELECT_MANY		       = 1<<2,
 	EM_POPUP_SELECT_MARK_READ              = 1<<3,
 	EM_POPUP_SELECT_MARK_UNREAD            = 1<<4,
 	EM_POPUP_SELECT_DELETE                 = 1<<5,
 	EM_POPUP_SELECT_UNDELETE               = 1<<6,
-	EM_POPUP_SELECT_MAILING_LIST            = 1<<7,
+	EM_POPUP_SELECT_MAILING_LIST           = 1<<7,
 	EM_POPUP_SELECT_RESEND                 = 1<<8,
 	EM_POPUP_SELECT_MARK_IMPORTANT         = 1<<9,
 	EM_POPUP_SELECT_MARK_UNIMPORTANT       = 1<<10,
-	EM_POPUP_SELECT_FLAG_FOLLOWUP      = 1<<11,
+	EM_POPUP_SELECT_FLAG_FOLLOWUP          = 1<<11,
 	EM_POPUP_SELECT_FLAG_COMPLETED         = 1<<12,
 	EM_POPUP_SELECT_FLAG_CLEAR             = 1<<13,
 	EM_POPUP_SELECT_ADD_SENDER             = 1<<14,
 	EM_POPUP_SELECT_MARK_JUNK              = 1<<15,
 	EM_POPUP_SELECT_MARK_NOJUNK            = 1<<16,
-	EM_POPUP_SELECT_LAST = 1<<18 /* reserve 2 slots */
+	EM_POPUP_SELECT_LAST = 1<<18, /* reserve 2 slots */
+	EM_POPUP_SELECT_MLIST_ACTIONS          = 1<<19,
+	EM_POPUP_SELECT_MLIST_HELP             = 1<<20,
+	EM_POPUP_SELECT_MLIST_SUBSCRIBE        = 1<<21,
+	EM_POPUP_SELECT_MLIST_UNSUBSCRIBE      = 1<<22,
+	EM_POPUP_SELECT_MLIST_ARCHIVES         = 1<<23,
+	EM_POPUP_SELECT_MLIST_OWNER            = 1<<24
 };
 
 /* Flags that describe a TARGET_URI */
 enum {
-	EM_POPUP_URI_HTTP = 1<<0,
-	EM_POPUP_URI_MAILTO = 1<<1,
-	EM_POPUP_URI_NOT_MAILTO = 1<<2,
+	EM_POPUP_URI_HTTP              = 1<<0,
+	EM_POPUP_URI_MAILTO            = 1<<1,
+	EM_POPUP_URI_NOT_MAILTO        = 1<<2,
+	EM_POPUP_URI_LIST_HELP         = 1<<3,
+	EM_POPUP_URI_LIST_SUBSCRIBE    = 1<<4,
+	EM_POPUP_URI_LIST_UNSUBSCRIBE  = 1<<5,
+	EM_POPUP_URI_LIST_ARCHIVES     = 1<<6,
+	EM_POPUP_URI_LIST_OWNER        = 1<<7
 };
 
 /* Flags that describe TARGET_PART */
Index: mail/em-utils.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/em-utils.c,v
retrieving revision 1.8
diff -u -r1.8 em-utils.c
--- mail/em-utils.c	19 Nov 2003 21:22:12 -0000	1.8
+++ mail/em-utils.c	2 Dec 2003 10:42:41 -0000
@@ -30,6 +30,7 @@
 #include <sys/stat.h>
 #include <errno.h>
 #include <time.h>
+#include <gnome.h>
 
 #include <camel/camel-stream-fs.h>
 #include <camel/camel-url-scanner.h>
@@ -1242,6 +1243,80 @@
 	e_msg_composer_unset_changed (composer);
 }
 
+/* List commands */
+
+void
+mailing_list_action (CamelMimeMessage *message, const gchar *header)
+{
+	const gchar *action;
+	
+	if (!(action = camel_medium_get_header ((CamelMedium *) message, header)))
+		return;
+
+	mailing_list_run_action(action);
+}
+
+void
+mailing_list_run_action(const gchar *action)
+{
+	const gchar *p, *url;
+	gchar **uris;
+	gint i;
+	GError *err = NULL;
+#define n 5
+
+	/* 5 elements at my descretion */
+	uris = g_strsplit(action,",", n);
+
+	/* This code is almost ready to show a list of possible
+	 * actions if that is decided to use. */
+	for(i = 0; i < n; i++) {
+		action = g_strdup(uris[i]);
+		p = action;
+		while (*action == ' ' || *action == '\t' || *action == '<')
+			action++;
+		if (!(strncmp (action, "mailto:";, 6))) {
+			while (*p && !strchr (">", *p))
+				p++;
+			url = g_strndup (action, p - action);
+			if (strlen (url) == 0)
+				continue;
+			em_utils_compose_new_message_with_mailto (url);
+			break;
+		} else {
+			while (*p && !strchr (">", *p))
+				p++;
+			url = g_strndup (action, p - action);
+			if (strlen (url) == 0)
+				continue;
+			gnome_url_show (url, &err);
+			if (err) {
+				g_warning ("gnome_url_show: %s", err->message);
+				g_error_free(err);
+			} else {
+				break;
+			}
+		}
+	}
+#undef n
+	return;
+}
+
+void
+em_utils_mailing_list_action_folder (CamelFolder *folder, const gchar *uid, CamelMimeMessage *message, void *user_data)
+{
+	gchar *command = (gchar *)user_data;
+
+	mailing_list_action (message, command);
+}
+
+void
+em_utils_mailing_list_command (CamelFolder *folder, const char *uid, gchar * command)
+{
+	mail_get_message (folder, uid,
+			  em_utils_mailing_list_action_folder, GINT_TO_POINTER(command), mail_thread_new);
+}
+
 /**
  * em_utils_post_reply_to_message_by_uid:
  * @folder: folder containing message to reply to
Index: mail/em-utils.h
===================================================================
RCS file: /cvs/gnome/evolution/mail/em-utils.h,v
retrieving revision 1.4
diff -u -r1.4 em-utils.h
--- mail/em-utils.h	27 Oct 2003 21:31:19 -0000	1.4
+++ mail/em-utils.h	2 Dec 2003 10:42:41 -0000
@@ -80,6 +80,26 @@
 	REPLY_MODE_LIST
 };
 
+/* List commands */
+#define	LIST_COMMAND_HELP        "List-Help"
+#define LIST_COMMAND_SUBSCRIBE   "List-Subscribe"
+#define	LIST_COMMAND_UNSUBSCRIBE "List-Unsubscribe"
+#define	LIST_COMMAND_ARCHIVE     "List-Archive"
+#define	LIST_COMMAND_OWNER       "List-Owner"
+
+#define URI_PARAM_LIST_HELP        "x-list-help"
+#define URI_PARAM_LIST_SUBSCRIBE   "x-list-subscribe"
+#define URI_PARAM_LIST_UNSUBSCRIBE "x-list-unsubscribe"
+#define URI_PARAM_LIST_ARCHIVE     "x-list-archive"
+
+typedef enum _mailing_list_command mailing_list_command;
+
+void mailing_list_action (struct _CamelMimeMessage *message, const char *header);
+void mailing_list_commands (struct _CamelFolder *folder, const char *uid, struct _CamelMimeMessage *message, void *user_data);
+void em_utils_mailing_list_command (struct _CamelFolder *folder, const char *uid, char *command);
+void mailing_list_run_action(const char *url);
+void em_utils_mailing_list_action_folder (struct _CamelFolder *folder, const char *uid, struct _CamelMimeMessage *message, void *user_data) ;
+
 void em_utils_reply_to_message (struct _CamelMimeMessage *message, int mode);
 void em_utils_reply_to_message_by_uid (struct _CamelFolder *folder, const char *uid, int mode);
 
Index: ui/evolution-mail-message.xml
===================================================================
RCS file: /cvs/gnome/evolution/ui/evolution-mail-message.xml,v
retrieving revision 1.52
diff -u -r1.52 evolution-mail-message.xml
--- ui/evolution-mail-message.xml	12 Nov 2003 21:13:05 -0000	1.52
+++ ui/evolution-mail-message.xml	2 Dec 2003 10:42:42 -0000
@@ -326,6 +326,14 @@
 
 	  <separator f="" name="emaillist2"/>
 
+          <submenu name="ListCommands" _label="L_ist">
+            <menuitem verb="MailingListHelp" _label="_Request List Help"/>
+            <menuitem verb="MailingListSubscribe" _label="_Subscribe to list"/>
+            <menuitem verb="MailingListUnsubscribe" _label="_Unsubscribe from list"/>
+            <separator f="" name="listlist1"/>
+            <menuitem verb="MailingListArchives" _label="_View List Archives"/>
+          </submenu>
+
           <menuitem name="MessageReplySender" verb="" _label="_Reply to Sender"/>
           <menuitem name="MessageReplyList" verb="" _label="Reply to _List"/>
           <menuitem name="MessageReplyAll" verb="" _label="Reply to _All"/>
-- 
Edgar Antonio Luna Díaz
Fingerprint: C008 5EAC 5272 AC8C 7589  4821 8B34 6166 8733 8310


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