On Wed, 2004-08-11 at 21:39 +0200, ERDI Gergo wrote: > 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. > I've talked to Christine and she agrees that the settings for this should be per-account. > 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); I think that there should probably be a default per-account setting for whether or not the composer should default to requesting a receipt. other than that, I think the composer code looks ok so far. > 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; > + I think I'd put NEVER as the first item in the enum (0 makes a good NEVER value, plus NEVER should be default anyway) > 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"); I'm not sure I'd use the values gotten from medium_get_header() here... using camel_mime_message_get_message_id() might be a better way to go as it has been canonicalised. along the same lines, might be better to use camel_mime_message_get_date () and then either use camel_header_format_date() (from camel-mime- utils.h) to format the time_t/offset to an rfc822 date, or, perhaps, format that time_t into a more human friendly form? not sure what the preferred date format would be... perhaps rfc822 format is fine. > + 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); probably should check the return code from gethostname as it may fail. also, the hostname may not include the domain. not sure we care? > + 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); perhaps don't quote the original subject? might look funny if the original message's subject had quotes in it... > + 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", "<>"); afaict, this is an illegal header. > + > + /* 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 " > {1}"?</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"> From rom a quick scan of the rfc, it appears you've missed bits - like setting the Original-Message-Id, Original-Recipient, Final-Recipient, the different disposition modes, etc (tho I will admit to not having read the whole rfc yet). Jeff -- Jeffrey Stedfast Evolution Hacker - Novell, Inc. fejj ximian com - www.novell.com
Attachment:
smime.p7s
Description: S/MIME cryptographic signature