On Mon, 2004-08-09 at 14:56 +0200, ERDI Gergo wrote: > 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 9 Aug 2004 12:48:53 -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: camel/camel-folder.c > =================================================================== > RCS file: /cvs/gnome/evolution/camel/camel-folder.c,v > retrieving revision 1.203 > diff -u -u -r1.203 camel-folder.c > --- camel/camel-folder.c 21 May 2004 09:08:09 -0000 1.203 > +++ camel/camel-folder.c 9 Aug 2004 12:48:58 -0000 > @@ -166,6 +166,7 @@ > > /* events */ > camel_object_class_add_event(camel_object_class, > "folder_changed", folder_changed); > + camel_object_class_add_event(camel_object_class, > "handle_receipt", NULL); > camel_object_class_add_event(camel_object_class, "deleted", > NULL); > camel_object_class_add_event(camel_object_class, "renamed", > NULL); > } > @@ -766,6 +767,17 @@ > if (old != info->flags) { > info->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED; > camel_folder_summary_touch(folder->summary); > + } > + > + /* If we're setting the SEEN flag on a message that asks for a > + * receipt, fire an appropriate event */ > + if (((set & flags) | CAMEL_MESSAGE_SEEN) && > + !(old & CAMEL_MESSAGE_SEEN) && > + !(info->flags & CAMEL_MESSAGE_RECEIPT_HANDLED)) > + { > + CamelMimeMessage *message = camel_folder_get_message > (folder, uid, NULL); > + if (camel_medium_get_header (CAMEL_MEDIUM (message), > "Disposition-Notification-To")) > + camel_object_trigger_event(folder, > "handle_receipt", uid); > } > > camel_folder_summary_info_free(folder->summary, info); > 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 9 Aug 2004 12:49:03 -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 9 Aug 2004 12:49:18 -0000 > @@ -419,6 +419,7 @@ > GByteArray *data; > char *charset; > int i; > + gboolean receipt; > > if (composer->persist_stream_interface == CORBA_OBJECT_NIL) > return NULL; > @@ -437,6 +438,16 @@ > composer->extra_hdr_names- > >pdata[i], > composer->extra_hdr_values- > >pdata[i]); > } > + > + /* Message Disposition Notification */ > + receipt = atoi (bonobo_ui_component_get_prop (composer->uic, > "/commands/RequestReceipt", "state", NULL)); > + if (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 +510,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); > Index: e-util/ChangeLog > =================================================================== > RCS file: /cvs/gnome/evolution/e-util/ChangeLog,v > retrieving revision 1.475 > diff -u -u -r1.475 ChangeLog > --- e-util/ChangeLog 5 Aug 2004 21:50:30 -0000 1.475 > +++ e-util/ChangeLog 9 Aug 2004 12:49:22 -0000 > @@ -1,3 +1,7 @@ > +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 9 Aug 2004 12:49:24 -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 9 Aug 2004 12:49:24 -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; > + char *url; > + gboolean keep_on_server; > + gboolean auto_check; > + int auto_check_time; > + gboolean save_passwd; > + EAccountReceiptPolicy receipt_policy; can you stick with the format of previous code and not indent the variables so much? just the one space por favour. > } EAccountService; > > typedef struct _EAccount { > Index: mail/ChangeLog > =================================================================== > RCS file: /cvs/gnome/evolution/mail/ChangeLog,v > retrieving revision 1.3428 > diff -u -u -r1.3428 ChangeLog > --- mail/ChangeLog 4 Aug 2004 15:20:57 -0000 1.3428 > +++ mail/ChangeLog 9 Aug 2004 12:49:50 -0000 > @@ -1,3 +1,12 @@ > +2004-08-09 ERDI Gergo <cactus cactus rulez org> > + > + * em-folder-view.c (emfv_send_receipt): New function to send > an > + RFC 2298-compliant message delivery notification > + > +2004-08-07 ERDI Gergo <cactus cactus rulez org> > + > + * em-utils.c (em_utils_guess_account): Moved here from em- > composer-utils.c > + why was this function moved? it doesn't seem to serve any purpose. > 2004-08-03 Jeffrey Stedfast <fejj novell com> > > * em-composer-utils.c (format_sender): If type="{Sender}" and > name > 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 9 Aug 2004 12:49:56 -0000 > @@ -49,8 +49,6 @@ > > #include <camel/camel-string-utils.h> > > -static EAccount *guess_account (CamelMimeMessage *message, > CamelFolder *folder); > - > struct emcs_t { > unsigned int ref_count; > > @@ -414,7 +412,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; > @@ -1044,7 +1042,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); > > @@ -1105,54 +1103,6 @@ > > /* Replying to messages... */ > > -static GHashTable * > -generate_account_hash (void) > -{ > - GHashTable *account_hash; > - EAccount *account, *def; > - EAccountList *accounts; > - EIterator *iter; > - > - accounts = mail_config_get_accounts (); > - account_hash = g_hash_table_new (camel_strcase_hash, > camel_strcase_equal); > - > - /* add the default account to the hash first */ > - if ((def = mail_config_get_default_account ())) { > - if (def->id->address) > - g_hash_table_insert (account_hash, (char *) > def->id->address, (void *) def); > - } > - > - iter = e_list_get_iterator ((EList *) accounts); > - while (e_iterator_is_valid (iter)) { > - account = (EAccount *) e_iterator_get (iter); > - > - if (account->id->address) { > - EAccount *acnt; > - > - /* Accounts with identical email addresses > that are enabled > - * take precedence over the accounts that > aren't. If all > - * accounts with matching email addresses are > disabled, then > - * the first one in the list takes precedence. > The default > - * account always takes precedence no matter > what. > - */ > - acnt = g_hash_table_lookup (account_hash, > account->id->address); > - if (acnt && acnt != def && !acnt->enabled && > account->enabled) { > - g_hash_table_remove (account_hash, > acnt->id->address); > - acnt = NULL; > - } > - > - if (!acnt) > - g_hash_table_insert (account_hash, > (char *) account->id->address, (void *) account); > - } > - > - e_iterator_next (iter); > - } > - > - g_object_unref (iter); > - > - return account_hash; > -} > - > static EDestination ** > em_utils_camel_address_to_destination (CamelInternetAddress *iaddr) > { > @@ -1266,63 +1216,6 @@ > return composer; > } > > -static EAccount * > -guess_account_folder(CamelFolder *folder) > -{ > - EAccount *account; > - char *tmp; > - > - tmp = camel_url_to_string(CAMEL_SERVICE(folder->parent_store)- > >url, CAMEL_URL_HIDE_ALL); > - account = mail_config_get_account_by_source_url(tmp); > - g_free(tmp); > - > - return account; > -} > - > -static EAccount * > -guess_account (CamelMimeMessage *message, CamelFolder *folder) > -{ > - GHashTable *account_hash = NULL; > - EAccount *account = NULL; > - const char *tmp; > - int i, j; > - char *types[2] = { CAMEL_RECIPIENT_TYPE_TO, > CAMEL_RECIPIENT_TYPE_CC }; > - > - /* check for newsgroup header */ > - if (folder > - && camel_medium_get_header((CamelMedium *)message, > "Newsgroups") > - && (account = guess_account_folder(folder))) > - return account; > - > - /* then recipient (to/cc) in account table */ > - account_hash = generate_account_hash (); > - for (j=0;account == NULL && j<2;j++) { > - const CamelInternetAddress *to; > - > - to = camel_mime_message_get_recipients(message, types > [j]); > - if (to) { > - for (i = 0; camel_internet_address_get(to, i, > NULL, &tmp); i++) { > - account = g_hash_table_lookup > (account_hash, tmp); > - if (account) > - break; > - } > - } > - } > - g_hash_table_destroy(account_hash); > - > - /* then message source */ > - if (account == NULL > - && (tmp = camel_mime_message_get_source(message))) > - account = mail_config_get_account_by_source_url(tmp); > - > - /* and finally, source folder */ > - if (account == NULL > - && folder) > - account = guess_account_folder(folder); > - > - return account; > -} > - > static void > get_reply_sender (CamelMimeMessage *message, CamelInternetAddress > **to, const char **postto) > { > @@ -1424,7 +1317,7 @@ > (*postto)++; > } > > - rcpt_hash = generate_account_hash (); > + rcpt_hash = em_utils_generate_account_hash (); > > reply_to = camel_mime_message_get_reply_to (message); > if (!reply_to) > @@ -1749,7 +1642,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 +1699,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-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 9 Aug 2004 12:50:05 -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> > @@ -120,6 +123,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 gboolean emfv_ask_receipt (EMFolderView *emfv, > CamelMimeMessage *message); > +static void emfv_handle_receipt (CamelObject *o, gpointer > event_data, gpointer user_data); > +static void emfv_send_receipt (EMFolderView *emfv, > CamelMimeMessage *message); > + > static const EMFolderViewEnable emfv_enable_map[]; > > struct _EMFolderViewPrivate { > @@ -525,6 +532,9 @@ > if (folder) { > emfv->priv->folder_changed_id = > camel_object_hook_event(folder, "folder_changed", > (CamelObjectEventHookFunc)emfv_folder_changed, emfv); > + /* Listen for delivery notification requests */ > + camel_object_hook_event(folder, "handle_receipt", > emfv_handle_receipt, emfv); > + I'm not sure I like that this uses a signal... I guess we'll see what NotZed thinks. > camel_object_ref(folder); > mail_refresh_folder(folder, NULL, NULL); > /* We need to set this up to get the right view > options for the message-list, even if we're not showing it */ > @@ -1949,7 +1959,7 @@ > emfv_enable_menus(emfv); > return; > } > - > + > em_format_format((EMFormat *)emfv->preview, folder, uid, msg); > > if (emfv->priv->seen_id) > @@ -2190,6 +2200,167 @@ > { > g_object_ref(emfv); > mail_async_event_emit(emfv->async, MAIL_ASYNC_GUI, > (MailAsyncFunc)emfv_gui_folder_changed, folder, NULL, emfv); > +} > + > +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); I think the comment is obvious. I think just remove it. > + > + if (account->source->receipt_policy == E_ACCOUNT_RECEIPT_ASK) > { > + GtkWidget *dialog; > + 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); > + int response; > + > + dialog = gtk_message_dialog_new (dialog_parent, > + GTK_DIALOG_MODAL, > + GTK_MESSAGE_QUESTION, > + GTK_BUTTONS_YES_NO, > + _("Send message > receipt to %s about message \"%s\"?"), > + receipt_address, > subject); > + response = gtk_dialog_run (GTK_DIALOG (dialog)); > + gtk_widget_destroy (dialog); > + > + return (response == GTK_RESPONSE_YES); > + } > + > + return (account->source->receipt_policy == > E_ACCOUNT_RECEIPT_ALWAYS); > +} > + > +static void > +emfv_send_receipt (EMFolderView *emfv, CamelMimeMessage *message) > +{ > + EAccount *account = em_utils_guess_account (message, emfv- > >folder); > + > + CamelMimeMessage *receipt = camel_mime_message_new (); > + CamelMultipart *body = camel_multipart_new (); > + CamelMimePart *part; > + CamelDataWrapper *receipt_text, *receipt_data; > + char *receipt_text_buf, *receipt_data_buf; > + CamelContentType *type; > + CamelInternetAddress *addr; > + CamelStream *stream; > + CamelFolder *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; > + don't have blank lines between variable declaration. this is against c89. > + > + g_return_if_fail (receipt_address); > + g_return_if_fail (account); you shouldn't use these. use real checks. remember: code should work even if all g_return_*() macros are removed. if the condition is a valid condition, then it should use a real check rather than one of these macros. > + > + > + /* Collect information for the receipt */ > + gethostname (hostname, MAXHOSTNAMELEN); > + self_address = account->id->address; > + > + one blank line is plenty for separating blocks :) (same for other places in this code) > + /* 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 (); > + receipt_text_buf = g_strdup_printf ("Your message to %s about > \"%s\" " > + "(dated %s) has been read > by the user.", > + self_address, > message_subject, message_date); > + stream = camel_stream_mem_new_with_buffer (receipt_text_buf, > strlen (receipt_text_buf)); > + g_free (receipt_text_buf); it'd be nicer/cleaner if you just created the memory stream and then use camel_stream_printf() to it directly rather than using g_strdup_printf() and then copying the buffer over. it's just a waste. just remember to reset the stream afterward. > + type = camel_content_type_new ("text", "plain"); > + camel_data_wrapper_set_mime_type_field (receipt_text, type); > + camel_content_type_unref (type); > + 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 (); > + receipt_data_buf = g_strdup_printf ("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); > + stream = camel_stream_mem_new_with_buffer (receipt_data_buf, > strlen (receipt_data_buf)); > + g_free (receipt_data_buf); again, just use the camel_stream_printf method. simpler, faster, cleaner, etc. > + type = camel_content_type_new ("message", "disposition- > notification"); > + camel_data_wrapper_set_mime_type_field (receipt_data, type); > + camel_content_type_unref (type); > + 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", "<>"); is this legal? > + > + /* Send the receipt */ > + folder = mail_component_get_folder(NULL, > MAIL_COMPONENT_FOLDER_OUTBOX); > + info = camel_message_info_new (); > + info->flags = CAMEL_MESSAGE_SEEN; > + mail_append_mail (folder, receipt, info, 0, 0); > + /* camel_object_unref (mail_folder); */ > +} > + > +static void > +emfv_handle_receipt (CamelObject *o, gpointer event_data, gpointer > user_data) > +{ > + char *uid = event_data; > + EMFolderView *emfv = (EMFolderView*)user_data; > + CamelMimeMessage *message = camel_folder_get_message (emfv- > >folder, uid, NULL); > + > + g_return_if_fail (message); this is a perfectly valid condition. don't use g_return macros. also, you should be using an async function to get the message or you will block the UI. > + > +#if 0 > + camel_folder_set_message_flags (emfv->folder, uid, > + CAMEL_MESSAGE_RECEIPT_HANDLED, > + CAMEL_MESSAGE_RECEIPT_HANDLED); > +#endif the final code should not have #if 0'd blocks > + > + if (emfv_ask_receipt (emfv, message)) > + emfv_send_receipt (emfv, message); > } > > /* keep these two tables in sync */ > Index: mail/em-utils.c > =================================================================== > RCS file: /cvs/gnome/evolution/mail/em-utils.c,v > retrieving revision 1.47 > diff -u -u -r1.47 em-utils.c > --- mail/em-utils.c 28 Jul 2004 14:38:50 -0000 1.47 > +++ mail/em-utils.c 9 Aug 2004 12:50:10 -0000 > @@ -34,6 +34,7 @@ > #include <camel/camel-stream-fs.h> > #include <camel/camel-url-scanner.h> > #include <camel/camel-file-utils.h> > +#include <camel/camel-string-utils.h> > > #include "em-filter-editor.h" > > @@ -1886,3 +1887,109 @@ > /* We used to load parts to check their type, we dont anymore, > see bug #11778 for some discussion */ > } > + > +GHashTable * > +em_utils_generate_account_hash (void) > +{ > + GHashTable *account_hash; > + EAccount *account, *def; > + EAccountList *accounts; > + EIterator *iter; > + > + accounts = mail_config_get_accounts (); > + account_hash = g_hash_table_new (camel_strcase_hash, > camel_strcase_equal); > + > + /* add the default account to the hash first */ > + if ((def = mail_config_get_default_account ())) { > + if (def->id->address) > + g_hash_table_insert (account_hash, (char *) > def->id->address, (void *) def); > + } > + > + iter = e_list_get_iterator ((EList *) accounts); > + while (e_iterator_is_valid (iter)) { > + account = (EAccount *) e_iterator_get (iter); > + > + if (account->id->address) { > + EAccount *acnt; > + > + /* Accounts with identical email addresses > that are enabled > + * take precedence over the accounts that > aren't. If all > + * accounts with matching email addresses are > disabled, then > + * the first one in the list takes precedence. > The default > + * account always takes precedence no matter > what. > + */ > + acnt = g_hash_table_lookup (account_hash, > account->id->address); > + if (acnt && acnt != def && !acnt->enabled && > account->enabled) { > + g_hash_table_remove (account_hash, > acnt->id->address); > + acnt = NULL; > + } > + > + if (!acnt) > + g_hash_table_insert (account_hash, > (char *) account->id->address, (void *) account); > + } > + > + e_iterator_next (iter); > + } > + > + g_object_unref (iter); > + > + return account_hash; > +} > + > +static EAccount * > +em_utils_guess_account_folder(CamelFolder *folder) > +{ > + EAccount *account; > + char *tmp; > + > + tmp = camel_url_to_string(CAMEL_SERVICE(folder->parent_store)- > >url, CAMEL_URL_HIDE_ALL); > + account = mail_config_get_account_by_source_url(tmp); > + g_free(tmp); > + > + return account; > +} > + > +EAccount * > +em_utils_guess_account (CamelMimeMessage *message, CamelFolder > *folder) > +{ > + GHashTable *account_hash = NULL; > + EAccount *account = NULL; > + const char *tmp; > + int i, j; > + char *types[2] = { CAMEL_RECIPIENT_TYPE_TO, > CAMEL_RECIPIENT_TYPE_CC }; > + > + /* check for newsgroup header */ > + if (folder > + && camel_medium_get_header((CamelMedium *)message, > "Newsgroups") > + && (account = em_utils_guess_account_folder(folder))) > + return account; > + > + /* then recipient (to/cc) in account table */ > + account_hash = em_utils_generate_account_hash (); > + for (j=0;account == NULL && j<2;j++) { > + const CamelInternetAddress *to; > + > + to = camel_mime_message_get_recipients(message, types > [j]); > + if (to) { > + for (i = 0; camel_internet_address_get(to, i, > NULL, &tmp); i++) { > + account = g_hash_table_lookup > (account_hash, tmp); > + if (account) > + break; > + } > + } > + } > + g_hash_table_destroy(account_hash); > + > + /* then message source */ > + if (account == NULL > + && (tmp = camel_mime_message_get_source(message))) > + account = mail_config_get_account_by_source_url(tmp); > + > + /* and finally, source folder */ > + if (account == NULL > + && folder) > + account = em_utils_guess_account_folder(folder); > + > + return account; > +} > + > Index: mail/em-utils.h > =================================================================== > RCS file: /cvs/gnome/evolution/mail/em-utils.h,v > retrieving revision 1.16 > diff -u -u -r1.16 em-utils.h > --- mail/em-utils.h 28 Jul 2004 14:38:50 -0000 1.16 > +++ mail/em-utils.h 9 Aug 2004 12:50:11 -0000 > @@ -41,6 +41,7 @@ > struct _GtkAdjustment; > struct _CamelException; > struct _EMFormat; > +struct _EAccount; > > gboolean em_utils_prompt_user(struct _GtkWindow *parent, const char > *promptkey, const char *tag, const char *arg0, ...); > > @@ -102,6 +103,10 @@ > gboolean em_utils_in_addressbook(struct _CamelInternetAddress *addr); > > const char *em_utils_snoop_type(struct _CamelMimePart *part); > + > +GHashTable * em_utils_generate_account_hash (void); > +struct _EAccount *em_utils_guess_account (struct _CamelMimeMessage > *message, struct _CamelFolder *folder); > + > > #ifdef __cplusplus > } > Index: mail/message-list.c > =================================================================== > RCS file: /cvs/gnome/evolution/mail/message-list.c,v > retrieving revision 1.396 > diff -u -u -r1.396 message-list.c > --- mail/message-list.c 28 Jul 2004 02:55:52 -0000 1.396 > +++ mail/message-list.c 9 Aug 2004 12:50:22 -0000 > @@ -51,6 +51,10 @@ > #include <gal/e-table/e-tree-memory.h> > #include <gal/e-table/e-tree-memory-callbacks.h> > > +#include <camel/camel-mime-message.h> > +#include <camel/camel-multipart.h> > +#include <camel/camel-stream-mem.h> > + > #include <camel/camel-exception.h> > #include <camel/camel-file-utils.h> > #include <camel/camel-folder.h> > @@ -63,6 +67,7 @@ > #include "mail-config.h" > #include "message-list.h" > #include "mail-mt.h" > +#include "mail-component.h" > #include "mail-tools.h" > #include "mail-ops.h" > #include "em-popup.h" > @@ -2824,7 +2829,7 @@ > > cell = e_table_extras_get_cell (message_list->extras, > "render_size"); > g_object_set (cell, "strikeout_column", strikeout_col, > NULL); > - > + > /* Build the etree suitable for this folder */ > message_list_setup_etree (message_list, outgoing); what are these changes for? they seem to be leftover from an earlier revision of your patch perhaps? please remove. > > Index: shell/shell-errors.xml.h > =================================================================== > RCS file: /cvs/gnome/evolution/shell/shell-errors.xml.h,v > retrieving revision 1.6 > diff -u -u -r1.6 shell-errors.xml.h > --- shell/shell-errors.xml.h 1 Aug 2004 17:58:08 -0000 1.6 > +++ shell/shell-errors.xml.h 9 Aug 2004 12:50:23 -0000 > @@ -22,7 +22,8 @@ > "\n" > "If you choose to remove this data, the entire contents of the > \"evolution\" directory will be removed permanently. If you choose to > keep this data, then you may manually remove the contents of > \"evolution\" at your convenience.\n" > ""); > -char *s = N_("Keep"); > +char *s = N_("_Remind Me Later"); > +char *s = N_("_Keep Data"); > /* shell:upgrade-remove-1-4-confirm title */ > char *s = N_("Really delete old data?"); > /* shell:upgrade-remove-1-4-confirm primary */ these changes are unrelated as well. > 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 9 Aug 2004 12:50:24 -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 9 Aug 2004 12:50:26 -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"/> > > @@ -119,7 +123,7 @@ > > <submenu name="View" _label="_View"> > <menuitem name="ViewAttach" verb="" > _label="Show _attachments"/> > - <separator f="" name="emailcomposer"/> > + <separator f="" name="emailcomposer1"/> > <menuitem name="ViewFrom" verb=""/> > <menuitem name="ViewTo" verb=""/> > <menuitem name="ViewPostTo" verb=""/> > @@ -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"> -- Jeffrey Stedfast Evolution Hacker - Novell, Inc. fejj ximian com - www.novell.com
Attachment:
smime.p7s
Description: S/MIME cryptographic signature