[Evolution-hackers] Beginnings of Message Disposition Notification Support



Hi,

Firstly, congratulations on your latest wonderful release.

I'm new to this list but I was reading a rather heated thread on the
users list regarding "return receipts" and thought that I might have a
shot at implementing support for this.

So far I have trivially added support for requesting the Message
Disposition Notification's in the first place.  This takes the form of
an "MDN Request" toggle option on the "Security" menu of the composition
window.  When true at build_message time the extra header "Disposition-
Notification-To:" is set to the same value as the "From:" header.

When loading a draft message (e_msg_composer_new_with_message) the
simple presence of this header triggers the setting of the mdn_request
field of the new composer object back to true.

I have not exhaustively tested this but a Mozilla Thunderbird understood
what I was asking for and sent me a MDN back.  This is only a first
attempt and I expect to find many issues I have overlooked but I thought
you might like some input at this stage.  Feel free to correct me on any
point and suggest alternative strings and/or UI structure.

Regarding the more difficult generation of the MDNs, when a request
comes in I was thinking of tending away from the user interfaces I have
seen for this before.  Instead I was thinking of putting a tool bar
button that shows a dialogue with tabs for the possible disposition
types "displayed", "dispatched", "processed", "deleted", "denied" and
"failed" (probably with the exception of "failed", though).

Each tab would have a description the type for the user to choose.  The
default tab would be whatever Lookout uses when it asks to send a read
receipt (probably "displayed") and each would have a send button.  Bear
in mind here that I have not read the IMAP-specific RFC yet.

I, personally, would hope to just never push that tool bar button but if
you have to for whatever reason it is there for you to do so.

Comments, suggestions, bugs and flames all welcome,

James Ascroft-Leigh
diff -r -u evolution-2.0.0/composer/e-msg-composer.c evolution-2.0.0-jwal/composer/e-msg-composer.c
--- evolution-2.0.0/composer/e-msg-composer.c	2004-08-13 17:27:16 +0100
+++ evolution-2.0.0-jwal/composer/e-msg-composer.c	2004-09-17 19:19:05 +0100
@@ -437,7 +437,13 @@
 					 composer->extra_hdr_names->pdata[i],
 					 composer->extra_hdr_values->pdata[i]);
 	}
-	
+
+	if (e_msg_composer_get_mdn_request (composer)) {
+		camel_medium_add_header (CAMEL_MEDIUM (new),
+					"Disposition-Notification-To",
+					camel_medium_get_header (CAMEL_MEDIUM (new), "From"));
+	}
+
 	if (composer->mime_body) {
 		plain_encoding = CAMEL_TRANSFER_ENCODING_7BIT;
 		for (i = 0; composer->mime_body[i]; i++) {
@@ -1830,6 +1836,20 @@
 	e_msg_composer_set_smime_encrypt (E_MSG_COMPOSER (composer), atoi (state));
 }
 
+static void
+menu_security_mdn_request_cb (BonoboUIComponent           *component,
+			      const char                  *path,
+			      Bonobo_UIComponent_EventType type,
+			      const char                  *state,
+			      gpointer                     composer)
+
+{
+	if (type != Bonobo_UIComponent_STATE_CHANGED)
+		return;
+	
+	e_msg_composer_set_mdn_request (E_MSG_COMPOSER (composer), atoi (state));
+}
+
 
 static void
 menu_view_from_cb (BonoboUIComponent           *component,
@@ -2255,7 +2275,16 @@
 		composer->uic, "SecuritySMimeEncrypt",
 		menu_security_smime_encrypt_cb, composer);
 	
-	/* View -> Attachments */
+	/* Security -> MDN Request */
+	bonobo_ui_component_set_prop (
+		composer->uic, "/commands/SecurityMDNRequest",
+		"state", e_msg_composer_get_mdn_request (composer) ? "1" : "0", NULL);
+
+	bonobo_ui_component_add_listener (
+		composer->uic, "SecurityMDNRequest",
+		menu_security_mdn_request_cb, composer);
+	
+		/* View -> Attachments */
 	bonobo_ui_component_add_listener (
 		composer->uic, "ViewAttach",
 		menu_view_attachments_activate_cb, composer);
@@ -3865,6 +3894,12 @@
 		to = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_TO);
 		cc = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_CC);
 		bcc = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_BCC);
+
+		if (camel_medium_get_header (CAMEL_MEDIUM (message), "Disposition-Notification-To")) {
+			e_msg_composer_set_mdn_request (new, TRUE);
+		} else {
+			e_msg_composer_set_mdn_request (new, FALSE);
+		}
 		
 		len = CAMEL_ADDRESS (to)->addresses->len;
 		for (i = 0; i < len; i++) {
@@ -4035,6 +4070,8 @@
 	bonobo_ui_component_set_prop (composer->uic, "/menu/Edit", "sensitive", "0", NULL);
 	bonobo_ui_component_set_prop (composer->uic, "/menu/Format", "sensitive", "0", NULL);
 	bonobo_ui_component_set_prop (composer->uic, "/menu/Insert", "sensitive", "0", NULL);
+
+	/* TODO: MDN: Ask hackers whether MDN preferences should be disabled here */
 }
 
 /**
@@ -4881,6 +4918,46 @@
 
 
 /**
+ * e_msg_composer_set_mdn_request:
+ * @composer: A message composer widget
+ * @mdn_request: Whether the composer should include the Disposition-Notification-To: header
+ * 
+ * Set the status of the "MDN Request" toggle item.  The user can override it.
+ **/
+void
+e_msg_composer_set_mdn_request (EMsgComposer *composer, gboolean mdn_request)
+{
+	g_return_if_fail (E_IS_MSG_COMPOSER (composer));
+
+	if (composer->mdn_request && mdn_request)
+		return;
+	if (!composer->mdn_request && !mdn_request)
+		return;
+	
+	composer->mdn_request = mdn_request;
+	e_msg_composer_set_changed (composer);
+	
+	bonobo_ui_component_set_prop (composer->uic, "/commands/SecurityMDNRequest",
+				      "state", composer->mdn_request ? "1" : "0", NULL);
+}
+
+/**
+ * e_msg_composer_get_mdn_request:
+ * @composer: A message composer widget
+ * 
+ * Get the status of the "MDN Request" flag.
+ * 
+ * Return value: The status of the "MDN Request" flag.
+ **/
+gboolean
+e_msg_composer_get_mdn_request (EMsgComposer *composer)
+{
+	g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE);
+	
+	return composer->mdn_request;
+}
+
+/**
  * e_msg_composer_get_view_from:
  * @composer: A message composer widget
  * 
diff -r -u evolution-2.0.0/composer/e-msg-composer.h evolution-2.0.0-jwal/composer/e-msg-composer.h
--- evolution-2.0.0/composer/e-msg-composer.h	2004-07-27 17:52:17 +0100
+++ evolution-2.0.0-jwal/composer/e-msg-composer.h	2004-09-17 14:15:42 +0100
@@ -94,6 +94,7 @@
 	guint32 pgp_encrypt            : 1;
 	guint32 smime_sign             : 1;
 	guint32 smime_encrypt          : 1;
+	guint32 mdn_request            : 1;
 	guint32 view_from              : 1;
 	guint32 view_replyto           : 1;
 	guint32 view_to                : 1;
diff -r -u evolution-2.0.0/ui/evolution-message-composer.xml evolution-2.0.0-jwal/ui/evolution-message-composer.xml
--- evolution-2.0.0/ui/evolution-message-composer.xml	2004-05-25 21:54:01 +0100
+++ evolution-2.0.0-jwal/ui/evolution-message-composer.xml	2004-09-17 13:48:11 +0100
@@ -73,6 +73,10 @@
                 <cmd name="SecuritySMimeEncrypt" _label="S/MIME Encrypt" 
                 _tip="Encrypt this message with your S/MIME Encryption Cetificate"
 		type="toggle" state="0" hidden="1"/>
+		
+                <cmd name="SecurityMDNRequest" _label="_MDN Request" 
+                _tip="Request that all recipients respond with a Message Disposition Notification"
+		type="toggle" state="0"/>
 
 	</commands>
 	
@@ -139,6 +143,7 @@
                         <menuitem name="SecurityPGPEncrypt" verb="" _label="PGP Encrypt"/>
                         <menuitem name="SecuritySMimeSign" verb="" _label="S/MIME Sign"/>
                         <menuitem name="SecuritySMimeEncrypt" verb="" _label="S/MIME Encrypt"/>
+                        <menuitem name="SecurityMDNRequest" verb="" _label="_MDN Request"/>
                 </submenu>
 		
 	</menu>

Attachment: signature.asc
Description: This is a digitally signed message part



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