Re: [evolution-patches] Patch for the receipt bounty (#127534)



So here's a new version of the patch. The receipt policy setting is still per-account, since I think this is the most flexible approach, and the UI guys haven't stated their opinion yet. Oh, and the UI for this is still not yet written, again, I'd like to get the backend stuff right first.

--
   .--= ULLA! =---------------------.   `We are not here to give users what
   \     http://cactus.rulez.org     \   they want'  -- RMS, at GUADEC 2001
    `---= cactus cactus rulez org =---'
A ferfi jutalma a no, a no jutalma, hogy o a jutalom.
Index: camel/camel-folder-summary.h
===================================================================
RCS file: /cvs/gnome/evolution/camel/camel-folder-summary.h,v
retrieving revision 1.78
diff -u -u -r1.78 camel-folder-summary.h
--- camel/camel-folder-summary.h	21 May 2004 09:08:09 -0000	1.78
+++ camel/camel-folder-summary.h	11 Aug 2004 19:31:06 -0000
@@ -70,6 +70,8 @@
 	CAMEL_MESSAGE_JUNK = 1<<7,
 	CAMEL_MESSAGE_SECURE = 1<<8,
 
+	CAMEL_MESSAGE_RECEIPT_HANDLED = 1 << 9,
+	
 	/* following flags are for the folder, and are not really permanent flags */
 	CAMEL_MESSAGE_FOLDER_FLAGGED = 1<<16, /* for use by the folder implementation */
 
Index: composer/ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/composer/ChangeLog,v
retrieving revision 1.655
diff -u -u -r1.655 ChangeLog
--- composer/ChangeLog	28 Jul 2004 18:06:31 -0000	1.655
+++ composer/ChangeLog	11 Aug 2004 19:31:14 -0000
@@ -1,3 +1,8 @@
+2004-08-06  ERDI Gergo  <cactus cactus rulez org>
+
+	* e-msg-composer.c (build_message): Create an MDN header if a
+	receipt is requested by the user
+
 2004-07-28  Not Zed  <NotZed Ximian com>
 
 	* e-msg-composer.c: Fixes for api changes in mail/ for 61940.
Index: composer/e-msg-composer.c
===================================================================
RCS file: /cvs/gnome/evolution/composer/e-msg-composer.c,v
retrieving revision 1.477
diff -u -u -r1.477 e-msg-composer.c
--- composer/e-msg-composer.c	28 Jul 2004 18:06:31 -0000	1.477
+++ composer/e-msg-composer.c	11 Aug 2004 19:31:24 -0000
@@ -437,6 +437,15 @@
 					 composer->extra_hdr_names->pdata[i],
 					 composer->extra_hdr_values->pdata[i]);
 	}
+
+	/* Message Disposition Notification */
+	if (composer->request_receipt) {
+		char *mdn_address = hdrs->account->id->reply_to;
+		if (!mdn_address || !*mdn_address)
+			mdn_address = hdrs->account->id->address;
+		
+		camel_medium_add_header (CAMEL_MEDIUM (new), "Disposition-Notification-To", mdn_address);
+	}
 	
 	if (composer->mime_body) {
 		plain_encoding = CAMEL_TRANSFER_ENCODING_7BIT;
@@ -499,7 +508,7 @@
 			CORBA_exception_init (&ev);
 			GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "save-data-on", &ev);
 		}
-		data = get_text (composer->persist_stream_interface, "text/html");		
+		data = get_text (composer->persist_stream_interface, "text/html");
 		if (save_html_object_data) {
 			GNOME_GtkHTML_Editor_Engine_runCommand (composer->editor_engine, "save-data-off", &ev);
 			CORBA_exception_free (&ev);
@@ -1910,6 +1919,19 @@
 }
 
 static void
+menu_insert_receipt_cb (BonoboUIComponent           *component,
+			const char                  *path,
+			Bonobo_UIComponent_EventType type,
+			const char                  *state,
+			gpointer                     user_data)
+{
+	if (type != Bonobo_UIComponent_STATE_CHANGED)
+		return;
+	
+	e_msg_composer_set_request_receipt (E_MSG_COMPOSER (user_data), atoi (state));
+}
+
+static void
 menu_changed_charset_cb (BonoboUIComponent           *component,
 			 const char                  *path,
 			 Bonobo_UIComponent_EventType type,
@@ -2206,7 +2228,15 @@
 	bonobo_ui_component_add_listener (
 		composer->uic, "ViewBCC",
 		menu_view_bcc_cb, composer);
+
+	/* Insert/Request Receipt */
+	bonobo_ui_component_set_prop (
+		composer->uic, "/commands/RequestReceipt",
+		"state", composer->request_receipt ? "1" : "0", NULL);
+	bonobo_ui_component_add_listener (
+		composer->uic, "RequestReceipt",
+		menu_insert_receipt_cb, composer);
 	
 	/* Security -> PGP Sign */
 	bonobo_ui_component_set_prop (
@@ -5176,6 +5207,47 @@
 	e_msg_composer_hdrs_set_visible (E_MSG_COMPOSER_HDRS (composer->hdrs),
 					 e_msg_composer_get_visible_flags (composer));
 }
+
+
+
+/**
+ * e_msg_composer_get_request_receipt
+ * @composer: A message composer widget
+ * 
+ * Get the status of the "Request receipt" flag.
+ * 
+ * Return value: The status of the "Request receipt" flag.
+ **/
+gboolean
+e_msg_composer_get_request_receipt (EMsgComposer *composer)
+{
+	g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
+	
+	return composer->request_receipt;
+}
+
+
+/**
+ * e_msg_composer_set_request_receipt:
+ * @composer: A message composer widget
+ * @state: whether to request or not a receipt
+ *
+ * If set, a message delivery notification request will be sent to the recipient
+ */
+void
+e_msg_composer_set_request_receipt (EMsgComposer *composer, gboolean request_receipt)
+{
+	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
+	
+	if ((composer->request_receipt && request_receipt) ||
+	    (!composer->request_receipt && !request_receipt))
+		return;
+	
+	composer->request_receipt = request_receipt;
+	bonobo_ui_component_set_prop (composer->uic, "/commands/RequestReceipt",
+				      "state", composer->request_receipt ? "1" : "0", NULL);
+}
+
 
 
 EDestination **
Index: composer/e-msg-composer.h
===================================================================
RCS file: /cvs/gnome/evolution/composer/e-msg-composer.h,v
retrieving revision 1.91
diff -u -u -r1.91 e-msg-composer.h
--- composer/e-msg-composer.h	27 Jul 2004 16:52:17 -0000	1.91
+++ composer/e-msg-composer.h	11 Aug 2004 19:31:25 -0000
@@ -101,6 +101,7 @@
 	guint32 view_bcc               : 1;
 	guint32 view_cc                : 1;
 	guint32 view_subject           : 1;
+	guint32 request_receipt        : 1;
 	guint32 has_changed            : 1;
 	guint32 autosaved              : 1;
 	
@@ -191,6 +192,10 @@
 gboolean                 e_msg_composer_get_view_bcc                     (EMsgComposer      *composer);
 void                     e_msg_composer_set_view_bcc                     (EMsgComposer      *composer,
 									  gboolean           view_bcc);
+
+gboolean                 e_msg_composer_get_request_receipt              (EMsgComposer *composer);
+void                     e_msg_composer_set_request_receipt              (EMsgComposer *composer,
+									  gboolean      request_receipt);
 
 EDestination           **e_msg_composer_get_recipients                   (EMsgComposer *composer);
 EDestination           **e_msg_composer_get_to                           (EMsgComposer *composer);
Index: e-util/ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/e-util/ChangeLog,v
retrieving revision 1.476
diff -u -u -r1.476 ChangeLog
--- e-util/ChangeLog	9 Aug 2004 16:47:03 -0000	1.476
+++ e-util/ChangeLog	11 Aug 2004 19:31:28 -0000
@@ -3,6 +3,10 @@
 	* e-icon-factory.c (icon_foreach_remove): We must return TRUE here
 	so that things actually get removed from the list
 
+2004-08-07  ERDI Gergo  <cactus cactus rulez org>
+
+	* e-account.h: Added new receipt_policy field to services
+
 2004-08-05  Rodrigo Moya <rodrigo novell com>
 
 	* e-icon-factory.c (e_icon_factory_init): connect to "changed"
Index: e-util/e-account.c
===================================================================
RCS file: /cvs/gnome/evolution/e-util/e-account.c,v
retrieving revision 1.10
diff -u -u -r1.10 e-account.c
--- e-util/e-account.c	9 Apr 2004 19:47:06 -0000	1.10
+++ e-util/e-account.c	11 Aug 2004 19:31:30 -0000
@@ -314,6 +314,7 @@
 
 	changed |= xml_set_bool (node, "auto-check", &service->auto_check);
 	changed |= xml_set_int (node, "auto-check-timeout", &service->auto_check_time);
+	changed |= xml_set_int (node, "receipt-policy", &service->receipt_policy);
 	if (service->auto_check && service->auto_check_time <= 0) {
 		service->auto_check = FALSE;
 		service->auto_check_time = 0;
@@ -528,6 +529,8 @@
 	xmlSetProp (src, "auto-check", account->source->auto_check ? "true" : "false");
 	sprintf (buf, "%d", account->source->auto_check_time);
 	xmlSetProp (src, "auto-check-timeout", buf);
+	sprintf (buf, "%d", account->source->receipt_policy);
+	xmlSetProp (src, "receipt-policy", buf);
 	if (account->source->url)
 		xmlNewTextChild (src, NULL, "url", account->source->url);
 
@@ -655,6 +658,7 @@
 	{ /* E_ACCOUNT_SOURCE_AUTO_CHECK */ 1<<EAP_LOCK_AUTOCHECK },
 	{ /* E_ACCOUNT_SOURCE_AUTO_CHECK_TIME */ 1<<EAP_LOCK_AUTOCHECK },
 	{ /* E_ACCOUNT_SOURCE_SAVE_PASSWD */ 1<<EAP_LOCK_SAVE_PASSWD },
+	{ /* E_ACCOUNT_SROUCE_RECEIPT_POLICY */ },
 
 	{ /* E_ACCOUNT_TRANSPORT_URL */ 1<<EAP_LOCK_TRANSPORT },
 	{ /* E_ACCOUNT_TRANSPORT_SAVE_PASSWD */ 1<<EAP_LOCK_SAVE_PASSWD },
Index: e-util/e-account.h
===================================================================
RCS file: /cvs/gnome/evolution/e-util/e-account.h,v
retrieving revision 1.7
diff -u -u -r1.7 e-account.h
--- e-util/e-account.h	1 Apr 2004 19:48:43 -0000	1.7
+++ e-util/e-account.h	11 Aug 2004 19:31:30 -0000
@@ -40,6 +40,7 @@
 	E_ACCOUNT_SOURCE_AUTO_CHECK,
 	E_ACCOUNT_SOURCE_AUTO_CHECK_TIME,
 	E_ACCOUNT_SOURCE_SAVE_PASSWD,
+	E_ACCOUNT_SOURCE_RECEIPT_POLICY,
 
 	E_ACCOUNT_TRANSPORT_URL,
 	E_ACCOUNT_TRANSPORT_SAVE_PASSWD,
@@ -80,12 +81,19 @@
 	char *sig_uid;
 } EAccountIdentity;
 
+typedef enum _EAccountReceiptPolicy {
+	E_ACCOUNT_RECEIPT_ASK,
+	E_ACCOUNT_RECEIPT_NEVER,
+	E_ACCOUNT_RECEIPT_ALWAYS
+} EAccountReceiptPolicy;
+
 typedef struct _EAccountService {
 	char *url;
 	gboolean keep_on_server;
 	gboolean auto_check;
 	int auto_check_time;
 	gboolean save_passwd;
+	EAccountReceiptPolicy receipt_policy;
 } EAccountService;
 
 typedef struct _EAccount {
Index: mail/ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/mail/ChangeLog,v
retrieving revision 1.3430
diff -u -u -r1.3430 ChangeLog
--- mail/ChangeLog	10 Aug 2004 19:10:06 -0000	1.3430
+++ mail/ChangeLog	11 Aug 2004 19:31:54 -0000
@@ -1,3 +1,12 @@
+2004-08-11  ERDI Gergo  <cactus cactus rulez org>
+
+	* mail-errors.xml: Added new dialog for receipt requests
+
+	* em-composer-utils.c (em_utils_guess_account): Made guess_account
+	public, to be callable from em-folder-view
+	(em_utils_send_receipt): New function to send an RFC
+	2298-compliant message delivery notification
+
 2004-08-06  Jeffrey Stedfast  <fejj novell com>
 
 	* em-folder-tree-model.c (em_folder_tree_model_get_selected):
Index: mail/em-composer-utils.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/em-composer-utils.c,v
retrieving revision 1.21
diff -u -u -r1.21 em-composer-utils.c
--- mail/em-composer-utils.c	4 Aug 2004 15:20:57 -0000	1.21
+++ mail/em-composer-utils.c	11 Aug 2004 19:31:59 -0000
@@ -27,6 +27,9 @@
 #include <string.h>
 #include <gtk/gtkdialog.h>
 
+#include <netdb.h>     /* define MAXHOSTNAMELEN on Solaris */
+#include <sys/param.h> /* define MAXHOSTNAMELEN elsewhere  */
+
 #include <gal/util/e-util.h>
 
 #include "mail-mt.h"
@@ -48,8 +51,7 @@
 #include "e-util/e-account-list.h"
 
 #include <camel/camel-string-utils.h>
-
-static EAccount *guess_account (CamelMimeMessage *message, CamelFolder *folder);
+#include <camel/camel-stream-mem.h>
 
 struct emcs_t {
 	unsigned int ref_count;
@@ -414,7 +416,7 @@
 	if (mail_folder) {
 		/* mail the message */
 		info = camel_message_info_new ();
-		info->flags = CAMEL_MESSAGE_SEEN;
+		info->flags = CAMEL_MESSAGE_SEEN | CAMEL_MESSAGE_RECEIPT_HANDLED;
 		
 		send = g_malloc (sizeof (*send));
 		send->emcs = user_data;
@@ -438,7 +440,7 @@
 		
 		/* mail the message */
 		info = camel_message_info_new ();
-		info->flags = CAMEL_MESSAGE_SEEN;
+		info->flags = CAMEL_MESSAGE_SEEN | CAMEL_MESSAGE_RECEIPT_HANDLED;
 		
 		post_ptr = post_folders;
 		while (post_ptr) {
@@ -577,7 +579,7 @@
 	msg = e_msg_composer_get_message_draft (composer);
 	
 	info = g_new0 (CamelMessageInfo, 1);
-	info->flags = CAMEL_MESSAGE_DRAFT | CAMEL_MESSAGE_SEEN;
+	info->flags = CAMEL_MESSAGE_DRAFT | CAMEL_MESSAGE_RECEIPT_HANDLED | CAMEL_MESSAGE_SEEN;
 	
 	sdi = g_malloc (sizeof (struct _save_draft_info));
 	sdi->composer = composer;
@@ -1044,7 +1046,7 @@
 	while (camel_medium_get_header (CAMEL_MEDIUM (message), "Delivered-To"))
 		camel_medium_remove_header (CAMEL_MEDIUM (message), "Delivered-To");
 	
-	account = guess_account (message, NULL);
+	account = em_utils_guess_account (message, NULL);
 	
 	composer = e_msg_composer_new_redirect (message, account ? account->name : NULL);
 	
@@ -1103,6 +1105,110 @@
 	mail_get_message (folder, uid, redirect_msg, NULL, mail_thread_new);
 }
 
+
+void
+em_utils_send_receipt (CamelFolder *folder, CamelMimeMessage *message)
+{
+	EAccount *account = em_utils_guess_account (message, folder);
+
+	CamelMimeMessage *receipt = camel_mime_message_new ();
+	CamelMultipart *body = camel_multipart_new ();
+	CamelMimePart *part;
+	CamelDataWrapper *receipt_text, *receipt_data;
+	CamelContentType *type;
+	CamelInternetAddress *addr;
+	CamelStream *stream;	
+	CamelFolder *out_folder;
+	CamelMessageInfo *info;	
+	const char *message_id = camel_medium_get_header (CAMEL_MEDIUM (message), "Message-ID");
+	const char *message_date = camel_medium_get_header (CAMEL_MEDIUM (message), "Date");
+	const char *message_subject = camel_mime_message_get_subject (message);
+	const char *receipt_address = camel_medium_get_header (CAMEL_MEDIUM (message), "Disposition-Notification-To");
+	char hostname[MAXHOSTNAMELEN + 1];
+	char *self_address, *receipt_subject;
+
+	if (!receipt_address)
+		return;
+	
+	/* Collect information for the receipt */
+	gethostname (hostname, MAXHOSTNAMELEN);
+	self_address = account->id->address;
+	
+	/* Create toplevel container */
+	camel_data_wrapper_set_mime_type (CAMEL_DATA_WRAPPER (body),
+					  "multipart/report;"
+					  "report-type=\"disposition-notification\"");
+	camel_multipart_set_boundary (body, NULL);	
+	
+	/* Create textual receipt */
+	receipt_text = camel_data_wrapper_new ();
+	type = camel_content_type_new ("text", "plain");
+	camel_data_wrapper_set_mime_type_field (receipt_text, type);
+	camel_content_type_unref (type);
+	stream = camel_stream_mem_new ();
+	camel_stream_printf (stream,
+			     "Your message to %s about \"%s\" "
+			     "(dated %s) has been read by the user.",
+			     self_address, message_subject, message_date);
+	camel_data_wrapper_construct_from_stream (receipt_text, stream);
+	camel_object_unref (stream);
+	
+	part = camel_mime_part_new ();
+	camel_medium_set_content_object (CAMEL_MEDIUM (part), receipt_text);
+	camel_object_unref (receipt_text);
+	camel_multipart_add_part (body, part);
+	camel_object_unref (part);	
+	
+	/* Create the machine-readable receipt */
+	receipt_data = camel_data_wrapper_new ();
+	type = camel_content_type_new ("message", "disposition-notification");
+	camel_data_wrapper_set_mime_type_field (receipt_data, type);
+	camel_content_type_unref (type);
+	stream = camel_stream_mem_new ();
+	camel_stream_printf (stream,
+			     "Reporting-UA: %s; %s\n"
+			     "Final-Recipient: rfc822; %s\n"
+			     "Original-Message-ID:%s\n"
+			     "Disposition: manual-action/MDN-sent-manually; displayed",
+			     hostname, "Evolution " VERSION SUB_VERSION " " VERSION_COMMENT,
+			     self_address, message_id);
+	camel_data_wrapper_construct_from_stream (receipt_data, stream);
+	camel_object_unref (stream);
+	
+	part = camel_mime_part_new ();
+	camel_medium_set_content_object (CAMEL_MEDIUM (part), receipt_data);
+	camel_object_unref (receipt_data);
+	camel_multipart_add_part (body, part);
+	camel_object_unref (part);	
+	
+	/* Finish creating the message */
+	camel_medium_set_content_object (CAMEL_MEDIUM (receipt), CAMEL_DATA_WRAPPER (body));
+	camel_object_unref (body);
+	
+	receipt_subject = g_strdup_printf ("Delivery Notification for: \"%s\"", message_subject);
+	camel_mime_message_set_subject (receipt, receipt_subject);
+	g_free (receipt_subject);
+	
+	addr = camel_internet_address_new ();
+	camel_address_decode (CAMEL_ADDRESS (addr), self_address);
+	camel_mime_message_set_recipients (receipt, CAMEL_RECIPIENT_TYPE_TO, addr);
+	camel_object_unref (addr);
+	
+	addr = camel_internet_address_new ();
+	camel_address_decode (CAMEL_ADDRESS (addr), receipt_address);
+	camel_mime_message_set_from (receipt, addr);
+	camel_object_unref (addr);
+
+	camel_medium_set_header (CAMEL_MEDIUM (receipt), "Return-Path", "<>");
+
+	/* Send the receipt */
+	out_folder = mail_component_get_folder(NULL, MAIL_COMPONENT_FOLDER_OUTBOX);
+	info = camel_message_info_new ();
+	info->flags = CAMEL_MESSAGE_SEEN;
+	mail_append_mail (out_folder, receipt, info, 0, 0);
+	/* camel_object_unref (mail_folder); */
+}
+
 /* Replying to messages... */
 
 static GHashTable *
@@ -1279,8 +1385,8 @@
 	return account;
 }
 
-static EAccount *
-guess_account (CamelMimeMessage *message, CamelFolder *folder)
+EAccount *
+em_utils_guess_account (CamelMimeMessage *message, CamelFolder *folder)
 {
 	GHashTable *account_hash = NULL;
 	EAccount *account = NULL;
@@ -1749,7 +1855,7 @@
 
 	g_return_if_fail(message != NULL);
 	
-	account = guess_account (message, NULL);
+	account = em_utils_guess_account (message, NULL);
 	flags = CAMEL_MESSAGE_ANSWERED | CAMEL_MESSAGE_SEEN;
 	
 	switch (mode) {
@@ -1806,7 +1912,7 @@
 	if (message == NULL)
 		return;
 	
-	account = guess_account (message, folder);
+	account = em_utils_guess_account (message, folder);
 	flags = CAMEL_MESSAGE_ANSWERED | CAMEL_MESSAGE_SEEN;
 	
 	get_reply_sender (message, &to, NULL);
Index: mail/em-composer-utils.h
===================================================================
RCS file: /cvs/gnome/evolution/mail/em-composer-utils.h,v
retrieving revision 1.7
diff -u -u -r1.7 em-composer-utils.h
--- mail/em-composer-utils.h	28 Jul 2004 14:38:50 -0000	1.7
+++ mail/em-composer-utils.h	11 Aug 2004 19:32:00 -0000
@@ -34,6 +34,7 @@
 struct _CamelMimeMessage;
 struct _EMsgComposer;
 struct _EMFormat;
+struct _EAccount;
 
 void em_composer_utils_setup_callbacks (struct _EMsgComposer *composer, struct _CamelFolder *folder, const char *uid,
 					guint32 flags, guint32 set, struct _CamelFolder *drafts, const char *drafts_uid);
@@ -62,6 +63,10 @@
 
 void em_utils_redirect_message (struct _CamelMimeMessage *message);
 void em_utils_redirect_message_by_uid (struct _CamelFolder *folder, const char *uid);
+
+void em_utils_send_receipt (struct _CamelFolder *folder, struct _CamelMimeMessage *message);
+
+struct _EAccount * em_utils_guess_account (struct _CamelMimeMessage *message, struct _CamelFolder *folder);
 
 enum {
 	REPLY_MODE_SENDER,
Index: mail/em-folder-view.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/em-folder-view.c,v
retrieving revision 1.85
diff -u -u -r1.85 em-folder-view.c
--- mail/em-folder-view.c	28 Jul 2004 14:38:50 -0000	1.85
+++ mail/em-folder-view.c	11 Aug 2004 19:32:08 -0000
@@ -29,6 +29,9 @@
 #include <sys/stat.h>
 #include <unistd.h>
 
+#include <netdb.h>	/* define MAXHOSTNAMELEN on Solaris */
+#include <sys/param.h>	/* define MAXHOSTNAMELEN elsewhere  */
+
 #include <gtk/gtkvbox.h>
 #include <gtk/gtkbutton.h>
 #include <gtk/gtkvpaned.h>
@@ -63,6 +66,7 @@
 #include <bonobo/bonobo-ui-util.h>
 
 #include "widgets/misc/e-charset-picker.h"
+#include "widgets/misc/e-error.h"
 
 #include <e-util/e-dialog-utils.h>
 #include <e-util/e-icon-factory.h>
@@ -120,6 +124,10 @@
 static void emfv_on_url_cb(GObject *emitter, const char *url, EMFolderView *emfv);
 static void emfv_on_url(EMFolderView *emfv, const char *uri, const char *nice_uri);
 
+static void     emfv_set_seen (EMFolderView *emfv, const char *uid);
+static gboolean emfv_ask_receipt (EMFolderView *emfv, CamelMimeMessage *message);
+static void     emfv_handle_receipt(EMFolderView *emfv, const char *uid);
+
 static const EMFolderViewEnable emfv_enable_map[];
 
 struct _EMFolderViewPrivate {
@@ -381,6 +389,8 @@
 			em_folder_view_set_folder((EMFolderView *)emmb, emfv->folder, emfv->folder_uri);
 			em_folder_view_set_message((EMFolderView *)emmb, uids->pdata[i], FALSE);
 			gtk_widget_show(emmb->window);
+			
+			emfv_handle_receipt (emfv, uids->pdata[i]);
 		}
 
 		message_list_free_uids(emfv->list, uids);
@@ -1933,7 +1943,7 @@
 	MessageList *list = emfv->list;
 	
 	if (mst->uid && list->cursor_uid && !strcmp (mst->uid, list->cursor_uid))
-		camel_folder_set_message_flags (emfv->folder, mst->uid, CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_SEEN);
+		emfv_set_seen (emfv, mst->uid);
 	
 	return FALSE;
 }
@@ -1949,7 +1959,7 @@
 		emfv_enable_menus(emfv);
 		return;
 	}
-	
+
 	em_format_format((EMFormat *)emfv->preview, folder, uid, msg);
 	
 	if (emfv->priv->seen_id)
@@ -1966,7 +1976,7 @@
 			emfv->priv->seen_id = g_timeout_add_full(G_PRIORITY_DEFAULT_IDLE, emfv->mark_seen_timeout,
 								 (GSourceFunc)do_mark_seen, mst, (GDestroyNotify)mst_free);
 		} else {
-			camel_folder_set_message_flags(emfv->folder, uid, CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_SEEN);
+			emfv_set_seen (emfv, uid);
 		}
 	}
 	
@@ -2190,6 +2200,63 @@
 {
 	g_object_ref(emfv);
 	mail_async_event_emit(emfv->async, MAIL_ASYNC_GUI, (MailAsyncFunc)emfv_gui_folder_changed, folder, NULL, emfv);
+}
+
+static void
+emfv_set_seen(EMFolderView *emfv, const char *uid)
+{
+	guint32 old_flags = camel_folder_get_message_flags(emfv->folder, uid);
+
+	/* If we're setting the SEEN flag on a message, handle receipt
+	 * requests */
+	if (!(old_flags & CAMEL_MESSAGE_SEEN))
+		emfv_handle_receipt(emfv, uid);
+	
+	camel_folder_set_message_flags(emfv->folder, uid, CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_SEEN);
+}
+
+static gboolean
+emfv_ask_receipt(EMFolderView *emfv, CamelMimeMessage *message)
+{
+	/* Check the account's receipt policy settings, and pop up a
+	 * dialog if the policy is ASK */
+	
+	EAccount *account = em_utils_guess_account (message, emfv->folder);
+	
+	if (account->source->receipt_policy == E_ACCOUNT_RECEIPT_ASK) {
+		GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (emfv));
+		GtkWindow *dialog_parent = (toplevel && GTK_IS_WINDOW (toplevel)) ? GTK_WINDOW (toplevel) : NULL;
+		const char *receipt_address = camel_medium_get_header (CAMEL_MEDIUM (message), "Disposition-Notification-To");
+		const char *subject = camel_mime_message_get_subject (message);
+		
+		return (e_error_run (dialog_parent, "mail:ask-receipt", receipt_address, subject) == GTK_RESPONSE_YES);
+	}
+	
+	return (account->source->receipt_policy == E_ACCOUNT_RECEIPT_ALWAYS);
+}
+	
+static void
+emfv_handle_receipt(EMFolderView *emfv, const char *uid)
+{
+	guint32 old_flags = camel_folder_get_message_flags(emfv->folder, uid);
+	CamelMimeMessage *message = camel_folder_get_message(emfv->folder, uid, NULL);
+
+	g_return_if_fail (message);
+
+	if (old_flags & CAMEL_MESSAGE_RECEIPT_HANDLED)
+		return;
+	
+#if 0
+	camel_folder_set_message_flags (emfv->folder, uid,
+					CAMEL_MESSAGE_RECEIPT_HANDLED,
+					CAMEL_MESSAGE_RECEIPT_HANDLED);
+#endif
+	
+	if (!camel_medium_get_header(CAMEL_MEDIUM (message), "Disposition-Notification-To"))
+		return;
+	
+	if (emfv_ask_receipt (emfv, message))
+		em_utils_send_receipt(emfv->folder, message);	
 }
 
 /* keep these two tables in sync */
Index: mail/mail-errors.xml
===================================================================
RCS file: /cvs/gnome/evolution/mail/mail-errors.xml,v
retrieving revision 1.4
diff -u -u -r1.4 mail-errors.xml
--- mail/mail-errors.xml	29 Jul 2004 06:47:31 -0000	1.4
+++ mail/mail-errors.xml	11 Aug 2004 19:32:09 -0000
@@ -315,6 +315,13 @@
  <primary>Could not connect to {0}. Groupwise account setup is incomplete. You may need to setup  the account again</primary>
 </error>
 
+  <error id="ask-receipt" type="question" default="GTK_RESPONSE_NO">
+    <primary>Receipt requested</primary>
+    <secondary>Send message receipt to {0} about message &quot;{1}&quot;?</secondary>
+    <button stock="gtk-no" response="GTK_RESPONSE_NO"/>
+    <button stock="gtk-yes" response="GTK_RESPONSE_YES"/>
+  </error>
+
 </error-list>
 
Index: ui/ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/ui/ChangeLog,v
retrieving revision 1.398
diff -u -u -r1.398 ChangeLog
--- ui/ChangeLog	23 Jun 2004 03:59:03 -0000	1.398
+++ ui/ChangeLog	11 Aug 2004 19:32:23 -0000
@@ -1,3 +1,8 @@
+2004-08-06  ERDI Gergo  <cactus cactus rulez org>
+
+	* evolution-message-composer.xml: Added new menu item for
+	requesting message receipts when composing a new message
+
 2004-06-22  V Ravi Kumar Raju <vravikr yahoo co uk>
 
 	* evolution-addressbook.xml: Remove the Menu Seperator in View
Index: ui/evolution-message-composer.xml
===================================================================
RCS file: /cvs/gnome/evolution/ui/evolution-message-composer.xml,v
retrieving revision 1.43
diff -u -u -r1.43 evolution-message-composer.xml
--- ui/evolution-message-composer.xml	25 May 2004 20:54:01 -0000	1.43
+++ ui/evolution-message-composer.xml	11 Aug 2004 19:32:24 -0000
@@ -31,6 +31,10 @@
 		pixtype="stock" pixname="gtk-delete"
 		_tip="Delete all but signature"/>
 
+		<cmd name="RequestReceipt" _label="Request Receipt"
+		     _tip="Check to get delivery notification when your message is read"
+		     type="toggle" state="0"/>
+		
 		<cmd name="FormatHtml" _label="HT_ML" _tip="Send the mail in HTML format"
 		type="toggle" state="0"/> 
 		
@@ -132,6 +136,8 @@
 	                <menuitem name="FileAttach" verb=""
 	                _label="_Attachment..." pixtype="pixbuf"/>
                 	<placeholder name="Component"/>
+			<separator f="" name="emailcomposer"/>
+			<menuitem name="RequestReceipt" verb=""/>
                 </submenu>
 		
                 <submenu name="Security" _label="_Security">


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