From b741f2e9e395de5408edea20ff3c4d4731439079 Mon Sep 17 00:00:00 2001 From: nobody Date: Mon, 17 Sep 2001 04:32:38 +0000 Subject: This commit was manufactured by cvs2svn to create tag 'GNOME_SPELL_0_3'. svn path=/tags/GNOME_SPELL_0_3/; revision=12879 --- mail/.cvsignore | 19 - mail/ChangeLog | 15076 ------------------- mail/GNOME_Evolution_Mail.oaf.in | 141 - mail/Mail.idl | 86 - mail/Makefile.am | 173 - mail/README.async | 366 - mail/component-factory.c | 1191 -- mail/component-factory.h | 29 - mail/e-attchmt.png | Bin 169 -> 0 bytes mail/e-searching-tokenizer.c | 986 -- mail/e-searching-tokenizer.h | 74 - mail/evolution-mbox-importer.c | 222 - mail/evolution-mbox-importer.h | 35 - mail/evolution-outlook-importer.c | 289 - mail/evolution-outlook-importer.h | 35 - mail/folder-browser-factory.c | 211 - mail/folder-browser-factory.h | 22 - mail/folder-browser-ui.c | 583 - mail/folder-browser-ui.h | 27 - mail/folder-browser.c | 1896 --- mail/folder-browser.h | 160 - mail/folder-info.c | 245 - mail/importers/.cvsignore | 12 - .../GNOME_Evolution_Mail_Mbox_Importer.oaf.in | 29 - .../GNOME_Evolution_Mail_Outlook_Importer.oaf.in | 29 - mail/importers/Makefile.am | 29 - mail/importers/evolution-mbox-importer.c | 354 - mail/importers/evolution-outlook-importer.c | 319 - mail/local-config.glade | 221 - mail/mail-account-editor-news.c | 193 - mail/mail-account-editor-news.h | 72 - mail/mail-account-editor.c | 196 - mail/mail-account-editor.h | 65 - mail/mail-account-gui.c | 1677 --- mail/mail-account-gui.h | 124 - mail/mail-accounts.c | 943 -- mail/mail-accounts.h | 121 - mail/mail-autofilter.c | 359 - mail/mail-autofilter.h | 51 - mail/mail-callbacks.c | 2340 --- mail/mail-callbacks.h | 125 - mail/mail-config-druid.c | 921 -- mail/mail-config-druid.h | 91 - mail/mail-config.c | 2056 --- mail/mail-config.glade | 3072 ---- mail/mail-config.h | 216 - mail/mail-crypto.c | 304 - mail/mail-crypto.h | 73 - mail/mail-display.c | 2005 --- mail/mail-display.h | 82 - mail/mail-folder-cache.c | 1035 -- mail/mail-folder-cache.h | 64 - mail/mail-format.c | 2352 --- mail/mail-identify.c | 123 - mail/mail-importer.c | 262 - mail/mail-importer.h | 50 - mail/mail-local.c | 1128 -- mail/mail-local.h | 38 - mail/mail-mt.c | 902 -- mail/mail-mt.h | 84 - mail/mail-offline-handler.c | 245 - mail/mail-offline-handler.h | 70 - mail/mail-ops.c | 2177 --- mail/mail-ops.h | 156 - mail/mail-search-dialogue.c | 176 - mail/mail-search-dialogue.h | 61 - mail/mail-search.c | 423 - mail/mail-search.h | 80 - mail/mail-send-recv.c | 836 - mail/mail-send-recv.h | 45 - mail/mail-session.c | 507 - mail/mail-session.h | 53 - mail/mail-summary.c | 523 - mail/mail-summary.h | 32 - mail/mail-tools.c | 446 - mail/mail-tools.h | 92 - mail/mail-types.h | 41 - mail/mail-vfolder.c | 565 - mail/mail-vfolder.h | 29 - mail/mail.h | 83 - mail/main.c | 147 - mail/message-browser.c | 264 - mail/message-browser.h | 61 - mail/message-list.c | 2522 ---- mail/message-list.etspec | 17 - mail/message-list.h | 138 - mail/subscribe-dialog.c | 1657 -- mail/subscribe-dialog.etspec | 9 - mail/subscribe-dialog.glade | 326 - mail/subscribe-dialog.h | 60 - 90 files changed, 55824 deletions(-) delete mode 100644 mail/.cvsignore delete mode 100644 mail/ChangeLog delete mode 100644 mail/GNOME_Evolution_Mail.oaf.in delete mode 100644 mail/Mail.idl delete mode 100644 mail/Makefile.am delete mode 100644 mail/README.async delete mode 100644 mail/component-factory.c delete mode 100644 mail/component-factory.h delete mode 100644 mail/e-attchmt.png delete mode 100644 mail/e-searching-tokenizer.c delete mode 100644 mail/e-searching-tokenizer.h delete mode 100644 mail/evolution-mbox-importer.c delete mode 100644 mail/evolution-mbox-importer.h delete mode 100644 mail/evolution-outlook-importer.c delete mode 100644 mail/evolution-outlook-importer.h delete mode 100644 mail/folder-browser-factory.c delete mode 100644 mail/folder-browser-factory.h delete mode 100644 mail/folder-browser-ui.c delete mode 100644 mail/folder-browser-ui.h delete mode 100644 mail/folder-browser.c delete mode 100644 mail/folder-browser.h delete mode 100644 mail/folder-info.c delete mode 100644 mail/importers/.cvsignore delete mode 100644 mail/importers/GNOME_Evolution_Mail_Mbox_Importer.oaf.in delete mode 100644 mail/importers/GNOME_Evolution_Mail_Outlook_Importer.oaf.in delete mode 100644 mail/importers/Makefile.am delete mode 100644 mail/importers/evolution-mbox-importer.c delete mode 100644 mail/importers/evolution-outlook-importer.c delete mode 100644 mail/local-config.glade delete mode 100644 mail/mail-account-editor-news.c delete mode 100644 mail/mail-account-editor-news.h delete mode 100644 mail/mail-account-editor.c delete mode 100644 mail/mail-account-editor.h delete mode 100644 mail/mail-account-gui.c delete mode 100644 mail/mail-account-gui.h delete mode 100644 mail/mail-accounts.c delete mode 100644 mail/mail-accounts.h delete mode 100644 mail/mail-autofilter.c delete mode 100644 mail/mail-autofilter.h delete mode 100644 mail/mail-callbacks.c delete mode 100644 mail/mail-callbacks.h delete mode 100644 mail/mail-config-druid.c delete mode 100644 mail/mail-config-druid.h delete mode 100644 mail/mail-config.c delete mode 100644 mail/mail-config.glade delete mode 100644 mail/mail-config.h delete mode 100644 mail/mail-crypto.c delete mode 100644 mail/mail-crypto.h delete mode 100644 mail/mail-display.c delete mode 100644 mail/mail-display.h delete mode 100644 mail/mail-folder-cache.c delete mode 100644 mail/mail-folder-cache.h delete mode 100644 mail/mail-format.c delete mode 100644 mail/mail-identify.c delete mode 100644 mail/mail-importer.c delete mode 100644 mail/mail-importer.h delete mode 100644 mail/mail-local.c delete mode 100644 mail/mail-local.h delete mode 100644 mail/mail-mt.c delete mode 100644 mail/mail-mt.h delete mode 100644 mail/mail-offline-handler.c delete mode 100644 mail/mail-offline-handler.h delete mode 100644 mail/mail-ops.c delete mode 100644 mail/mail-ops.h delete mode 100644 mail/mail-search-dialogue.c delete mode 100644 mail/mail-search-dialogue.h delete mode 100644 mail/mail-search.c delete mode 100644 mail/mail-search.h delete mode 100644 mail/mail-send-recv.c delete mode 100644 mail/mail-send-recv.h delete mode 100644 mail/mail-session.c delete mode 100644 mail/mail-session.h delete mode 100644 mail/mail-summary.c delete mode 100644 mail/mail-summary.h delete mode 100644 mail/mail-tools.c delete mode 100644 mail/mail-tools.h delete mode 100644 mail/mail-types.h delete mode 100644 mail/mail-vfolder.c delete mode 100644 mail/mail-vfolder.h delete mode 100644 mail/mail.h delete mode 100644 mail/main.c delete mode 100644 mail/message-browser.c delete mode 100644 mail/message-browser.h delete mode 100644 mail/message-list.c delete mode 100644 mail/message-list.etspec delete mode 100644 mail/message-list.h delete mode 100644 mail/subscribe-dialog.c delete mode 100644 mail/subscribe-dialog.etspec delete mode 100644 mail/subscribe-dialog.glade delete mode 100644 mail/subscribe-dialog.h (limited to 'mail') diff --git a/mail/.cvsignore b/mail/.cvsignore deleted file mode 100644 index dd1d902aa2..0000000000 --- a/mail/.cvsignore +++ /dev/null @@ -1,19 +0,0 @@ -.deps -.libs -.pure -Makefile -Makefile.in -Mail-stubs.c -Mail-skels.c -Mail-common.c -Mail.h -evolution-mail -evolution-mail.pure -test-mail -test-sources -test-thread -*.bb -*.bbg -*.da -*.gcov -GNOME_Evolution_Mail.oaf diff --git a/mail/ChangeLog b/mail/ChangeLog deleted file mode 100644 index 253396513f..0000000000 --- a/mail/ChangeLog +++ /dev/null @@ -1,15076 +0,0 @@ -2001-09-16 Christopher James Lahey - - * message-list.c (ml_get_node_by_id): Made save_id const here. - -2001-09-16 Jeffrey Stedfast - - * mail-display.c (pixbuf_gen_idle): Don;t destroy the pixbuf - loader, unref it instead. - - * mail-config.c (mail_config_folder_to_cachename): Use - camel_folder_get_uri(). - -2001-09-15 - - * mail-vfolder.c: Major rewrite of most of the guts, handle - changes based on signals and events, etc. Use the main storage - handling code that imap uses, etc. - - * mail-tools.c (mail_tool_uri_to_folder): Dont special case - vfolder: anymore. - - * component-factory.c (owner_set_cb): use vfolder_load_storage(), - new function to setup vfolder storage, after interaction has been - enabled only. This might need some tweaking ... - (storage_remove_folder): Removed all the folder lookup stuff. - Just delete the folder based on the path passed in. There should - be no reason this wouldn't work, right? - -2001-09-14 - - * mail-ops.c (get_folderinfo_get): Only add vtrash folder info, if - store supports vtrash. - - * component-factory.c (mail_load_storage_by_uri): Let 'vfolder' - stores show up too. - -2001-09-13 - - * mail-vfolder.c (vfolder_uri_to_folder): Open a vfolder then set - its expression, since name?query open method is removed. - -2001-09-14 Jeffrey Stedfast - - * subscribe-dialog.c (fe_root_value_at): Return the cached value - of camel_service_get_name so that we don't leak memory. - (fe_real_value_at): Don't strdup the node's name. - (folder_etree_construct): Set the service_name. - (fe_destroy): Free the service_name. - - * mail-ops.c (add_vtrash_info): Free the temporary path variable - here. - - * subscribe-dialog.c (store_data_new): Added a refcount variable - so set the refcount to 1. - (sd_got_store): Unref the store-data. - (store_data_async_get_store): Ref the store-data. - (store_data_ref): New function. - (store_data_unref): New function. - (subscribe_dialog_destroy): Instead of freeing the store-data - here, unref it instead. We may just have an async function - running. Set the callback function to NULL so that when the - (remaining) async functions finish, they become no-ops. - - * mail-send-recv.c (build_dialogue): Revert my bar_destroy code - and replace it with dialog_destroy instead. - - * mail-ops.c (mail_send_message): Append a message to any - exception we get appending to any folders after having sent the - message successfully saying that the message was sent successfully - so the user doesn't misinterpret the error. - -2001-09-13 Jon Trowbridge - - * mail-callbacks.c (composer_get_message): Fixed double-freeing of - EDestination vector when sending html mail to people who don't - necessarily want it. Fixes bug #9848. - -2001-09-13 Jeffrey Stedfast - - * subscribe-dialog.c (get_short_folderinfo_desc): - (get_short_folderinfo_get): - (get_short_folderinfo_got): - (get_short_folderinfo_free): - (subscribe_get_short_folderinfo): Modified to take a FolderETree - instead of a CamelStore (since the CamelStore is inside the - FolderETree anyway) so that we could ref the ETree to prevent a - race condition. Should fix bug #9827. - - * mail-format.c (try_inline_pgp_sig): Make sure that the - charset_filter is non-NULL before using it since iconv may fail. - -2001-09-13 Larry Ewing - - * mail-tools.c (mail_tool_quote_message): free the credits string. - -2001-09-12 - - * mail-vfolder.c (vfolder_remove_cb): Fixed the remove callback - prototype, and return the result properly using the listener. - (vfolder_uri_to_folder): Always use the same store uri, so we dont - create a new store for each folder. - -2001-09-12 Jeffrey Stedfast - - * mail-config.c (mail_config_write_on_exit): Save transport - passwords too. This fixes bug #3020. - -2001-09-11 Dan Winship - - * mail-folder-cache.c (mail_folder_cache_note_folderinfo): Don't - set the folderinfo's unread count to 0 when camel reports -1, - since that may overwrite a valid unread count from before. - (get_folder_info): Do it here instead when first creating a new - folderinfo structure. - Should fix bug #1756. - -2001-09-11 Larry Ewing - - * mail-account-gui.c (menu_file_save_cb): call menu_file_save_error - when there is an exception while saving. - (menu_file_save_error): pop up a dialog telling the user the file - has not been saved. - -2001-09-10 - - * mail-local.c (mail_local_reconfigure_folder): Dynamically create - the folder type list from camel. - (reconfigure_clicked): And change code to handle changes. - -2001-09-10 - - * merged mail_local patch from peterw. Many changes. - -2001-09-10 Iain Holmes - - * mail-config.c (impl_GNOME_Evolution_MailConfig_addAccount): Add a - none account if the url is empty. - -2001-09-10 Jeffrey Stedfast - - * mail-callbacks.c (mail_generate_reply): Don't use - new_with_sig_file, that function no longer exists. - (forward_get_composer): Same here. - -2001-09-10 Zbigniew Chyla - - * mail-config.c - (add_shortcut_entry): Marked string for translation. - (new_source_created): Ditto. - - * mail-send-recv.c - (format_url): Marked strings for translation. - (build_dialogue): Ditto. - -2001-09-10 Jeffrey Stedfast - - * mail-account-gui.c (mail_account_gui_new): Hide the S/MIME frame - if we don't support S/MIME. - - * mail-send-recv.c (build_dialogue): Attach to the destroy event - for each progressbar using bar_destroyed as the callback. - (bar_destroyed): New callback to unregister the timeout and set - the send-info's bar member to NULL so we don't try to update a - destroyed progressbar. - - * mail-callbacks.c (mail_generate_reply): Pass along the right - string, this fixes bug #9518. - - * mail-account-gui.c (save_service): Don't save the authmech if - the username doesn't exist. Fixes bug #9474. - - * mail-callbacks.c (do_edit_messages): Remove some mailer-set - headers. Fixes bug #9462. - -2001-09-10 Dan Winship - - * mail-callbacks.c (composer_get_message): Fix obvious dumb - mistake in previous commit that made it *always* complain you had - invalid recipients. - -2001-09-09 Jon Trowbridge - - * mail-callbacks.c (composer_get_message): Complain if we are - trying to send to invalid recipients. (Bug #8875) - -2001-09-09 Jeffrey Stedfast - - * mail-config-druid.c (evolution_mail_config_wizard_factory_fn): - We need to initialize all of the struct fields or else god knows - what will happen later when we try to use 'em. Also set a destroy - function for the MailConfigWizard so we don't leak it. - -2001-09-08 Jon Trowbridge - - * mail-callbacks.c (ask_confirm_for_unwanted_html_mail): Added. - Shows a (hopefully) informative dialog warning you that some - recipients might not want HTML mail (who are listed), and gives - the option to cancel sending. (FIXME: The wording of this dialog - could use some work.) - (composer_get_message): Check if we are sending HTML to someone - who might not want it, and raise the dialog if we are. Use our - new destination-vector based api when talking to the composer. - Touch our destinations here, boosting their use scores. This is - the right place for this to happen --- closer to the end of the - sending process, where incorrect/artificial use score inflation is - less likely to occur. - - * mail-config.c (config_read): Added - /Mail/Format/confirm_unwanted_html key. This flag determines - whether or not we want to see the warning dialog when we send HTML - mail to contacts who don't want it. Default is TRUE. - (mail_config_write_on_exit): Write out the confirm_unwanted_html - key. - (mail_config_get_confirm_unwanted_html): Added. - (mail_config_set_confirm_unwanted_html): Added. - -2001-09-08 Dan Winship - - * mail-display.c (mail_display_destroy): Unref the invisible, - don't just destroy it. - -2001-09-07 Jeffrey Stedfast - - * mail-format.c (mail_write_authenticity): Give the full path of - the wax-seal icons. - (try_inline_pgp_sig): Convert the charset from UTF-8 to whatever - charset it should be. Now takes a CamelMimePart argument as well. - (try_uudecoding): Now takes a part argument as well. - (try_inline_pgp): Here too. - (try_binhex): And finally here. - (handle_text_plain): Pass along the mime part to the try_* - functions. - -2001-09-06 Chris Toshok - - * component-factory.c (notify_listener): new function, to notify - the bonobo listener in remove_folder/create_folder. - (storage_create_folder): match EvolutionStorage create_folder - signal's signature. - (storage_remove_folder): match EvolutionStorage remove_folder - signal's signature. - -2001-09-06 Dan Winship - - Fix a bunch of replying/forwarding-related formatting bugs. - - 2749 - Message text not included in reply, but html attachment is - 4294 - "forward inline" should quote the same headers as the - normal mail display - 6100 - Reply to a forwarded email displays email headers - 7255 - Replying to HTML message - 7527 - replying to forwarded message w/ attachments does the wrong - thing - - * mail-format.c (mail_get_message_rfc822): New function to get - message headers and body together, for inline forwards, or replies - containing attached messages. - (mail_get_message_body): Redo this to always return HTML, but keep - the "want_plain" flag, to decide whether to return HTML that looks - like HTML or HTML that looks like plain text. Use - mail_get_message_rfc822 to handle attached message/rfc822 parts. - Don't include the text of vcard or icalendar attachments. Don't - fail to include text parts just because we found an HTML part. - (Since we're always returning HTML now, this doesn't cause - problems any more.) - - * mail-tools.c (mail_tool_quote_message): Simplify greatly. - mail_get_message_body always returns HTML now, and we let it take - care of prepending "> "s too. We then let GtkHTML deal with - converting the HTML to plain text if the user wants to reply in - plain text. - (mail_tool_forward_message): Simplify this a ton too: parts of it - are moved into mail_get_message_rfc822 and parts are now - unnecessary. - - * mail-callbacks.c (do_forward_non_attached): Call - mail_tool_forward_message here always, and let it do the "> " - quoting in the "quoted" case, so that we get the headers too when - forwarding quoted. Related to bug #4294. - -2001-09-05 Dan Winship - - * mail-display.c (launch_cb): the "command" of a - GnomeVFSMimeApplication can include arguments as well. Deal with - that. Fixes support for CodeWeavers' CrossOver Plugin. - -2001-09-05 Jeffrey Stedfast - - * mail-config.c (mail_config_remove_account): Adjust the - default_account index correctly. - -2001-09-05 Jeffrey Stedfast - - * mail-config.c (mail_config_get_accounts): Added a g_assert to - make sure that config wasn't NULL. This is meant to help debug bug - #4911 and friends. - - * component-factory.c (owner_set_cb): Do not mail_config_init() - here as we've already called this in main() in main.c. - -2001-09-05 Ettore Perazzoli - - [Fix #958, ShellComponents should not be created by factories, for - the mailer case.] - - * GNOME_Evolution_Mail.oaf.in: Remove the - GNOME_Evolution_Mail_ShellComponentFactory. - - * component-factory.c: Changed to not use a factory. - (COMPONENT_FACTORY_ID): Removed. - (COMPONENT_ID): New. - (idle_quit): Don't unref the component_factory. - (create_component): Renamed from `component_fn'. Take no args. - (component_factory_init): Create the component with - `create_component' and register it on OAF. - -2001-09-06 Radek Doulik - - * everywhere updated for new mail_content_loaded definition - (prototype) - -2001-09-05 Radek Doulik - - * mail-display.c (mail_display_redisplay): increase - redisplay_counter - (try_part_urls): new helper function - (try_data_urls): ditto - (load_content_loaded): if it has stream handle available and if - it's still valid, it writes to this stream instead of - redisplaying, uses try_part_urls and try_data_urls - - * mail-display.h: added redisplay_counter to MailDisplay, I use - it in load_content_loaded to be sure that there wasn't any - redisplay and that remembered handle is still valid - - * mail-display.c (on_url_requested): don't end stream with error - if part is not loaded yet - (on_url_requested): don't end stream in cases when we are going to - load image using http - (stream_write_or_redisplay_when_loaded): new helper function, - which is extracted from mail_display_redisplay_when_loaded. it's - extended to handle gtkhtml stream writting - (mail_display_redisplay_when_loaded): use - stream_write_or_redisplay_when_loaded - (mail_display_stream_write_when_loaded): new function, uses - stream_write_or_redisplay_when_loaded - struct _load_content_msg: added handle, url and redisplay_counter - fields - - * mail-format.c (mail_content_loaded): added redisplay, url and - handle parameter for case when we are loading image content and - want it write to stream instead of redisplaying - -2001-09-05 Ettore Perazzoli - - * message-browser.c (message_browser_new): s/Evolution/Ximian - Evolution/. - -2001-09-04 Ettore Perazzoli - - [Fix #7542, "Crash Afer Closing".] - - * component-factory.c (owner_unset_cb): NULL the - global_shell_client as the first thing here. Otherwise we might - get into a slight race that causes the shell to crash. [Still, of - course the shell shouldn't crash, but I haven't been able to track - that down yet.] - -2001-09-04 Zbigniew Chyla - - Fixes #7251 - - * mail-ops.c (add_vtrash_info): Mark "Trash" with U_(), not _(). - -2001-09-04 Jeffrey Stedfast - - * mail-ops.c (fetch_mail_fetch): Unref the source folder here - because it might be a POP folder. We do this because on store - finalize, we now try to disconnect cleanly which means that we may - block. - - * mail-send-recv.c (build_dialogue): Fix capitalization. Fixes bug - #7486. - -2001-09-04 Peter Williams - - * mail-local.c (mlf_init): Remove accidentally left-in "choke on - this" preprocessor thingie. - (mail_local_folder_reconfigure): Instead of creating our own local - exception, just assert that ex != NULL. - (*): Staticize everything that can be and remove some obnoxious - prototypes. - -2001-08-31 Peter Williams - - * mail-local.c (mail_local_reconfigure_folder): Use (NULL, NULL) - as the arguments to g_hash_table_new instead of g_direct_foo. - Instead of checking the URI, check MAIL_IS_LOCAL_FOLDER (fb->folder) - to check whether we can reconfigure the folder. Instead of - gnome_dialog_run_and_close, use gnome_dialog_run... - (reconfigure_clicked): And deal with removing the hash table - elements here. - (local_storage_new_folder_cb): Set the folder's name to the - displayName to i18nize correctly (after shell patch is applied). - -2001-08-30 Peter Williams - - * mail-local.c: Rewrite as a more complete CamelStore. - - * component-factory.c (create_folder): We can now chuck out most - of this function and just call mail_get_folder. - (xfer_folder_done): If we succeeded in moving the messages, now - delete the source folder as we should be. - (xfer_folder): In order to do so, create a new xfer_folder_data - struct that records the value of 'remove_source' Fix a leak by - unreffing the source folder. - - * mail-ops.[ch]: We no longer need the mail_new_folder operation. - - * folder-browser.[ch]: Don't need the 'reconfigure' member - anymore, because the loaded folder's URL doesn't change. - (do_message_selected): Don't check it - (on_right_click): Same. - (folder_browser_set_uri): Same. - (got_folder): Same. - -2001-08-31 Zbigniew Chyla - - * mail-vfolder.c (vfolder_create_storage): Marked string for - translation (with U_). - -2001-08-28 Zbigniew Chyla - - * message-list.c (e_mail_address_compare): Use g_utf8_collate - instead of g_strcasecmp for comparing names. - (subject_compare): Replaced g_strcasecmp, isspace, var++ with - UTF-8 counterparts. - -2001-08-30 Iain Holmes - - * importer/evolution-mbox-importer.c (load_file_fn): Check if it's - a folder, if so, create a folder. - (process_item_fn): If it was a folder created, just finish up - importing - -2001-08-29 Iain Holmes - - * importers/evolution-mbox-importer.c: Turn off debugging, remove - spewage. - (process_item_fn): Notify the importer if the folder isn't opened - or created yet. - (load_file_fn): Allow the function to continue if the folder is - being created. - -2001-08-30 Peter Williams - - Due to the introduction of mail_folder_cache_remove(), we can no - longer assume that mail_folder_info's always exist, so we need to - robustify a lot of this. - - * mail-folder-cache.c (folder_browser_destroyed): New - function. Called when the folder browser is destroyed -- analogous - to camel_folder_finalized. - (mail_folder_cache_note_fb): Hook it up here. - (struct _mail_folder_info): Add a member, mail_info_id, that - records the get_mail operation's id, so that we can cancel it if - we need to. - (get_folder_info): Initialize it here. - (get_mail_info_reply): Clear it here. - (mail_folder_cache_remove_folder): If necessary, cancel it here. - (mail_folder_cache_note_folder): Check it here before starting a - new operation, just in case. - (update_message_counts_main): Take a URI instead of a - mail_folder_info *, in case the MFI has gotten destroyed. - (update_message_counts): Take a quark of the URI instead of a - mail_folder_info *, for the same reason. We use a quark instead of - an allocated gchar * because figuring out when to free the string - gets tricky. Then go from quark -> URI string -> MFI. Return if - the folder is no longer valid, because this indicates that the MFI - was removed before this signal got called. Pass a string to - update_message_counts_main instead of an MFI. - (camel_folder_finalized): Don't bother unhooking the signals here. - Same change as above, but don't bother checking for a valid folder - because we're about to make it invalid anyway. - (message_list_built): Analogous to the above, except with the - FolderBrowser instead of the CamelFolder. - (selection_changed): As above. - (folder_browser_destroyed): As above. - (struct get_mail_info_msg): Instead of taking a mail_folder_info - *, take a URI, for reasons explained above. - (get_mail_info_receive): Go from URI -> MFI before doing anything. - (get_mail_info_reply): Same. - (get_mail_info_destroy): Free the URI. - (get_mail_info): Take a URI and return the message id so that it - can be cancelled if necessary. - (mail_folder_cache_remove_folder): Disconnect from signals and - events before removing. - (mail_folder_cache_note_folder): Use a GQuark instead of the - mail_folder_info * as the user_data. - (mail_folder_cache_note_fb): Same. - (mail_folder_cache_note_folderinfo): Little formatting change. - -2001-08-30 Jeffrey Stedfast - - * message-browser.c (message_browser_message_loaded): Fixed a - memory leak. - (message_browser_new): Added a comment as to why , after - reparenting, we do not unref the mail_display. - (message_browser_destroy): Don't call gtk_widget_destroy() on the - message_list here. - -2001-08-30 Peter Williams - - * mail-ops.c (remove_folder_get): Instead of removing the folder - from the folder cache here... - (remove_folder_got): ... do it here, in the main thread. - -2001-08-29 Jon Trowbridge - - * mail-callbacks.c (composer_get_message): When calling - e_msg_composer_get_message, pass in TRUE for the 'sending' arg. - (Part of the fix for bug #8332) - -2001-08-29 Peter Williams - - * folder-browser-ui.c: Fix the pixmap for /commands/MessageUndelete. - - * component-factory.c (owner_set_cb): Toss in a call to - mail_config_init () cause it might contribute to solving - bug 4911, and it won't hurt. - -2001-08-28 Peter Williams - - * component-factory.c (owner_unset_cb): Disable interaction once - the shell has quit. - (create_view): Instead of - folder_browser_factory_new_control ("", corba_shell) when looking - at a mailstorage folder, use create_noselect_control(). - -2001-08-27 Ettore Perazzoli - - * mail-local.c: Match the studlyCapsification of - shell/Evolution*.idl. - - * mail-config-druid.h: Change type of `event_source' from - `Bonobo_EventSource *' to `Bonobo_EventSource'. - - * mail-accounts.c (mail_delete): Remove unused local variable - `label'. - - * folder-info.c (do_get_info): `#if 0' unused variables. - -2001-08-27 Jon Trowbridge - - * mail-callbacks.c (mail_generate_reply): Check if we are trying - to reply to a message with no From: field, and try to do something - graceful in that case. (Bug #7028) - - * mail-display.c (ebook_callback): Add paranoid checks for the - case of a message with a From: field. (Also maybe bug #7028) - -2001-08-27 Iain Holmes - - * mail-config-druid.c (druid_finish): Free the list and hash table. - (druid_cancel): Free the list and hash table. - -2001-08-27 Jeffrey Stedfast - - * mail-account-gui.c (mail_account_gui_new): Set the source and - transport description labels. - (transport_type_changed): Set the transport description label. - (source_type_changed): Set the source description label. - - * mail-tools.c (mail_tool_make_message_attachment): Remove - X-Evolution* headers. - (mail_tool_remove_xevolution_headers): New function to convenience - removing the X-Evolution headers. - (mail_tool_restore_xevolution_headers): New convenience function - to restore the X-Evolution headers. - (mail_tool_destroy_xevolution): New function to cleanup the - structure. - (mail_tool_forward_message): Remove and restore the X-Evolution - headers here too. - -2001-08-26 Jeffrey Stedfast - - * mail-send-recv.c (receive_update_got_store): If the store is not - connected, scan it's subfolders first. - - * mail-ops.c (report_status): Call va_end() so LinuxPPC doesn't - have a caniption. - -2001-08-24 Jeffrey Stedfast - - * mail-display.c (launch_cb): Use the new e_mkdtemp function. - - * folder-browser.c (message_list_drag_data_get): Use the new - e_mkdtemp function. - -2001-08-24 Ettore Perazzoli - - [Fix #8024, Empty strings marked for translation.] - - * component-factory.c: Don't mark empty strings for translation. - Rather, give descriptions and display names to types "mailstorage" - and "vtrash". - -2001-08-24 Peter Williams - - * mail-ops.c (remove_folder_get): Save the folder's full_name, - unref it, and *then* unref the store, so that the folder has been - closed before it gets deleted. - -2001-08-24 Peter Williams - - * mail-config.c (add_shortcut_entry): Instead of using the length - of the shortcuts list as the index for the shortcut, use -1, which - means "last". - - * mail-config-druid.c (druid_finish): Remove the account adding - stuff since that happens in wizard_finish now. - - * mail-config.c (add_new_storage): New function. Add a - MailConfigAccount to the shell as a storage. - (maybe_add_shortcut): Renamed to new_source_created. - (new_source_created): Call add_new_storage here. - - * component-factory.c (mail_remove_storage_by_uri): Don't warn if - the storage isn't remote... no point in making the caller do extra - work. - -2001-08-24 Jeffrey Stedfast - - * mail-config.c (mail_config_set_thread_list): Don't let the uri - be an empty string (how the fuck is this even happening in the - first place??). - (mail_config_get_thread_list): Same. - (mail_config_set_show_preview): And here. - (mail_config_get_show_preview): And finally here. - -2001-08-23 Larry Ewing - - * mail-search.c (mail_search_construct): attach to the destroy - handler to reset the tokenizer. - (dialog_destroy_cb): reset the tokenizer here so that destroying - the dialog with the window manager still clears the hilighted - items. - -2001-08-23 Peter Williams - - * mail-account-gui.c (mail_account_gui_save): Eek, let the user create - new accounts if old_account == NULL. - -2001-08-23 Jeffrey Stedfast - - * component-factory.c (destination_folder_handle_drop): Check to - make sure we actually have drag data. - - * folder-browser.c (message_list_drag_data_received): Check to - make sure we have valid data. - -2001-08-21 Christopher James Lahey - - * Revert fix for Ximian bug #6995. - -2001-08-23 Peter Williams - - * mail-folder-cache.c (maybe_update): Record the timeout_id so we - can cancel it if the mail_folder_info is later freed. Also obviates - the use of the _UPDATE_QUEUED flag. - (mail_folder_cache_remove_folder): Cancel the timeout if we need to. - Lock around the hash table operations. Free mfi itself. Add debugging - spew. - (get_folder_info): Initialiae the timeout_id to 0. - -2001-08-22 Jon Trowbridge - - * mail-callbacks.c (ask_confirm_for_only_bcc): Provide alternative - text for this dialog for the case when a message has only Bcc - recipients because of a hidden contact list's addresses being - moved from To/Cc to Bcc. - (composer_get_message): Try to detect when our message has only - Bcc recipients because of moving addresses around due to a hidden - contact list, and show the dialog with the revised wording in this - case. - -2001-08-22 Jeffrey Stedfast - - * component-factory.c (create_view): Don't blindly make all vtrash - folder types have a uri of vtrash:file:/, instead only make it use - vtrash:file:/ if it's a file: uri, else use physical_uri. - -2001-08-22 jacob berkman - - * mail-display.c: rework how the e-card-popup thing has its life - managed. we now hide the window on the Hide event and destroy it - on the Destroy event emitted from its event source - -2001-08-22 Peter Williams - - * mail-send-recv.c (set_send_status): We don't need to escape this - for printf'ing. - -2001-08-22 Peter Williams - - Prevent the user from creating two accounts with the same name. - - * mail-config.c (impl_GNOME_Evolution_MailConfig_addAccount): - Abort if the account has the same name as another account. - - * mail-account-gui.c (mail_account_gui_save): Don't let the user - save if the account has the same name as another account. - - * mail-config-druid.c (management_check): Disable the next button - if the account name is the same as a preexisting account. - (construct): The only part of 'pages' that was being used was the - name. 'wizard_pages' now has the callbacks, while 'pages' is just - an array of char *'s. - (wizard_finish_cb): Save the account first because that's the - right way, and try to honor mail_account_gui_save's return value. - - * mail-config.glade: Add a label noting that you're not allowed to - create two accounts with the same name. - -2001-08-22 Peter Williams - - * folder-browser-ui.c (fbui_sensitize_timeout): Check for NULL uic - here as well. - (fbui_sensitize_items): Up the timeout interval to 110 ms. - -2001-08-21 Peter Williams - - * mail-account-editor.c (apply_changes): Honor the return value of - mail_account_gui_save. - - * mail-ops.c (sync_folder_desc): Say which folder is getting - saved. - -2001-08-21 Dan Winship - - * mail-identify.c (mail_identify_mime_part): Don't trust gnome-vfs - when it says "text/plain" if gnome_vfs_mime_type_from_name says - something different. Fixes a problem with recognizing icalendar - attachments labeled "application/octet-stream". Also, don't bother - asking gnome-vfs about winmail.dat attachments, since it will - often claim that they're MPEGs due to some mis-magic. - -2001-08-21 Jeffrey Stedfast - - * mail-session.c (mail_session_forget_password): zero-ize the - password before freeing. - (forget_password): Same. - -2001-08-21 Peter Williams - - * message-list.c (message_list_set_folder): Don't sink the extras - since _set_folder can get called more than once (on reconfigure.) - (message_list_destroy): So just unref the extras here. - - * mail-send-recv.c (build_dialogue): Treat the spool provider like - IMAP: update instead of performing an explicit receive. - -2001-08-21 Peter Williams - - * folder-browser-ui.c (fbui_sensitize_items): Rename to - fbui_real_sensitize_items. Now we queue a change and set up a - timeout, making sure weed out redundant changes, fixing flicker. - (fbui_sensitize_timeout): New function. The timeout. - (fbui_real_sensitize_items): Semi-new function. Rename of old - fbui_sensitize_items. - (folder_browser_ui_set_selection_state): Pass the FB instead of - only the UIC to sensitize_items. - (folder_browser_ui_message_loaded): Same. - - * folder-browser.c (folder_browser_destroy): Kill the new timeout - if it is registered. - - * folder-browser.h: Add some members to FolderBrowser for keeping - track of the queue of changes. - -2001-08-20 Iain Holmes - - * mail-config.druid: Fix the jumping around. - -2001-08-20 Peter Williams - - * mail-ops.c (remove_folder_get): Fix double-unref of the store. - -2001-08-20 Jeffrey Stedfast - - * component-factory.c (create_folder): Modify the url and set the - protocol to mbox rather than hacking it and prepending mbox: to - the uri. - - * mail-local.c (get_folder): Don't prepend the folder_name with - the store's path because the hash key is folder_name, not - /folder_name. - -2001-08-20 Iain Holmes - - * mail-config-druid.c: Change some of the text labels. - (create_label): Make a label instead of a GtkHTML widget. - -2001-08-18 Iain Holmes - - * mail-account-gui.c (mail_account_gui_setup): Stop hiding the source - and transport frames. - -2001-08-20 Ettore Perazzoli - - * folder-browser-ui.c (folder_browser_setup_property_menu): - Updated as ChangeFolderProperties is now in the - ComponentPlaceholder. - -2001-08-20 Peter Williams - - * mail-accounts.c (mail_able): Whoops, make sure that the account - has a source before removing it or what-have-you. - - * subscribe-dialog.c: Add a few comments. - -2001-08-20 Damon Chaplin - - * folder-browser-ui.c: use new small trash icon for Delete command. - -2001-08-20 Ettore Perazzoli - - * mail-ops.c (sync_folder_desc): s/Synchronising/Synchronizing/. - -2001-08-20 Jeffrey Stedfast - - * component-factory.c (storage_create_folder): - camel_folder_create_folder can now return a heirachial tree so - subscribe to down the tree. - -2001-08-20 Damon Chaplin - - * folder-browser-ui.c: use new Cut/Copy/Paste icons. - -2001-08-19 Ettore Perazzoli - - * component-factory.c: Update the folder list to include a display - name and a description. - -2001-08-19 Jeffrey Stedfast - - * mail-mt.c (do_op_status): Allow the activity to be NULL if there - isn't a global_shell_client so that we don't try and report status - updates when the shell is destroyed. - - * mail-config.c (add_shortcut_entry): Return if there isn't a - global_shell_client. - - * component-factory.c (owner_set_cb): set the global_shell_client - here and connect to the destroy signal. - - * mail-vfolder.c (vfolder_create_storage): Use an extern - global_shell_client. - -2001-08-19 Christopher James Lahey - - * mail-callbacks.c (delete_msg): Made delete make the cursor go - backwards if the user is sorting by descending date. Fixes Ximian - bug #6995. (Reverted.) - -2001-08-19 Jeffrey Stedfast - - Note: The following changes were based on Zbigniew Chyla's fixes. - - * mail-callbacks.c (mail_generate_reply): Convert the date string - to UTF-8. - (do_forward_non_attached): Same here. - -2001-08-05 Zbigniew Chyla - - * folder-info.c: Added missing #include . (applied by Damon) - -2001-08-18 Jeffrey Stedfast - - * mail-config.c (config_read): Change the default values for - "always-sign" to false. - - * mail-callbacks.c (open_msg): if the folder is Outbox, let the - user edit the message(s) too I guess. - -2001-08-18 Ettore Perazzoli - - * folder-browser-ui.c: Hook the new `delete-message.png' up. - -2001-08-17 Damon Chaplin - - * mail-display.c (pixmap_press): stop signal emission so the GtkButton - class method doesn't mess up the popup menu. Hopefully fixes bug #1828. - -2001-08-17 Zbigniew Chyla - - * mail-search.c (mail_search_construct): Put _() instead of N_() - around of the "Search" string, gnome_dialog_constructv doesn't - translate button names. - -2001-08-17 Jeffrey Stedfast - - * mail-format.c (mail_write_authenticity): We want wax-seal.png - instead, since I added the png files to cvs and renamed it to - wax-seal.png. - -2001-08-17 Iain Holmes - - * importers/evolution-mbox-importer.c (load_file_fn): Fix - warnings. - -2001-08-17 JP Rosevear - - * component-factory.c (owner_set_cb): don't init the config here - - * main.c (main): init the config here - -2001-08-17 JP Rosevear - - * mail-config-druid.c: remove dead structure - -2001-08-17 Jeffrey Stedfast - - * mail-config.c (mail_config_write): Save the always-sign options - for pgp and smime. - (config_read): Read in the always-save options for pgp and smime. - -2001-08-17 Christopher James Lahey - - * message-list.etspec: Made the default values for column - expansions here more reasonable. - -2001-08-16 Iain Holmes - - * GNOME_Evolution_Mail.oaf.in: Add the Wizard stuff. - - * component-factory.c (component_fn): Init the Wizard factory. - (mail_load_storages): Check service isn't NULL before it's been - dereferenced. - - * mail-account-gui.c (mail_account_gui_setup): Only show the top level - widget is it's not NULL. - Change the gtk_widget_set_usizes to gtk_widget_hides. - - * mail-config-druid.c: Rewrite to use the EvolutionWizard stuff. - - * mail-config-druid.h: Add stuff to the MailConfigDruid struct. - - * mail-config.c (mail_config_get_default_account): Init the config if - it's not been inited. - -2001-08-16 Jason Leach - - * mail-tools.c (mail_tool_quote_message): Only starting cutting - the signature out when we match "-- \n", so "--\n" in the middle - of a mail won't omit the rest for a quoted reply. Bug #7454. - -2001-08-16 Jeffrey Stedfast - - * mail-callbacks.c (confirm_expunge): Respect the user's desire to - be prompted to confirm that he wants to expunge the blasted - folder. Also, don't set the usize - that's just an evil hack and - you may find it will cut off text once the label has been - translated. - (create_msg_composer): In order for the security options to be - checked when composing a new message, we must set the from account - explicitly even though the composer hdrs sets the default from - account and emits the signal because at that stage the composer - hasn't yet connected to the signals and thus the bonobo menu items - don't get set. - - * mail-config.c (mail_config_set_confirm_expunge): New. - (mail_config_get_confirm_expunge): New. - -2001-08-16 Peter Williams - - * subscribe-dialog.c (fe_got_children): Sort the nodes here... - (fe_sort_folder): ... using this function. - - * folder-browser-ui.c (folder_browser_ui_message_loaded): Check - for uic == NULL. I'm not sure how this could happen, but... - -2001-08-16 Peter Williams - - * folder-browser-ui.c (folder_browser_ui_set_selection_state): - Disable "Search Message" when more or less than exactly one - message is selected. - - * subscribe-dialog.c (fe_done_subscribing): Instead of hackfully - getting the path, use a CamelURL so that escaping is - handled. Silly me. -- See below -- - (fe_node_to_shell_path): Use node->name and node->full_name to - generate the the shell path of this item. Don't need to escape the - URL, and handle cases when dir_sep != '/' - (fe_done_subscribing): Use fe_node_to_shell_path instead of the - CamelURL. Third time's the charm... * folder-browser-ui.c - (folder_browser_ui_set_selection_state): Disable "Search Message" - when more or less than exactly one message is selected. - - * subscribe-dialog.c (fe_done_subscribing): Instead of hackfully - getting the path, use a CamelURL so that escaping is - handled. Silly me. -- See below -- - (fe_node_to_shell_path): Use node->name and node->full_name to - generate the the shell path of this item. Don't need to escape the - URL, and handle cases when dir_sep != '/' - (fe_done_subscribing): Use fe_node_to_shell_path instead of the - CamelURL. Third time's the charm... - -2001-08-15 Jeffrey Stedfast - - * mail-display.c (save_part): Remember the filename is in utf8, so - use the e_utf8 functions to set the filename in the file selection - dialog. - -2001-08-15 Peter Williams - - * message-list.c (on_cursor_activated_idle): Always remove the - idle and return FALSE, instead of returning TRUE if more than one - message is selected. - -2001-08-15 Jason Leach - - * mail-tools.c (mail_tool_quote_message): Stop building the quote - after a sigdash, hence, omitting the signature from a - reply/forward. Bug #5529. - -2001-08-15 Anna Marie Dirks - - * mail-callbacks.c (expunge-folders): Re-added, at Ettore's - request, the confirm-expunge dialog. - -2001-08-15 Jason Leach - - * message-list.c (message_list_init): Use ALWAYS for scroll frame - policy because ETable acts lame with AUTOMATIC. Bug #6925. - -2001-08-16 Not Zed - - * mail-callbacks.c (expunge_folder): Don't confirm expunge. - -2001-08-15 Not Zed - - * mail-local.c (register_folder_register): Remove operation - registration/etc. Handled by mail-mt.c - - * message-list.c (regen_list_regen): Remove camel operation - registration/etc. - -2001-08-14 Jeffrey Stedfast - - * mail-accounts.c (load_accounts): Convert the UTF-8 account name - string into a gtk-string before using it in the GtkCList. - -2001-08-14 Peter Williams - - * mail-callbacks.c (previous_unread_msg): Make previous unread - wrap around too. - - * mail-accounts.c (load_accounts): If the account is enabled, - set a checkmark pixmap instead of a strange plus sign. - (mail_accounts_dialog_init): Load the pixmap here. - (mail_accounts_dialog_finalise): Free it here. - - * mail-accounts.h: Prototype it here. - -2001-08-14 Dan Winship - - * folder-browser.c (message_list_drag_data_get): Fix the fix for - #6722. - - * mail-ops.c (save_messages_save): Likewise. - (save_part_save): Deal with the possibility that - camel_mime_filter_charset_new_convert will return NULL (bad - charset name). Fixes #6611. - -2001-08-13 Jon Trowbridge - - * mail-search.c (mail_search_construct): Disable the "search - forward/backward" option in the search dialog. Why? Well, it - doesn't work properly (bug #4869), and the reason it doesn't work - is because of some scary stuff deep inside of gtkhtml that I don't - understand at all. So since I'm paranoid, and since the GUI - freeze is tomorrow, and since it isn't really an important feature - at all, I'm #if 0-ing it out. If the gtkhtml stuff gets sorted - out, we can slip it back in for 1.1. - -2001-08-13 Peter Williams - - * component-factory.c (user_create_new_item_cb): New function, - handle "user creatable items". - (component_fn): Tell the shell that we're capable of creating - mail messages. - -2001-08-13 Jason Leach - - * mail-local.c (get_folder): Fix this so it can actually get - folders from the hash of folders on the local store (it was - looking up plain @folder_name, which is typically "mbox", instead - of the full URI, /home/jleach/evolution/local/Foo/mbox). - - * component-factory.c (do_remove_folder): Rename to - remove_folder_done, more fitting for it's purpose. - (do_xfer_folder): Similar name change. - (do_create_folder): Similar name change. - (remove_folder): Don't notifyResult for the component here, we - will notify with our result in remove_folder_done. - (xfer_folder): Ditto. - - * mail-vfolder.c (vfolder_refresh): Create new folders with unread - counts of "0" instead of #FALSE (which just happens to be #defined - as zero). - -2001-08-13 Peter Williams - - * mail-send-recv.c (mail_autoreceive_setup): Break most of the - functionality into a separate function. - (autoreceive_setup_list): Rename of mail_autoreceive_setup that is - passed a list of accounts. - (mail_autoreceive_setup_account): New function. Set up a single - account using autoreceive_setup_account. - - * mail-send-receive.h: Prototype mail_autoreceive_setup_account. - - * mail-account-gui.c (mail_account_gui_save): Instead of setting - up all accounts, set up only this source with the new - mail_autoreceive_setup_account. - - * mail-config-druid.c (druid_finish): ... which means we can call - mail_config_add_account() after the MailConfigAccount has been - created by mail_account_gui_save() because we no longer need the - account to be in the list for mail_autoreceive_setup() - - * mail-config.c (mail_config_add_account): ... which means we can - possibly add a shortcut to the account's sources's Inbox here. - (maybe_add_shortcut): New function. If the store is a storage, add - a shortcut to its inbox. Hope that /INBOX exists. - (add_shortcut_entry): New function. Creates a shortcut if it doesn't - yet exist. - -2001-08-13 Peter Williams - - * mail-account-gui.c (service_complete): Take account of the fact that - service->path may be NULL (if service is a transport.) - - * mail-config-druid.c (druid_finish): Bleah, bugfix in case the - account has no source. - -2001-08-13 Anna Marie Dirks - - * mail-config.glade: Changed all instances of "Wizard" and "Druid" - to "Assistant". - - * mail-config-druid.c: Ditto. - -2001-08-13 Anna Marie Dirks - - * mail-accounts.c: Changed the title of the Mail Settings - dialog from "Evolution Account Manager" to "Mail Settings" . - -2001-08-13 Jeffrey Stedfast - - * message-list.c (get_message_uid): Do some g_assert() - action. Make sure that the node passed in is non-NULL and also - make sure that the CamelMessageInfo gotten from the ETree is - non-NULL. - (get_message_info): Same here. - - * mail-callbacks.c (expunge_folder): Confirm that the user really - wants to expunge. - (save_msg_ok): Set the parent window here. - -2001-08-13 Peter Williams - - * mail-config.c (remove_account_shortcuts): Remove the shortcuts - corresponding to an account (they all point to - evolution:/accountname/..) - (mail_config_remove_account): When deleting the account, remove - its shortcuts. - -2001-08-10 Peter Williams - - * mail-config-druid.c (druid_finish): Whoa, fatal typo. Sorry. - -2001-08-13 Jason Leach - - * mail-local.c (init_trash): Tell folder cache the path for our - Trash is /Trash, because that's what Shell needs to hear for - updating folders. - -2001-08-11 Jason Leach - - * mail-offline-handler.c (impl_goOnline): Set the session as - online so auto mail checking (and the composer) will be doing the - right things when you go online. Bug #6343 and #4601. - - * folder-browser.c: Make the right click "Resend..." into "Edit as - New Message...", bug #6838. - - * mail-accounts.h: Remove unecessary #include - - * mail.h: Removed a prototype for a non-existant - mail_view_create(). - -2001-08-10 Jeffrey Stedfast - - * mail-account-gui.c (build_auth_menu): Fix bug #4523 for good. - (save_service): If service->authitem is NULL, then the user tried - to enable authentication but the provider doesn't actually support - it. - -2001-08-10 Jon Trowbridge - - * folder-browser.c: Set our ESearchBarItems subitems to NULL. - -2001-08-10 Jeffrey Stedfast - - * mail-callbacks.c (transfer_msg): Prepend the uri with evolution: - to fix bug #6916. - -2001-08-10 Jason Leach - - * folder-browser.c: Make the context menu for the Sent folder have - "Resend..." instead of "Resend", to clarify that it will bring up - a dialog needing your input rather than just blindly sending the - message again. Also give it the 'e' accelerator. Bug #6838. - - * mail-callbacks.c (next_unread_msg): Since 'N' keypresses go - through here now, use wrap-around selecting. - (previous_unread_msg): Same for 'P' here. - - * message-list.c (on_cursor_activated_idle): Stop this idle timer - when we have multiple items selected, this keeps it from loading - and then marking the last item in your selection list as read. - Bug #4693. - -2001-08-10 Peter Williams - - * mail-accounts.c (mail_delete): Don't remove the account from the - tree if it's not enabled. - -2001-08-10 Jason Leach - - * mail-ops.c (remove_folder_get): Remove all the messages from a - folder that's being deleted before actually doing the - camel_store_delete_folder, so it won't leave behind an mbox file - that's going to prevent the actual directory from being deleted, - and strange effects like new folders with the same name being made - in it's place. Bug #5618. - - * mail-folder-cache.c (mail_folder_cache_remove_folder): New - function, a way to get something out of the folder cache, like - folders being deleted. Bug #6878. - -2001-08-10 Peter Williams - - * mail-accounts.c (news_add_destroyed): Whoops, compile fix. - -2001-08-10 Jason Leach - - * mail-callbacks.c (mark_as_unseen): If marking messages as - unread, remove the automatic mark-as-read timer. Bug #4153. - -2001-08-08 Peter Williams - - * component-factory.c (mail_load_storages): Don't load the storage - if it isn't enabled. - (mail_remove_storage_by_uri): New function. Goes through the - gymnastics of getting a CamelStore from the URI and calling - mail_remove_storage. Copied from mail_delete(). - (mail_load_storage_by_uri): Break out the storage-loading part of - mail_load_storages into a single function. - (mail_load_storages): Just call mail_load_storage_by_uri several - times. - - * mail.h: Prototype our new _by_uri functions. - - * mail-accounts.c (news_add_destroyed): Instead of hacking around - mail_load_storages, call mail_load_storage_by_uri. - (mail_delete): Move this chunk of code into - mail_remove_storage_by_uri. - (mail_able): Add or remove the storage as necessary, with our - new _by_uri functions. - - * mail-config-druid.c (druid_finish): See news_add_destroyed above. - -2001-08-10 Jeffrey Stedfast - - * mail-config.c (mail_config_get_show_preview): Free dbkey if we - don't use it. - - * folder-browser.c (on_right_click): Added a comment about leaking - memory here, but we seem to not even use the 2 strings we - strdup...is this code still under construction? - - * mail-ops.c (mail_send_message): Free the sent_folder_uri at the - bottom of the function (ironically enough we were freeing it if we - encountered an error but never free'd it on success :-) - (get_folderinfo_got): Fixed a memory leak...this one would have - gone away once we got rid of the debug g_warning though. - -2001-08-10 Not Zed - - * mail-ops.c (mail_transfer_messages): Dont want it to keep on - running if it got bad arguments, want it to bloody well crash. - (mail_append_mail): Same here. - -2001-08-09 Jeffrey Stedfast - - * message-list.c (mlfe_callback): Added a g_assert_not_reached() - - I'm hoping this will help us track down the "can't delete message - sometimes" (ie bug #6637 and friends) bugs that users have been - reporting. If herein lies the problem, then we can expect some - crashes and some good backtraces, hopefully. - -2001-08-09 Peter Williams - - * folder-browser.c (on_key_press): The bonobo menu items now - handle 'n' and 'p'. - (on_key_press): 'q' as well. - - * message-list.c (message_list_select): Fix inline documentation. - -2001-08-09 Anna Marie Dirks - - Fixes bug #6918 - - * folder-browser.c: Changed the "Store search as vFolder" menu - item to "Create vFolder from Search". - -2001-08-09 Jeffrey Stedfast - - Fixes bug #6722 - - * mail-ops.c (save_messages_save): Don't set the default perms - here, let the user's umask deal with permissions. - - * folder-browser.c (message_list_drag_data_get): Don't set any - default perms. - -2001-08-09 Jeffrey Stedfast - - * mail-account-gui.c (mail_account_gui_save): Save the pgp and - smime always-sign options. - - * mail-config.c (account_copy): Copy the always-sign options over - too. - -2001-08-08 Not Zed - - * mail-ops.c (send_mail_send): Dont double-register this - operation, mail-mt will do it for us. - (get_folderinfo_get): " - (get_folder_get): " - (get_store_get): " - (create_folder_get): " - (remove_folder_get): " - (sync_folder_sync): " - (get_message_get): " - - * message-list.c (message_list_setup_etree): Free the etstate - object after we're done using it. - -2001-08-08 Peter Williams - - * subscribe-dialog.c (sc_selection_changed): New function. Set the - sensitivity of the subscribe buttons based on whether any folders - are selected. - (menu_item_selected): If getting the widget for the first time, - hook up sc_selection_changed. - -2001-08-08 Peter Williams - - * mail-ops.c (mail_update_subfolders): Change this gtk_object_ref - on the storage to a bonobo_object_ref. - - * component-factory.c (mail_lookup_storage): And here. - - * mail-vfolder.c (mail_vfolder_get_vfolder_storage): And here. - -2001-08-07 Ettore Perazzoli - - * message-browser.c (set_bonobo_ui): Remove the "Customize - Toolbar" thing. - -2001-08-07 Not Zed - - * mail-config.c (mail_config_get_thread_list): Free the dbkey if - we found the config option. - - * mail-send-recv.c (build_dialogue): Free the pretty_url after - we've used it. - (free_send_info): Free the 'what' string. - (receive_done): Use free_send_info to make sure we free - everything. - - * mail-ops.c (send_queue_free): Unref the filter driver when done. - (send_queue_send): Unref the driver here too, force any long - taking operations to run in our thread. - -2001-08-07 Peter Williams - - * Revert Jeff's changes to subscribe-dialog.[ch]. It's not a widget, - it's an object from which you can obtain a widget. - -2001-08-07 Jeffrey Stedfast - - * mail-callbacks.c (manage_subscriptions): Hide the app->window. - (do_mail_print): Set the parent of the gnome-dialog to be the - folder-browser so that when evolution is closed, the print dialog - gets destroyed. Should fix bug #4781. - - * subscribe-dialog.c (subscribe_dialog_new): This should return a - GtkWidget not a GtkObject. - - * mail-session.c (get_filter_driver): Update to use user's logging - preferences. - - * mail-accounts.c (filter_log_toggled): New. - (filter_log_path_changed): New. - (construct): Get and attach signals to the filter logging option - widgets. - - * mail-config.c (config_read): Read in filter logging options. - (mail_config_write_on_exit): Save filter logging options. - (mail_config_set_filter_log_path): Implemented. - (mail_config_get_filter_log_path): Implemented. - (mail_config_set_filter_log): Implemented. - (mail_config_get_filter_log): Implemented. - -2001-08-07 Peter Williams - - * subscribe-dialog.c (folder_etree_construct): Move - fe_create_root_node farther down, so we can check for its children - without problems. - - * mail-callbacks.c (folder_created): Use bonobo_object_unref on - the storage since it's a bonobo object. - (mail_storage_create_folder): Same. - (folder_deleted): Same. - - * mail-send-recv.c (receive_update_got_store): Same. - - * mail-ops.c (do_update_subfolders): Same. - - * subscribe-dialog.c (fe_destroy): Unref the e_storage since - lookup_store gives us a ref. - -2001-08-07 Peter Williams - - * subscribe-dialog.c (folder_etree_construct): Move - fe_create_root_node farther down, so we can check for its children - without problems. - (storage_tree_path): Removed, this was broken. - (subscribe_get_short_folderinfo): Use the queued thread instead of - the new thread. - (subscribe_do_subscribe_folder): Same. - (ftree_node_new_root): Don't create the path anymore; it was - broken and there's a better way to get it now. - (fe_got_children): Remove some debugging output. - (fe_check_for_children): Here too. - (fe_done_subscribing): Get the path from the URI instead of the - ftree_node. - (_SubscribeDialogPrivate): Add all of our useful widgets as - members. - (sc_refresh_pressed): Don't clear the search... that makes no - sense now. - (sc_search_activated): Don't set the filter radio button as active - now; we use sensitivity instead. - (sc_all_toggled): Make the search entry insensitive. - (sc_filter_toggled): Make the search entry sensitive. - (kill_default_view): New function. Gets rid of the default view - stuff and makes all the widgetry sensitive. - (menu_item_selected): Check if we moved off of the default view - and, if so, call kill_default_view(). - (subscribe_dialog_construct): Initialize our new private widget - members, and by default insensitize most of the buttons because - they make no sense in the default view. - -2001-08-06 Jeffrey Stedfast - - * mail-config.glade: Added key accelerators to a bunch of the - config options and moved the Bcc and empty-subject checkboxes to - the composer tab where they belong. - - * mail-callbacks.c (providers_config): Raise the dialog if it - exists already. - (manage_subscriptions): Raise the dialog if it already exists. - (main_select_first_unread): Removed (we haven't needed this code - in ages). - (select_first_unread): Same. - (save_msg_ok): If the path is empty, just return. - - * mail-local.c (mail_local_reconfigure_folder): Raise the dialog - if it already exists. - -2001-08-06 Jeffrey Stedfast - - * mail-callbacks.c (expunge_folder): Set the message-display - message to NULL if we can't get an info too. - -2001-08-06 Jason Leach - - * mail-callbacks.c (create_folders): Make vtrash folders on other - storages with a "vtrash" type, so they get the little trashcan - icon. - -2001-08-06 Peter Williams - - * subscribe-dialog.[ch]: Reimplement to be asynchronous and pretty, - with progressive folder loading and all sorts of wonderful - improvements. - - * mail-callbacks.c (manage_subscriptions): Change to reflect API - update. - - * Makefile.am (etspec_DATA): Add subscribe-dialog.etspec. - (glade_DATA): And the glade file. - - * subscribe-dialog.etspec: New file, break out the specification - from inside the subscribe-dialog.c - - * subscribe-dialog.glade: Update this, actually use it now. - -2001-08-06 Jeffrey Stedfast - - * mail-callbacks.c (empty_trash): Yuck. Special case whether or - not we want to expunge all the trash folders syncronously or - asyncronously based on whether or not we are doing Empty-On-Exit - or emptying trash by user request respectively. - -2001-08-06 Jason Leach - - * mail-folder-cache.c (make_folder_name): Removed this function, - it's not needed anymore. - (mail_folder_cache_note_folderinfo): Initialize mfi->unread to 0 - always, so the shell won't get sent a random int for vtrash or - potentially other folders. - - * message-list.c (message_list_select): Fix a minor glitch with - how it started a backwards wraparound at the 2nd to last message, - skipping the very last message. - -2001-08-06 Jeffrey Stedfast - - * mail-config.glade: s/character set/character encoding - -2001-08-05 Ettore Perazzoli - - * message-browser.c (message_browser_message_loaded): Make the - title of the window "subject - Message" instead of just "subject". - Also, display "(No subject)" if the subject is NULL. - - [Fix #6399, 8-bit characters are not displayed in window title.] - - * message-browser.c (message_browser_message_loaded): Convert the - subject from UTF-8 to GTK. - -2001-08-05 Ettore Perazzoli - - [Revert the previous changes, there seems to be something wrong - with it.] - - * component-factory.c (component_factory_init): Back to using - `bonobo_generic_factory_new()'. - (component_fn): Updated accordingly. - -2001-08-04 Ettore Perazzoli - - * component-factory.c (component_factory_init): Use - `e_bonobo_generic_factory_multi_display_new()' instead of just - `bonobo_generic_factory_new()'. - (component_fn): Added @component_id arg. - -2001-08-04 Jeffrey Stedfast - - * mail-format.c (mail_part_is_inline): Add yet another - special-case hack for application/pgp. - -2001-08-04 Jason Leach - - * message-list.c (message_list_select): Add a @wraparound - argument, so the 'n' and 'p' keypresses (or anything else that - wants to) can wrap around to find the next unread. - - * folder-browser.c (on_key_press): Tell it to wrap around here. - - * mail-callbacks.c (delete_msg): Don't wrap around here (or the - other callbacks in this file). - -2001-08-03 Jason Leach - - * mail-folder-cache.c (update_idle): Updates for EvolutionStorage - API changes. - - * mail-importer.c (mail_importer_create_folder): Ditto. - - * mail-local.c: Same here. - -2001-08-03 Jeffrey Stedfast - - * mail-account-gui.c (build_auth_menu): Try to restore the choice - the user had chosen before hitting the "Check Supported Types" - button. - - * mail-format.c (write_headers): Removed a no-longer-needed - g_warning. - -2001-08-03 Not Zed - - * mail-session.c (get_password): return the source url for - popb4smtp auth request. - -2001-08-02 Jon Trowbridge - - * mail-ops.c (filter_folder_describe): Added. Provide - description for filter_folder_op. - (fetch_mail_describe): Added. Provide description for - fetch_mail_op. - - * message-list.c (regen_list_describe): Added. Provide - description for regen_list_op. - - * mail-config.c (check_service_describe): Added. Provide - description for check_service_op. - - * folder-info.c (do_describe_info): Added. Provide description - for get_info_op. - -2001-08-02 Larry Ewing - - * mail-send-recv.c (format_url): handle null paths in the dialog - so that we avoid printing NULL strings - -2001-08-02 Jeffrey Stedfast - - * mail-callbacks.c (filter_edit): Raise the filter-editor window - if it's already created. - - * folder-browser.c (message_list_drag_data_received): I obviously - can't spell recieved, er, received...uh, yea. - -2001-08-02 Jason Leach - - * mail-config.glade: Set history_id's for the sig and html sig - gnome file entry boxes so it can persist history, also add titles - to the dialogs that popup when you click the "Browse..." button. - Bug #5595. - -2001-08-02 Jeffrey Stedfast - - * mail-vfolder.c (vfolder_create_storage): Connect to the - folder_remove signal on the storage. - (vfolder_remove): New function to remove a vfolder. - (vfolder_edit): Raise the window if it already exists. - -2001-08-02 Not Zed - - * Makefile.am (INCLUDES): Add EVOLUTION_BUTTONSDIR to get to some - different icons. - - * mail-ops.c (mail_sync_folder): Queue the folder sync operation, - rather than running it in parallel. - - * mail-send-recv.c: applies anna's patch for prettier send-recv - dialogue. - (parse_url): Renamed to format_url, fixed callers. - (format_url): Use camel_url_free instead of g_free, also handle - case where we have no host (use path instead). - (build_dialogue): Cleaned up some whitespace. - (build_dialogue): Create the label directly with the right text, - dont set any text in the progress bar, and save the label into the - info struct for later updating. - (struct _send_info): Added 'status' the label with the status - string. - (operation_status_timeout): - (receive_done): - (receive_cancel): Set the status label, not the progress format - text. - (hide_send_info): NULL out status too. - (mail_receive_uri): Init status. - (free_folder_info): Initiate a folder sync here, so we can ... - (free_send_data): ... Remove the awful hack of iterating through - bonobo controls to sync all open folders. - (free_send_data): Initiate a sync of the inbox too. - (build_dialogue): Remove set_alignment on the icon, its not a - gtkmisc object. - -2001-08-01 Jeffrey Stedfast - - * folder-browser.c (folder_browser_copy): Do the Right Thing (tm) - if the message list is not the widget in focus (which is to copy - the text selected in the html viewer instead). Fixes bug #5868. - -2001-08-01 Jason Leach - - * folder-browser-ui.c: Use the new Save As and Message Search - icons from Jakub. - - * mail-callbacks.c (delete_msg): Don't move cursors around when - deleting last message and Hide Deleted Messages isn't enabled. - Bug #5928. - -2001-07-31 Anna Marie Dirks - - * mail-mt.c (do_get_pass): Changed the title of this dialog - to "Enter Password". - -2001-07-30 Jeffrey Stedfast - - * mail-mt.c (do_get_pass): We are not guarenteed to have a - non-NULL service (ie. PGP) thus check for it. - (pass_got): And again here. - (mail_get_password): And of course here too. - - * mail-format.c (decode_pgp): When writing out a CamelException to - the HTML stream, be sure to translate it first. - (handle_message_external_body): Convert to UTF8 here too - I know - this function is basically a dead end right now but eventually we - will want to do something. I mostly did this because param values - are UTF8 encoded so we should avoid mixing and matching UTF with - non UTF8. - (format_mime_part): Avoid writing non-UTF8 to the HTML stream. - - * mail-tools.c (mail_tool_make_message_attachment): Convert - translated strings to UTF8 here too. - (mail_tool_forward_message): Here too. - -2001-07-23 Zbigniew Chyla - - * mail-format.c (attachment_header, write_address, decode_pgp, - mail_write_authenticity): - Convert translated strings to UTF8 before calling mail_html_write. - - I modified the patch slightly and cleaned up bits of code around - it as well. For example, we probably want to avoid having HTML - tags in the strings to be translated. -- fejj - -2001-07-30 Jeffrey Stedfast - - * mail-account-gui.c (mail_account_gui_new): Restore old security - settings from the saved configuration. Fixes bug #5710. - -2001-07-30 Not Zed - - * mail-session.c (do_register_timeout): Actually add the timeout, - this time in the gtk thread. - (do_remove_timeout): And same for remove. - (register_timeout): - (remove_timeout): Proxy the gtk calls to the main thread, and - wait for them to execute synchronously. - (register_timeout): Instead of return with fail for a too small - timeout, just increase the timeout. - -2001-07-27 Zbigniew Chyla - - * component-factory.c (populate_folder_context_menu): Added (unused) - table with strings intended to be translated (i18n tools can't extract - strings from XML data inside .c file). - -2001-07-27 Jeffrey Stedfast - - * mail-mt.c (focus_on_entry): Don't need this anymore. - (do_get_pass): Since we already have the entry widget, no need to - do the nasty focus_on_entry hack. - -2001-07-26 Peter Williams - - * mail-mt.c (do_get_pass): Figure out whether we're getting the - password for the source or the transport, and get the toggle - button accordingly. - (pass_got): Same. - - * mail-config.c (mail_config_get_account_by_transport_url): New - function. Cut + paste + search + replace of _by_source_url. - - * mail-config.h: Prototype here. - -2001-07-26 Jeffrey Stedfast - - * folder-browser.c (message_list_drag_data_get): If we don't have - any messages selected, break out. This fixes bug #5612. - - * component-factory.c (xfer_folder): Fixed a strstr (url, - "noselect=yes") brokenness. - (destination_folder_handle_motion): Same. - (destination_folder_handle_drop): And again here. - - * mail-format.c (handle_application_pgp): Implemented. - (setup_mime_tables): Setup the application/pgp handler to use - handle_application_pgp instead of handle_text_plain. - (handle_text_plain): Remove special-case hacks for application/pgp - types. - - * mail-config.glade: beautification. - -2001-07-26 Peter Williams - - * mail-mt.c (do_get_pass): Use magic to make the password - remembering checkbutton come after the entry, visually. - -2001-07-26 Jeffrey Stedfast - - * mail-format.c (write_headers): Respect Gtk theme colors for the - fonts and calculate a new table gbcolor based on gtk theme - preferences. - - * mail-config.glade: Label the enabled field. - -2001-07-26 Peter Williams - - * message-list.etspec: Make the date column smaller and the - subject column larger, relatively. - - * mail-folder-cache.c (make_folder_status): Don't display "0 - hidden". - - * folder-browser.c (on_key_press): Make 'q' a toggle, not one-way. - - * message-list.etspec: Rename "Date" column to "Sent". - -2001-07-25 Anna Marie Dirks - - * mail-config.glade: fixed a mis-spelling of "Fashion" in the mail - accounts window. (See bug 5433) - -2001-07-25 Jeffrey Stedfast - - * mail-session.c (make_key): Don't make the key url:item if we - have the url, just make it url. This fixes bug #5339. - (mail_session_set_password): Removed. - -2001-07-25 Peter Williams - - * folder-browser.c (etree_key): Make it so Enter always opens the - message in another window. - -2001-07-25 Peter Williams - - * mail-mt.c (mail_get_password): Now take a CamelService parameter - (as passed by Camel). Allows us to have a "remember password" - checkbox that is set correctly and whose settings can be - propagated back to the proper MailConfigService. - (do_get_pass): Add a checkbutton allowing the user to change - whether the password is remembered or not. - (pass_got): Apply the setting of the "remember password" - checkbutton (if not cancelled.) - - * mail-mt.h: Update the prototype here. - - * mail-config.c (mail_config_service_set_save_passwd): New - function, pretty bland. - - * mail-config.h: Prototype our bland new function. (Get it? It's a - pun!) - - * mail-session.c (get_password): Pass the service as well. - -2001-07-25 Jeffrey Stedfast - - * mail-account-gui.c (build_auth_menu): Now takes a - check_supported gboolean argument saying whether or not to disable - non-supported authtypes. - (source_type_changed): Update for build_auth_menu. - (transport_type_changed): Same. - (service_check_supported): Pass in TRUE for the disable - non-supported authtypes to build_auth_menu and also disable - check-supported button and the authtype menu if we get a NULL - supported auth list. - - * mail-callbacks.c (mail_generate_reply): Initialize `me' to NULL. - (forward_attached): If we are only forwarding a single message, - pass the message along as the callback data, else pass NULL. - (do_forward_attach): Updated for changes to - forward_get_composer(). - (do_forward_non_attached): Same. - (forward_get_composer): Try to guess which account to forward the - message from if the message passed in is non-NULL. - -2001-07-24 Peter Williams - - * mail-config.c (mail_config_write): Um, write the HTML signature - settings in the right place. Whoops. - -2001-07-24 Jason Leach - - * mail-callbacks.c (delete_msg): If we're deleting the last - message, select the previous, not next, which actually selects - nothing. Fixes #5323. - -2001-07-24 Jeffrey Stedfast - - * mail-ops.c (save_part_save): Pass the O_TRUNC flag to open so - that we don't leave trailing garbage at the end of the file if the - new file content is shorter than the old file content. - - * component-factory.c (create_view): Fix for bug #5174. - -2001-07-24 Jason Leach - - * mail-config.c (config_read): Match the prefix for the - "remember_passphrase" setting with where it's being saved to - (/Mail/Prompts), so the setting gets loaded correctly. Fixes - #5351. - -2001-07-24 Jeffrey Stedfast - - * mail-format.c (handle_text_plain): check_specials if this is an - application/pgp type as well. - - * mail-ops.c (add_vtrash_info): When dumping the CamelURL to a - string, hide all the params. - -2001-07-24 Jeffrey Stedfast - - * mail-callbacks.c (guess_me): Do a case-insensitive comparison. - (mail_generate_reply): Only resort to the source account's - identity if we can't find out which identity to use based on the - recipients of the message first. - - * mail-config.c (mail_config_get_default_account): Make sure to - return the 0th account if we don't have a default. We don't want - to return NULL. - - * mail-callbacks.c (empty_trash): Use mail_tool_get_trash for the - remote store trash folders. - - * mail-tools.c (mail_tool_get_trash): New convenience function. - -2001-07-24 Jason Leach - - * mail-config.c (config_read): get_boolean_with_default for the - "Mark as read" timeout, not get_long_with_default. Fixes #5176. - -2001-07-24 Peter Williams - - * mail-folder-cache.c (make_folder_name): Don't display "(0 unsent)" if - the outbox is empty. - - * mail-local.c (init_trash): Set up the local trash in the folder - cache. - - * mail-folder-cache.c (update_idle): Make the error reporting a little - but more descriptive. - -2001-07-24 Peter Williams - - * mail-config.glade: Add new label widgets with a message that SSL - isn't supported. - - * mail-account-gui.h: Add a new member to the Transport GUI struct - for the 'SSL is not supported' message. - - * mail-account-gui.c (source_type_changed): Change logic to display - a message stating that SSL isn't supported if SSL isn't supported. - (transport_type_changed): Same. - (mail_account_gui_new): Also load the labels for the the no-SSL - message. - - * mail-accounts.c (construct): Fix typo. - -2001-07-24 Not Zed - - * component-factory.c (create_folder): Dont call notifyResult here - if we've just launched a thread to do the work, it calls it - itself. This apparently breaks the importers, but thats a - different issue. - -2001-07-23 Not Zed - - * mail-mt.c (mail_msgport_replied): Go back to calling - mail_msg_free here. - (mail_msg_destroy): Remove the operation unregistration stuff. - (mail_msg_received): And put it here, so we unregister as soon as - the async part of the operation is complete. I thought about this - and we should be doing this anyway so we register/unregister - always in the same thread, although the camel_operation api - doesn't enforce it, this *is* what it expects. - - * message-list.c (regen_list_regen): re-add reporting to - rebuilding the message list. Basically fixes #4931 - -2001-07-23 Jeffrey Stedfast - - * mail-search.c (toggled_fwd_cb): Oops. Uncomment this code since - Trow fixed GtkHTML to actually have this function now. - - * mail-config.glade: Fixed the "Read" to be Read in the glade file - per menesis' request. - - * mail-accounts.c (construct): Give the dialog a Close button - instead of an OK button. - (prompt_bcc_only_toggled): New. - (threaded_list_toggled): New. - (show_preview_toggled): New. - (construct): Add code for the bcc-only-prompt, threaded-list, and - show-preview checkboxes. - - * mail-ops.c (transfer_messages_transfer): If the source and - destination folders are the same, just mark the uids as undeleted - (in case they were marked as deleted before). - -2001-07-23 Jon Trowbridge - - * mail-search.c (begin_cb): Carefully check for NULL everywhere, - and do the right thing if the message we are currently looking at - gets expunged. (Bug #4870) - -2001-07-23 Jason Leach - - [Bug #5225: No UI way to mark as unimportant] - - * folder-browser.c (on_right_click): Do the necessary stuff to - show or hide the correct "Mark Important" or "Mark as Unimportant" - menu items depending on the status of messages that are selected. - - * folder-browser-ui.c: Add the MarkAsUnimportant verb here. - - * mail-callbacks.c (mark_as_unimportant): Simple function that's - the callback for these new menu items. - -2001-07-22 Ettore Perazzoli - - * component-factory.c (remove_folder): Updated to get a @type - argument. Return an error if the type isn't "mail". - (xfer_folder): Likewise. - -2001-07-21 Ettore Perazzoli - - * component-factory.c: Make types "mailstorage" and "vtrash" - non-user-creatable. - -2001-07-20 Jason Leach - - * mail-summary.c (generate_html_summary): Change this back to the - "evolution:/local/Inbox" URI. - -2001-07-20 Peter Williams - - * component-factory.c (storage_remove_folder): Don't let the user - remove vtrash folders. - -2001-07-20 Peter Williams - - * mail-mt.c (mail_msgport_replied): Fix DanW's fix. Pass the right - arguments to mail_msg_destroy. - - * component-factory.c (component_fn): Don't populate the context - menu; our only action didn't even work. - (populate_folder_context_menu): Removed. ChangeFolderProperties - needs a FolderBrowser which we don't have. It didn't even work - before. - - * mail-local.c (mail_local_reconfigure_folder): Bring the creation - of the hash table to the beginning to prevent warnings. Complain - if the mailbox is non-local. - -2001-07-20 Jeffrey Stedfast - - * mail-ops.c (filter_folder_filter): Don't expunge the source - folder if we have a cache. - -2001-07-20 Dan Winship - - * mail-mt.c (mail_msgport_replied): Use mail_msg_destroy rather - than mail_msg_free, so the cancellation operation gets - unregistered and doesn't leak two file descriptors. - -2001-07-19 Jason Leach - - * mail-summary.c (generate_html_summary): Update this - evolution:/local/ URI to evolution:/Local Folders/ to go along - with today's shell changes. - -2001-07-19 Jason Leach - - * mail-display.c: Fix #4605: "Save Image as" should be "Save Image - as...". - -2001-07-19 Jason Leach - - * mail-display.c (mail_display_new): Set the vertical scrolling - policy for the mail display to AUTOMATIC, only get a scrollbar if - the e-mail is longer than one frame. - - * folder-browser.c (my_folder_browser_init): We were setting the - policy twice (and to two different things). Removed this one. - - * message-list.c (message_list_init): Set the policy for the - message list scroll frame to be horizontal=NEVER, - vertical=AUTOMATIC (scrollbar only if you have >1 page of - messages). - -2001-07-19 Peter Williams - - Track the NoSelect changes in Camel. - - * mail-callbacks.c (create_folders): We don't need to check if - the URL is NULL or not anymore. - - * component-factory.c (create_noselect_control): New - function. Create a dummy control for folders that can't contain - messages (ie \NoSelect) - (create_view): If the URI says the folder is noselect, make a - dummy control. FIXME: still should merge in the global UI - elements. - (xfer_folder): Don't allow the operation if the destination is - NoSelect. - (destination_folder_handle_motion): Ditto. - (destination_folder_handle_drop): Ditto. - -2001-07-19 Not Zed - - * mail-local.c (reconfigure_folder_reconfigure): remvoed - register/start/end etc code. - - * mail-ops.c (get_messages_desc): Add the count here. - (get_messages_get): Remove the register/start code, its handled - above us. - (save_messages_desc): Added count. - (save_messages_save): Removed register/start/end code. - - * mail-mt.c (mail_msg_received, mail_msg_destroy): Changed to use - camel_operation rather than mail_status. - (mail_msgport_received, mail_msgport_replied): Turn of the - mail_status stuff, we dont need to report on stuff running in the - gui thread right? - (retrieve_shell_view_interface_from_control, set_view_data, - mail_statusf, mail_status, mail_status_end, mail_status_start, - status_timeout, do_del_status, set_status_op): removed now - redundant stuff. - (mail_msg_free): Removed reference to timeout_id. - -2001-07-18 Not Zed - - * mail-local.c (reconfigure_folder_reconfigure): Changed to use - camel_operation rathre than mail_status. - (reconfigure_folder_describe): re-enabled this function. - - * mail-ops.c (get_messages_get): Changed to use camel-progress for - status reporting. - (save_messages_save): Likewise. - -2001-07-17 Not Zed - - * mail-mt.c (struct _mail_msg_priv, destroy_objects, mail_msg_new, - mail_msg_free, do_op_status): Changed to use an EvolutionActivityClient for - progress. - -2001-07-18 Jason Leach - - * mail-tools.h (mail_tool_get_local_inbox_url): Remove this - prototype for a function that was removed long ago. - (mail_tool_get_local_movemail_url): Ditto. - -2001-07-18 Jason Leach - - [Simplifying how default account is stored and used internally, - fixes possabilities of having multiple default accounts and things - like deleting the current default account] - - * mail-account-gui.c (mail_account_gui_new): Update for new way of - finding out the default account. - (mail_account_gui_save): Ditto. - - * mail-accounts.c (load_accounts): Ditto. - - * mail-config-druid.c (make_default_account): Ditto. - - * mail-config.c: Added an int MailConfig::default_account, to be - used instead of a 'default_account' boolean on each mail account. - (mail_config_set_default_account_num): New function, facilitates - things. - - * Mail.idl: removed the Account::default_account boolean. - -2001-07-18 Jeffrey Stedfast - - * mail-tools.c (mail_tool_generate_forward_subject): Do what was - suggested in #4596. - -2001-07-18 Peter Williams - - * mail-accounts.c (construct): Add GTK_WIDGET to the charset - picker. Reportedly prevent a craash for someone... ? - - * mail-config.glade: Typo fix. - Later: And actually fix the typo. - -2001-07-17 Jeffrey Stedfast - - * mail-accounts.c (mail_delete): Setup the auto-receive here - instead. - - * mail-config.c (mail_config_remove_account): Don't setup the - auto-recv here. - -2001-07-17 Iain Holmes - - * mail-accounts.c (mail_able): Reset the auto receive. - - * mail-config.h (mail_config_remove_account): Reset the autoreceive. - -2001-07-17 Jason Leach - - * mail-account-gui.c (source_type_changed): Fix for last change: - hide the entire widget, not just the entry. - -2001-07-17 Jeffrey Stedfast - - * folder-browser.c (message_list_drag_data_recieved): Fix to - correctly handle text/uri-lists that contain more than a single - url. - - * component-factory.c (destination_folder_handle_drop): Fix to - correctly handle text/uri-lists that contain more than a single - url. - -2001-07-17 Jason Leach - - * mail-config.glade: Make the Path: entry into a GnomeFileEntry so - you get a nice "Browse..." button that pops up a file selector to - locate your mbox files. Bug #3501. - -2001-07-17 Jeffrey Stedfast - - * mail-format.c (mail_part_toggle_displayed): Cleaned up a bit. - (handle_multipart_encrypted): Replace the encrypted part with the - decrypted part. - -2001-07-17 Iain Holmes - - * mail-accounts.c (mail_delete): Make a nicer dialog. - -2001-07-17 Jeffrey Stedfast - - * mail-local.c (init_trash): Use CAMEL_VTRASH_NAME. - - * mail-ops.c (add_vtrash_info): Use CAMEL_VTRASH_NAME. - - * folder-browser.c: turned off some debugging - -2001-07-16 Jeffrey Stedfast - - * mail-callbacks.c (transfer_msg): Disallow vtrash for now... - - * mail-ops.c (add_vtrash_info): Use g_strcasecmp() when looking - for a Trash folder - it may be lowercase or something funky. - (transfer_messages_transfer): Special-case vtrash folders. - - * mail-local.c (init_trash): No need to specify the vfolder - expression here. This code was moved into camel-vtrash-folder.c - ages ago. - - * component-factory.c: Let VTrash folders accept/export the same - dnd types as normal folders. - -2001-07-16 Peter Williams - - * mail-folder-cache.c (outbox_folder): prototype outbox_folder so - we can check if a folder is it. - (make_folder_name): If the folder is the outbox, display the count - of total messages as "unsent". - (make_folder_status): If the folder is the outbox, display - "unsent" instead of "total" - -2001-07-16 Peter Williams - - * mail-display.c (mail_display_redisplay): Use our own - display_style member instead of the global setting. - (mail_display_init): Initialize display_style. - - * mail-display.h: Include "mail-config.h" and add a display_style - member. - - * mail-format.c (write_headers): Look at the MailDisplay's - display_style instead of using the full_headers data. - - * folder-browser.c (folder_browser_set_message_display_style): Set - the MailDisplay's display style as well as the global display - style. - (my_folder_browser_init): Don't save preference changes by - default. (This is only observered wrt. the message display style - but should apply to other items.) - - * folder-browser-factory.c (folder_browser_factory_new_control): - Set this FB to save the preferences set in it. - - * folder-browser-ui.c (folder_browser_ui_add_message): Read our - display's state instead of the global setting. - -2001-07-16 Peter Williams - - * mail-folder-cache.c (mail_folder_cache_set_folder_browser): DUH. - No need to update every folder if we set the folder browser to - NULL. - -2001-07-15 Jeffrey Stedfast - - * mail-account-gui.c (mail_account_gui_save): Call - mail_autoreceive_setup() so that any changes to the list of - accounts will be respected the next time mail is checked. - -2001-07-13 Peter Williams - - * mail-callbacks.c (expunge_folder): Segfault prevention here if - no uid is currently loaded. - - * mail-vfolder.c (unlist_vfolder): New function. If a vfolder in - our list gets finalized, NULL out info->folder (Is it wrong if - this happens?) Also, locking issues? - (vfolder_uri_to_folder): Hook up to the finalize event here. - -2001-07-13 Jeffrey Stedfast - - * mail-ops.c (filter_folder_filter): Updated to reflect changes in - the filter API by passing in the provided uid cache to - camel_filter_driver_filter_folder. - (mail_filter_folder): Set the cache to NULL. - (mail_fetch_mail): Set the cache to NULL. - (fetch_mail_fetch): If a cache exists for this folder, set - it. When we are finished filtering the incoming messages, the - logic changes a bit. We now save the cache if keep_on_server is - set *or* if there was an exception this way if the user's download - gets interrupted, he won't have to download all the messages - again. - (fetch_mail_fetch): Oh yea, and just so if we get an exception - with `delete' turned on, the next time the user checks mail and an - exception *doesn't* occur, it will go back and mark all the - messages for deletion. - -2001-07-12 Iain Holmes - - * importers/evolution-mbox-importer.c (load_file_fn): Check that - the folder does exist before trying to import it. - -2001-07-12 Jeffrey Stedfast - - * mail-callbacks.c (expunge_folder): Force-hide all deleted - messages before expunging. - (expunged_folder): Restore the user's "hide deleted messages" - preference. - -2001-07-12 Jason Leach - - * mail-callbacks.c (expunge_folder): Only blank the mail display - if the message being viewed is one of those to be expunged. Bug - #4030. - -2001-07-12 Jason Leach - - * mail-config.c (config_read): Should be saving the - 'identity_html_signature' and 'identity_has_html_signature" keys - in the /Mail/Accounts prefix (with the rest of the per-account - stuff, not on it's own) - -2001-07-11 JP Rosevear - - * mail-display.c (get_embedded_for_component): no longer need to - set a my address property - -2001-07-10 Federico Mena Quintero - - * mail-display.c (link_copy_location): Set the CLIPBOARD selection - as well as the primary selection so that Edit/Paste will work in - other programs (e.g. Netscape). - (mail_display_new): Add the target for the CLIPBOARD selection. - -2001-07-10 Jason Leach - - [Bug #4305: Make the automatic mark-as-read timer optional] - - * mail-config.glade: Necessary changes to make the Mark as "Read" - label a toggle button instead. - - * mail-accounts.c (construct): Connect to the "toggled" on our new - toggle. - (timeout_toggled): New callback, called from above. - - * mail-config.c (mail_config_get_do_seen_timeout): New. - (mail_config_set_do_seen_timeout): New. - (mail_config_write_on_exit): Save the preference here. - (config_read): Load it here. - -2001-07-10 JP Rosevear - - * folder-browser.c: Cosmetic patch - replace our defines with the - e-popup ones - - * Makefile.am: Typo - -2001-07-10 Peter Williams - - * mail-format.c (attachment_header): Took the logic of whether or - not to make the attachment header out of the actual function. - (mail_part_is_displayed_inline): Return if the part is being - displayed inline (regardless of whether it is actually inline). - (mail_part_toggle_displayed): Toggle whether it's displayed inline - or not. - (get_inline_flags): Determine whether the part is displayed inline - and whether it is actually inline. - (mail_format_mime_message): Initialize the attachment_status hash - table. - - * mail-display.c (inline_cb): Instead of modifying the - CamelMimePart, use mail_part_toggle_displayed - (button_press): As above. - (pixmap_press): Use mail_part_is_displayed_inline instead of - mail_part_is_inline. Get the MailDisplay from the popup to do - this. - - * mail.h: Add prototypes. - -2001-07-10 JP Rosevear - - * Makefile.am: extra dist the news files - -2001-07-10 Jeffrey Stedfast - - * mail-config.c (mail_config_write_on_exit): Use - bonobo_config_set_string_wrapper. - (mail_config_write): Same. - (bonobo_config_set_string_wrapper): Macro wrapping - bonobo_config_set_string that passes "" as the val if the val is - NULL. - - * mail-callbacks.c (mail_generate_reply): Make sure that the - reply-to addr i non-NULL before trying to add it to the hash - table. - -2001-07-09 JP Rosevear - - * mail-account-gui.c (get_focused_widget): fix typo so it compiles - -2001-07-09 Jeffrey Stedfast - - * mail-format.c (setup_mime_tables): Handle application/pgp using - the text/plain handler. - - * mail-account-gui.c (get_focused_widget): New function to - determine which widget is focused. - - * mail-account-editor.c (apply_changes): Not only flip to the - notebook page that wasn't finished, but also grab the focus of the - incomplete widget. - - * mail-config-druid.c (source_changed): Grab the focus of the - incomplete widget. - (transport_prepare): And here. - (identity_changed): Here too. - - * mail-account-gui.c (mail_account_gui_identity_complete): Take an - incomplete argument so we can set which widget is incomplete and - then the caller can focus it or whatever. - (service_complete): Same. - (mail_account_gui_transport_complete): And again here. - (mail_account_gui_management_complete): And here too. - -2001-07-09 Jeffrey Stedfast - - * mail-format.c (decode_pgp): Update to pass in the `remember' - argument when creating a new pgp context. - (try_inline_pgp_sig): And here... - - * mail-crypto.c (mail_crypto_pgp_mime_part_sign): Update to pass - in the `remember' argument when creating a new pgp context. - (mail_crypto_pgp_mime_part_verify): Same. - (mail_crypto_pgp_mime_part_encrypt): And here... - (mail_crypto_pgp_mime_part_decrypt): And finally here. - - * mail-config.c (mail_config_get_remember_pgp_passphrase): New. - (mail_config_set_remember_pgp_passphrase): New. - (config_read): Read in the "remember passphrase" value. - (mail_config_write_on_exit): Save the remember-passphrase value. - - * mail-accounts.c (construct): Allow the user to set "Remember PGP - Passphrase". - (remember_pgp_passphrase_toggled): Set the toggle state. - -2001-07-09 Peter Williams - - * mail-ops.c (get_folderinfo_got): Check for an exception and - print it. Call done anyway. - (do_update_subfolders): Check for NULL info. - -2001-07-09 Peter Williams - - * mail-config.c (mail_config_write): Some NULL protection for our - strings: pgp_key, html_signature, smime_key. Probably we should do - this for all strings. Either that or change Bonobo Config. - - * message-list.c (message_list_init): Explicitly initialize search - to NULL. Bug 3951 might to be due to a problem wrt this, and it - can't hurt. - -2001-07-09 Dan Winship - - * mail-display.c (save_part): g_strdup the result of - g_get_home_dir since this variable will get free'd later. - - * mail-format.c (mail_lookup_handler): Use - gnome_vfs_mime_get_short_list_applications rather than - gnome_vfs_mime_get_default_application. - - * mail-display.c (pixmap_press): Construct the EPopupMenu array on - the fly, based on the number of applications available to open the - MIME type. - (launch_cb): Figure out which menu item was clicked, and invoke - the appropriate application. Ugh, messy, because of the EPopupMenu - interface. Probably should get rewritten some day. Also, make this - handle apps with expects_uris set too. - -2001-07-09 Peter Williams - - * mail-config.c (mail_config_write): Change html_signature stuff - over to bonobo-config -- someone forgot to do this. - - * mail-folder-cache.c (dm): Gave up and got rid of dm. Just - replaced it with d(g_message()) and set G_LOG_DOMAIN. - -2001-07-09 Peter Williams - - * mail-folder-cache.c (mail_folder_cache_set_update_shellview): - Deleted - (as opposed to #if 0) - (get_folder_info): Changed to assume it has the folder lock. - (make_folder_name): Same. - (make_folder_status): Same. - (update_idle): Don't unlock around the make_folder_ functions. - (*): Changed behavior wrt. get_folder_info. Lock before calling, - but also move preconditions before -- get_folder_info can only - return NULL if uri is NULL. Also add preconditions for other - arguments where necessary. - -2001-07-07 Christopher James Lahey - - * message-list.c (on_cursor_activated_cmd): Check for new_uid != - NULL here before strcmping. - -2001-07-07 Dan Winship - - * main.c (main): Only install the segv_redirect handler if SEGV's - handler is not currently SIG_DFL. Otherwise you get an infinite - SEGV loop if you run with GNOME_DISABLE_CRASH_DIALOG. - -2001-07-07 Christopher James Lahey - - * message-list.c (message_list_select): Made this handle being - given a row that's outside the range better. - -2001-07-06 Jason Leach - - [Fix bug #1100, default account is stored strangely] - - * mail-config.c (mail_config_get_default_account_num): New - function, returns the integer of the position of the default - account, used to save which account is the default to the config - db. - (mail_config_write): Save the default account number here in - "/Mail/Accounts/default_account". - (config_read): Load in which is the default here. - -2001-07-06 Larry Ewing - - * mail-callbacks.c (composer_send_cb): add a NULL check since that - is a valid return. - -2001-07-06 Peter Williams - - * mail-format.c (format_mime_part): Prevent infinite recursion when - viewing attachments that we can't / shouldn't display but are some - form of plaintext. Cf bug #2234 - -2001-07-06 Jeffrey Stedfast - - * folder-browser.c (folder_browser_copy): Freeze and Thaw the - folder. - -2001-07-06 Jeffrey Stedfast - - * folder-browser.c (folder_browser_copy): Mark the messages as - Seen also. - (folder_browser_class_init): Create an atom type for - X-Evolution-Message selection type. - (my_folder_browser_init): Add our multiple selection types, one of - which is the default string type. - - * component-factory.c (destination_folder_handle_drop): Update to - use the new X-Evolution-Message type format. - - * folder-browser.c (selection_get): Convert the - X-Evolution-Message clipboard type to whatever format the target - wants. - (message_list_drag_data_get): Update because the - X-Evolution-Message type changed. - (folder_browser_copy): Same. - (x_evolution_message_parse): And here too. - -2001-07-06 Peter Williams - - * mail-callbacks.c (composer_postpone_cb): Don't free the psd here -- - it will be freed on the "destroy" signal. - - * mail-folder-cache.c (maybe_update): Instead of an idle, use a very - short timeout in hopes of reducing the number of redundant updates. - - * mail-tools.c (mail_tool_uri_to_folder): Only note the folder in the - cache if we successfully got it. - -2001-07-06 Jason Leach - - * mail-callbacks.c (delete_msg): Select the very next message - after deleting, not the next undeleted (it can make things jump - around in annoying ways if you are deleting many messages), bug #4032. - - * folder-browser.c: Forgot to commit the "Mark as Important" right - click menu item. - - * message-list.c (message_list_set_folder): Setup the strikeout - column here (after we've gotten the folder) so we can disable - strikeouts for vtrash folders, part of bug #2224. - -2001-07-06 Dan Winship - - * mail-folder-cache.c (mail_folder_cache_set_folder_browser): Fix - obvious bug in previous bugfix: Pass "fb" to check_for_fb_match() - so only the selected folder gets updated, instead of "all folders - that haven't yet been selected". - -2001-07-06 Ettore Perazzoli - - * component-factory.c (populate_folder_context_menu): New function - to populate the right-click menu for mail folders. - (component_fn): Pass it to `evolution_shell_component_new()'. - -2001-07-05 Jeffrey Stedfast - - * mail-accounts.c (construct): Add a checkbox for prompting when - sending a message with an empty subject. - - * mail-ops.c (mail_send_message): If filtering fails, return right - away. - - * mail-config.c (mail_config_set_show_preview): Okay, apparently I - was wrong. Oh well. - (mail_config_set_thread_list): Fix this one too. - -2001-07-05 Peter Williams - - * mail-vfolder.c (vfolder_uri_to_folder): Add mail folder cache - hookups. - - * Makefile.am: Remove the ridiculuous relic known as - test-mail. Clean up a bit. - - * mail-vfolder.c (vfolder_uri_to_folder): Add mail folder cache - hookups. - -2001-07-05 Peter Williams - - * mail-folder-cache.c (mail_folder_cache_set_folder_browser): - Clear the shell view label if mailer loses focus. - - * mail-ops.c (do_update_subfolders_rec): Check for NULL url before - calling folder cache functions. - -2001-07-04 Gediminas Paulauskas - - * folder-browser-ui.c (message_pixcache): set icon for - ApplyFilters command. - -2001-07-04 Jeffrey Stedfast - - * mail-config.c (mail_config_set_show_preview): Revert Sam's - changes. - - Note: Uhm, g_hash_table_lookup_extended gives us a pointer to the - original value which we can just change to update the hash table - without the need to re-insert - it's already there!! Also, you - don't want to g_hash_table_insert the new value with the same key - without at least first removing the existing bucket. And, you - certainly don't want to g_free() the key after you insert it - - eek!! - -2001-07-03 Sam Creasey - - * mail-config.c (mail_config_set_show_preview): Replace value in - config->preview_hash when it already exists. Old code never - re-inserted into the hash, just assigned to val -- it's an int - here, not a real pointer. - -2001-07-03 Joe Shaw - - * mail-callbacks.c (expunge_folder): Unset the message being displayed - when expunging. This makes expunged messages not show in the preview - pane when they're not there anymore. Fixes #3591. - -2001-07-03 Joe Shaw - - * mail-callbacks.c (mail_reply): If msg is NULL, fetch the message - and requeue a mail_reply call. Fixes bug #3816. - (requeue_mail_reply): Callback from mail_get_message(). - -2001-07-03 Jeffrey Stedfast - - * mail-config.c (mail_config_get_show_preview): Use a better - GHashTable technique that will hopefully solve some bugs and also - use _with_default bonobo-config call. - (mail_config_set_show_preview): No sense in removing the entry - from the hash table and then re-inserting it. Just reset the - value. - (mail_config_get_thread_list): Use the same logic. - (mail_config_set_thread_list): And again here. - -2001-07-03 Peter Williams - - * mail-folder-cache.c (make_folder_name, make_folder_status): - Split make_string into these. - (update_idle): Use (name and status) instead of (wide and thin) - for the text. - -2001-07-03 Jason Leach - - * folder-browser-ui.c: "Mark as Important" menu thingy here. - -2001-07-03 Peter Williams - - * folder-browser.c (message_list_drag_data_get): Compile fixes. - #include errno.h and gnome-dialog-utils.h. s/dirname/tmpdir/ - -2001-07-03 Peter Williams - - Prevent folders from appearing to have -1 new messages. Prevent - nonactive folders from updating the title bar. Make the title bar - update when switching to an already-opened folder. - - * mail-folder-cache.c (update_message_counts): Ignore the value - for 'unread' if it is -1. - (get_mail_info_receive): Same - (mail_folder_cache_note_folderinfo): Same. - (get_folder_info): Initialize 'fb' to NULL. - (mail_folder_info): Add 'fb' member. - (mail_folder_cache_note_fb): Change note_message_list to this. - (update_idle): Only update the ShellView if the active folder - browser is the same as the one that the MFI references. - (mail_folder_cache_set_folder_browser): New function. Use it to - set the active folder browser. NULL is okay. - (check_for_fb_match): Called from the above. If the MFI has the - new folder browser as its view, queue an update. - - * mail-folder-cache.h: Fix prototypes. - - * mail-callbacks.c (create_folders): Check if fi->url is nonnull. - - * folder-browser.c (got_folder): Change to use note_fb instead of - note_messge_list. - - * folder-browser-factory.c (control_activate): Set the folder - browser - (control_deactivate): Clear it here. - (fb_get_svi): Kill some inappropriately cut-n-pasted code. - -2001-07-03 Dan Winship - - * mail-config.glade: Rename some of the widgets in the news config - to not conflict with the mail config stuff, so the mail config - druid will work again. - -2001-07-03 Jeffrey Stedfast - - * folder-browser.c (message_list_drag_data_get): Use mkdtemp if we - have it, else use mktemp but make the code safer than it was - previously. - - * mail-display.c (launch_cb): Free the template string if the - tempdir failed to be created. - - * folder-browser.c (message_list_drag_data_get): Hide the URL - passwd, auth, and params. - (folder_browser_copy): Same. - -2001-07-03 Dan Winship - - * mail-ops.c (filter_folder_filter): Don't pass a dirty exception - to camel_folder_sync. Fixes an IMAP filtering crash. - -2001-07-02 Sam Creasey - - * mail-account-editor-news.c: Added an MailAccountEditorNews, for - NNTP configuratuion. Based on MailAccountEditor, but stripped. - - * Makefile.am: added mail-account-editor-news.c and - mail-account-editor-news.h to SOURCES if ENABLE_NNTP is defined. - - * mail-accounts.c (load_news): Moved this function, and fixed some - slight brokenness. - (news_edit): Added functional code using MailAccountEditorNews - (news_add): Added functional code using news_edit after - allocation. - - * mail-config.glade: news_editor_window widget added. Used by - MailAccountEditorNews. - - * mail-display.c (save_data_cb): Store the pathname used when - saving messages so that the next save box will default to the - previous path. - - * message-browser.c (message_browser_new): add signal handler for - size_allocate on the message browser. Thus new windows are size - as they were last allocated. - (message_browser_size_allocate_cb): handler to store allocations. - - * message-list.c (message_list_setup_etree): connect to the - info_changed signals for the state of the message_list->tree. - Save the folder state to disk, so that when additional - message_lists are created, they are consistant. e.g. the next - buttons do the same thing in the browser, and in the message - viewer after changing sorting options. - - * subscribe-dialog.c (build_tree): freeze sc->folder model while - building the tree. Not doing so takes a very long time over 40000 - newsgroups. - -2001-07-02 Jeffrey Stedfast - - * mail-accounts.c (construct): Setup the Empty Trash On Exit - widgets. - - * mail-config.c (config_read): Option to emtpy trash on exit. - (mail_config_write_on_exit): Same. - (mail_config_set_empty_trash_on_exit): Set the option. - (mail_config_get_empty_trash_on_exit): Get the option. - - * component-factory.c (owner_unset_cb): Empty the trash folders if - the user set the "empty trash on exit" option. - -2001-07-02 Jeffrey Stedfast - - * mail-callbacks.c (transfer_msg): Updated for the - mail_transfer_messages API. - - * folder-browser.c (message_list_drag_data_recieved): Update for - the mail_transfer_messages API. - (selection_received): Same. - - * mail-ops.c (mail_transfer_messages): Renamed from - mail_do_transfer_messages and also added a callback/data arguments - since we need it component_factory::xfer_folder. - - * component-factory.c (xfer_folder): Use mail_transfer_messages - instead. - (destination_folder_handle_drop): Update to pass in a NULL - callback arg and a NULL data argument to mail_transfer_messages. - -2001-07-02 Larry Ewing - - * mail-display.c (save_part): move the saving logic out of save_cb - so that we can reuse it for the image saving code. - (save_cb): call save_part. - (save_url): new function to resolve an save an html url. - (image_save_as): save function for images and. Add it to the - link_menu, and add MASK_URL and MASK_SRC to the structure so that - we cans show the proper menus. - (html_button_press_event): call get_src as well to find external - urls references. Add popup masking. - -2001-07-02 Peter Williams - - * README.async: Add a warning about how wrong this document is. - -2001-07-02 Peter Williams - - * mail-folder-cache.h: New file. Protoypes for the Mail Folder - Cache, which provides a place for all the disparate pieces of the - mailer to save bits of information about a folder. Centralizes the - information display code. - - * mail-folder-cache.c: New file. Implements the Mail Folder Cache. - - * Makefile.am (evolution_mail_SOURCES): Add the - mail-folder-cache.{c,h} - - * folder-browser-factory.c (fb_get_svi): Copy of that absurdly - long-named function in mail-display.c that gets the - GNOME_Evolution_ShellView. - (control_activate): Set the ShellView for the folder cache. - - * folder-browser.c (got_folder): Tell the folder browser about - this folder. - - * mail-callbacks.c (create_folders): Tell the folder cache about - the new folders. - - * mail-local.c (reconfigure_folder_reconfigure): Don't unhook our - events as we no longer hook them up. - (register_folder_registered): Tell the folder cache about this - folder's place in the local storage. - (register_folder_register): No longer hook events; the Folder - Cache will do this. - (local_folder_changed, local_folder_changed_proxy): Move to - mail-folder-cache.c - (free_local_folder): No longer unhook events. - - * mail-ops.c (do_update_subfolders_rec): Instead of setting the - folder status ourselves, inform the Folder Cache about the - changes. - - * mail-tools.c (mail_tool_uri_to_folder): Replace danw's cache - with the new Mail Folder Cache. - (cache_folder, etc): removed. - -2001-07-02 Jeffrey Stedfast - - * mail-accounts.c: #include widgets/misc/e-charset-picker.h since - it was moved there from libgal. - -2001-07-02 Peter Williams - - * importers/evolution-mbox-importer.c (mbox_factory_fn): Kill - irritating "Returning" g_warning. - -2001-07-02 Dan Winship - - * mail-session.c (get_filter_driver): Implement this, based on - code that used to be in mail-ops.c - - * mail-ops.c (mail_load_filter_context, setup_filter_driver): - Moved into MailSession::get_filter_driver. - (filter_get_folder): Moved to mail-session.c - (mail_filter_folder, mail_filter_on_demand, mail_fetch_mail, - mail_send_mail, mail_send_queue): Remove FilterContext args, use - camel_session_get_filter_driver. - - * mail-send-recv.c (mail_send_receive, mail_receive_uri): - Remove FilterContexts - -2001-07-01 Chris Toshok - - * subscribe-dialog.c (subscribe_dialog_gui_init): the FolderSearch - control is in a different dockitem now. - -2001-07-01 Dan Winship - - * mail-tools.c (update_unread_count): Ref the folder before - proxying the event, in case there's only one reference to it and - it gets unreffed before the other end of the event handler runs. - (update_unread_count_main): And unref it when we're done. - (mail_tool_uri_to_folder): Only hold the lock around the hash - table operations, not the entire function. Holding the lock the - whole time can cause deadlock when resolving vfolders, and the - CamelSession and CamelStore locks ensure that multiple threads - calling this function will end up with the same CamelFolder object - at the end anyway, so we just need to lock and re-check the cache - at the end before adding the folder to the cache. - -2001-06-30 Ettore Perazzoli - - * folder-browser-ui.c: Get MailNext/MailPrevious to use - next-message.png and previous-message.png, respectively. Also - change Print to use print.png. - -2001-06-30 Jon Trowbridge - - * mail-display.c (make_popup_window): Changed to return the - created window. - (find_socket): Added. Copied from e-shell-view.c. The fact - that I'm copying this bit of code all over isn't cool. - (html_button_press_event): Properly destroy the popup window when - the widget inside the control is destroyed. - - * mail-callbacks.c (addrbook_sender): Added. Implements - the "Add sender to addressbook" right-click. (Bug #3645) - (find_socket): Added. Copied from e-shell-view.c. - - * folder-browser.c: Added "Add sender to addressbook" to - context_menu[]. - - * mail-display.c: (handle_embedded_address_object): Removed. - (on_object_requested): Removed handling for embedded address - objects. (Which was obsolete crap.) - -2001-06-29 Larry Ewing - - * mail-display.c (html_button_press_event): remove redundant - logic. - - * mail-callbacks.c (create_msg_composer): make sure we show the - sig file. - -2001-06-29 Jeffrey Stedfast - - * folder-browser-factory.c (control_deactivate): Turn folder - syncing back on here so that IMAP folders will sync without - needing to hit Send & Receive. - - * mail-callbacks.c (ask_confirm_for_only_bcc): Throw up the - confirmation dialog. - (composer_get_message): If the user only specified Bcc recipients, - prompt him/her to make sure we should continue and risk the server - adding an Apparently-To header. - - * mail-config.c (config_read): Read in config option for prompting - when only Bcc recipients are specified. - (mail_config_write_on_exit): Save the option. - (mail_config_get_prompt_only_bcc): New. - (mail_config_set_prompt_only_bcc): New. - -2001-06-29 Dan Winship - - * mail-account-gui.c (build_auth_menu): Take two authtypes lists, - "all", and "supported", and make the unsupported authtypes grayed - out in the menu rather than missing. - (source_type_changed, transport_type_changed, - service_check_supported): Update build_auth_menu calls. - -2001-06-29 Radek Doulik - - * mail-account-gui.c (menu_file_save_cb): implemented plain saving - -2001-06-28 Radek Doulik - - * mail-account-gui.c (load_signature): implemented plain load - (load_signature): use e_msg_composer_get_signature_html - -2001-06-28 Peter Williams - - * mail-ops.c (mail_send_message): Revert fejj's Bcc header removal; - this unsets the BCC recipients and so doesn't send to the Bcc'd - people at all. - -2001-06-28 Jeffrey Stedfast - - * mail-send-recv.c (free_send_data): The e_iterator_get() returns - a gconstpointer and we need a non-const BonoboControl so cast it. - - * mail-account-gui.c (mail_account_gui_new): - gui->check_html_signature is GtkToggleButton not a GtkCheckButton. - - * folder-info.c: Added some #include's to supress warnings. - -2001-06-28 Ettore Perazzoli - - * mail-display.c: Fix case of labels in the `link_menu' so that it - is consistent with that of the other menus in Evolution - [i.e. "Copy Link Location" instead of "Copy Location" etc.]. - -2001-06-28 Ettore Perazzoli - - * mail-display.c (invisible_selection_get_callback): New, signal - handler for "selection_get" on the GtkInvisible widget we use for - selections. - (invisible_selection_clear_event_callback): New, signal handler - for "selection_clear_event" on the same invisible widget. - (mail_display_init): Initialize the `selection' and `invisible' - members. Also, explicitly initialize all the other fields as - well. - (mail_display_destroy): Free `selection'. Destroy `invisible'. - (link_copy_location): Re-implemented to just make the mail display - become the owner of the primary selection. - (on_selection_get): Remove `#if 0'ed code. - (mail_display_new): Remove the `#if 0'ed code that would connect - selection stuff to the HTML widget. - (mail_display_new): Connect the signals and add the targets to the - invisible widget. - - * mail-display.h: New members `selection' and `GtkInvisible' in - `MailDisplay'. - -2001-06-28 Jeffrey Stedfast - - * mail-config.c (mail_config_write_on_exit): Don't bother trying - to save the passwd if the url is NULL. - - * folder-browser.c (vfolder_mlist): Strip the mlist name to fix - bug #3732. - - * component-factory.c (destination_folder_handle_drop): Since we - have an exception variable, we might as well use it when getting - folders too. - - * folder-browser.c (message_list_drag_data_recieved): Call - gtk_drag_finish. - -2001-06-28 Dan Winship - - * mail-tools.c (mail_tool_uri_to_folder): After finding a folder, - attach to its "folder_changed" and "message_changed" signals. - (update_unread_count, update_unread_count_main): Moved here from - folder-browser but basically unchanged. Doing this here lets us - get folder tree updates for folders that have had messages - moved/copied/filtered into them, but which don't yet have a view - associated with them. - - * folder-browser.c (update_unread_count, update_unread_count_main, - etc): Moved to mail-tools.c - -2001-06-28 Radek Doulik - - * mail-config.c: use new fields everywhere - - * mail-config.h: as below - - * Mail.idl: added html_signature and has_html_signature - -2001-06-28 Ettore Perazzoli - - * component-factory.c (component_fn): Register for the "mailto" - schema. - (handle_external_uri_cb): Callback for the "handle_external_uri" - signal. - (component_fn): Connect it. - -2001-06-27 Ettore Perazzoli - - * component-factory.c (component_fn): Pass NULL as the - @external_uri_schemas argument to - `evolution_shell_component_new()'. - -2001-06-27 Peter Williams - - * folder-browser-ui.c: Uncomment EditSelectThread. Yaay! - - * mail-callbacks.c (select_thread): New function. Self-explanatory - name. Implementation is a little hairy. - - * mail-callbacks.h: Prototype it here. - - * mail-callbacks.c (invert_selection): Here too. - (select_all): Here too. - - * subscribe-dialog.c (subscribe_select_all): Update to use new - ETree accessors. - (subscribe_invert_selection): Here too. - -2001-06-27 jacob berkman - - * folder-browser.c (save_cursor_pos): work around an e-tree bug - -2001-06-27 Jeffrey Stedfast - - * folder-browser.c: Fixed Cut/Copy/Paste to work - it turns out I - couldn't share a single GtkInvisible between all the - FolderBrowser's after all. - -2001-06-27 Peter Williams - - * folder-browser-factory.c (control_deactivate): Change to use - more reality-based API below. - Include folder-browser-ui.h too. - (control_activate): Remove now-unused 'int state'. - - * folder-browser-ui.h: Changed prototypes to match changes below. - - * folder-browser-ui.c (folder_browser_ui_rm_message): Commented out - to reflect reality of how this stuff works (you can't actually remove - the pieces). - (folder_browser_ui_rm_global): Same. - (folder_browser_ui_rm_list): Left because here we add the view menus. - (folder_browser_ui_add_list): ... which were moved here. - (folder_browser_ui_rm_all): New function, does the job of old ui_rm() - -2001-06-26 Peter Williams - - * folder-browser-ui.c: New file derived from - folder-browser-factory.c. Contains the Bonobo UI code, split into - three groups as described in ui/ChangeLog. Also contains the - GalView stuff and the hookups into the Bonobo UI stuff. - - * folder-browser-factory.c: Move most of the UI stuff to - folder-browser-ui.c. - (control_activate): Add all three kinds of UI element to this - folderbrowser. - (control_deactivate): Remove all three kinds. - - * folder-browser-ui.h: New file. Prototypes functions to add UI - elements to a FolderBrowser. - - * Makefile.am: Add folder-browser-ui.{c,h} - - * message-browser.c (PARENT_TYPE): Change to BONOBO_TYPE_WINDOW - (message_browser_destroy): Chain to parent destroy function. - (set_bonobo_ui): New function. Add the 'message' functions from - the folder browser to our UI. - (message_browser_close): BonoboVerbify this. - - * message-browser.h: Convert to BonoboWindow. - -2001-06-26 Jeffrey Stedfast - - * folder-browser.c (my_folder_browser_init): Helps if I spell - "received" correctly. - - * mail-config.c (mail_config_set_thread_list): If the value is - already in the hash table, first remove it before setting the new - value so we don't leak. - (mail_config_set_show_preview): Same. - -2001-06-26 Dan Winship - - * mail-mt.c (op_status_timeout): Don't pop up a progress dialog to - say "I already finished this a while ago". - - * component-factory.c (storage_create_folder): Pass the path - prefix to folder_created so it can add it to the folder tree in - the right place. - - * mail-callbacks.c (folder_created): Take a path prefix. - -2001-06-26 jacob berkman - - * mail-config.c (mail_config_get_show_preview): make ettore stop - complaining so i can get back to work - -2001-06-26 Jeffrey Stedfast - - * component-factory.c (message_rfc822_dnd): No longer returns a - gboolean and also takes a CamelException. - (destination_folder_handle_drop): Do better error checking. - - * folder-browser.c (my_folder_browser_init): Connect to the - tree-drag-data-recieved signal. - (message_list_drag_data_recieved): New function that handles the - recieving end of the DnD event. - (x_evolution_message_parse): New convenience function to parse the - x-evolution-message type so that the cut/paste and DnD code can - share it. - (selection_received): Use x_evolution_message_parse(). - - * mail-config.c (config_read): Read in the default show_preview - value. - (mail_config_write_on_exit): Save the default show_preview value - as well as saving the individual settings for each URI that has - been changed. - -2001-06-25 Joe Shaw - - * folder-browser.c (invisible_destroyed): Check to make sure that - clipboard_selection is non-NULL before we g_byte_array_free() it. - -2001-06-25 jacob berkman - - * mail-send-recv.c (free_send_data): sync folders after we've - gotten mail - - * folder-browser-factory.c (control_activate): set the ui - component on the folder browser - (control_activate): update the view preview item - (control_deactivate): don't sync the folder here - (control_deactivate): unset the ui component of the folder browser - - * mail-callbacks.c (toggle_flags): stuff from jleach to add an - importance keybinding - (mark_as_important): ditto - (toggle_as_important): again - - * mail-config.c (mail_config_get_show_preview): - (mail_config_set_show_preview): basically a copy of - get_thread_list() but for the preview pane - - * folder-browser.c (folder_browser_destroy): unref the our ui - component - (folder_browser_set_ui_component): new function for setting the ui - component - (save_cursor_pos): - (set_cursor_pos): try to show the selected row when the preview - pane is shown - (folder_browser_set_message_preview): implement - (folder_browser_toggle_preview): toggle the preview (duh) - (on_key_press): add keybindings for marking as important (!), and - hiding the preview pane (q) - (etree_key): clean up a little bit, and make enter either show the - preview pane or open the message - (fb_resize_cb): only save the paned size if the preview is alread - shown - (folder_browser_gui_init): pass ourselves to fb_resize_cb - (on_message_selected): only add the timeout if the preview is - shown - -2001-06-25 Jeffrey Stedfast - - * folder-browser.c (folder_browser_destroy): Unref the invisible - window that we use for slections. - (folder_browser_class_init): Init the clipboard_atam type. - (selection_get): New - (selection_clear_event): New - (selection_received): New - (folder_browser_copy): New function to copy the message-list - selection. - (folder_browser_cut): New function to cut the message-list - selection. - (folder_browser_paste): New function to paste the message-list - selection. - (my_folder_browser_init): Initialize `invisible` if it's NULL else - ref it - also set some signals on it. - - * folder-browser-factory.c: Added verbs for cut/copy/paste. - -2001-06-23 Jason Leach - - * mail-local.c (local_storage_removed_folder_cb): Fixes here for - removing folders. - - * mail-ops.c (remove_folder_get): Some fixes in here too. - -2001-06-22 Jeffrey Stedfast - - * mail-config.c (config_read): Duh, we saved the charset as - "default_charset", not "charset" - no wonder the correct charset - menu item was never being set. - -2001-06-21 Jeffrey Stedfast - - * mail-ops.c (mail_send_message): Temporarily remove the Bcc - header before sending the message. - -2001-06-21 Jon Trowbridge - - * mail-display.c (html_button_press_event): Remove empty "name" - property setting from the popup control. - -2001-06-21 Jeffrey Stedfast - - * mail-callbacks.c (composer_get_message): Allow the message to be - sent even if there are no To recipients but only as long as there - are other recipients defined. - -2001-06-21 Jason Leach - - * component-factory.c (mail_remove_storage): Deregister the - storage from the shell so it will get removed from the folder - tree. - -2001-06-20 Kjartan Maraas - - * folder-browser.c: More than one accel key is a tad - confusing. - -2001-06-19 Jeffrey Stedfast - - * mail-display.c: #include "folder-browser-factory.h" - - * component-factory.c (mail_remove_storage): New function to - remove an EvolutionStorage. - - * mail-accounts.c (mail_delete): Remove the storage from the - folder-tree. - (news_delete): Same. - -2001-06-19 Jeffrey Stedfast - - * component-factory.c (destination_folder_handle_drop): Accept - text/uri-list mime types - this allows us to drag messages from - Nautilus into an Evolution folder. - - * folder-browser.c (message_list_drag_data_get): Do cleanup and - better error handling. - -2001-06-19 Jon Trowbridge - - * mail-tools.c (mail_tool_do_movemail): Properly clean up the - movemail files when no mail was received. - -2001-06-19 Radek Doulik - - * mail-format.c (write_field_row_begin): add column with   - between header name and value - (write_field_row_begin): hmm, use just bold   as it looks - better - -2001-06-18 Jeffrey Stedfast - - * component-factory.c (destination_folder_handle_drop): Use a nice - switch statement and use the new enum values. - - * mail-callbacks.c (list_add_addresses): Now takes a hash table of - already-used-recipients so that we don't get duplicates. - (mail_generate_reply): Pass in a rcpt_hash argument to - list_add_addresses(). These changes fix bug #1639. - -2001-06-18 Dan Winship - - * Makefile.am (evolution_mail_LDADD): Remove DB3_LDADD - -2001-06-18 Jeffrey Stedfast - - * component-factory.c: Change the drop-type "x-evolution-dnd" to - "x-evolution-message" since we want to be able to DnD more than - one data type ;-) - - * folder-browser.c: Change supported DnD drop types to disclude - URI_LIST as that seems to crash Nautilus and seems overly - complicated. Since I am going to be supporting message/rfc822, - hopefully Nautilus can handle that or else maybe something like - text/plain. - (message_list_drag_data_get): Remove the code for URI_LIST. - -2001-06-14 Not Zed - - * mail-tools.c (mail_tool_uri_to_folder): If we have a fragment in - the url, use that as the folder name, and not the path component. - -2001-06-13 Not Zed - - * component-factory.c (mail_load_storages): Added temp hack to let - spool providers show up in the list. - -2001-06-16 Jeffrey Stedfast - - * folder-browser.c (my_folder_browser_init): Allow user's to - "copy" drag & drop rather than just "move". - -2001-06-15 Jeffrey Stedfast - - * component-factory.c (destination_folder_handle_drop): Implemented. - - * message-list.c (message_list_construct): Don't connect to the - DnD signals here. - (message_list_drag_data_get): Removed. - (add_uid): Removed. - - * folder-browser.c (my_folder_browser_init): Connect to DnD signals. - (message_list_drag_data_get): Implemented. - -2001-06-15 Jeffrey Stedfast - - * mail-ops.c (mail_send_message): Fixed misuse of an uninitialized - variable. - - * component-factory.c (destination_folder_handle_drop): Implemented. - - * mail.h: Added prototype for evolution_folder_info_factory_init. - - * mail-ops.c (mail_do_transfer_messages): Now takes a const char* - as the dest_uri. This works better all around since we strdup'd - the string anyway. - -2001-06-15 Dan Winship - - * mail-format.c (mail_format_mime_message): We can't output - "" and "" here because it gets called recursively to - display message/rfc822 subparts. - (mail_format_raw_message): Add padding to match the formatted - display. - - * mail-display.c (mail_display_redisplay): Move rodo's html header - changes from mail_format_mime_message to here. - -2001-06-14 Jeffrey Stedfast - - * folder-browser.c (got_folder): Updated to reflect changes to - mail_config_[g,s]et_thread_list(). - (folder_browser_toggle_threads): Same. - - * folder-browser-factory.c (control_activate): Updated to reflect - changes to mail_config_[g,s]et_thread_list(). - - * mail-config.c (mail_config_write_on_exit): Do cleanup when we're - done. - (mail_config_set_thread_list): Send in a URI so we can save the - state on a per-folder basis. - (mail_config_get_thread_list): Send in a URI so we can retrieve - the state on a per-folder basis. - - * component-factory.c: Setup the accepted_dnd_types. Also added - skeleton code for DnD. - -2001-06-14 Jeffrey Stedfast - - * folder-browser-factory.c: Add Reply-to-List bonobo verbs. - - * folder-browser.c: Add Reply-to-List menu items. - - * mail-callbacks.c (mail_reply): Use an enum for specifying the - reply mode, becaus enow we can reply-to-list. - (reply_to_list): Implement. - (reply_to_sender): Use REPLY_SENDER. - (reply_to_all): Use REPLY_ALL. - (mail_generate_reply): Handle the different modes. - -2001-06-12 JP Rosevear - - * Makefile.am: Remove folder-info.h until iain checks it in - -2001-06-12 Not Zed - - * mail-account-gui.c (source_type_changed): Setup default spool - location same as for mbox mail retrieval. - -2001-06-08 Dan Winship - - * folder-browser-factory.c: fix some commands to match the ui file - again. - -2001-06-07 Iain Holmes - - * GNOME_Evolution_Mail.oaf.in: Add server info for FolderInfo - Remove server info for the Summary server - - * Mail.idl: Add a FolderInfo interface to retreive information about - a mail folder. - - * Makefile.am: Remove the executive summary stuff. Add the folder-info - files. - - * component-factory.c: Remove the mail-summary.h include. - Remove summary_factory. - (summary_fn): Remove. - (component_factory_init): Remove the summary_factory creation. - Initialise the info_factory. - -2001-06-08 Jon Trowbridge - - * mail-ops.c (mail_send_message): Reattach X-Evolution-Account - information to the message after sending it. This way it can - be used to set the identity properly if we later Resend the - message. - - * mail-tools.c (mail_tool_get_local_movemail_path): If you had - multiple accounts that used mboxes, and if you received mail in N - of those accounts, you would get N copies of each of your e-mail - messages. This is because everything was being dumped into one - big file by movemail, and the filters would run on that file N - times. To work around this, each mbox account now gets its own - distinct temporary movemail file. - -2001-06-07 Jon Trowbridge - - * mail-ops.c (fetch_mail_fetch): Pass the original source URI - to camel_filter_driver_filter_mbox. - (mail_send_message): Pass NULL as the orginal source URI - to camel_filter_driver_filter_message. - -2001-06-06 Jon Trowbridge - - * mail-account-gui.c (source_type_changed): Check that the chain - of deferences in gui->account->source->url is safe. This was - causing a segfault when adding a new account if any of the - existing accounts had their sources set to "None". - (i.e. gui->account->source == NULL) - - * mail-accounts.c (load_accounts): Check that account->source != - NULL before dereferencing it. - (load_accounts): The selection is cleared when the account clist - is rebuilt (say after a call to add), but no unselect event is - emitted. Yes, the clist is evil. We work around this by - explictly calling mail_unselect, our unselect signal handler. - (Otherwise, the edit and delete buttons remain sensitive and - accounts_row != 0, but the user can't see which row the dialog - thinks is selected.) - (load_news): Check the account->source != NULL before - dereferencing it. - (mail_unselect): If an insensitive button in a button box has the - focus, and if you hit tab, there is a segfault deep inside of gtk. - This is probably a gtk bug. We work around it by having the add - button (which is always sensitive) grab the focus on an unselect. - -2001-06-05 Jason Leach - - (Fix bug #3211: Should undelete when flagging a delete message as - important) - - * message-list.c (on_click): When flagging a message as important, - check to see if it's flagged as deleted, if so, undelete it. - - (Fix bug #314: Display URLs in statusbar on mouseover) - - * mail-display.c (html_on_url): New function, callback for - GtkHTML's "on_url" signal. - -2001-06-05 Radek Doulik - - * mail-format.c: make HTML and plain mails to have the same - boundary - -2001-06-03 Ettore Perazzoli - - * Makefile.am (evolution_mail_LDADD): Move `$(DB3_LDADD)' before - libeutil. - -2001-06-01 Federico Mena Quintero - - * folder-browser.h (FolderBrowser): Added fields for the - GalViewMenus and GalViewCollection, since we need to keep them - around while the component is active. - - * folder-browser-factory.c (folder_browser_setup_view_menus): Plug - leaks; unref the spec and factory. Set the view collection and - the view menus on the FolderBrowser object. - (folder_browser_discard_view_menus): New function. - (control_deactivate): Discard the menus. - - * folder-browser.c (folder_browser_destroy): Destroy the view - collection and the view menus. - -2001-06-01 Ettore Perazzoli - - * Makefile.am (evolution_mail_LDADD): Add `$(DB3_LDADD)'. - -2001-06-01 Jeffrey Stedfast - - * mail-account-gui.c (mail_account_gui_save): Save the pgp and - smime settings. - (mail_account_gui_new): Setup the pgp and s/mime page (but disable - the s/mime frame if we are not compiled with s/mime support). - - * mail-config.c (account_copy): Updated to save extra pgp and - smime options. - (account_destroy): Free draft/sent folder info and also the new - pgp/smime keys. - (config_read): Read in the pgp and s/mime config options. - (mail_config_write): Save the account pgp and smime options. - -2001-06-01 Jeffrey Stedfast - - * mail-account-gui.c (source_type_changed): Call - build_extra_conf() here too. This is when we REALLY want to call - it anyway, not on switch-page because then we'd lose any data on - the Receive Options page if we never switch to that page before - applying the changes. - - * mail-account-editor.c (construct): Don't connect to the - switch-page event, instead just call build_extra_conf() here with - the source->url. - -2001-06-01 Dan Winship - - * mail-config.c (config_read): Fix dumb misuse of g_get_charset. - -2001-05-31 Jeffrey Stedfast - - * mail-format.c (handle_multipart_signed): Removed the code to - check for the validity of an S/MIME part. Stuff works differently - now. - - * mail-crypto.c: Rewrote how the S/MIME stuff is going to work. - -2001-05-30 Dan Winship - - * mail-config.glade: Rename the "PGP" page back to "Other" and add - a "default charset" option menu. - - * mail-config.c (config_read, mail_config_write_on_exit, - mail_config_get_default_charset, mail_config_set_default_charset): - Handle "default charset". - - * mail-accounts.c (construct): Fill in the "default_charset" menu - with an e_charset_picker menu. - (charset_menu_deactivate): Update the default charset. - -2001-05-29 Jeffrey Stedfast - - * mail-callbacks.c (list_add_addresses): Take another argument to - ignore a certain address. - (mail_generate_reply): Ignore references to the reply-to address - when constructing the Cc list. - -2001-05-29 Jason Leach - - * message-browser.c (message_browser_new): one-line fix for bug - #2536: File->Close in message viewer doesn't work. - (message_browser_new): Also replaced like 4 lines of code with a - one-liner featuring gnome_app_create_toolbar_with_data(). - -2001-05-28 Jason Leach - - * mail-local.c (load_metainfo): Don't need to check if (foo!=NULL) - before doing an xmlFreeDoc(). - -2001-05-28 Dan Winship - - * mail-format.c (write_text_header): Fix a bug that could cause a - crash on messages with an empty subject. Oops. - -2001-05-27 Jeffrey Stedfast - - * message-list.c: Removed the etable spec string. - (message_list_construct): Load the etable spec from a file. - - * folder-browser-factory.c: Load the etable spec from the file, - not a string. - - * Makefile.am: Add message-list.etspec to be installed. - - * message-list.etspec: New file containing the ETable file - specification. - - * mail-config.h: Prototype evolution_mail_config_get_type. - -2001-05-27 Dan Winship - - * folder-browser-factory.c: #include - "evolution-shell-component-utils.h" rather than "e-gui-utils.h" - for e_pixmaps_update. - - * subscribe-dialog.c: Likewise. - -2001-05-26 Jeffrey Stedfast - - * mail-format.c (try_inline_pgp_sig): Fix to work properly. - (handle_multipart_signed): Fixed a bug that caused some - multipart/signed messages to be handled by the multipart_mixed - handler. - -2001-05-25 Jeffrey Stedfast - - * folder-browser-factory.c: Added callbacks for Next/Previous - Unread and Next/Previous Flagged message. - - * mail-callbacks.c (previous_flagged_msg): Implemented. - (next_flagged_msg): Implemented. - -2001-05-26 Dan Winship - - * mail-ops.c (mail_send_message, transfer_messages_transfer, - set_offline_do): When unreffing a folder we got ourselves (as - opposed to one passed in by the caller), sync before unreffing, - since we might be holding the only reference to it. - (mail_refresh_folder): New op, like mail_sync_folder, but does a - camel_folder_refresh_info instead. - - * folder-browser-factory.c (control_activate): Call - mail_refresh_folder, not mail_sync_folder. (The goal is to see new - messages: sync used to work with imap because imap_sync was - broken, but it doesn't work for that any more.) - -2001-05-25 Peter Williams - - * Makefile.am: Reference libeshell.la instead of libeshell.a. - -2001-05-25 Jeffrey Stedfast - - * folder-browser-factory.c (control_activate): Disable Resend on - non-Sent folder FolderBrowsers. Thanks to Wayne Davis for this - patch. - - * component-factory.c (xfer_folder): This code should be correct - now. Still waiting on the shell to do it's job of creating the - metadata xml file in the destination folder though. - -2001-05-24 Jeffrey Stedfast - - * message-list.c (message_list_select_uid): g_strdup the uid into - the ml->cursor_uid. - - * message-browser.c (message_browser_forward_msg): Use the default - forward style. - -2001-05-24 Dan Winship - - * mail-identify.c (mail_identify_mime_part): If the message data - is online, sniff the data for a MIME type first, and use the - filename second. Makes it more reliable, and deals with the - specific case of "application/octet-stream; name=foo.vcf" which - gnome-vfs will identify as vcalendar, but which can also be a - vcard. - -2001-05-24 Jeffrey Stedfast - - * mail-format.c (try_inline_pgp_sig): Only write the message up to - (but not including) the attached signature block. - -2001-05-23 Jeffrey Stedfast - - * mail-callbacks.c (composer_postpone_cb): Don't free the - folder-info here, instead have mail_append_mail() call our new - function, append_mail_cleanup() which'll free the - folder-info. This fixes the problem of send-later segfaulting. - - * message-list.c (message_list_set_folder): Make the message-list - respect the "hide deleted messages" setting. Fixes bug #2248. - - * component-factory.c (xfer_folder): New function that the shell - component calls to copy/move a folder. - (component_fn): Set the xfer_folder_fn argument. - - * mail-ops.c (mail_remove_folder): New async function to remove a - folder. God knows if it does what the ShellComponent needs or not - yet. - (mail_xfer_folder): Yet another yummy async function to move or - copy a folder to a new location. - - * component-factory.c (storage_remove_folder): New function for - removing folders. - (remove_folder): New function that the shell component calls to - delete a folder. - (component_fn): Set the remove_folder_fn argument. - -2001-05-22 Jeffrey Stedfast - - * mail-config.c (mail_config_write_on_exit): Save the - message-display style. - (config_read): Read the message-display style. - -2001-05-22 Dan Winship - - * mail-display.c (on_url_requested): If http mode is - HTTP_SOMETIMES, use e_book_query_address_locally to check the From - address and load images if it's found. - - * mail-config.c (config_read): Default http_mode to - MAIL_CONFIG_HTTP_SOMETIMES. Fix typo to make default forward style - actually work. - -2001-05-22 Jeffrey Stedfast - - * Makefile.am: Use MAILER_CFLAGS and MAILER_LIBS. - - * message-browser.c (message_browser_folder_loaded): Instead of - calling message_list_select_uid() here, instead connect to the - "message_list_loaded" signal since the message-list is not built - yet at this point. - (message_browser_message_list_built): Call - message_list_select_uid() here instead. - - * message-list.c: Lets have a new signal, MESSAGE_LIST_BUILT, that - gets emitted when the message-list has finished being built by one - of the built_*() functions. - (message_list_class_init): Setup the signal stuff. - (regen_list_regened): Emit the signal here (should this perhaps be - moved into each of the build_*() functions instead?). - -2001-05-21 Kjartan Maraas - - * mail-local.c: Mark a string for translation. - -2001-05-18 Jon Trowbridge - - * Makefile.am (evolution_mail_LDADD): Added libebook.la (which is - now required by the composer.) - -2001-05-17 Dan Winship - - * mail-callbacks.c (composer_postpone_cb): mark Outbox messages as - read. - -2001-05-17 Jeffrey Stedfast - - * mail-format.c (mail_write_authenticity): New convenience - function for all signature verification functions to use to - display whether or not the signed part was authentic. - (try_inline_pgp_sig): Use mail_write_authentic(). - (handle_multipart_signed): Add code to handle S/MIME - multipart/signed parts and also use mail_write_authenticity(). - -2001-05-17 Dan Winship - - * mail-config.glade: add new icons from jimmac. - -2001-05-16 Dan Winship - - * mail-format.c (mail_format_raw_message): add - E_TEXT_TO_HTML_ESCAPE_8BIT to the flags - -2001-05-16 Dan Winship - - * folder-browser.c (folder_browser_is_drafts, - folder_browser_is_sent, folder_browser_is_outbox): Functions to - determine if a folderbrowser is one of the drafts, sent, or outbox - folders. - (got_folder): Pass TRUE for the "outgoing" flag to - message_list_set_folder if this is a Sent, Drafts, or Outbox - folder. - - * message-list.c (message_list_set_folder): Take a flag saying - whether or not the folder is an "outgoing" folder. - (message_list_setup_etree): Ditto. Use that rather than a - hardcoded list of foldernames for deciding whether to swap From - and To in the default layout. - - * mail-config.c (mail_config_folder_to_cachename): Make IMAP - folders have unique cachenames rather than only one per store, so - that IMAP Sent and Drafts folders don't get forced into having the - same layout as the INBOX. - - * mail-callbacks.c: (is_sent_folder, is_drafts_folder): Gone. - Replaced with simpler folder_browser_is_* routines. - (edit_msg, resend_msg, open_msg): Use folder_browser_is_* - routines. - - * mail-local.c (reconfigure_clicked): Update call to - message_list_set_folder. - -2001-05-16 Jeffrey Stedfast - - * mail-crypto.c (mail_crypto_is_smime_v3_signed): Removed (this - now exists in camel/camel-smime.c). - (mail_crypto_is_pkcs7_mime): Same. - (mail_crypto_smime_part_sign): new - (mail_crypto_smime_part_verify): new - (mail_crypto_smime_part_encrypt): new - (mail_crypto_smime_part_decrypt): new - (mail_crypto_pgp_mime_part_sign): Added code to set an exception - if the context fails to be created. - (mail_crypto_pgp_mime_part_verify): And here... - (mail_crypto_pgp_mime_part_encrypt): Same. - (mail_crypto_pgp_mime_part_decrypt): And here too. - -2001-05-16 Dan Winship - - * mail-display.c (mail_display_redisplay): Deal with full-header - mode in addition to source mode - - * mail-format.c (write_field_row_begin): Add WRITE_NOCOLUMNS flag - to write the header in a single table cell rather than two. Output - the second columns's "" when not in NOCOLUMNS mode. Don't - include the ":" in the passed-in header name. - (write_date, write_address): Update for write_field_row_begin - changes. - (write_text_field): Genericified and updated from write_subject. - (write_headers): Deal with both normal and full-header mode. - -2001-05-15 Dan Winship - - * mail-display.c (on_url_requested): Load http images if the user - has force-loaded images too. - (mail_display_redisplay): Update for normal/headers/source changes. - (mail_display_load_images): New. Force HTTP image loading for the - current message. - - * mail-config.c (mail_config_get_message_display_style, - mail_config_set_message_display_style): Updated and renamed from - mail_config_{get,set}_view_source - - * mail-callbacks.c (load_images): New. - - * folder-browser.c (folder_browser_set_message_display_style): - Renamed and updated from folder_browser_toggle_view_source. - - * folder-browser-factory.c (verbs): Add ViewLoadImages. - (control_activate): Update for normal/headers/source change to - radio group. - -2001-05-15 Dan Winship - - * folder-browser-factory.c (verbs): Update for changes in - evolution-mail.xml (many commands were renamed to better match the - current menu layout). - (pixcache): Refer to commands via their paths in /commands/ - rather than hardcoding their menu paths. - -2001-05-14 Jon Trowbridge - - * mail-search.c (mail_search_construct): Put frame around dialog - vbox, put mail subject in that frame's label. (Patch by Duncan.) - (mail_search_set_subject): Break out subject-setting code. - Truncate long subjects with ellipses. - -2001-05-14 Duncan Mak - - * mail-search.c (mail_search_construct): set the dialog's - window_icon to jimmac's new find_message.xpm. - -2001-05-13 Iain Holmes - - * Makefile.am: Make the LDADD line longer so it actually compiles - everything correctly. - -2001-05-14 Dan Winship - - * mail-config.glade: Split "Other" page into three pages, Display, - Composer, and PGP. Add HTML image stuff on the Display page and - default forward style on the Composer page. - - * mail-config.c (mail_config_get_default_forward_style, - mail_config_set_default_forward_style): User-specified default - style for forwarding messages. - (config_read, mail_config_write_on_exit): Deal with forward style. - - * mail-accounts.c: Handle HTML image display options and default - forward style. - - * mail-callbacks.c (forward): New. Forward in the user-selected - default style. - (forward_inline, forward_quoted): Simplify these some. Remove the - fallback to forward attached when forwarding multiple messages: it - should just forward the multiple messages inline or quoted in - those cases. (Which it doesn't yet, but that's a bug.) - - * folder-browser.c (context_menu): Remove "Forward inline" and - make "Forward" call forward() rather than forward_attached(). - - * folder-browser-factory.c: Update command/menu/toolbar/pixmap - gunk for the "MessageForwardAttached" vs "MessageForward" split. - - * mail-session.c (mail_session_get_type): - * mail-format.c (format_mime_part): - * mail-account-gui.c (setup_service): Fix warnings. - - * mail-mlist-magic.c: Remove this... it's not used any more. - - * folder-browser.c: - * message-browser.c: Remove references to mail-mlist-magic.h - -2001-05-14 Jon Trowbridge - - * folder-browser.c (folder_browser_config_search): Use secondary - searches here, so that we control the interference between the two - bits of searching UI. - -2001-05-13 Jon Trowbridge - - * mail-search.c (mail_search_construct): Destroy the MailSearch - dialog if the underlying MailDisplay is destroyed. I don't like - the way that label in the dialog with the message subject in it - looks, so I've #ifdef-ed it out for now. Center the Matches - label --- it makes the dialog look more balanced, I think. - (dialog_clicked_cb): Changed to reflect adjusted - ESearchingTokenizer API, using primary searches. - (toggled_case_cb): Use the primary search API. - - * e-searching-tokenizer.c: Make searching routines utf8-friendly. - Rationalize how the match begin/end markup is handled; allow for - begin/end markup that varies by search. Add concept of primary and - secondary matching, to disentangle possible interactions between - search-bar searches and search-dialog searches. - -2001-05-13 Jeffrey Stedfast - - * mail-local.c (mail_local_storage_shutdown): Get rid of this - we - don't need it. - - * component-factory.c (owner_unset_cb): Don't unref the LocalStore - - we don't own a ref on it!! - -2001-05-12 Duncan Mak - - * mail-search.c (begin_cb): Updates the subject on refresh and - sets subject to "Untitled Message" if subject is NULL. - (mail_search_construct): Moved msg_subject to its own GtkLabel, - sets subject to "Untitled Message" if subject is NULL. Give focus - to entry by default. Made in entry run - dialog_clicked_cb by setting gnome_dialog_editable_enters. - -2001-05-12 Gediminas Paulauskas - - * folder-browser-factory.c: load pixmaps for MessageCopy and - MessageForwardAttached. Thanks Wayne Davis - for a patch. - -2001-05-11 Dan Winship - - * mail-display.c (load_http): callback to use GNOME-VFS to load - http data. - (on_url_requested): Handle http: URLs that refer to either MIME - parts or web data. - (mail_display_redisplay_when_loaded): Moved out of - mail_content_loaded and made more generic. - - * mail-format.c (add_url): Handle two different kinds of URLs - (URLs that point to CamelMimeParts and URLs that point to - GByteArrays). - (mail_content_loaded): Use mail_display_redisplay_when_loaded. - (format_mime_part): Renamed from "call_handler_function". Also, - record Content-Location if the part has one. (This is not yet 100% - correct: it doesn't deal with relative URLs at all.) - (handle_text_html): Use Content-Location URL rather than - Content-ID, when available (will help deal with relative URLs once - GtkHTML supports that better). - (etc): Update for changes. - - * mail-config.c (mail_config_get_http_mode, - mail_config_set_http_mode): get/set HTTP image downloading mode. - (config_read, mail_config_write_on_exit): save/load that data. - -2001-05-11 JP Rosevear - - * mail-importer.h: add proto - - * mail-importer.c (mail_importer_uninit): release and unref the - local storage - - * mail-local.c (mail_local_store_finalize): use - bonobo_object_release_unref rather than doing Bonobo_Unknow_unref - and a corba release - (register_folder_registered): "sink" the local_store ref to - prevent circular ref - (mail_local_storage_shutdown): unref the local store - - * mail-local.h: new proto - - * component-factory.c (owner_unset_cb): uninit the importer and - shutdown the local storage - -2001-05-11 Jeffrey Stedfast - - * mail-local.c (mail_local_reconfigure_folder): Set a title on the - window "Reconfigure %s" where %s is the folder name. Also, don't - allow more than one of these type windows to be opened per folder. - - * mail-tools.c (mail_tool_get_folder_name): Fix Danw's kludge to - actually work :-) - -2001-05-11 Martha Burke - - * gui/Makefile.am: sanitize LD_ADDS and CFLAGS so the libtool - lines are shorter (fixes problem on solaries due to sed) - -2001-05-11 Jeffrey Stedfast - - * mail-vfolder.c (vfolder_edit): Don't allow multiple copies of - this to be run at a time. - - * mail-callbacks.c (providers_config): Don't allow multiple copies - of this to be run at a time. - (manage_subscriptions): Same, but this was a tad more kludgy since - we don't gnome_dialog_run_and_close() this one. I had to make the - widget a semi-global variable. yuck :\ - (filter_edit): Same. - -2001-05-11 Jon Trowbridge - - * e-searching-tokenizer.c (e_searching_tokenizer_new): - Remove a snippet of debugging code I left in by mistake. - -2001-05-11 Jeffrey Stedfast - - * mail-callbacks.c (forward_inlined): If the cursor_uid is NULL, - then we can't forward anything so just return. - (forward_quoted): Same. - -2001-05-10 Jon Trowbridge - - * folder-browser.c (folder_browser_config_search): Use the - ESearchingTokenizer to highlight search matches for folder-level - searches. Still mildly broken, but it works for the simple cases. - - * mail-display.c (mail_display_new): Use our ESearchingTokenizer - for the mail display GtkHTML widget. - - * mail-search.c (dialog_clicked_cb): Use the ESearchingTokenizer to - highlight search matches. - (mail_search_construct): Add a match count to the search dialog. - - * e-searching-tokenizer.c - (e_searching_tokenizer_set_search_string): Added. A custom HTML - tokenizer that does highlighting of search strings. - - * mail-config.c: No, we don't want to include - bonobo-running-context.h... just bonobo-context.h. - -2001-05-10 Jeffrey Stedfast - - * mail-config.c: Fix some compiler warnings by including the - correct bonobo headers and by using the correct bonobo types. - (config_read): Some fixes so that we can never have an empty - string as a URL. - -2001-05-10 Dan Winship - - * folder-browser.c (on_key_press): Don't advance to the next - undeleted message after "Delete"... - - * mail-callbacks.c (delete_msg): ...instead, do it here, whether - the user used Delete, Alt+D, or the toolbar. (But only if they - only deleted a single message.) - - * message-list.c (message_list_select): Don't clear the display on - failure. - (build_tree): Clear the display when the currently-selected - message stops existing and we don't have an obvious message to - select instead of it. (Eg, when deleting the last message with - "hide deleted messages" set, or expunging while a deleted message - is selected.) - -2001-05-09 Dan Winship - - * mail-offline-handler.c: New file, started by Ettore, finished by - me, to implement the GNOME_Evolution_Offline interface. - - * Makefile.am (evolution_mail_SOURCES): Add - mail-offline-handler.[ch] - - * mail-ops.c (mail_store_set_offline): Set a store online or - offline. - - * mail-send-recv.c (auto_timeout): Don't run auto-check-for-mail - while the session is offline. - - * component-factory.c (component_fn): Set up offline handler. - -2001-05-09 Christopher James Lahey - - * importers/evolution-mbox-importer.c (load_file_fn): Made a const - char * here. - -2001-05-08 Iain Holmes - - * mail-config.[ch]: Moved all references to the Bonobo stuff into the .c file - -2001-05-08 Iain Holmes - - * mail-callbacks.c (filter_edit): Set the title of the dialog. - - * GNOME_Evolution_Mail.oaf.in: Add a reference for the MailConfig - interface stuff. - - * Mail.idl: Add the MailConfig interface, and a MailFilter interface. - - * component-factory.c (component_factory_init): Call - evolution_mail_config_factory_init. - - * mail-account-gui.c (setup_service): Just return if url == NULL, - don't crash. - - * mail-config.c: #include bonobo-object.h, #include Mail.h and define - the Config factory IID. - Implement the MailConfig interface with a BonoboObject. - (impl_GNOME_Evolution_MailConfig_addAccount): Convert the CORBA struct - into the correct MailConfig structures and add the account. - (evolution_mail_config_class_init): Initialise the class. - (evolution_mail_config_init): This function is intentionally left blank. - - (evolution_mail_config_factory_fn): Create an EvolutionMailConfig object - and return it. - (evolution_mail_config_factory_init): Set up the bonobo factory. - - * mail-config.h: #include bonobo-xobject.h and Mail.h - Declare the object structures. - - * importers/Makefile.am: Remove the intelligent importers. - - * importers/evolution-mbox-importer.c (folder_created_cb): Callback - from when the folder is created. Opens the folder and unrefs the - listener. - (load_file_fn): Create the folder if it doesn't exist. - -2001-05-08 Jeffrey Stedfast - - * mail-tools.c (mail_tool_forward_message): Convert the Subject - header to HTML and also make sure that the Subject, To, and From - header values are non-NULL before feeding them into - e_text_to_html(). - - * mail-callbacks.c (edit_msg_internal): Free the UIDs if the user - decides to not go through with editing all the messages he - selected. - (resend_msg): If the user attempts to resend more than 10 - messages, make sure he really means it. - (do_resend_messages): Richard Zach feels that "Resend" should open - the message(s) in a composer since he might want to edit at least - the recipients (maybe he needs to resend because the message - bounced the first time) and Ettore wants pretty much the same - thing. This makes "Resend" basically the same as "Edit" but for - previously sent messages, whereas "Edit" is only for Drafts. - -2001-05-08 Gediminas Paulauskas - - * mail-search.c: convert search entry to utf8. - - * mail-local.c: d() debugging message. - - * mail-send-recv.c: replace " ..." with "..." - - * Makefile.am: removed EVOLUTION_VERSION. - -2001-05-07 Jeffrey Stedfast - - * mail-account-gui.c: s/HAVE_NSS/HAVE_SSL for the SSL checkbox - stuff. - -2001-05-07 Dan Winship - - * folder-browser.c (my_folder_browser_init): Connect to - key_press_event on the GtkHTML widget. - (etree_key): Only handle space/backspace here, pass the rest off - to on_key_press. - (on_key_press): Handle Delete/N/P/Menu in either MessageList or - MailDisplay. - - * message-list.c (message_list_select): Grab focus if we don't - have it. - -2001-05-03 Dan Winship - - * message-list.c: #include - - * mail-ops.c (get_folderinfo_get): - * subscribe-dialog.c (build_tree): Update for - camel_store_get_folder_info prototype change. - - * mail-format.c (handle_text_plain_flowed): Improve more on the - fix from the other day: the first level of indentation adds blank - lines, but further levels don't... - -2001-04-30 Dan Winship - - * folder-browser.c (folder_browser_destroy): Unhook event handlers - before syncing the folder, since the folder browser will have been - destroyed by the time the sync thread completes and calls the - signal handlers. - -2001-04-29 Dan Winship - - * mail-format.c (handle_text_plain_flowed): Mojo this a bit so - that "\n\n>" gets translated to "
" rather than - "

", since the transition to blockquote mode - creates a blank line itself. Makes Mozilla-generated flowed - replies look better. - -2001-04-27 Dan Winship - - * mail-session.c: Renamed from session.c and made to be a subclass - of CamelSession. - - * mail-mt.c (mail_user_message): Renamed from mail_get_accept and - made more general-purpose, to implement the new - camel_session_alert_user. - -2001-04-26 Jeffrey Stedfast - - * main.c (main): No need to camel_shutdown() anymore... - - * mail-callbacks.c (next_msg): Don't filter on Seen status. - (previous_msg): Same. - (next_unread_msg): New function that does what the old callback - next_msg callback did (only better named). - (previous_unread_msg): Same. - - * message-list.c (hide_load_state): Updated to use camel-file-util - routines. - (hide_save_1): Same. - (hide_save_state): And here too. - -2001-04-26 Dan Winship - - * Makefile.am (INCLUDES): Remove UNICODE_CFLAGS - - * mail-format.c (handle_text_plain_flowed): Use - to mark citations rather than italicizing them, which has never - looked very nice. Now this is more consistent with the non-flowed - case. - -2001-04-26 Jon Trowbridge - - * folder-browser-factory.c: Added "MessageSearch" verb. - - * mail-callbacks.c (search_msg): Added search callback. - (are_you_sure): Added some casts to fix compiler warnings. - - * mail-search.c: Added. A simple search-in-message widget, - that uses GtkHTML's searching capabilities. - -2001-04-25 Dan Winship - - * mail-callbacks.c (are_you_sure): New foot-shooting-prevention - helper function. - (edit_msg_internal, view_msg): If the user has more than 10 - messages selected, ask before opening them all in separate - windows, to protect against misclicks/typos after "select all" - (which we've had at least two reports of now). - -2001-04-25 Radek Doulik - - * mail-tools.c (mail_tool_quote_message): set object data directly - in HTML source - - * mail-callbacks.c (mail_generate_reply): remove \n from citation - (mail_generate_reply): don't use e_msg_composer_mark_text_orig - -2001-04-24 Jeffrey Stedfast - - * folder-browser.c: Added a new signal, "message_loaded" that gets - emitted when the message has been loaded and set on the - mail_display. - (folder_browser_class_init): Define the "message_loaded" signal - stuff. - (done_message_selected): Emit the "message_loaded" signal here. - - * message-browser.c (message_browser_next_msg): Do our own - message-list manipulation. We want the next message, not the next - unread message. - (message_browser_prev_msg): Same here but for previous. - (message_browser_new): Connect to the folder browser's - "message_loaded" signal. - (message_browser_folder_loaded): Don't connect to the - message-list's "message_selected" signal. - (message_browser_message_loaded): Nw callback which replaces the - old message_browser_message_selected callback's functionality. - -2001-04-24 Dan Winship - - * folder-browser.c: Add accelerators to the context menu. - (on_right_click): Use e_tree_get_cell_geometry and a - GtkMenuPositionFunc when responding to a Menu-key press so we can - line the menu up with the selected row rather than the cursor. - - * message-browser.c: include for E_MAKE_TYPE. - -2001-04-23 Jon Trowbridge - - * mail-display.c (html_button_press_event): Check for mailto: - links, and pop up our mail address menu when we find one. - (make_popup_window): The main piece of code (ignoring a zillion - little callbacks) to pop up our windows with reasonable semantics - for having them close automatically. - (mail_text_write): Enable converting addresses to mailto links - in message bodies. - - * mail-format.c (write_address): Simplify code, removing Radek's - hacks. Write out addresses as mailto: links. - -2001-04-23 Jeffrey Stedfast - - * mail-callbacks.c (do_view_message): Use the message-browser - widget rather than the mail-view window. - - * mail-view.c: Removed. - - * folder-browser.c: Added a folder_loaded signal. - - * message-browser.[c,h]: New window to solve all our message - browsing needs. This replaces mail-view.c. - - * message-list.c (message_list_select_uid): New function needed by - the new message-browser window. - -2001-04-23 Dan Winship - - * mail-callbacks.c (save_msg): Append a "/" to the result of - g_get_home_dir so gets the default dir it was supposed to. - -2001-04-22 Jeffrey Stedfast - - * mail-ops.c (mail_send_message): Lets do proper refcounting on - the sent-folder. Also, g_strdup() the sent_folder_uri since we - later free it. If we don't, then we get lovely corrupt memory. - - * mail-crypto.c (mail_crypto_pgp_mime_part_sign): Make sure we - have a context before we try and use it. - -2001-04-22 Gediminas Paulauskas - - * folder-browser.c, mail-autofilter.c, mail-callbacks.c, - mail-ops.c, mail-summary.c, mail-vfolder.c: use system = - EVOLUTION_DATADIR "/file" instead of g_strdup_printf. Rename - userrules to user (and system) to be consistent. - - * mail-send-recv.c: set window icon to send-receive.xpm - -2001-04-21 Gediminas Paulauskas - - * mail-summary.c: translate "Mail summary". - -2001-04-20 Dan Winship - - * mail-config-druid.c (make_default_account): Convert the result - of g_get_real_name() from the locale charset to UTF8. Noted by - Petter Sundlöf (NOT "Petter Sundl_" :) - -2001-04-20 Jeffrey Stedfast - - * mail-config.c (mail_config_set_pgp_type): Use a CamelPgpType. - (mail_config_get_pgp_type): Return a CamelPgpType. - (auto_detect_pgp_variables): auto-detect the user's pgp settings. - -2001-04-20 Dan Winship - - * mail-format.c (handle_text_plain): Fix a dumb thinko in my 04-11 - patch. - -2001-04-20 Kjartan Maraas - - * mail-ops.c: (send_mail_desc): Convert subject from utf8 - before passing it on. - -2001-04-20 Gediminas Paulauskas - - * mail-display.c: #if 0'd out my not-working selection code - -2001-04-19 Dan Winship - - * mail-format.c (mail_format_raw_message): Make this more raw: - don't do URLs and citations. - -2001-04-18 Dan Winship - - * session.c (request_callback): Don't need to dup the string: the - relevant gnome-dialog routine already does. - - * message-list.c (message_list_destroy): Free the uid_nodemap. - (hide_save_state): Free the filename when we're done. - -2001-04-18 Jeffrey Stedfast - - * mail-callbacks.c (is_sent_folder): Implemented. - (resend_msg): Use is_sent_folder(). - -2001-04-17 Dan Winship - - * mail-mt.c (mail_msg_check_error): Fix a memory leak. - -2001-04-16 Ettore Perazzoli - - * importers/Makefile.am (INCLUDES): Add `$(EXTRA_GNOME_CFLAGS)' - here. - -2001-04-15 Jeffrey Stedfast - - * mail-callbacks.c (mark_all_as_seen): Mark the messages as seen, - not unseen. - (is_drafts_folder): New function to attempt to determine if a - folder is a drafts folder. - (open_msg): Use is_drafts_folder(). - (edit_msg): And here. - (edit_msg_internal): New function that doesn't do the drafts - checking and is only to be used internally. This should save us - from having to doubly-check a folder to see if it's a drafts - folder when doing an Open on the message. - (open_msg): Call edit_msg_internal once we've established that the - folder is a drafts folder. - -2001-04-14 Jeffrey Stedfast - - * mail-crypto.c (mail_crypto_pgp_mime_part_verify): Only use - non-NULL contexts. - (mail_crypto_pgp_mime_part_encrypt): Same. - (mail_crypto_pgp_mime_part_decrypt): And here too. - - * mail-format.c (try_inline_pgp_sig): Make sure to not use the - context if it is NULL. - (decode_pgp): Same. - - * folder-browser-factory.c: Added stuff for filtering/vfoldering - on mailinglists. - -2001-04-13 Dan Winship - - * Makefile.am (evolution_mail_LDADD): Remove some redundant LIBS - variables... purify complained that the command line was too - long. :-} - - * mail-account-gui.c: Plug leaks. - - * mail-display.c (on_url_requested): close the html stream on - error too. - - * mail-ops.c (fetch_mail_fetch): Move a line around that probably - doesn't affect anything, but it's correct. - - * session.c (auth_callback): Plug leak. - - * mail-send-recv.c (receive_status): Initialize "now". - -2001-04-13 Christopher James Lahey - - * message-list.c (on_cursor_activated_cmd): Only activate the - message if the cursor has moved. - -2001-04-12 Christopher James Lahey - - * message-list.c (e_mail_address_new): Updated this function to be - a correct full ordering. - (ml_has_get_node_by_id, ml_get_node_by_id): Implemented these - functions. - (find_next_undeleted): Changed this to find next sorted undeleted - message. Also, changed it so that if the current message is not - deleted, it returns NULL. - (build_tree, build_flat): Changed these to only set the cursor if - the cursor is changed. - - * subscribe-dialog.c: Changed this to pass NULL, NULL for - has_get_node_by_id and get_node_by_id. - -2001-04-12 Jeffrey Stedfast - - * session.c (auth_callback): If the service is NULL, just use the - item as the key. - - * mail-crypto.c (mail_crypto_pgp_mime_part_sign): Use the - CamelCipherHash enum. - (mail_crypto_pgp_mime_part_verify): Use a CamelCipherValidity. - - * mail-format.c (try_inline_pgp_sig): Updated to use - CamelCipherValidity instead of CamelPgpValidity. - (handle_multipart_signed): Same. - -2001-04-12 Dan Winship - - * folder-browser.c (do_message_selected, on_message_selected): - Don't printf NULL - - * mail-format.c (mail_part_is_inline): Don't leak memory. - -2001-04-12 Jeffrey Stedfast - - * mail-accounts.c (pgp_path_changed): Updated for changes to PGP - code. - - * component-factory.c (owner_set_cb): Don't init openpgp anymore - because we don't need it. - - * mail-crypto.c: Simply wrap the camel-pgp-mime functions (also - renamed the functions to be prefixed with mail_crypto). - - * mail-format.c (handle_multipart_signed): Update to use - camel_pgp_mime_is_rfc2015_signed() and other camel-pgp-mime - functions. - (handle_multipart_encrypted): Same but for rfc2015_encrypted. - (decode_pgp): Updated to use camel-pgp-context - (try_inline_pgp): Updated to use camel-pgp-context's. - (try_inline_pgp_sig): Same. - -2001-04-11 Dan Winship - - * mail-format.c (handle_text_plain): Only look for special - pseudo-multipart-isms (binhex, uucode, old pgp, etc) if the MIME - type is really text/plain. Otherwise, since there's no handler for - applciation/mac-binhex40, it gets sent to mail-identify.c, which - thinks it's text/plain because it starts with English words, and - so it gets sent back to the text/plain handler, which finds an - embedded binhex part... - - * mail-callbacks.c (do_view_message): mark messages as seen when - opening then in a separate window. - -2001-04-11 Jeffrey Stedfast - - * openpgp-utils.c (openpgp_encrypt): Don't g_free the recipient - array members here because we free them in the caller. - -2001-04-11 Jeffrey Stedfast - - * mail-crypto.c (pgp_mime_part_verify): Huh, somehow I forgot to - apply the from filter when verifying signed parts. Oh well, - probably not all that common. Fixed now though. - -2001-04-11 Jeffrey Stedfast - - * mail-callbacks.c (save_msg): Use the homedir as the default - filename. - -2001-04-11 Christopher James Lahey - - * message-list.c (save_tree_state, message_list_setup_etree): Save - the expanded state using the ETree built in expanded state code. - -2001-04-05 Not Zed - - * Merge from evolution-0-10 to evolution-0-10-merge-0 into head. - -2001-04-04 Kjartan Maraas - - * mail-account-gui.c: Add prototype for service_changed(). - * message-list.h: Remove #include - since it doesn't get installed. - -2001-04-04 Gediminas Paulauskas - - * mail-config-druid.c (create_html): set content type to utf8. - * mail-config.c (mail_config_check_service): fix warning. - * mail-display.c (link_open_in_browser): just call on_link_clicked(). - (link_menu): Open link works. - (link_copy_location): claim selection. - (on_selection_get): new function, selection handler. - (mail_display_new): connect to selection_get. FIXME: does not work. - -2001-04-04 Gediminas Paulauskas - - * component-factory.c: use big trash icon, stolen from mc. - -2001-04-03 Jeffrey Stedfast - - * openpgp-utils.c (openpgp_encrypt): Add --no-tty argument to gpg. - -2001-04-03 Dan Winship - - * folder-browser-factory.c (control_activate): Sync the folder on - activate. - - * session.c (mail_session_remember_password): Use the same - URL-transforming rules we use when hashing the password so this - actually works. - -2001-04-02 Iain Holmes - - * importers/elm-importer.c (elm_can_import): Call is_kmail to check for - KMail files. - (is_kmail): Checks if the given directory is a KMail directory. - -2001-04-02 Iain Holmes - - * importers/elm-importer.c (elm_can_import): Check for some MH files - to make sure that the dir really is an Elm dir. - -2001-04-02 Dan Winship - - * mail-account-gui.c: Add a "provider_type" arg to - MailAccountGuiService. - (transport_needs_auth_toggled): Call service_changed if enabling - the auth pane so the status of the "Check supported types" button - will be correct. - (service_check_supported): Use gsvc->provider_type, not - CAMEL_PROVIDER_STORE. - (mail_account_gui_new): Pass the transport as the user_data to the - "changed" signal on transport.hostname, not the store. - (mail_account_gui_setup): Set up provider_type fields - -2001-04-01 Gediminas Paulauskas - - * component-factory.c: changed vtrash icon to trash. doh - * folder-browser-factory.c: pixmap cache got moved from here to - e-util/e-gui-utils.c. Changed pixmap paths according to file renames. - Added icons for print, get mail, etc., changed get mail icon as Jacub - suggested. - * subscribe-dialog.c: also use new pixmap cache. - -2001-03-30 Dan Winship - - * mail-config.c (check_service_check): Register for cancellation. - (mail_config_check_service): Pop up a modal dialog with a message - and a "Cancel" button for the duration of the check. - -2001-03-30 Iain Holmes - - * importers/evolution-mbox-importer.c (load_file_fn): Check if - foldername is \0. - - * importers/evolution-outlook-importer.c (load_file_fn): Ditto. - -2001-03-30 Jon Trowbridge - - * mail-display.c (mail_text_write): Add (commented-out) - E_TEXT_TO_HTML_CONVERT_ADDRESSES. - - * mail-config.c (mail_config_get_account_by_source_url): - Call e_url_equal to compare URLs. - -2001-03-30 Dan Winship - - * component-factory.c (debug_cb): If the EvolutionShellComponent - emits a "debug" signal, turn on camel_verbose_debug. - -2001-03-30 Radek Doulik - - * mail-display.c (mail_display_redisplay): reset last_active - -2001-03-29 Jon Trowbridge - - * mail-callbacks.c: Added #include to get things - to compile. - - * mail-callbacks.c (mail_generate_reply): Look at the - X-Evolution-Source header, and try to find a corresponding - account. If this works, send the mail from this account. - If not, use the default account. - - * mail-ops.c (send_queue_send): Strip out the X-Evolution-Source - header before sending. - - * mail-config.c (mail_config_get_account_by_source_url): Added. - Look up accounts by source URL. - -2001-03-29 Dan Winship - - * mail-format.c (call_handler_function): if called with a - multipart that's really a 0-part, spew an error and display as - source. - - * message-list.c: #include - - * mail-callbacks.c: #include - for the gnome-print stuff. - - * mail-display.c (pixmap_press): Ignore "funky" button clicks - (like scroll wheel scrolls) - -2001-03-29 Kjartan Maraas - - * *.*: Cleaned up #includes. Remove unneccesary includes of - , , and replaced with more - fine grained headers where needed. Also marked a bunch of - strings for translations and added some missing prototypes. - -2001-03-29 Dan Winship - - * mail-account-editor.c (switch_page): Fix this so the "Receiving - Options" page gets filled in again. - - * mail-send-recv.c (receive_get_folder): Doh! This was storing - "struct _folder_info"s in the cache and then trying to read them - back as CamelFolders. Fixicate. Fixes the "crash with 2 POP - accounts" bug. - - * session.c (auth_callback): Update call to camel_url_to_string. - (Don't include the params in the password hash table key.) - - * mail-config.c (mail_config_folder_to_cachename): Call - camel_url_to_string with HIDE_PASSWORD and HIDE_PARAMS so that - changing URL params doesn't change the cachename. - - * mail-ops.c (add_vtrash_info): - * mail-local.c (reconfigure_folder_reconfigure): - * mail-account-gui.c (save_service): Update calls to - camel_url_to_string. - -2001-04-03 Dan Winship - - * folder-browser-factory.c (control_activate): Sync the folder on - activate. - - * session.c (mail_session_remember_password): Use the same - URL-transforming rules we use when hashing the password so this - actually works. - -2001-04-03 Not Zed - - * mail-ops.c (mail_send_message): Strip header content before using it. - -2001-04-02 Iain Holmes - - * importers/elm-importer.c (elm_can_import): Calls is_kmail to - check for kmail files. - (is_kmail): Checks if the given directory is a KMail directory. - -2001-04-02 Dan Winship - - * mail-account-gui.c: Add a "provider_type" arg to - MailAccountGuiService. - (transport_needs_auth_toggled): Call service_changed if enabling - the auth pane so the status of the "Check supported types" button - will be correct. - (service_check_supported): Use gsvc->provider_type, not - CAMEL_PROVIDER_STORE. - (mail_account_gui_new): Pass the transport as the user_data to the - "changed" signal on transport.hostname, not the store. - (mail_account_gui_setup): Set up provider_type fields - -2001-04-02 Iain Holmes - - * importers/elm-importer.c (elm_can_import): Check for some MH files - to make sure that the dir really is an Elm dir. - -2001-03-30 Not Zed - - * folder-browser.c (folder_browser_toggle_hide_deleted): New - function to listen for hide_deleted changes. - (folder_browser_toggle_hide_deleted): Only svae the hide-deleted - state if we are not setting a trash folder. - - * folder-browser-factory.c (control_activate): Set the - hide_deleted flag appropriately/setup the menu's appropriately. - (control_activate): Workaround to Force setting of options by - bypassing bonobo notification, since it doesn't properly handle - changed components. - - * mail-config.c (mail_config_get_hide_deleted): - (mail_config_set_hide_deleted): New functions for - accessing/setting the hide deleted state. - (mail_config_write_on_exit): - (config_read): Save/load the hide_deleted flag. - - * message-list.c (main_folder_changed): Oops, remember to copy - over all the rest of the changes too if we removed some. - (find_next_undeleted): Find the first undeleted message below us. - This of course does not follow sorting conventions, but thats - etree. Have to ask chris if there is a way to make it work like - that. - (message_list_set_hidedeleted): Check we dont set hide_delete on a - vtrash. - (build_tree): If the message has vanished, try and get the next - undeleted message set, etc, if it still exists. The set_cursor() - function seems very broken but i'm sure e-lahey will get to it - soon. - (build_flat): Similarly for above. - -2001-03-30 Dan Winship - - * mail-config.c (check_service_check): Register for cancellation. - (mail_config_check_service): Pop up a modal dialog with a message - and a "Cancel" button for the duration of the check. - - * component-factory.c (debug_cb): If the EvolutionShellComponent - emits a "debug" signal, turn on camel_verbose_debug. - -2001-03-30 Radek Doulik - - * mail-display.c (mail_display_redisplay): reset last_active - -2001-03-29 Dan Winship - - * mail-format.c (call_handler_function): if called with a - multipart that's really a 0-part, spew an error and display as - source. - - * mail-display.c (pixmap_press): Ignore "funky" button clicks - (like scroll wheel scrolls) - -2001-03-29 Dan Winship - - * mail-account-editor.c (switch_page): Fix this so the "Receiving - Options" page gets filled in again. - - * mail-send-recv.c (receive_get_folder): Doh! This was storing - "struct _folder_info"s in the cache and then trying to read them - back as CamelFolders. Fixicate. Fixes the "crash with 2 POP - accounts" bug. - - * session.c (auth_callback): Update call to camel_url_to_string. - (Don't include the params in the password hash table key.) - - * mail-config.c (mail_config_folder_to_cachename): Call - camel_url_to_string with HIDE_PASSWORD and HIDE_PARAMS so that - changing URL params doesn't change the cachename. - - * mail-ops.c (add_vtrash_info): - * mail-local.c (reconfigure_folder_reconfigure): - * mail-account-gui.c (save_service): Update calls to - camel_url_to_string. - -2001-03-29 Not Zed - - * mail-local.c (init_trash): Create a vtrash folder, not a vee folder. - - * folder-browser-factory.c (control_activate): Hook in the hide - deleted thingy. - Removed MessageHideDeleted menu stuff. - - * message-list.c (message_list_set_hidedeleted): New function, to - set if we should hide deleted messages automatically/always. - (regen_list_regen): If we have hide deleted messages turned on, - then hide them. - (main_message_changed): Promote to a folder_changed event with a - change list, folder_changed has the optimisations to handle this - appropriately. - (main_folder_changed): IF we get changes events for - deleted/undeleted stuff, change to added/removed events, rebuild - if necessary. - (message_list_set_folder): Setup the default hidedeleted state to - be to hide everything unless it is in a vtrash folder. - -2001-03-28 Jeffrey Stedfast - - * mail-account-gui.c (setup_service): Move the - gtk_toggle_button_set_active outside the if. - -2001-03-28 Dan Winship - - * mail-account-gui.c (mail_account_gui_new): Set up the - sent/drafts folder buttons. - (folder_picker_clicked): Pop up the folder selector when sent or - drafts is clicked. - (mail_account_gui_save): Save the sent/drafts folders. - - * mail-config.c (account_copy): copy sent/drafts info - (config_read): read sent/drafts info - (mail_config_write): write sent/drafts info - - * mail-callbacks.c (composer_send_cb, composer_postpone_cb): - split out some common code here (and fix inconsistencies). Always - set headers on the message giving the account name, transport, - and sent folder to use. - - * mail-ops.c (mail_send_message): If the message has an - X-Evolution-Account header, use the transport/sent folder info for - that account (assuming it still exists). Otherwise, if it has - X-Evolution-Transport and/or X-Evolution-Fcc, use those. If not, - use the default transport and sent folder. - FIXME: Falls back silently to the default sent folder if it can't - open the account-specific one... - (send_queue_send): remove the X-Evolution-Transport, etc - processing here, as it gets done by mail_send_message now. - FIXME: We only sync the default sent folder. - - * component-factory.c (owner_set_cb): While setting up the - standard folders, also record their URIs. - -2001-03-27 Jeffrey Stedfast - - * mail-account-editor.c (switch_page): Lets do some NULL checking - here. First, make sure the gsrc isn't NULL and also make sure that - account->source isn't NULL either. - - * mail-account-gui.c (mail_account_gui_setup): If there isn't a - source_proto, make sure we select "None" as the source type. - -2001-03-27 Dan Winship - - * mail-config-druid.c (construct): set the initial druid button - state after doing the mail_account_gui_setup, since that may - invoke signal handlers that will change it. - - * mail-account-gui.c (mail_account_gui_new): Fill in signature and - organization too. - (mail_account_gui_save): Preserve the "enabled" flag on the source. - (save_service): Don't look at authtype if the widget is - insensitive. (Fixes the "smtp://;auth=PLAINservername" bug.) - -2001-03-27 Not Zed - - * mail-send-recv.c (receive_done): Use gnome-dialog-close instead - of object_unref, for some reason it doesn't like being unref'd - with a refcount of 1, _who knows_. Gets rid of that refcount - warning on get mail. - -2001-03-27 Dan Winship - - * mail-config.glade: Probably the very last new config dialog - ever. (Ha ha). From Anna, based on a story by me. - - * mail-account-gui.c: New code for the new mail-config.glade. This - abstracts out all of the common code between the account editor - and the druid. It also handles the spiffy new provider-specific - config stuff. - - FIXME: The code to check if a service is ok or not is no longer - there... waiting until the online/offline stuff from the shell - appears. - - * mail-account-editor.c, mail-config-druid.c: These are much - smaller now, since most of the interesting bits moved to - mail-account-gui.c - - * mail-accounts.c: Add an enabled/disabled column/button to - replace the checkbox that used to be in the editor, because it - really makes more sense to have it out here. This looks ugly. - Probably ought to ETable it... - (load_accounts): Fill in the enabled column. - (mail_select, mail_unselect): toggle the sensitivity and name of - the Enable/Disable button appropriately - (mail_able): Handle the enable/disable button. - - * mail-config.c: Remove reply-to from MailConfigIdentity since it - didn't belong there (and wasn't being saved anyway). - (mail_config_check_service): Simplify this a bit. This really - needs to pop up a dialog with a "connecting..." message and a - cancel button. - - * mail-ops.c (uid_cachename_hack): Kludge, copied+modified from - mail_config_folder_to_cachename to deal with the different - behavior of the URL code now. Will go away when the keep-on-server - code moves. - (get_folderinfo_get): Only pass "subscribed_only" to - camel_store_get_folder_info if the store supports subscriptions... - - * mail-local.c (local_provider): Update this to reflect the - CamelProvider structure change - -2001-03-26 Jeffrey Stedfast - - * mail-callbacks.c (transfer_msg): Add "vtrash" as an allowed mail - folder type. - - * mail-ops.c (transfer_messages_transfer): Updated to reflect - changes made to the move/copy API in camel-folder.c - (add_vtrash_info): Use /Trash as the path instead of Trash. - - * mail-local.c (reconfigure_folder_reconfigure): Updated this too. - -2001-03-20 Not Zed - - * mail-local.c (init_trash): Fixed vfolder_new api. - -2001-03-26 Dan Winship - - * mail-format.c (get_cid): Make fake content-id URLs be guaranteed - unique: the old way (with %p on the CamelMimePart *) would - generate duplicates if memory was freed and re-allocated the right - way. - - * mail-display.c (pixbuf_gen_idle, etc): Make the thumbnail cache - global rather than per-MailDisplay, since content-ids ought to be - globally unique. Also, don't leak content-id strings when the - pixbuf generation fails, and remove pixbufs from the cache after 5 - minutes. - - * component-factory.c (mail_load_storages): Simplify a bit using - camel_session_get_provider. - - * mail-callbacks.c (empty_trash): Ditto, and fix up use of - CamelException. - -2001-03-26 Radek Doulik - - * mail-format.c (write_address): clear name and email data after - each address - -2001-03-25 Dan Winship - - * component-factory.c (unref_standard_folders): Fix a bug in this - that probably would have been noticed sooner if ETree hadn't always - made the mailer crash before you got here. :-) - -2001-03-25 Jeffrey Stedfast - - * mail-account-editor.c (transport_auth_type_changed): Allow the - authtype to be NULL. - (transport_auth_init): If the provider allows authtypes but - doesn't *need* one, create a "None" menu item that the user can - choose. This should fix the bug people have been seeing recently - since dan removed the no_authtype authmech from the smtp provider. - -2001-03-24 Jeffrey Stedfast - - * openpgp-utils.c (openpgp_verify): Default to iso-8859-1 as the - user's charset here if it is undefined. This is a better choice - than us-ascii. - -2001-03-23 Jon Trowbridge - - * mail-display.c (handle_embedded_address_object): #ifdef away - some code I don't quite want to delete yet. - (html_button_press_event): Remove some of Radek's placeholder - code, replace it with code to create my AddressPopup bonobo - control. - - * mail-format.c: Remove some obsolete code that if #ifdef-ed out - a while ago. - - * mail-ops.c (send_queue_send): Strip out the X-Evolution-Identity - header when sending. - -2001-03-23 Christopher James Lahey - - * message-list.c: Turned on BROKEN_ETREE. - -2001-03-22 Iain Holmes - - * importers/evolution-outlook-importer.c: Update for new IDL. - - * importers/evolution-mbox-importer.c: Update for new IDL. - - * importers/Makefile.am: Build the elm importer. - -2001-03-22 Jeffrey Stedfast - - * mail-accounts.c (mail_double_click): New callback to handle a - double-click event in the account clist. - (construct): Setup the double-click event for the account list. - -2001-03-22 Radek Doulik - - * mail-display.c (mail_display_new): connect to button_press_event - and iframe_created events of GtkHTML widget - (html_button_press_event): new signal handler, runs popup on - address fields and on links, later we should add popups for images - and maybe some more? any ideas? - (html_iframe_created): new signal handler, takes care of - connecting to button_press_event of all iframes : plus bunch of - empty methods for popup menu items - to be implemented - (html_motion_notify_event): new handler, highlights addresses by - underline - (html_enter_notify_event): take care of enter event - (update_active): helper function, extracted from - html_motion_notify_event - (update_active): move to absolute coordinates - (html_button_press_event): ditto - - * mail-format.c (write_address): revert back to raw HTML text, - store name and email to Text objects, workaround gtkhtml tables - bug (to be fixed soon ;-) - -2001-03-21 Ettore Perazzoli - - * folder-browser-factory.c (update_pixmaps): Don't return if - loading one image fails. - -2001-03-21 Dan Winship - - * mail-format.c (handle_multipart_related): Fix a bug in (illegal) - 0-part messages - - * mail-config-druid.c (incoming_check, incoming_type_changed, - transport_check, transport_type_changed): * mail-account-editor.c - (transport_type_changed, source_check): Use the new URL part - macros - - * mail-config.c (check_service_check): Use provider authtype list - if not connecting. - -2001-03-20 Miguel de Icaza - - * folder-browser-factory.c: Added new icons. - -2001-03-18 Miguel de Icaza - - * folder-browser-factory.c: Remove duplicated verb. - -2001-03-20 Iain Holmes - - * importers/evolution-mbox-importer.c (process_item_fn): Step the - parser so that it will import more than one message. - -2001-03-20 JP Rosevear - - * importers/Makefile.am: extra dist the oaf files - -2001-03-20 Radek Doulik - - * mail-tools.c (mail_tool_quote_message): set color in html - citation - - * mail-config.c: added citation highlighting configuration - - * mail-tools.c (mail_tool_quote_message): use citation - highlighting - - * mail-display.c (mail_text_write): use citation highlighting - -2001-03-20 Christopher James Lahey - - * folder-browser.c (etree_key): Made this check if the control - mask is set. - -2001-03-20 Christopher James Lahey - - * message-list.c (remove_node_diff, build_flat_diff): Remove the - node before freeing the data it points to. - -2001-03-19 Christopher James Lahey - - * Merged e-tree-rework-branch: - -2001-03-18 Christopher James Lahey - - * message-list.c: Added has_save_id and get_save_id methods. - - * subscribe-dialog.c: Added arguments for - e_tree_memory_callbacks_new of get_save_id and has_save_id to - NULL. - -2001-03-16 Christopher James Lahey - - * message-list.c: Added a call to - e_tree_memory_set_expanded_default to TRUE. Removed all calls to - set_expanded on nodes while the tree is frozen since this fails - miserably now. - -2001-03-13 Christopher James Lahey - - * message-list.c (message_list_get_layout): Turned off draw-grid. - -2001-03-09 Christopher James Lahey - - * folder-browser-factory.c, folder-browser.c, message-list.c, - message-list.h, subscribe-dialog.c, subscribe-dialog.h, - mail-callbacks.c: Converted these all to use ETree instead of - ETable. - -End of branch - -2001-03-19 Iain Holmes - - * importers/pine-importer.c: Pine intelligent mail importer. - - * importer/elm-importer.c: Elm imtelligent mail importer. - - * importer/GNOME_Evolution_Mail_(Pine|Elm)_Intelligent_Importer.oaf.in: - Pine and Elm oafinfo files. - - * importer/netscape-importer.c (maybe_replace_name): Replace some invalid - names with valid ones (Trash -> Netscape-Trash). Change some netscape names - to Evolution names (Unsent Messages -> Outbox). - (scan_dir): Use less variables. - (netscape_import_file): Simplify. - -2001-03-19 Jeffrey Stedfast - - * mail-ops.c: Removed gnome.h and ctype.h - (send_queue_send): Don't remove the X-Evolution header here. - (mail_send_message): Remove it here instead (so we only have to - remove it in one place - no matter if you send a single message or - send_queue. - -2001-03-19 Jeffrey Stedfast - - * mail-format.c (write_headers): Write the date header. - - * component-factory.c (owner_unset_cb): Call - unref_standard_folders() here instead. - - * folder-browser-factory.c: Add Resend Message menu item. - - * folder-browser.c (on_right_click): Add resend to the right-click - menu. - - * mail-callbacks.c (composer_sent_cb): Unref the message. - (composer_postpone_cb): Unref the message here too. - (resend_msg): New callback to allow resending of messages in the - Sent folder. - -2001-03-18 Jeffrey Stedfast - - * component-factory.c (unref_standard_folders): unref the standard - folders. - (owner_set_cb): Use g_atexit() to call unref_standard_folders() - when evolution-mail exits. This should solve the problem where - these folders are not synced when evolution-mail closes (because - they still had refs on them on close). - -2001-03-17 Not Zed - - * mail-mt.c (mail_msg_free): Move the proxy event outside the lock - (otherwise we always deadlock). - - * mail-local.c (reconfigure_clicked): Clear the message list - during update inside the folder thingy. This is a hell mess, need - to move the gui stuff to mail-callbacks and make this reconfigure - thing a more generic func. - - * message-list.c (ml_value_to_string): Cleanup the logic to use - lookup tables. - (sort_uid_to_rows): Removed due to rewrite below. - (build_flat_diff): Changes for node/summary/etc changes. Also do - changed nodes too. - (clear_tree): Free the info reference for nodes in our hashtable. - (build_subtree): Ref the info reference in our hash/tree node. - (on_click): Dont free message info, since we just got our ref to - it. - (remove_node_diff): Free messageinfo off node. - (build_flat): Ref messageinfo. - (message_list_set_folder): Allow a NULL folder to be set - - i.e. clear the view. - (message_list_set_folder): Emit a no message sleeted signal. - (build_tree): Change cursor keeping stuff to work with new info. - - Turned off BROKEN_ETREE - well maybe it'll work. Check for - duplicate messages displayed, etc. - -2001-03-16 Not Zed - - * message-list.h: Added uid_nodemap; mapping of uid's to e-tree - nodes. - - * message-list.c (build_flat): Changed to take a summary argument, - and to store node in node map, etc, and store info's in e-tree. - (build_subtree): Changed to store node in node map, and to store - info's in tree directly. - (ml_tree_value_at): Changed to get info directly from tree node, - removed allocated return value logic. - (ml_tree_value_at): Removed all "fake node" handling, no fake - nodes should ever exist. - (id_is_uid, id_is_subject, id_uid, id_subject): Removed macro's no - longer used. - (new_id_from_uid, new_id_from_subject): Removed no longer used. - (get_message_uid): - (get_message_info): Treat tree node data as messageinfo. - (message_list_select): Dont free the messageinfo, as its part of - our data, not retrieved from folder. - (message_list_drag_data_get): ditto. - (subtree_unread): Treat tree node data as messageinfo. - (subtree_size): ditto. - (subtree_earliest): ditto. - (clear_tree): Reset uid_nodemap on clear. - (save_node_state): tree nodes == messageinfo's. - (add_node_diff): ditto. - (remove_node_diff): ditto. - (main_folder_changed): use uid_nodemap to lookup changed nodes. - (main_message_changed): ditto. - -2001-03-16 Jeffrey Stedfast - - * mail-crypto.c (pgp_mime_part_sign_prepare_part): New function to - prepare the mime part and any subparts for pgp signing. - (pgp_mime_part_sign_restore_part): New convenience function to - undo the prepare_part. - (pgp_mime_part_sign): Don't assume the part passed in is a leaf - part, we could very easily get a multipart (and in fact were which - is why people have been having unexpected results when signing - messages with attachments) and set the encoding as if it were a - leaf part. Use our 2 new convenience functions to set the - encoding(s) instead. - -2001-03-15 Miguel de Icaza - - * folder-browser-factory.c (folder_browser_setup_view_menus): Fix - memory leak. - -2001-03-15 Jeffrey Stedfast - - * mail-account-editor.c (apply_changes): We don't care about SSL, - yea baby... - (apply_changes): Don't care about SSL, no baby... - (construct): Yea, I said we don't care 'bout SSL, baby - (construct): That's exactly what I said, uh huh... - (transport_auth_type_changed): Set the sensitivity of the - user/passwd entries. - (transport_type_changed): If the hostname hasn't been set yet, - just use "localhost" as it doesn't really matter, since all we - need is a valid URL object. - - * mail-config.c: We no longer need `use_ssl' for sources and - transports. - -2001-03-15 Dan Winship - - * mail-display.c (mail_display_redisplay): Remove a stray - camel_object_ref that was causing messages to never be finalized - if they got redisplayed (because of attachments, delayed-loading - IMAP parts, etc) - -2001-03-15 Not Zed - - * folder-browser.c: Added edit item to search-bar menu. - - * mail-callbacks.c (filter_edit): Changed for filter_editor_new() - api addition/change. - - * mail-vfolder.c (vfolder_edit): Use vfolder_editor_new intead. - -2001-03-14 Jeffrey Stedfast - - * session.c (mail_session_init): Tell camel to init NSS. - (mail_session_accept_dialog): Doh! NULL terminate the list of - buttons and show the label. - - * mail-mt.c (do_get_accept): Same. - -2001-03-14 Ettore Perazzoli - - * importers/Makefile.am (INCLUDES): Add `-I$(top_builddir)/shell' - and `-I$(top_srcdir)'. - -2001-03-13 Dan Winship - - * mail-display.c (on_url_requested): Call gtk_html_end() on the - stream so things happen. Fixes a problem with some inline images - (just very small ones maybe?) - - * importers/.cvsignore: create - -2001-03-13 Jeffrey Stedfast - - * session.c (mail_session_init): Call camel_init with the - evolution directory passed in. Also, abort if camel cannot be - initialized. - - * main.c (main): Shutdown camel. - -2001-03-04 Michael Meeks - - * folder-browser-factory.c (free_pixmaps): impl. - (update_pixmaps): accelerate with cache. - -2001-03-13 Iain Holmes - - * Makefile.am: Removed the importers and created a subdirectory - for them to live happily as plugins. - - * mail-importer.c (mail_importer_create_folder): Modified the - function to take a BonoboListener for the callback. - (get_importer_list): Get a list of importer plugins. - (free_importer_list): Free the list of plugins. - (mail_importer_init): Initalise the list of plugins. - (main_importer_uninit): Unload the modules. - - * GNOME_Evolution_Mail.oaf.in: Remove the oaf_server entries for - the importers. - - * importers/*: Copy the importers in here. - -2001-03-12 Jeffrey Stedfast - - * mail-config.c (mail_config_write): Make the transport save - whether or not it's supposed to use SSL as well. - (config_read): Read in whether or not we should remember the - transport password (for those that support SASL). - (mail_config_write): Save whether or not to save transport - passwords (needed for SASL enabled transports). - - * mail-ops.c (add_vtrash_info): Instead of always creating a new - vTrash folder, if the store already has a Trash folder, replace it - with the vTrash. Also, name the folder "Trash" instead of "vTrash" - and i18nify the name. - -2001-03-11 Jeffrey Stedfast - - * mail-ops.h: Added protection. - - * folder-browser-factory.c: Add ActionsEmptyTrash. By the way - - should we rename the bonobo verbs now that our menu structure has - changed? - - * mail-callbacks.c (empty_trash): New callback to empty ALL of the - trash folders. - -2001-03-10 Jeffrey Stedfast - - * mail-ops.c (send_queue_send): Remove our X-Evolution header - before we send. Also don't send messages that are marked for - deletion. - -2001-03-09 Jeffrey Stedfast - - * mail-mt.c (mail_get_accept): New async function that will be - used for SSL certs later. - - * session.c (auth_callback): Changed to return a gpointer value. - (mail_session_accept_dialog): New function to handle the new - _ACCEPT authenticator mode. - -2001-03-08 Jeffrey Stedfast - - * folder-browser-factory.c: Set the Forward->Quoted callback. - Also set the forward->Attachment callback. - - * mail-view.c (view_forward_msg): Specify FORWARD_ATTACHED. - - * mail-callbacks.c (forward_attached): Don't call - forward_messages() anymore...never really needed to. Just handle - it directly. - (forward_inlined): Specify FORWARD_INLINE as the flag argument. - (forward_quoted): New function sorta like forward_inlined except - this forwards the message quoted. - - * mail-tools.c (mail_tool_forward_message): New function to - prepare a message to be forwarded. - -2001-03-08 Jon Trowbridge - - * mail-format.c (write_field_row_begin): Added. Table row HTML - broken out into its own function. - (write_subject): Added. Emits the proper HTML for the subject - line. - (write_field_to_stream): #ifdef-ed out of existence. - (write_address): Take a CamelInternetAddress and spit out an - tag with the appropriate s. - - * mail-display.c (on_object_requested): Check for an "address" - object. If found, call... - (handle_embedded_address_object): ...this function, which creates - an AddressWidget bonobo control and passes in the necessary info. - I never really realized just quite how much GtkHTML kicks ass - until I figured out how to make this work. - -2001-03-08 Jeffrey Stedfast - - * mail-vtrash.[c,h]: Removed from cvs - - * Makefile.am: Removed mail-vtrash.[c,h] - - * main.c: Don't #include "mail-vtrash" anymore. - - * component-factory.c: Add "vtrash" as a folder type we support. - (create_view): Kludgy-kludge around the vtrash type. - (owner_set_cb): Don't create the vTrash folder here anymore... - - * folder-browser.c (on_double_click): Call open_msg here so that - it does the Right Thing (tm). - -2001-03-08 Jeffrey Stedfast - - * mail-local.c (mail_local_store_class_init): Override the default - init_trash() with the our custom one (since MailLocalStore doesn't - let the CamelStore keep a hash of opened folders and instead - keepts track of them itself). - (init_trash): custom implementation of the init_trash method for - MailLocalStores - (get_folder): i18nize. - (register_folder_registered): Don't add the folder to the vtrash - here. - -2001-03-08 Ettore Perazzoli - - * component-factory.c (component_fn): Specify a NULL - `EvolutionShellComponentGetDndSelectionFn'. - -2001-03-07 Jeffrey Stedfast - - * mail-autofilter.c (filter_rule_from_message): Add an action-part - widget. - (filter_rule_from_mlist): Same here. This should get rid of the - problem where people go to create a rule based on a message and - forget to fill-in the action part. - -2001-03-07 Jeffrey Stedfast - - * mail-crypto.c (mail_crypto_is_smime_v3_signed): New function to - decide if a mime part is an S/MIME v3 signed part. - (mail_crypto_is_pkcs7_mime): New function to decide if a mime part - is an application/pkcs7-mime part (or an application/octet-stream - part with application/pkcs7-mime data). - - * mail-account-editor.c (source_auth_init): Move the signal - emittion to after the set_menu call so that it actually works. - (transport_type_changed): Updated to manipulate the user/passwd - fields for the transport. - (construct): Updated to init the user/passwd fields for the - transport. - (transport_auth_init): Renamed. Also fill in the user/passwd - fields if available. - -2001-03-06 Jeffrey Stedfast - - * mail-accounts.c (construct): Disable the NNTP code if NNTP is - not enabled. This prevents some runtime warnings... - - * mail-config-druid.c: Updated to have a transport auth page. - -2001-03-01 Miguel de Icaza - - * folder-browser.c (on_right_click): Move the context menus to - the toplevel code; Use enumerations for the various bitfield - constants. - - Add support for hiding items that are not required (read/unread - and delete/undelete). - - This requires my previous patch, as it assumes "Open" does the - right thing instead of having two operations: Open and Edit. - -2001-02-28 Miguel de Icaza - - * folder-browser.c (on_right_click): Removed draft folders op - here, since open_msg now does the right thing (edit or view). - - * folder-browser-factory.c (update_pixmaps): Removed MessageEdit - from here. - - * mail-callbacks.c (open_msg): New function, does the "right - thing" to a message (either, edit or open). - - * folder-browser-factory.c: Register new command here. - (update_pixmaps): Rename keys that have been shuffled around. - (update_pixmaps): Rename to match new updates on xml file. - - Rename MessageOpenNewWindow to MessageOpen. Change action from - "view_message" to "open_message". - - * mail-callbacks.c (mark_all_as_seen): New command. Marks all - messages as seen. - -2001-03-06 Dan Winship - - * mail-ops.c (get_folderinfo_got): If the folderinfo has no URL - (ie, can't contain messages), don't add it as a vtrash source. - -2001-03-05 Jeffrey Stedfast - - * mail-config-druid.c: Don't access the `active` data member of a - GtkToggleButton directly - bad programming, shame on me. - - * mail-account-editor.c: Same here. - - * mail-accounts.c: And here too. - - * mail-callbacks.c (empty_subject_destroyed): And finally here. - - * mail-crypto.c (pgp_mime_part_sign): Correcty set the mime type - for the multipart. Hmmm, still doesn't wrap correctly. NotZed? - Ideas? - (pgp_mime_part_encrypt): Here too. - -2001-03-03 Not Zed - - * mail-tools.c: Remove very old camel lock stuff. - - * mail-local.c (register_folder_registered): Add the local folder - as a potential vfolder source. - - * folder-browser.c (got_folder): When we have a new folder, - register it as a potential vfolder source. - - * mail-vfolder.c: Added the source rule to the vfolder_info. - (vfolder_refresh): Store the rule in the vfolder info, etc. - (vfolder_register_source): Function to register a newly opened - folder with us. - (vfolder_uri_to_folder): Save the folder in the vfolder_info too. - (source_finalise): Handle clenaup when the folder dies. - -2001-03-02 Not Zed - - * mail-mt.c (set_stop): Check the container is not NIL before - trying to set thje prop. - -2001-03-01 Not Zed - - * folder-browser.c (folder_browser_search_menu_activated): Fixes - for changes to search bar. - (search_save): Removed. - (search_full): Removed. - (search_full_clicked): Removed. - (folder_browser_search_option_items[]): Removed. - (folder_browser_search_query_changed): Changed for search bar - changes. - (folder_browser_clear_search): Removed. - - * mail-vfolder.c (vfolder_clone_rule): New function to clone a - filter/search rule into a matching vfolder rule. - - * mail-send-recv.c (mail_receive_uri): Setup a timeout for status - updates. - (build_dialogue): Setup timeout id for status updates. - (operation_status_timeout): New function to set the status via a - timeout. - (receive_done): Remove the timeout handler if we need to. - (operation_status): - (receive_status): Just update the info, and let the timeout - handler update the gui. - (do_free_status): - (do_show_status): Removed gui thread status message processing. - -2001-02-28 Not Zed - - * folder-browser.c (folder_browser_config_search): New function to - configure the FilterRule for the search mechanism. - -2001-02-27 Not Zed - - * folder-browser.c (folder_browser_gui_init): Setup the search bar - as a filterbar. - (got_folder): Set the whole search bar sensitive or not based on - the search capability of the folder. - - * folder-browser.h: Changed to use efilterbar instead of esearchbar. - -2001-02-27 Jeffrey Stedfast - - * mail-callbacks.c (configure_mail): Return TRUE if the user - configured his/her settings, else return FALSE. - (check_send_configuration): If configure_mail() returns TRUE, then - continue otherwise quit. - (send_receive_mail): Same. - -2001-02-26 Jeffrey Stedfast - - * mail-callbacks.c (mail_generate_reply): Set a "References" - header no matter what if we are able to get a Message-Id. Fixes - bug #1583. - - * mail-accounts.c (mail_delete): Confirm that the user REALLY - wants to delete this account. - (news_delete): Same. - - * mail-ops.c (mail_send_message): Changed the product string - - will change it to use User-Agent once I get the RFC/DRUMS draft or - whatever. Until then I'll stick with X-Mailer. - -2001-02-26 Dan Winship - - * mail-callbacks.c (delete_msg): Mark deleted messages as "seen" - as well so they don't count towards the unread count. - - * mail-view.c (view_delete_msg): ditto - -2001-02-25 Jeffrey Stedfast - - * component-factory.c (owner_set_cb): Re-add the - mail_vtrash_create() hack back in for LocalStores since there's no - better way to register a vTrash folder on the Local Storage yet. - - * mail-local.c (register_folder_registered): Add folders to the - vTrash folder here since the LocalStore does not let the parent - CamelStore class keep it's own hash of the folders. - -2001-02-25 Jeffrey Stedfast - - * session.c (mail_session_forget_password): New function to force - the removal of a given password. - - * openpgp-utils.c (openpgp_decrypt): On failure, forget the - passphrase. - (openpgp_encrypt): Here too. (cleaned this up a bit too) - (openpgp_clearsign): And here. - (openpgp_sign): Again... - - * mail-callbacks.c (composer_postpone_cb): Abort if the message is - NULL (which is valid if an error occured). - (composer_send_cb): Same. - -2001-02-24 Jeffrey Stedfast - - * folder-browser.c: Toss the mail_tool_camel_lock* stuff. - * mail-ops.c: Same. - * mail-summary.c: Here too. - - * mail-tools.c (mail_tool_uri_to_folder_noex): Blown away! - (mail_tool_filter_get_folder_func): *kapoosh* - (mail_tool_camel_lock_up): Same. - (mail_tool_camel_lock_down): Same. - (mail_tool_set_uid_flags): Don't need this rubbish anymore either. - -2001-02-24 Jeffrey Stedfast - - * component-factory.c (mail_load_storages): No longer need to - construct the vTrash here. - (owner_set_cb): Don't make the vTrash for the local store here. - - * mail-ops.c (add_vtrash_info): New function to add a vTrash - folder info to a pre-constructed CamelFolderInfo for use in the - get_folder_info async function. - -2001-02-23 Jeffrey Stedfast - - * main.c (main): No longer need to do a vtrash_cleanup() (it also - doesn't exist anymore). - - * component-factory.c (mail_load_storages): Updated to use the new - vtrash code. - (owner_set_cb): Same. - - * mail-tools.c (mail_tool_uri_to_folder): Update to handle the - "vtrash:" url prefix so that we can extract the REAL uri and know - to get the trash folder. - - * mail-vtrash.c (mail_vtrash_add): Add the vTrash folder to the - EvolutionStorage. - (mail_vtrash_create): Get the store based on the uri (async) and - then call mail_trash_add. - (vtrash_cleanup): Removed. - (vtrash_uri_to_folder): Removed. - (vtrash_create): Replaced by mail_vtrash_create() - -2001-02-23 Iain Holmes - - * component-factory.c (owner_set_cb): Init the importer here. - - * mail-importer.[ch] (mail_importer_create_folder): Add a function - that creates new folders in the shell. - (mail_importer_init): Take in an EvolutionShellClient, and get the - local_storage corba_object from it. - -2001-02-22 Jeffrey Stedfast - - * mail-vtrash.c (create_trash_vfolder): Come up with a unique - store uri for each vtrash (using %p and the CamelStore we're gonna - place it on). - (get_trash_get): Pass in the store so we can use it for %p. - -2001-02-23 Not Zed - - * mail-vfolder.c (vfolder_gui_add_from_mlist): Rule to add mlist - vfolder. - - * mail-autofilter.c (filter_gui_add_for_mailing_list): Removed. - (rule_from_mlist): Build a generic match rule from an mlist. - (vfolder_rule_from_mlist): Setup the vfolder rule for an mlist. - (filter_rule_from_mlist): Setup a filter rule fro an mlist. - (filter_gui_add_from_mlist): GUI thingy to do the work. - - * folder-browser.c (on_right_click): Added vfolder on mailing list - to filter menu. - (on_right_click): Use header_raw_check_mailign_list instead of - mlist magic to get the mailing list name. - (filter_mlist): Changed to use new add_from_mlist() call. - (vfolder_mlist): New function for vfolder from mlist. - - * mail-send-recv.c (build_dialogue): Only allow downloading if the - source is enabled at this time. - (mail_autoreceive_setup): Check for enabled sources before setting - up autodownload. - -2001-02-22 Jeffrey Stedfast - - * mail-accounts.c (construct): Construct the PGP Path - GnomeFileEntry widget. - (pgp_path_changed): Try to auto-detect which PGP type the binary - file is based on the basename (yuck). - -2001-02-23 Not Zed - - * mail-ops.c (create_folder_get): Make op cancellable/report - internals. - (get_folder_get): - (sync_folder_sync): - (get_folderinfo_get): Make op cancellable/report internals. - - * mail-vtrash.c (get_trash_get): Setup the operation registration, - and create a pseudo "start/stop" operation. - (get_trash_free): Free store if we have it. - (get_trash_got): Move vtrash add into here, so we execute in the - right thread. - - * component-factory.c (owner_set_cb): Make trash creation async. - - * mail-local.c (register_folder_desc): A description of what we're - doing. - - * mail-mt.c (mail_msg_new): Set status callback to operation_new. - (mail_operation_status): Operation status function, proxy messages - to main thread, and attempt to present a meaningful ui experience - for operations. - -2001-02-22 Jeffrey Stedfast - - * openpgp-utils.c (openpgp_verify): Fixed memory corruption bug. - - * mail-format.c (try_inline_pgp_sig): Check to make sure the - validity isn't NULL. - (handle_multipart_signed): Check for NULL validities. - -2001-02-21 Jeffrey Stedfast - - * mail-tools.c (mail_tool_uri_to_folder): Protect against NULL - uri's. - - * mail-vtrash.c: Do mutex locking on the global hash table - this - should clear up some segfaults ;-) - - * mail-config-druid.c (druid_finish): Set the 'enabled' member of - the source to TRUE if the URL exists else set to FALSE. - (incoming_type_changed): If the provider chosen is "None" then - gray-out the auto-check widgets and the check-settings, otherwise - sensitize them. - - * mail-account-editor.c (construct): Added a few more settings. - (apply_changes): Save the new settings. - - * mail-config.c (service_copy): Updated. - (config_read): Read in whether or not the account is enabled. - (mail_config_write): Save if the account is enabled or not. - -2001-02-22 Jeffrey Stedfast - - * mail-ops.c (mail_send_message): Updated to reflect changes to - the filter-driver code. - -2001-02-22 Not Zed - - * Makefile.am (CAMEL_OBJS_EXTRA): Removed, no longer link with - libcamelvee. - (evolution_mail_LDADD): Ditto. - - * mail-vtrash.c: Moved camel-vee-store header ot camel levle. - - * mail-tools.c: Moved camel-vee-folder header to camel. - - * mail-local.c (local_storage_new_folder_cb): started hack for - progress reporting, which is currently to the console. - - * mail-mt.c (set_stop): Set the stop button sensitivity. - (mail_msg_received): enable/disable stop button while we're - processing stuff in another thread. - - * message-list.c (ml_tree_value_at): If our uid entry vanishes - before w'ere ready, then make a fake. - -2001-02-21 Jeffrey Stedfast - - * mail-crypto.c (pgp_mime_part_verify): Changed to use - PgpValidity. - - * openpgp-utils.c (openpgp_verify): Return a PgpValidity and set - the description as UTF-8 for later use in mail-format.c when - writing to GtkHTML. - - * mail-format.c (try_inline_pgp_sig): Updated to use the new - PgpValidity code. - (handle_multipart_signed): Updated. - -2001-02-21 Not Zed - - * mail-callbacks.c (composer_postpone_cb): Fix for api changes to - append_mail. - - * Makefile.am (evolution_mail_SOURCES): Removed mail-threads.[ch]. - - * mail-threads.[ch]: Removed. - - * subscribe-dialog.c (subscribe_do_get_store): Chagned to use new - thread stuff. This is really getting boring. - (subscribe_do_subscribe_folder): Changed to use new thread stuff. - Last one at last, phew. - - * session.c (register_callback): Changed to use new thread stuff. - YUCK. I dropped some functionality, now the timeout callback - return is ignored, so basically it keeps running till finished. - - * mail-ops.c (mail_operation_run): Removed, no longer used/needed. - (mail_do_append_mail): Changed to use new thread stuff. - (mail_do_transfer_messages): ditto. - - * mail-local.c (local_storage_new_folder_cb): Use new thread - stuff, also only run synchronous for this operation. - (mail_local_reconfigure_folder): - (reconfigure_clicked): Changed to use new mail thread stuff. - - * mail-config.c (mail_config_check_service): Changed to use new - thread stuff. - -2001-02-20 Dan Winship - - * mail-vtrash.c (get_trash_get): Pass NULL, not "/" for @top. - - * mail-callbacks.c (create_folders): Make this work with - CamelStores where the separator character isn't /. folder_created - and folder_deleted are still broken. - -2001-02-20 Not Zed - - * mail-vtrash.c: Include the camel-vee-store.h header from the - uninstalled copy. - -2001-02-19 Jeffrey Stedfast - - * component-factory.c (mail_load_storages): Create vTrash folders - for all remote stores as well. - -2001-02-20 Not Zed - - * mail-vtrash.c (create_trash_vfolder): Add the auto-update flag - to the folder open flags. - -2001-02-19 Jeffrey Stedfast - - * mail-vfolder.c (mail_vfolder_get_vfolder_storage): New handy - dandy function to ref and return the vfolder storage (will - probably be disavowed once I figure out how to get the vTrash - folder to show up in the EvolutionLocalStorage). - - * main.c (main): Call vtrash_cleanup(). - - * mail-vtrash.c: New file. - (vtrash_uri_to_folder): vtrash: URI handler - (vtrash_create): Replacement async vtrash function for the old one - in mail-ops.c - (vtrash_cleanup): Cleanup code - unrefs the cached vtrash folders - and free's the hashtable. - - * Makefile.am: Added mail-vtrash.[c,h]. - - * mail-tools.c (mail_tool_uri_to_folder): If we have a vtrash: - URI, call the vtrash URI handler function rather than continuing - on. Yes, I know this is a hack and it needs to be fixed. - - * mail-ops.c (mail_do_setup_trash): Removed. - (mail_trash_get): Removed. - - * component-factory.c (owner_set_cb): Create the vTrash folder for - the LocalStore here. - - * mail-local.c (get_folder_info): Implement. - -2001-02-20 Not Zed - - * mail-ops.c (fetch_mail_fetch): Unref the driver here, in the - subthread, so we dont block the gui while it sync's all the - folders. - (fetch_mail_fetched): Rewmoved above code from here. - -2001-02-16 Not Zed - - * mail-send-recv.c (receive_status): Dont do the thaw/freeze set here. - (update_folders): " - - * mail-vfolder.c (vfolder_refresh): Setup the virtual - 'unmatched' folder by default. - (vfolder_uri_to_folder): HAndle UNMATCHED folder specially, it has - no explicit sources. - -2001-02-16 Jeffrey Stedfast - - * mail-send-recv.c (receive_get_folder): Not sure it makes any - difference, but lets ref the folder while the hash table is locked - rather than after we unlock it. - -2001-02-16 Jeffrey Stedfast - - * main.c: * component-factory.c: Reverse the changes I made - yesterday. - -2001-02-15 Jeffrey Stedfast - - * main.c (main): Have the mail-config and openpgp initialize here - instead. - - * component-factory.c (owner_set_cb): No need to have mail-config - and openpgp init here. - -2001-02-15 Jeffrey Stedfast - - * mail-ops.c (do_scan_subfolders): Use mail_storage_create_folder - - * mail-callbacks.c (mail_storage_create_folder): Convenience - function so we can keep all the evolution_storage_add_new_folder() - code in one place as much as possible. - - * subscribe-dialog.c (recursive_add_folder): Use 'name' rather - than the no-description bs since that's what all the other places - do. - - * mail-callbacks.c (folder_created): New callback to handle the - "folder_created" signal - handles CamelFolderInfo's recursively. - (folder_deleted): Same but for "folder_deleted". - - * component-factory.c (storage_create_folder): Instead of doing - the evolution_storage_new_folder() stuff by hand, pass it off to - the new callback: folder_created(). At some point this will be - unecessary as we'll attach this callback to the "folder_created" - signal. - -2001-02-15 Jeffrey Stedfast - - * message-list.c: Wrapped the address compare functions in a - #ifdef - (address_compare): #ifdef the use of the smart address sorting - code and provide a #else for using g_strcasecmp(). - -2001-02-14 Jeffrey Stedfast - - * openpgp-utils.c (openpgp_verify): Add the --no-tty flag. - -2001-02-14 Dan Winship - - * mail-mlist-magic.c: Rewrite explanatory comments to use normal - regexps rather than procmail weirdness. - (check_sender): match "foo-owner" as well as "owner-foo". - (check_list_post): (New) Check for "List-Post: - - * component-factory.c (owner_set_cb): Setup the Trash folder. - - * mail-ops.c (create_trash_vfolder): Do better error handling. - (populate_folder_urls): Oops, helps to strdup the url into the - array if we plan on freeing the data. - (mail_get_trash): New async function that may eventually replace - mail_do_setup_trash(). - (do_setup_trash): Do better error handling. - - * mail-local.c (mail_local_store_class_init): Override - get_folder_info. - (get_folder_info): Implement. - -2001-02-13 Christopher James Lahey - - * mail-local.c (do_reconfigure_folder): Fix some uninitialized - variables. - -2001-02-12 Not Zed - - * message-list.c (build_tree): if doing a full update, save the - cursor pos and restore it afterwards. - (on_cursor_activated_cmd): Copy the current_uid to a new string. - I dont know why this is required, but it is. - (message_list_destroy): Free the cursor_uid as we're done with it. - (build_flat): IF the current uid disappeared from the list, then - unset the message. - (build_tree): Likewise. - -2001-02-12 Jeffrey Stedfast - - * mail-config.c (mail_config_write): Clean out the cruft in the - Accounts section before writing the current accounts out to the - config file. - - * mail-account-editor.c (construct): Strip the leading "/" from - the Namespace/Path entry if the provider doesn't require absolute - pathnames. - -2001-02-12 Kjartan Maraas - - * Makefile.am: xml-i18n-tools setup. - * GNOME_Evolution_Mail.oaf.in: Mark strings for translation. - -2001-02-11 Dan Winship - - * mail-callbacks.[ch]: Re-add non-static forward_messages. - mail-view.c needs it. - -2001-02-11 Jeffrey Stedfast - - * mail-callbacks.c (forward_inlined): Don't leak memory. - (forward_messages): change doinline to be a gboolean argument. - -2001-02-10 Jeffrey Stedfast - - * mail-callbacks.c (list_add_addresses): Check the full list of - IDs instead of just the default id and if we find an address - matching one of the user's ids, then save it. - (mail_generate_reply): Try to guess which account to use based - upon the list of To and Cc addresses and pass that as the 'From' - address to e_msg_composer_set_headers(). - (forward_get_composer): Updated to reflect changes to - e-msg-composer. - -2001-02-11 Gediminas Paulauskas - - * mail-config.glade.h: removed, xml-i18n-extract's the strings itself. - * *.glade: do not output_translatable_strings - * Makefile.am: removed *.glade.h from EXTRA_DIST. - -2001-02-09 Dan Winship - - * mail-local.c: Updates for CamelStore changes, small memory leak - fixes. - (lookup_folder): Removed (and moved into the reconfigure code) - since this method no longer exists in CamelStore. - (do_reconfigure_folder, etc): Update the info in the - MailLocalStore after reconfiguring. - (mail_local_lookup_folder): Removed - - * local-config.glade: fix padding of the label_format - - * message-list.c (ml_tree_value_at): Don't keep message infos - reffed across calls, since this can cause badness after a - reconfigure. Instead, just strdup the needed values and free those - on the next call. - - * mail-tools.c (mail_tool_get_root_of_store): Unused, remove. - (mail_tool_get_inbox): use camel_store_get_inbox. - - * evolution-outlook-importer.c (load_file_fn): - * evolution-mbox-importer.c (load_file_fn): Use - mail_tool_get_local_inbox() instead of mail_importer_get_folder() - - * mail-importer.c (mail_importer_get_folder): Removed - -2001-02-08 Jeffrey Stedfast - - * mail-callbacks.c (mail_generate_reply): New location for this - function. - - * mail-format.c: Removed mail_generate_reply as it's ONLY ever - used in mail-callbacks.c. - - * mail-ops.c (fetch_mail_fetch): Reworked some keep-mail-on-server - logic so that we ALWAYS look for a cached array of UIDs that we - may have downloaded previously so as not to download them again - even if we will be deleting them off the server. This fixes bug - #1344. - -2001-02-09 Not Zed - - * mail-ops.c (filter_folder_free): only free driver, if set. - (fetch_mail_fetched): Unref the driver here, so it can cleanup - before we call the 'done' callback. - - * component-factory.c (owner_set_cb): Add setup for mail - autoreceive stuff. - - * mail-send-recv.c (free_info_data): Free the send info's from teh - active hash, not the running list. - (receive_done): As we finish downloads, remove them and clean them - up, and also close the window. - (mail_autoreceive_setup): New function to setup & maintain - automatic download stuff. - -2001-02-08 Jeffrey Stedfast - - * mail-config-druid.c (construct): Set the sensitivity of the spin - button based on the state of the checkbox. - - * mail-config.c (config_read): Properly do defaults here. - (mail_config_write): Removed some of the settings being saved - here. - (mail_config_write_on_exit): Save those settings here instead. - -2001-02-08 Jeffrey Stedfast - - * mail-display.c (on_object_requested): Cast the CamelMedium to a - CamelMimePart before performing actions on it as if it were a - CamelMimePart. - - * mail-config-druid.c (druid_finish): Save the auto-check settings. - (construct): Initialize auto-check widgets. - (mail_config_druid_get_auto_check): New function - (mail_config_druid_get_auto_check_minutes): New functions - - * mail-config.c (config_read): Read in whether or not to check - every x minutes. - (mail_config_write): Save auto-check config data and SSL. - -2001-02-07 Jeffrey Stedfast - - * mail-autofilter.c (rule_add_subject): Use "contains" because the - subject might be broken into subparts and using the "is" rule will - then fail ;-) - -2001-02-08 Not Zed - - * mail-send-recv.c (mail_send_receive): - (mail_receive_uri): Init active_downloads hash if it hasn't been yet. - -2001-02-07 Not Zed - - * mail-send-recv.c (operation_status): Handle internal camel status return. - (receive_done): Remove active download when done. - (mail_receive_uri): Initiate download of a single source, with no gui. - (build_dialogue): Mark any new items as real active downloads. - (do_show_status): Make the progress bar optional. - -2001-02-06 Not Zed - - * mail-send-recv.c: camel_cancel->camel_operation. - - * mail-ops.old.c: camel_cancel->camel_operation. - - * mail-ops.c: camel_cancel->camel_operation. - - * mail-mt.c: camel_cancel->camel_operation. - - * mail-callbacks.c (stop_threads): camel_cancel->camel_operation. - - * mail-mt.h: CamelCancel->CamelOperation. - -2001-02-07 Jeffrey Stedfast - - * mail-mt.c (set_view_data): Check current_message for NULL - this - fixes a bug running under SunOS (not a major deal tho as it's in a - debug printf). - -2001-02-06 Jeffrey Stedfast - - * mail-config.c (mail_config_write_on_exit): Oops, save the - seen_timeout variable. - -2001-02-06 Christopher James Lahey - - * Makefile.am (evolution_mail_LDADD): Added libmenus.la. - - * folder-browser-factory.c (control_activate): Added GalView menus - here. - - * message-list.c, message-list.h (message_list_get_layout): Made - message_list_get_layout export. - -2001-02-06 Iain Holmes - - * mail-display.c (pixbuf_gen_idle): Set the size of the icon to 24x24 - always. - (button_press): Function to toggle the disposition of an attachment. - (on_object_requested): New way to indicate functions on attachments. - - * message-list.c (hide_load_state): Free the olduid. - -2001-02-06 Jeffrey Stedfast - - * mail-config-druid.c (set_defaults): Updated to checkfor - "(none)". - - * mail-account-editor.c (entry_changed): Make sure the email - address is valid. - - * mail-config-druid.c (identity_check): Check to make sure we have - a valid email address. - (is_email): New function to check a string to see if it's a valid - email address. - -2001-02-05 Jeffrey Stedfast - - * evolution-mbox-importer.c: We are now going to use a file - descriptor and a CamelMimeParser rather than a FILE pointer. - (load_file_fn): Open the file descriptor and initialize the - CamelMimeParser. - (importer_destroy_cb): Unref the mime parser. - (support_format_fn): Use an fd and use a case-insensitive - comparison as well as elimate a buffer overrun. - (process_item_fn): Process 1 CamelMimeMessage per invocation so as - to not lock up Iain's GUI and to work similar to the way Iain - originally coded it. - -2001-02-05 Christopher James Lahey - - * evolution-mbox-importer.c, evolution-mbox-importer.h: Moved - bonobo includes from the .c to the .h. Include - evolution-mbox-importer.h in evolution-mbox-importer.c. - - * evolution-outlook-importer.c, evolution-outlook-importer.h: - Moved bonobo includes from the .c to the .h. Include - evolution-outlook-importer.h in evolution-outlook-importer.c. - - * mail-callbacks.c: Include mail-send-recv.h. - - * mail-local.c (mail_local_lookup_folder): Cast local_store to - CAMEL_STORE. - - * mail-mt.c (mail_msg_cleanup): Make this function static. - - * mail-send-recv.c, mail-send-recv.h: Created mail_send_recv.h. - Included it in mail-send-recv.c. Added a #include - . - (mail_send_receive): Added a cast. - - * mail-summary.c (new_folder_cb, removed_folder_cb, - create_summary_view): Cast the source func in calling g_idle_add. - -2001-02-05 Jeffrey Stedfast - - * mail-format.c (try_inline_pgp_sig): New function to handle - inline pgp-signatures. - - * mail-config-druid.c (construct): Keep track of the CheckSettings - check boxes. - (transport_next): Connect if the user says so. - (incoming_next): Same. Also, don't jump to the next page if - test-settings fails. - -2001-02-05 Jeffrey Stedfast - - * mail-config-druid.c (incoming_next): Updated to not connect when - getting a list of authtypes. - (transport_next): No longer connects - again, this is - useless. Read the apply_changes argument for the reason why. - - * mail-account-editor.c (apply_changes): Updated. Set the - 'connect' argument to FALSE for now, this basically means that the - call is worthless tho so it may be best to either get rid of the - checks altogether or else make it connect. - (source_auth_init): Don't connect here, it's just plain annoying. - (transport_construct_authmenu): Same here. - - * mail-config.c (mail_config_check_service): Now takes a connect - argument. - -2001-02-03 Michael Meeks - - * mail-local.c (load_metainfo): Fix dodgy libxml allocation - pollution, and potential faults on NULL attributes. - -2001-02-02 Not Zed - - * mail-send-recv.c (mail_send_receive): Cleaned up so we dont add - an unecessary level of indenting. - - * message-list.c (ml_tree_value_at): For collapsed tree nodes, - scan the collapses nodes for the unread and status information. - Since we dont really have fake nodes anymore. - -2001-01-30 Ian Campbell - - * message-list.c: Add support for new icons for being - read/unread for fake root messages on threads. - -2001-01-30 Iain Holmes - - * mail-send-recv.c (mail_send_receive): Only allow one send and - receive to be running at once. - (build_dialogue): Set the icon for the window. - - * evolution-mbox-importer.c (support_format_fn): Only compare the first - 5 bytes of the signature. - -2001-01-30 Kjartan Maraas - - * folder-browser.c: Fix typo. - -2001-01-29 Jeffrey Stedfast - - * mail-importer.c (mail_importer_add_line): Cast the - camel_stream_mem_new() to a CamelStreamMem. - -2001-01-29 JP Rosevear - - * main.c: Return efence ifdefs to 0 for solaris build - -2001-01-29 Not Zed - - * message-list.c (tree_equal): Debug function to compare the tree - we think we have, after an incremental update. - (build_tree): Check the tree after we've built it. - (build_tree): Oops, turn on BROKEN_ETREE again. - - * mail-mt.c (mail_get_password): If we are being called from the - main gui thread, then just call the dialogue directly. Ideally we - dont want this anyway but lets handle the case nicely. - (mail_get_password): Try locking around the password request, to - single-queue any password requests. - (mail_msg_init): Push an exit handler to clean it up on completion. - - * mail-send-recv.c (receive_update_got_store): New function called - when the store has been retrieved asynchronously. - (mail_send_receive): Get the store asynchronously. This was - causing problems where the password dialogue would try and be - called from the main thread via a message. - - * mail-ops.c (mail_get_store): New function to get a store - (a)synchronously. More or less taken from subscribe-dialog, which - i will remove later. - (mail_scan_subfolders): Try running the scan subfolder thing - asynchronously, to help startup time. Not sure if this will work, - but presumably the shell can handle the folders appearing later - ok. - -2001-01-28 Jeffrey Stedfast - - * mail-config-druid.c (set_defaults): Turns out that I was wrong - about the g_get_real_name mem leak, god damn glib for not - following the const char* standard. - -2001-01-28 Jeffrey Stedfast - - * mail-config-druid.c (management_prepare): Use UTF-8. - (set_defaults): Use UTF-8 and also fixed a memory leak by freeing - the string returned by g_get_real_name(). - (mail_config_druid_get_account_name): Use UTF-8. - (mail_config_druid_get_full_name): Same. - (mail_config_druid_get_email_address): Same. - (mail_config_druid_get_organization): Same. - - * mail-account-editor.c (apply_changes): Save UTF-8 strings rather - than gtk strings. - (construct): Use the UTF-8 convenience functions to set the gtk - entries for the ID fields. - -2001-01-28 Ettore Perazzoli - - * mail-vfolder.c (vfolder_gui_add_rule): Make the OK button the - default one. - - * mail-search-dialogue.c (mail_search_dialogue_init): Use stock - buttons for OK and Cancel. Make the OK button the default one. - -2001-01-28 Ettore Perazzoli - - * mail-vfolder.c (vfolder_gui_add_rule): Set a default size for - the window so that more rules are visible. - - * mail-search-dialogue.c (mail_search_dialogue_construct): Set a - default size for the window so that more rules are visible. - -2001-01-28 Not Zed - - * mail-display.c (write_data_to_file): Changed to use - mail_save_part to save the data in another thread. - (save_data_cb): Hide the fileselector once we have a button press, - and are saving stuff. - - * mail-ops.c (mail_save_part): New function to save a part content - asynchronously. - -2001-01-27 Christopher James Lahey - - * folder-browser.c (etable_key): Don't handle home and end keys - since %ETable deals with them now. - -2001-01-27 Jeffrey Stedfast - - * message-list.c (address_compare): Protect against NULL address - pointers. - (subject_compare): Same but for subject pointers. - -2001-01-27 Iain Holmes - - * mail-summary.c (create_summary_view): Applied patch from John R Sheets - to fix some warnings. - (idle_check): Fixed the prototype to fix some warnngs as well. - -2001-01-26 Ettore Perazzoli - - * mail-display.c (get_embedded_for_component): Try a control - first, instead of an embeddable. - -2001-01-26 Jeffrey Stedfast - - * subscribe-dialog.c (populate_store_foreach): Check for a NULL - service->url as we obviously can't subscribe to folders on a - non-existant mail source :-) - (subscribe_do_get_store): Check for a NULL url here too, not that - we should need it anymore (due to the above fix) but it doesn't - hurt. Also, should we wait on the thread? Probably doesn't matter. - -2001-01-26 Iain Holmes - - * evolution-outlook-importer.c (load_file_fn): Replace fsetpos with - fseek and use a long instead of fpos_t. - (process_item_fn): Same. - - * mail-importer.h: Add a frozen item to tell when the folder is frozen. - - * evolution-mbox-importer.c (process_item_fn): Fix the blank message. - Set the frozen element. - (importer_destroy_cb): Thaw the folder if frozen. - -2001-01-26 Dan Winship - - * mail-identify.c (mail_identify_mime_part): Fix an uninitialized - variable use. - -2001-01-26 Jason Leach - - (Fixing an old FIXME) - - * component-factory.c (create_vfolder_storage): removing - create_vfolder_storage, replacing call to it with - vfolder_create_storage. - -2001-01-26 Not Zed - - * message-list.c (build_tree): Define BROKEN_ETREE again, till we - get this stuff fixed better. - -2001-01-25 Not Zed - - * folder-browser.c: Moved teh "sender contains" item to the end of - the list, so the gui doesn't suddenly change on everyone. Fixed - the sender-contains search string to be a valid s-exp (ha, didn't - test it even once eh ettore?!) - (search_save): Dont have the sender contains as the default case - (which well, never gets called anyway), oops i guess i should've - reviewed the patch a little more. - -2001-01-26 Ettore Perazzoli - - * folder-browser.c: Add a missing parenthesis to the "from - contains" rule. Also make it the last item instead of the first - one. - -2001-01-25 Iain Holmes - - * component-factory.c (component_factory_init): Init the mail - mail importers. - - * mail-local.[ch] (mail_local_lookup_folder): retrieve the local - folder given by the name. - - * mail-importer.[ch]: Basic functions for all importers to use. - - * evolution-mbox-importer.[ch]: Mbox importer. - -2001-01-25 Jeffrey Stedfast - The following fixes seem to clear up the problem of new mail not - being shown in the Inbox and/or other folders where mail had been - delivered. - - * mail-send-recv.c (build_dialogue): Freeze the inbox. - (receive_get_folder): Freeze folders before dumping them into the - hash table. - (free_folder_info): Thaw the folder. - (free_info_data): Thaw the Inbox. - -2001-01-25 Jason Leach - - (Don't prompt about unsaved changes for replies/forwards that have - not actually been modified) - - * mail-callbacks.c (do_forward_inline): Unset the has_changed for - the message composer. - (do_forward_attach): Same here. - (mail_reply): And here. - -2001-01-25 Dan Winship - - * mail-format.c (mail_content_loaded): Check if a message part's - content is available, and if it's not, queue a thread that will - load it and then queue an idle-handler redisplay of the message. - (call_handler_function): Call mail_content_loaded() on the part - and don't try to display it if it's currently offline. - (get_data_wrapper_text): Simplify a bit - - * mail-display.c (mail_display_queue_redisplay): rename and make - non-static. - (mail_display_redisplay): Use a "new and improved" way of - preserving the GtkHTML scroll location. ("new and improved" is - code for "gross and hackish", but there should be a real interface - for this eventually.) - (on_url_requested): Use mail_content_loaded() and don't write out - offline cid: URLs - - * mail-identify.c (mail_identify_mime_part): Use - mail_content_loaded and don't try to identify the data if it's - offline. - -2001-01-25 Christopher James Lahey - - * message-list.c: Made the message list pay attention to the - "cursor_activated" signal instead of the "cursor_change" signal. - -2001-01-25 Ettore Perazzoli - - * folder-browser-factory.c (update_pixmaps): Set the print icon - for various other items. - (set_pixmap): Be a bit more verbose in the warning message if the - icon isn't found [i.e. report the name of the file too]. - -2001-01-25 Ettore Perazzoli - - * folder-browser-factory.c (update_pixmaps): Set the pixmaps for - the "/menu/Folder/FolderConfig" and "/menu/Settings/SetMailConfig" - items. - (set_pixmap): Don't prepend the "buttons" prefix. - (update_pixmaps): Update accordingly. - -2001-01-24 Not Zed - - * folder-browser.c (search_string[]): Fix the subject match - expression, which was missing a closing ). - - * mail-send-recv.c (do_show_status): Escape any % signs in the - string before setting the format string. - -2001-01-24 Jeffrey Stedfast - - * mail-config.glade: Added a 3rd page to the account editor to - allow users to set their HTML sending preference and also allow - them to change their message status timeout. - - * mail-accounts.c (construct): Added handlers for the send-html - checkbox and for the mark-message-as timeout spinbutton. - -2001-01-23 Jeffrey Stedfast - - * mail-account-editor.c (apply_changes): Save the source and - transport changes whether the user can connect to the host or not. - -2001-01-23 Ettore Perazzoli - - [Applied patch from Tuomas Kuosmanen ] - - * folder-browser.c: Added enum value `ESB_SENDER_CONTAINS' as well - as a "Sender contains" item to the search menu. Also add a - corresponding "(match-all)" rule to the `search_string' array. - (search_save): Handle `ESB_SENDER_CONTAINS' here. - -2001-01-23 Ettore Perazzoli - - * GNOME_Evolution_Mail.oafinfo: Fixed the repo_ids so that they - use the right syntax. - -2001-01-23 Dan Winship - - * folder-browser-factory.c: - * mail-callbacks.c (send_receive_mail): Fix spelling. - -2001-01-24 Not Zed - - * mail-ops.c (fetch_mail_fetch): Set the default folder when - copying to mbox. This is a quick fix, i might need to do a slight - redesign to clean it up. - -2001-01-23 Jeffrey Stedfast - - * mail-send-recv.c (build_dialogue): Make sure the source->url is - not NULL (which is perfectly valid). - (mail_send_receive): Where oh where should my prototype be? - (receive_get_folder): Make sure to ref the folder before you add - it to the hash table. - - * openpgp-utils.c: - * mail-crypto.c: A few minor tweaks. - -2001-01-23 Not Zed - - * message-list.c (build_tree): Try turning off the BROKEN_ETREE - thing. It seems to work ok (better?) now, but if its still broken - i'll remove it again for the next release. - -2001-01-22 Jeffrey Stedfast - - * mail-config-druid.c (set_defaults): Automagically fill in the - user's default transport if he/she has setup previous accounts. - - * mail-format.c (handle_multipart_signed): Just wrote a temp way - of reporting success/fail of PGP/MIME signature verification - status. - -2001-01-22 Iain Holmes - - * evolution-outlook-importer.c: Outlook Express 4 .mbx importer. - - * component-factory.c (component_factory_init): initialise the - outlook importer. - - * GNOME_Evolution_Mail.oafinfo: Add the details for the Outlook - importer. - -2001-01-22 Dan Winship - - * mail-mt.[ch]: make mail_gui_thread non-static. - - * main.c (main): Set up signal handler for SEGV, BUS, FPE - (segv_redirect): if a gnome-segv'ing signal is received in - a thread other than mail_gui_thread, re-deliver it to that - thread to work around a problem with the gnome segv handler. - -2001-01-22 Jeffrey Stedfast - - * mail-format.c (handle_multipart_signed): Fixed to display - subparts (other than the signature part) and started to write a - pretty way to show if the signature verified or not. - -2001-01-23 Not Zed - - * mail-crypto.c (pgp_mime_part_verify): Fix a double-free problem. - -2001-01-22 Jeffrey Stedfast - - * mail-config-druid.c (incoming_type_changed): Oops, danw didn't - know 'provider' could be NULL :-) - -2001-01-22 Dan Winship - - * mail-config-druid.c (incoming_type_changed): Change "Path:" - label to "Namespace:" for IMAP. Use $MAILDIR rather than $MAIL for - Maildir. If $MAIL isn't set, guess. - - * component-factory.c (mail_hash_storage): Function to add a - store/storage mapping. - (add_storage): Use it. - - * mail-vfolder.c (vfolder_uri_to_folder): Use the vfolder name - rather than the string "mbox" (which wasn't ever used for - anything) in the vfolder URL. (Combined with the CamelVeeFolder - change, this makes camel_folder_get_name() return a pretty name - for vfolders now.) Call mail_hash_storage() to record the - CamelVeeStore/vfolder_storage mapping. (Ideally, there'd only be a - single CamelVeeStore... this is just a quick hack.) - - vfolders now display their unread count once you've looked at them - once. - -2001-01-22 Dan Winship - - * mail-tools.h: s/filter-driver.h/camel-filter-driver.h/ and - update first arg of mail_too_filter_get_folder_func - - * mail-tools.c (mail_tool_filter_get_folder_func): Update first - arg to CamelFilterDriver * - - * mail-send-recv.c (receive_status): - * mail-ops.c (send_queue_send): s/FILTER/CAMEL_FILTER/ - - * mail-callbacks.c: Remove filter-driver.h include - - * mail-accounts.c: Put the news functions inside #ifdef - ENABLE_NNTP to prevent warnings about unused statis functions. - - * subscribe-dialog.c (subscribe_folders, unsubscribe_folders, - subscribe_refresh_list): Update prototype to match BONOBO_UI_VERB. - (populate_store_list): add a de-constifying cast - -2001-01-22 Not Zed - - * .cvsignore: Added temp profiling files. - - * component-factory.c (owner_set_cb): remove a warning with - conditional news compilation. - - * mail-ops.h: Cleaned up the header list. - -2001-01-22 Jeffrey Stedfast - - * mail-crypto.c (mail_crypto_is_rfc2015_signed): Helps if I spell - stuff correctly so it can pass the tests ;-) - -2001-01-22 Not Zed - - * folder-browser-factory.c: Replace the old get_send mail with the - new one (button). - - * mail-ops.c (set_x_mailer): - (mail_load_evolution_rule_context): - (mail_do_fetch_mail): - (mail_do_filter_ondemand): - (mail_send_mail_old): - (mail_do_send_queue): All removed, (for) now lives in mail-send-recv.c. - (load_context): - (setup_filter_driver): - (filter_get_folder): - (mail_filter_folder): - (mail_fetch_mail): - (mail_update_subfolders): - (mail_send_mail): - (mail_send_queue): New equivalents of all these fundtions, moved - from mail-send-recv.c ... - (mail_filter_on_demand): Moved here too. - (mail_load_filter_context): Export this. - - * mail-callbacks.c (apply_filters): Use the new - mail_filter_on_demand() call. - (send_receieve_mail): Use mail_send_receive to do the work. Add a - little error handling here that used to be elsewhere. - (send_queued_mail): Removed. - (fetch_mail): Removed. - (select_first_unread): #ifdef'd this out. Not sure if this still - makes sense, but it doesn't get run right now anyway. - (composer_postpone_cb): Fix the setting of message flags. You - dont need to get them first, ever. - - * mail-send-recv.c (mail_send_message): Dont use - mail_tool_send_via_transport anymore (it does nothing useful). - - * mail-tools.c (mail_tool_camel_lock_up): Turned into a noop. - (mail_tool_camel_lock_down): And here too. - (mail_tool_move_folder_contents): Removed from the code (hasn't - bene used for ages). - (mail_tool_send_via_transport): Removed, it doesn't save anything. - -2001-01-21 Jeffrey Stedfast - - * component-factory.c (owner_set_cb): Initialize OpenPGP. - - * openpgp-utils.c (openpgp_init): No longer takes a passphrase - callback, we'll just use the mail-session one. Makes life simpler. - (pgp_get_passphrase): Use mail_session_request_dialog(). - - * mail-ops.c (do_send_queue): Remove the X-Evolution header before - we send. - - * mail-crypto.c (pgp_mime_part_sign): Don't forget to unref the - filters. - (pgp_mime_part_verify): Same. - (pgp_mime_part_encrypt): Same. - (pgp_mime_part_decrypt): Take NotZed's advice and use - camel_stream_mem_new_with_buffer instead of writing to a new - stream_mem. Also use camel_data_wrapper_construct_from_stream - instead of creating a parser and using that. - -2001-01-21 Jeffrey Stedfast - - * mail-crypto.c: Updated header comment and fixed some ref/unref - count problems in the various functions. Also fixed some other - little things. - (pgp_mime_part_encrypt): Do some canonical CRLF action before - encrypting. - (pgp_mime_part_sign): Make sure we are the owners of the byte - array. - (pgp_mime_part_verify): Same. - (pgp_mime_part_encrypt): Same. - (pgp_mime_part_decrypt): Same. - -2001-01-21 Christopher James Lahey - - * message-list.c (message_list_get_layout): Added - draw-focus="true" and selection-mode="browse" attributes to the - ETableSpecification. - (message_list_construct): Removed setting the "draw_focus" - argument since it doesn't exist any more. - -2001-01-21 Not Zed - - * mail-mt.c (mail_msg_new): Init a cancel field in the message. - (mail_msg_free): Free it. - (mail_msg_cancel): New function to attempt to cancel an operation - by id. Impelementation functions can still be uncancellable by - not registering for cancellation, etc, or do it themselves as - well. - - * mail-send-recv.c (fetch_mail_filter_folder): set folder_uid's - properly, so we can save it later. - (filter_folder_filter): Renamed from fetch_mail_filter_folder, - since its going to be used for all filtering. - (mail_fetch_mail): Changed from mail_filter_mail. - (mail_filter_folder): New function, replaces - mail_do_filter_ondemand functionality. - (mail_filter_on_demand): New function, actually replaces - mail_do_filter_ondemand. - (receive_get_folder): Added an exception arg. - (mail_send_message): New function to just send a message. - (send_mail_send): Use mail_send_message. - (send_queue_send): New send qeue code, use mail_send_message, and - clean up some stuff. - (mail_send_receive): Changed from mail_receive. - (build_dialogue): Setup the sending data, as well. - (mail_update_subfolders): New function to update folder info. - (send_mail_send): hook into cancellation if we want. - -2001-01-20 Jeffrey Stedfast - - * mail-ops.c (do_send_queue): Strip leading space from the - transport url gotten from the message. - -2001-01-19 Jeffrey Stedfast - - * mail-format.c (mail_generate_reply): If the name is empty - string, use the address. - -2001-01-19 Dan Winship - - * mail-display.c (pixmap_press): Update for e_popup_menu_run - change. - - * folder-browser.c (etable_key): On GDK_Menu (the menu key on - 105-key keyboards), pop up the right-click menu. - (on_right_click): update for e_popup_menu_run change. - - * subscribe-dialog.c (recursive_add_folder): New function to add a - folder and any parents of it that don't yet exist. Fixes bugzilla - #1028. - -2001-01-19 Not Zed - - * mail-send-recv.c: New swanky send/recieve thingy, well it so far - only receives (pop/mbox). Ignore all the warnings for now, and - the ugly 'button' to run it. - -2001-01-18 Jeffrey Stedfast - - * folder-browser-factory.c: Added the next/previous toolbar - buttons. - - * mail-callbacks.c (next_msg): New callback so we can have a next - toolbar button. - (previous_msg): Same but for previous. - -2001-01-17 Jeffrey Stedfast - - * mail-account-editor.c (construct): Anna's dialog now supports - SSL so we can get rid of the ssl-support checks. Also work around - the fact that Anna's dialog doesn't have an optionmenu for the - transport type, it's a label instead. - (transport_type_init): Cast the transport_type widget to a - GtkOptionMenu where appropriate as the widget that stores it is - now generic. - (apply_changes): Modify code to work with anna's dialog...*sigh* - (ok_clicked): Alert the user that one or more servers failed to - validate and allow him to continue anyway. - -2001-01-17 Jeffrey Stedfast - - * mail-config.c (mail_config_set_pgp_path): New config function to - set the path to the pgp binary. - (mail_config_get_pgp_path): Gee I wonder... - (mail_config_set_pgp_type): This one sets the type (ie PGP5, PGP2, - or GnuPG - see openpgp-utils.h for values) - (mail_config_get_pgp_type): Der. - -2001-01-17 Jeffrey Stedfast - - * mail-account-editor.c (construct): Handle NULL source and, while - we're at it, transport URLs. Apparently camel_url_new() and/or - camel-url_free() don't handle NULL input well. - - * mail-accounts.c (load_accounts): Handle NULL source URLs. - -2001-01-17 Jeffrey Stedfast - - * mail-account-editor.c (construct): Oops. "url && url->host" - doesn't do much without the '?' and ':' ;-) - -2001-01-17 Ettore Perazzoli - - * mail-ops.c (set_x_mailer): New function. - (send_mail_send): Use it. - (do_send_queue): Use it. - -2001-01-17 Martin Norbäck - - * openpgp-utils.c (pgp_get_passphrase): Changed the word entry - to enter, which is the correct word to use. - -2001-01-17 Jeffrey Stedfast - - * mail-callbacks.c (ask_confirm_for_empty_subject): Update to use - EMessageBox and to record if the user doesn't want to ever see - this dialog again. - - * mail-config.c (mail_config_get_prompt_empty_subject): New config - function. - (mail_config_set_prompt_empty_subject): Another new one. - -2001-01-16 Jeffrey Stedfast - - * mail-account-editor.c (apply_changes): Modify to be able to - handle a NULL source_url. - (source_auth_init): Allow for a NULL source url. - (source_check): Same. - - * mail-config.c (mail_config_write): Allow for NULL source - URLs. And while we're at it, NULL transport URLs as well. Might as - well save the use_ssl variable too. - (config_read): Same. - - * mail-config-druid.c (druid_finish): Modify to allow a NULL - source url. - (incoming_next): Modify to check for a NULL source and jump to the - transport page if one is encountered (this means the user decided - not to config a source). - (incoming_type_changed): Modify to set all widgets insensitive if - the user selected the "None" source menu item (aka NULL provider). - (incoming_check): Modify to allow the user to go to the next page - when he/she has chosen "None" for their source type. - (mail_config_druid_get_source_url): Return NULL if the provider is - NULL. - (mail_config_druid_get_transport_url): Same. - -2001-01-16 Dan Winship - - * mail-display.c (on_object_requested): Don't do thumbnails for - offline images - -2001-01-16 Jeffrey Stedfast - - * mail-callbacks.c (save_msg_ok): If the user hits "No", then - don't destroy the filesel window. - - * mail-ops.c (save_messages_save): Open with mode 0666 as danw - suggests. - -2001-01-16 Chris Toshok - - * component-factory.c (owner_set_cb): only load the news storage - if ENABLE_NNTP. - - * mail-accounts.c (construct): if !ENABLE_NNTP, remove the news - page from the dialog. - -2001-01-16 Radek Doulik - - * mail-format.c (mail_generate_reply): use - e_msg_composer_mark_text_orig - -2001-01-16 Dan Winship - - * mail-ops.c (send_mail_send, do_send_queue): Update the X-Mailer - header to use the string specified by configure. - -2001-01-16 Jason Leach - - * subscribe-dialog.c: removed unecessary #inlcude "e-title-bar.h" - -2001-01-16 Jason Leach - - * openpgp-utils.c (pgp_get_passphrase): Fix a string causing - translation problems. Bug #1147. - -2001-01-16 Not Zed - - * mail-ops.c (mail_do_fetch_mail): Setup a cancellation handle. - (do_fetch_mail): REgister for cancellation here. - (cleanup_fetch_mail): And unregister for cancellation here. - (mail_get_message): Add a cancel handle. - (get_message_get): Register/deregister for cancel. - (get_message_free): & clean up. - - * mail-mt.c (mail_msg_received): Removed debuggng. - - * mail-callbacks.c (stop_threads): Callback for stopping. - - * folder-browser-factory.c: Add a stop button verb thingy. - (control_activate): Disable the stop button by default. - -2001-01-15 Christopher James Lahey - - * message-list.c, message-list.h: Change from using filters for - date and size to using e_cell_date and e_cell_size. Moved a bunch - of includes from the message-list.h to the message-list.c. - -2001-01-15 Miguel de Icaza - - * mail-callbacks.c (configure_mail): Set the default button to - `Yes' here. - -2001-01-13 Jeffrey Stedfast - - * mail-account-editor.c (source_auth_init): If the preferred - authmech isn't found, default to the first one in the list. - (transport_construct_authmenu): This function already did the - above but I made it simpler. - (apply_changes): A number of cleanups. - -2001-01-13 Jeffrey Stedfast - - * mail-config-druid.c (druid_finish): Fixed mail_load_storages to - make a mini GSList of the account, not the account->source. Oops. - - * mail-accounts.c (news_delete): Updated to use the remove_news() - function. - - * mail-config.c (mail_config_remove_news): New convenience - function for removing news accounts. - (mail_config_remove_account): Pretty much the same thing. - - * mail-ops.c (do_send_queue): Get the X-Evolution-Transport URL - and use that if it exists, else fall back on the default - transport. - - * mail-callbacks.c (composer_postpone_cb): Set an - X-Evolution-Transport header. - -2001-01-12 Jeffrey Stedfast - - * Makefile.am: Removed GPG_* variables. - - * component-factory.c (mail_load_storages): Now takes a - 'is_account_data' variable to specify whether the sources is a - list of accounts of a list of services. Basically, the only time - you should pass in FALSE is when you are setting up NNTP storages. - (add_storage): Now takes a 'name' argument that specifies the name - to use in the storage. - (owner_set_cb): Updated to pass TRUE for accounts and FALSE for - news servers into mail_load_storages. - -2001-01-12 Christopher James Lahey - - * message-list.c: Changed filter_date and filter_size to match the - changes in gal. - -2001-01-12 Jeffrey Stedfast - - * mail-config.glade: Anna's dialogs. - - * mail-config.c (mail_config_get_account_by_address): - Removed. Danw and I decided on setting a X-Evolution-Transport - header on messages going to the Outbox so we can later guess which - transport to use when sending it. - - * mail-account-editor.c (apply_changes): Update to some day be - able to support SSL. - (construct): Update for Anna's dialogs... - - * subscribe-dialog.c (populate_store_list): Updated to reflect - past changes to the mail-config API. - -2001-01-12 Jeffrey Stedfast - - * mail-callbacks.c (composer_send_cb): Get the account by using - the new e_msg_composer_get_preferred_account() function. Also - check to make sure everything is configured (in case they deleted - their accounts while composing mail?). - - * mail-config.c (mail_config_get_account_by_address): New - convenience function. - -2001-01-12 Ettore Perazzoli - - * component-factory.c (component_fn): Pass NULL as the - @copy_folder_fn arg to `evolution_shell_component_new()'. - - * folder-browser.c (on_right_click): Removed hide menu. It - belongs to the view menu now. - -2001-01-12 Miguel de Icaza - - * message-list.c: Add strings for localization - - * folder-browser.c: Rename "Save" to "Store search as vFolder". - -2001-01-11 Miguel de Icaza - - * mail-display.c (on_object_requested): Unref the property bag - when we are done with it. - (get_embedded_for_component): Moved the code to request the - embeddable/control to a separate function. - -2001-01-12 Jeffrey Stedfast - - * mail-config.c (mail_config_get_account_by_name): New convenience - function that I will need later when I redo the composer From - field. - - * mail-display.c (on_object_requested): Update to reflect past - changes to the mail-config API. - - * session.c (mail_session_set_password): strdup() the key. - - * mail-config-druid.c (construct): We don't want to be able to set - the reply-to in the config druid. - (druid_finish): Don't set a reply-to anymore. - (mail_config_druid_finalise): Don't unref the providers. - - * mail-config.glade: Took out the Reply-To field in the druid. - -2001-01-11 Miguel de Icaza - - * mail-config-druid.c (incoming_type_changed): Guess the default - MAIL value for MBOX and Maildir files. - - * mail-callbacks.c (configure_mail): Force finalization of the - function before returning fixing the FIXME that was there. - -2001-01-11 Jeffrey Stedfast - - * mail-config-druid.c (transport_next): If the service_check - fails, pop-up a warning dialog letting the user know he or she may - have problems and then let them continue on with their lives. - (incoming_next): Same (+ jump them over the auth page to the - transport page). - - * mail-account-editor.c (apply_changes): Eek! Don't destroy the - account if the connection fails, duh. This is what is causing the - segfaults. - -2001-01-11 Dan Winship - - * folder-browser.c (got_folder): Connect to folder_changed as well - as message_changed for updating unread count - -2001-01-10 Miguel de Icaza - - * GNOME_Evolution_Mail.oafinfo: Add Bonobo/ItemContainer as the - set of supported interfaces in GNOME_Evolution_Mail_Composer - component. - -2001-01-11 Dan Winship - - * mail-format.c (write_field_to_stream): Translate the header name - to UTF8. - -2001-01-10 Jeffrey Stedfast - - * mail-callbacks.c (configure_mail): New function that explains to - the user why he can't do the action he requested and then procedes - to ask if he'd like to configure his accounts now. - (check_send_configuration): If the user doesn't have configured - accounts, don't let him continue and call configure_mail(). - (fetch_mail): Same. - (send_queued_mail): Same. - (send_receieve_mail): Same. - - * mail-config.c (mail_config_write): Don't save a "is_configured" - variable. Instead we'll just check to see if we have accounts - if - yes, then configured == TRUE. - (mail_config_is_configured): return accounts != NULL. - (mail_config_get_default_account): Mark the first account as the - default if none are marked. - -2001-01-10 Jeffrey Stedfast - - * mail-account-editor.c (source_auth_type_changed): Set the - sensitivity of the Password label too. - - * mail-config-druid.c (transport_back): New callback to handle - when the user hits the "back" button when on the transport - page. This is needed to handle the case where we don't want to - show the user the auth page (due to there being no auth choices). - (incoming_next): If we are going to skip over the auth page, set - the 'have_auth_page' variable to FALSE. - (construct): Initialize the have_auth_page to TRUE. - -2001-01-10 Jeffrey Stedfast - - * mail-config-druid.c (incoming_type_changed): Grab the focus of - the first widget that is sensitive. - (transport_type_changed): Same. - (identity_prepare): Grab the focus of the name entry. - - * mail-callbacks.c (send_queued_mail): Prevent Federico's segfault. - -2001-01-10 Jeffrey Stedfast - - * mail-config-druid.c (auth_type_changed): Clear the password - entry if it's not allowed. - (transport_type_changed): Clear the hostname if it is not allowed - by the provider type. - - * mail-account-editor.c (transport_type_changed): If the hostname - is allowed, clear it. - - * mail-config-druid.c (incoming_type_changed): Clear the contents - of the entry boxes that are not to be used. - (mail_config_druid_get_source_url): If the text in the entry is - emptry string, don't set it' contents in the url. - -2001-01-10 Miguel de Icaza - - * mail-callbacks.c (print_msg): Fix proto. - (print_preview_msg): Fix proto. - - * subscribe-dialog.c: Remove more UNSAFE macros. - -2001-01-09 Jason Leach - - * mail-display.c (pixmap_press): Bugfix for #1077: scrollwheel - doesn't work while hovering over an attachment icon. - -2001-01-09 Jeffrey Stedfast - - * mail-config-druid.glade: Moved to mail-config.glade - - * mail-accounts.c (construct): Updated to use mail-config.glade. - - * mail-account-editor.c (construct): Updated to use - mail-config.glade. - - * mail-config-druid.c (construct): Updated to use - mail-config.glade. - - * mail.h: Added the new mail config headers. - -2001-01-09 Dan Winship - - * mail-local.c (local_folder_changed_proxy): Change - mail_op_forward_event to mail_proxy_event. - -2001-01-09 Jeffrey Stedfast - - * mail-ops.c (save_messages_save): Let the system umask determine - the permissions of this file. - - * mail-config-druid.c (incoming_type_changed): Gray out the - appropriate labels too. - (auth_type_changed): And here. - (transport_type_changed): Here too... - - * mail-account-editor.c (source_check): Gray out the appropriate - labels too. - (transport_type_changed): And here too. - -2001-01-09 Jeffrey Stedfast - - * mail-account-editor.c: For all optionmenu's, set the appropriate - 'history'. - (keep_mail_check): Set the keep-on-server checkbutton sensitivity - based on whether or not the store is a storage or not. - (construct): Call keep_mail_check(). - - * mail-config-druid.c (incoming_type_changed): Set the - keep-on-server checkbutton sensitivity based on whether or not the - store is a storage or not. - - * mail-accounts.c (construct): Make sure the dialog isn't a - scrunched little thingy. - -2001-01-09 Dan Winship - - * Makefile.am (evolution_mail_LDFLAGS): Add -export-dynamic, so - libglade can resolve evolution-mail symbols. - -2001-01-09 Jeffrey Stedfast - - * mail-format.c: Updated. - (decode_pgp): Get rid of #ifdef PGP_PROGRAM's and handle - appropriately. - (handle_multipart_signed): Same. - (handle_multipart_encrypted): Same. - - * Makefile.am: Added openpgp-utils.[c,h] to the build. - - * openpgp-utils.c: New source file containing all of the pgp - interface code. - - * mail-crypto.c: Removed all of the openpgp funtions as they are - being moved to a new file. - (mail_crypto_is_rfc2015_signed): Renamed. - (mail_crypto_is_rfc2015_encrypted): Renamed. - -2001-01-09 Jeffrey Stedfast - - * session.c (mail_session_set_password): New function to set the - password for a given url. - - * mail-config-druid.c (druid_finish): Don't save the password in - the source url, instead insert it into the save-password hash. - (mail_config_druid_get_source_url): Check to make sure the - authmech isn't "", if it is then don't set the authmech. - - * mail-account-editor.c (apply_changes): Don't save the password - in the source url, instead insert it into the save-password - hash. Also check to make sure we don't set an empty string as the - authmech for the source or transport. - - * mail-accounts.c (mail_default): After reloading the accounts, - reselect the previously selected account. - (mail_delete): Same. - - * mail-config-druid.c (druid_cancel): Fixed segfault bug. - -2001-01-09 Radek Doulik - - * mail-format.c (write_headers): remove

- (handle_text_plain): add  
before - msg text - (handle_text_plain_flowed): ditto - -2001-01-09 Jeffrey Stedfast - - * mail-accounts.c (mail_default): Write the config data and reload - the accounts list so the "default" tag is relocated. - (mail_delete): Write the config data here too. - -2001-01-08 Jeffrey Stedfast - - * Makefile.am: - * component-factory.c: - * folder-browser-factory.c: - * folder-browser.c: - * mail-accounts.[c,h]: - * mail-account-editor.[c,h]: - * mail-callbacks.c: - * mail-config.[c,h]: - * mail-config-druid.[c,h]: - * mail-config-druid.glade: - * mail-display.c: - * mail-format.c: - * mail-tools.c: Brand spankin' new config druid, editor, - and manager. - -2001-01-08 Dan Winship - - * mail-ops.c: Add an #include - -2001-01-08 Jeffrey Stedfast - - * Makefile.am: - * component-factory.c: - * folder-browser-factory.c: - * folder-browser.c: - * mail-callbacks.c: - * mail-config.[c,h]: - * mail-display.c: - * mail-format.c: - * mail-tools.c: Reverted mail-config changes temporarily until - I get it working correctly. - -2001-01-08 Jeffrey Stedfast - - * mail-config-druid.c: More lovely fixes... - - * mail-callbacks.c: Don't segfault if a default account doesn't - exist. - -2001-01-08 Jeffrey Stedfast - - * mail-config-druid.c: A bunch of fixes. - - * mail-accounts.c: More fixes... - - * mail-account-editor.c (construct): Reparent the notebook to the - editor->vbox and set the resize policy. - -2001-01-07 Jeffrey Stedfast - - * mail-callbacks.c (providers_config): Use a - gnome_dialog_run_and_close(). - - * mail-accounts.c (construct): Reparent the notebook to the - dialog->vbox not to the dialog itself. Also set the resize policy - to allow the user to stretch it. - -2001-01-07 Jeffrey Stedfast - - * mail-tools.c (mail_tool_quote_message): Updated to reflect - changes to the mail-config API. - - * mail-display.c (redisplay): Updated to reflect changes to the - mail-config API. - - * mail-callbacks.c (providers_config): Use the new account dialog. - - * mail-config-druid.c (druid_finish): Load the new storage into - the shell. - (mail_config_druid_new): Take a shell argument. - - * mail-format.c (mail_generate_reply): Updated to reflect changes - to the mail-config API. - - * mail-config-druid.c: Fixed this to build. - - * mail-callbacks.c (check_send_configuration): Updated to reflect - changes to the mail-config API. - (create_msg_composer): Same. - (forward_get_composer): Same. - (send_queued_mail): Same. - (composer_send_cb): Same. - - * mail-account-editor.c: Updated to build cleanly. * - mail-config-druid.c: Same. * mail-accounts.c: Same. - - * folder-browser-factory.c (control_activate): Updated for API - changes in mail-config. - - * folder-browser.c (done_message_selected): Updated for API - changed in mail-config. - (folder_browser_gui_init): Same. - (got_folder): Same. - - * component-factory.c (owner_set_cb): After using the sources - list, free it as it is no longer a const GSList as with the older - mail-config code. - - * mail-config.c: Totally rewritten. - -2001-01-07 Jeffrey Stedfast - - * mail-accounts.c (mail_edit): Implemented. - - * mail-account-editor.c (apply_clicked): Implemented. - (ok_clicked): Implemented. - (cancel_clicked): Implemented. - (source_auth_type_changed): Implemented. - (source_auth_init): Implemented. - (transport_construct_authmenu): Implemented. - (transport_type_changed): Updated to change regenerate the auth - option menu. - (construct): Attached callbacks to OK, Apply and Cancel buttons. - - * mail-account-editor.c (source_auth_init): Use the new - mail_config_check_service(). - - * mail-config-druid.c: Remove check_service() as it will be moved - into mail-config. - -2001-01-06 Christopher James Lahey - - * message-list.c (message_list_select): Made it so that going to - the next or previous message in the list will at least move one - message, even if the current message matches the query. This - makes 'n' go to the next unread message, even if the current - message is unread. - -2001-01-06 Jeffrey Stedfast - - * mail-account-editor.c: Coded a bunch of the methods. - -2001-01-04 Iain Holmes - - * mail-summary.c (idle_check): Check if the HTML for the current - summary has been created, and if not then keep trying until it - has. - (new_folder_cb) - (removed_folder_cb) - (create_summary_view): Use the idle_check function to generate the - summary. - (create_summary_view): Don't set the HTML here. Set it via the - pipe. - -2001-01-05 Jeffrey Stedfast - - * mail-account-editor.[c,h]: New source files to provide an - account editor widget. - - * mail-config-druid.c (auth_type_changed): Set the authproto on - the druid so we can look it up later. - -2001-01-05 Jeffrey Stedfast - - * mail-accounts.c (mail_add): Since the druid now handles adding - the new account to the config, we'll just connect to the destroy - event and show the druid. - (mail_add_finished): Just reload the account list here. - - * mail-config-druid.c (druid_finish): New callback to handle the - "finish" signal. On second thought, it seems it would be best for - the finish callback to be here rather than in mail-accounts.c. - - * mail-accounts.[c,h]: Added. Contains source for the Account manager - window. And just like mail-config-druid.c, it's not yet complete. - - * mail-config-druid.c (mail_config_druid_get_incoming_keep_mail): - Renamed from _delete_mail - (mail_config_druid_get_transport_url): New convenience function - that replaces the get_hostname, get_protocol, etc. - (mail_config_druid_get_source_url): Same. - - * mail-config-druid.glade: Changed "Delete mail from server" to - "Keep mail on server" as this has a more positive ring to it. Both - I and Aaron agree this is the better phrase. - -2001-01-04 Jeffrey Stedfast - - * mail-config-druid.c: Fixed a few 'Oops'es. - - * mail-config-druid.glade: Added a "Default" button for marking an - account as the default. - -2001-01-04 Jeffrey Stedfast - - * mail-config-druid.glade: Updated. What else can I say? - -2001-01-04 Dan Winship - - * folder-browser.c (got_folder): Connect to "message_changed" on - the folder if it's on a remote storage. - (update_unread_count): Update the folder unread count / highlight - in the shell when the unread message count changes - -2001-01-04 Not Zed - - * mail-ops.c (mail_do_send_mail): Removed old implementation. - - * folder-browser.c (do_message_selected): If we haven't got a real - uid, then clear the display instead. - - * message-list.c (message_list_drag_data_get): Use new save - message function, and also wait for it to finish before - continuing. - (folder_changed): - (message_changed): Use mail_proxy_event instead of - mail_do_forward. - (mail_regen_list): New iplementation to replace the old. - : remove from headers. Dont define timeit by default. - (main_folder_changed): - (message_list_set_folder): - (message_list_set_threaded): - (message_list_set_search): - (message_list_hide_add): - (message_list_hide_uids): - (message_list_hide_clear): Use mail_regen_list instead of - mail_do_regenerate_messagelist. - (mail_do_regenerate_messagelist): Removed the old stuff. No - functionality changed yet, just using different thread stuff. - - * mail-callbacks.c (save_msg_ok): Use new save message function. - - * component-factory.c (create_view): - (add_storage): Use mail_scan_subfolders to build the folder info. - (create_folder): Use new implementation with our own callback. - (owner_set_cb): Changed b ack to use mail_get_folder, but now wait - for it to finish. This will let any gui still run, but also gives - us the required synchronous operation. - (got_folder): Callback for when the folder has been opened. - - * mail-ops.c (mail_get_folderinfo): New function to just get the - folder info in another thread. - (mail_scan_subfolders): New scan subfolder implementation that - uses mail_get_folderinfo. - (mail_do_scan_subfolders): Removed old implementation. - (mail_create_folder): Nerw implementation to create a folder, only. - (mail_do_create_folder): Removed old implementation. - (mail_save_messages): New implementation, fixes a couple of minor - problems, and now provides a return so it can be waited on. Also - check that the writes worked, etc. - (mail_do_save_messages): Remove previous implementation. - (mail_do_flag_messages): Removed, nothing uses it. - (mail_do_flag_messages): Removed, nothing uses it anymore. - (mail_get_folder): REturn the operation id, so callers can wait - for it. - (sync_folder_desc): - (expunge_folder_desc): Add describe functions so we know what its - doing. - (mail_send_mail): More generic implementation of sending mail. - - * mail-mt.c (mail_msg_new): Lock around seq increment. And insert - each new message into a hash table of active messages. - (mail_msg_init): Init the active message table. - (mail_msg_free): Remove the message from the active message table. - (mail_msg_wait): New function, waits for a message to be - processed, by id. - (mail_msg_check_error): Dont display the error if it is a - user-cancelled operation. - (mail_proxy_event): new implementation of mail_op_forward_event. - Only real difference is it uses the new thread stuff, and you can - wait for it to finish if you want. - (mail_proxy_event): If we're already in the main thread, just call - the function. - -2001-01-03 Jeffrey Stedfast - - * mail-config-druid.c: New source file that implements - mail-config-druid. Note: this is not yet complete. - -2001-01-03 Not Zed - - * mail-view.c (view_forward_msg): Call - mail-callbacks.c:forward_messages(), so the behaviour is the same - as from the folder browser. - - * mail-callbacks.c (forward_messages): New function to forward - messages, attached or not. - (forward_inlined): Changed to use new forward-messages - implementation. - (forward_attached): Likewise. - (do_forward_attach): Callback for forwarding as attachment, once - we have built it. - (do_forward_inline): Likewise, for inline, once we have retrieved - the message. - (forward_message): Removed. - - * mail-ops.c (mail_build_attachment): New function to build an - attachment of messages. - (mail_do_attach_message): Removed, functionality superceeded by - above. - (mail_do_forward_message): Removed. Likewise. - (mail_create_folder): Started work on an alternative - implementation of create_folder, but not sure about it yet. - - * mail-tools.c (mail_tool_generate_forward_subject): Remove locking. - (mail_tool_make_message_attachment): Free the description when done. - -2001-01-03 Radek Doulik - - * mail-format.c (write_headers): add font color setting for table, - changed border behavior - - * mail-display.c (redisplay): don't set body bg and text color - -2001-01-02 Not Zed - - * mail-callbacks.c (view_msg): Fix for mail_get_message change, - use queue thread. - - * folder-browser.c (done_message_selected): Fix mail_Get_message - calls, use new thread. - (do_message_selected): " - - * mail-ops.c (mail_get_message): Add a thread argument so callers - can specify which queue it executes on. - - * mail-mt.c (mail_msg_free): Fix a free order problem. - (mail_msg_destroy): Call mail_msg_free to do the work. - (mail_msgport_replied): " - (mail_msgport_replied): Check/display errors if we get them. - (mail_msgport_received): If we have a describe function, say what - we're doing, also set busy/unbusy. - (mail_msgport_replied): Clear busy when we get a reply. - (mail_get_password): Unset busy. - (mail_msg_received): Set busy as we go. - (mail_msg_destroy): Unset busy when done. - (mail_status): Blah blah, new status interface, the other wans't - workable with the way the shell api works. - -2000-12-29 Not Zed - - * folder-browser.c (do_message_selected): If we are reconfiguring, - just keep polling till we are done (yeah kinda shitty, but easy). - (folder_browser_set_uri): Clear reconfigure flag here. ick. - (got_folder): And here too. - (on_right_click): Remove locking. - (hide_sender): and here too. - (hide_subject): And here. - (on_right_click): If we are in reconfigure, then the whole menu is disabled. - - * mail-mt.c (status_busy_timeout): Clear the status_busy_timeout_id. - - * mail-local.c (local_storage_new_folder_cb): Made getting folders - completely synchronous. The shell expects it, and it was only - synchronous before by a sideeffect. - (do_reconfigure_folder): Remove locking stuff. - (do_reconfigure_folder): Use our own much simpler copying routine - than that stupid move_folder_contents thing. - (update_progress): Use mail_status_message() instead. - (do_reconfigure_folder): Set the reconfigure flag during - reconfigure & set busy flag. - (cleanup_reconfigure_folder): clear busy flag. - - * mail-tools.c (mail_tool_uri_to_folder): Remove the tool_lock - stuff. - (mail_tool_uri_to_folder_noex): Clear exception on exit. - (mail_tool_move_folder_contents): Get rid of this really stupid - function that is only used in one place. - - * component-factory.c (owner_set_cb): Use direct calls to get the - folders, as this code must run synchronous. Remove the event wait - stuff. - - * mail-callbacks.c (edit_msg): Call mail_get_messages, and create - the composers ourself. - (do_edit_messages): get_messages callback, create the composers - and connect to signals we need. - (view_msg): Dont call do_view_messages, just call - mail_get_messge for each to get them in parallel. - (do_view_message): view a single message. - - * mail-ops.c (mail_edit_messages): Just use mail_get_messages - for this operation. Removed the other async operation stuff. - Changed my mind, just removed entirely. - (mail_do_view_messages): Removed. - (mail_do_setup_folder): Removed. - (mail_do_scan_subfolders): Make this run synchronously, as every - caller expects it to (even if they didn't realise). - -2000-12-28 Not Zed - - * mail-callbacks.c (send_queued_mail): Dont expunge the folder - here, but in send_queue, otherwise it might execute out of order. - (expunge_folder): Remove the talbe prechange stuff, and infact - references to the message_list folder, as we have our own folder. - Also, dont allow expunge if we're already expunging. - (expunged_folder): Clkear the expunging flag if we're finished. - - * folder-browser-factory.c (control_deactivate): Likewise here. - Hrm, i thought this function required a callback, silly me. - - * mail-tools.c (mail_tool_make_message_attachment): Remov e - locking. - - * folder-browser.c (on_message_selected): Use a timeout handler so - we dont select immediately. - (folder_browser_set_uri): Changed to use mail_get_folder. - (got_folder): New callback called when get_folder is finished. - (folder_browser_destroy): Use new sync interface. - - * mail-ops.c (mail_get_message): New function to asynchrounously - get a message. - : #define out mail_tool_camel_lock stuff entirely. - (mail_get_folder): New function to asynchrounously get a folder. - (mail_do_load_folder): Removed, replaced by more generic function - above. - (mail_do_display_message): Removed, replaced by the more generic - funciton get_message. - (mail_get_messages): New function to get a list of messages - asynchronously. - (mail_sync_folder): New interface to sync a folder async. - (mail_expunge_folder): New interface for expunging folder, with - callback. - (do_send_queue): Remove lock stuff, and expunge if (and only if) - successful, also sync the sent folder while we're at it. - - * session.c (mail_session_request_dialog): Changed to use new - mail_get_password call. - - * mail-mt.[ch]: New threading/interthread messaging framework. - - * main.c (main): Init the message/thread system. - -2001-01-02 Dan Winship - - * mail-format.c (mail_part_is_inline): - (find_preferred_alternative): - * mail-display.c (launch_cb): Use header_content_type_simple, not - header_content_type_format. - -2000-12-26 Jeffrey Stedfast - - * mail-crypto.c (mail_crypto_openpgp_verify): Implemented. - -2000-12-23 Jeffrey Stedfast - - * mail-ops.c (mail_do_setup_trash): New function similar to - mail_do_setup_folder() except that this creates the Trash VFolder - (special-case). - -2000-12-21 Jeffrey Stedfast - - * mail-ops.c (do_send_mail): Don't free info inside the last - if-statement, if sent_folder doesn't exist we'll have a memory - leak. Instead free it afterward. - -2000-12-29 Dan Winship - - * mail-crypto.c: Oops. Update this for CamelContentType stuff too. - -2000-12-28 Dan Winship - - * mail-format.c (mail_part_is_inline, mail_get_message_body): Use - CamelContentType, and use header_content_type_is instead of doing - it by hand. - - (handle_text_plain): - (handle_multipart_related): - (find_preferred_alternative): - (handle_message_external_body): Use CamelContentType and - header_content_type_* functions instead of GMimeContentField. - - * mail-display.c (write_data_to_file, launch_cb): Use - CamelContentType and header_content_type_* functions instead of - GMimeContentField. - -2000-12-26 Iain Holmes - - * mail-display.c (mail_display_init): Initialise the thumbnail cache. - (mail_display_destroy): Free the cache. - (pixbuf_gen_idle): Check the cache for a pixbuf, add the pixbuf to the - cache if it's not there. - -2000-12-26 Iain Holmes - - * mail-summary.c (create_summary_view): Create a shared - BonoboEventSource object and use it for all the objects that - aggregate Bonobo::EventSource. - -2000-12-27 Dan Winship - - * subscribe-dialog.c (setup_subscribe_folder): Use info->name, not - input->full_name. Fixes #1029 in bugzilla.helixcode.com. - ({setup,do,cleanup}_subscribe_folder): Update previous fix: Jeff - had changed it to use ->full_name instead of ->name because that's - what camel_store_subscribe_folder needed. So we need to have - *both* names available, one for Camel, one for the shell. - -2000-12-24 Christopher James Lahey - - * message-list.c (filter_date): Changed this to format times in 12 - hour time instead of 24 hour time. - -2000-12-24 Christopher James Lahey - - * message-list.c (filter_date): Changed this to do different - formatting of dates within the last week. - -2000-12-24 Not Zed - - * Merge from camel-mt-branch. - -2000-12-23 Christopher James Lahey - - * message-list.c (filter_date): Changed this to do different - formatting of dates based on the current time. - -2000-12-23 Christopher James Lahey - - * message-list.c (message_list_get_layout): Added titles to the - pixbuf columns. - -2000-12-21 Iain Holmes - - * mail-summary.c: Added code to detect and regenerate the summary - when a new vfolder is created or removed. - - * mail-vfolder.c: Export the vfolder_storage variable, so that - the summary can add a listener to it. - -2000-12-05 Iain Holmes - - * component-factory.c (factory_destroy): Wait till all views have - gone and then destroy both factories. - -2000-12-21 Dan Winship - - * mail-display.c (pixbuf_for_mime_type): Deal with the possibility - that we have an icon-filename listed for a MIME type, but the icon - file doesn't actually exist. Also, if gnome-unknown.png can't be - found, fall back. Might fix a crash people have been reporting... - -2000-12-18 Chris Toshok - - * mail-format.c (handle_multipart_encrypted): for now #ifdef - PGP_PROGRAM falling back to handle_multipart_mixed. - (handle_multipart_signed): same. - -2000-12-18 Dan Winship - - * message-list.c (hide_save_state): Unlock camel when done to - prevent a hang later. - -2000-12-18 Miguel de Icaza - - * mail-tools.c (mail_tool_move_folder_contents): Only update - display every 2 seconds. - - * mail-ops.c (do_view_messages): Only update display every 2 seconds. - -2000-12-23 Not Zed - - * message-list.h (MessageList): Add a specific hide data lock. - - * message-list.c (message_list_drag_data_get): Do not use - cursor_uid, but get all currentlys elected messages directly off - the message-list. - (message_list_destroy): Removed mail_tool_camel_lock stuff. - (on_click): " - (message_list_hide_add, message_list_hide_uids, hide_load_state, - hide_save_state, message_list_hide_clear): ", but use a specfic - lock for the hide data. - (do_regenerate_messagelist): remove mail_tool_camel_lock stuff, - add hide_lock where required. - (message_list_init): Setup the hide_lock. - (message_list_destroy): Free the hide_lock. - -2000-12-22 Not Zed - - * mail-ops.c (mail_do_sync_folder): Run sync in different thread - each time. Just a quick litlte hack to check multithreading. - There are now few operations that single-queue. Need to work out - a way to make the allocation of threads & resources easier, so we - dont get overwhelmed with threads, but we dont block when we dont - have to, either. - - * message-list.c (main_folder_changed): If we have only changed - events, then process them directly. - (mail_do_regenerate_messagelist): Run regenerate in a new thread - each time, another quick hack to check mutlithreading. - - * mail-view.c (view_delete_msg): Call camel folder set message - flags directly. mail_do_set_message_flags() is now completely - unused. - - * folder-browser.c (mark_msg_seen): Call camel folder - set_message_flags directly. - - * mail-callbacks.c (flag_messages): New function, that just sets - flags of all selected messages, without all that messy thread - stuff (setting flags is in-memory). - (mark_as_seen): Use flag_messages(). - (mark_as_unseen): " - (undelete_msg): " - (delete_msg): " - -2000-12-20 Not Zed - - * message-list.c (message_list_select): Free messageinfo lookups. - (message_list_drag_data_get): " - (subtree_unread): " - (subtree_size): " - (subtree_earliest): " - (ml_tree_value_at): " Also, keep the message info around in a - static variable, and ref'd, so that any internal references we - have to it dont vanish while we're not looking. This has a couple - of problems ... esp since we never unref the last access, although - camel-folder-summary wont check this when its unref'd, so we're - 'safe'. - (save_node_state): free messageinfo lookups. - (on_click): " - (get_message_info): deconstify return. - - * mail-tools.c (mail_tool_move_folder_contents): Free messageinfo - lookups. - - * mail-ops.c (do_filter_ondemand): Free messageinfo lookups. - (do_flag_messages): " - (do_fetch_mail): Remove mail_tool_lock stuff. - (mail_operation_run): Quick hack to run an operation - asynchrounously, in a brand-new thread. - - * folder-browser.c (on_right_click): Free messageinfo lookups. - -2000-12-16 Not Zed - - * message-list.c (build_tree): Always use the slow (full-update) - version of the tree update code, to get around a bug(?) in etree. - (build_flat): Likewise. - -2000-12-15 Not Zed - - * mail-display.c (write_data_to_file): Dont blindly convert all - parts to utf8, e.g. image/jpg. We only convert text/* parts, and - only then if required. - -2000-12-14 Not Zed - - * component-factory.c (create_view): cast over a warning. - - * folder-browser-factory.c: Add verbs for hide functions. - - * message-list.c (message_list_hide_clear): - (message_list_hide_uids): - (message_list_hide_add): Some api renaming. - (message_list_hide_add): Allow ML_HIDE_SAME to be passed to mean - not to change the upper/lower range at all. - (hide_save_state): Save the state of the hide list to stable - storage. - (hide_load_state): Load the state of hte hide list. - (message_list_set_folder): Load/save the state of the folder if it - is changed/set. - (message_list_destroy): Save the state of the folder hide list - when done. - (save_tree_state): If we wrote out an empty state file, simply - remove it instead. - - * folder-browser.c (on_right_click): Add some hide menus. - (hide_read): Hide read messages. - (hide_deleted): Hide deleted messages. - (hide_selected): Hide selected/current message. - (hide_none): Show all hidden messages. - (on_right_click): Lock around accesses to the message (inside - mlist_detect_magic). - (on_right_click): Free the mailing list name. - -2000-12-13 Not Zed - - * folder-browser.c (on_right_click): Add camel locking since we - call it directly. Whoever heard of a lock you 'down' to unlock? - - * message-list.c (mail_do_regenerate_messagelist): Added hide - expression, messages to hide. Fixed all callers. - (do_regenerate_messagelist): IF we have a hide expression, search - and remove those from the uid list. If we have a hide range, - apply that afterwards. - (cleanup_regenerate_messagelist): Handle freeing the hide uid - temporary data, if required. - (message_list_destroy): Free hide data, also lock around all camel - object stuff. - (message_list_length): New function to get the number of messages - avaialble to be hidden by range. - (message_list_set_hide): Set the hide expression and range. - Issue: Should hiding be remembered? - (message_list_unhide_all): Turn off all hiding. - (message_list_hide_uids): Hide a list of uid's. - -2000-12-15 Dan Winship - - * subscribe-dialog.c (folder_toggle_cb): Update this for the new - signal handler prototype. Fixes the crash on double-click. - -2000-12-15 Jeffrey Stedfast - - * mail-format.c (handle_multipart_signed): New callback to handle - multipart/signed parts. - (decode_pgp): Update to account for the cipherlen argument needed - for openpgp_decrypt. - (is_rfc2015): Removed as we now have a better version in - mail-crypto. - (handle_multipart_encrypted): Updated to use the PGP/MIME utility - functions. - - * mail-crypto.c (mail_crypto_openpgp_decrypt): Don't check - (!*plaintext) as it could be a binary stream. Now also takes a - cipherlen argument. - (mail_crypto_openpgp_sign): New function. - (pgp_mime_part_sign): New function to replace a mime part with the - pgp signed equivalent. - (pgp_mime_part_encrypt): New function to replace a mime part with - the pgp encrypted equivalent. - (pgp_mime_part_decrypt): New function to decrypt a pgp encrypted - mime part (like from pgp_mime_part_encrypt) and replace it. - (is_rfc2015_signed): New function to determine if a mime part is - an rfc2015 signed part. - (is_rfc2015_encrypted): New function to determine if a mime part - is an rfc2015 encrypted part. - (mail_crypto_openpgp_verify): New openpgp function to verify a - signature. - -2000-12-14 Christopher James Lahey - - * mail-threads.c (update_active_views): Unref the iterator when - we're done with it. - -2000-12-14 Larry Ewing - - * mail-display.c (mail_display_new): call - gtk_html_set_default_content_type to make gkthtml default to utf-8 - when parsing. This requires gtkhtml >= the released 0.8. - -2000-12-14 Ettore Perazzoli - - * mail-threads.c (read_msg): Call `ui_set_busy()' before - `ui_set_message()' so that we are sure that the - set_busy/unset_busy calls always happen in order. - -2000-12-13 Christopher James Lahey - - * folder-browser.c (my_folder_browser_init): Made the vertical - scrollbar always be there. - - * message-list.c (message_list_get_layout): Changed the minimum - width of some of the pixmap column headers. - -2000-12-12 Christopher James Lahey - - * component-factory.c (create_view): Added a cast. - - * mail-summary.c: Added #include "mail-summary.h". Commented out - folder_free, summary_free, and view_destroy_cb since they're not - used. - (do_changed): Added a cast. - (create_summary_view): Changed some types so that casting would be - easier. - - * session.c (mail_session_remember_password): Added a cast. - -2000-12-12 Dan Winship - - * mail-summary.h: Fix to use the right .h instead of the - deprecated one. - -2000-12-12 Jeffrey Stedfast - - * mail-callbacks.c (forward_message): Attach a signature when - forwarding, fixes bug #826. - -2000-12-11 Dan Winship - - * session.c (mail_session_enable_interaction): New function to - tell the code that it's ok (or not) to interact with the user when - trying to authenticate to a service. Starts out turned off. - (mail_session_request_dialog): If interaction is disabled, fail if - the password isn't in the cache. - - * component-factory.c (owner_set_cb): Call - mail_session_enable_interaction() after everything else. (This - means that the IMAP password dialog will no longer pop up [under - the splash screen] at startup.) - -2000-12-11 Dan Winship - - * component-factory.c (create_view): Deal with "mailstorage" type - views (top-level mail storages) by trying to fill the storage's - folder tree again if we failed before. - (add_storage): Create new storages with a URI and type - "mailstorage". - - * mail-ops.c (cleanup_scan_subfolders): On success, mark the - storage as having been loaded, so create_view won't try again. - -2000-12-11 Jeffrey Stedfast - - * mail-format.c (decode_pgp): Updated to reflect arguments to the - openpgp functions - now also takes an outlen argument. - (try_inline_pgp): Updated. - (handle_multipart_encrypted): Updated here too. - - * mail-crypto.c (crypto_exec_with_passwd): Updated to handle - binary streams and such. - (mail_crypto_openpgp_encrypt): Always initialize the passwd_fds - even if we don't plan on signing. Added an 'inlen' to specify the - length of the input data (as it could be binary). Also added a - 'userid' argument for cases when we want to sign as well as - encrypt. - (mail_crypto_openpgp_decrypt): Updated to take an outlen argument - in case the ciphertext is encrypted binary data. - (mail_crypto_openpgp_clearsign): Added a 'hash' and 'detach' - arguments. 'hash' allows the program to specify the preferred hash - function (which will come in handy when generating - PGP/MIME). 'detach' allows the program to specify whether it wants - a detached signature or the entire signed text. - -2000-12-11 Dan Winship - - * message-list.c: Remove the never-once-used BonoboObject stuff - and make MessageList be a GtkWidget instead. Also, keep track of - the ETable directly rather than repeatedly calling - e_table_scrolled_get_table. - - * folder-browser.c (folder_browser_destroy): Use gtk methods - rather than bonobo methods to destroy the message list. - (on_right_click, on_double_click): These are being attached to the - ETable directly now, so fix the first argument (which isn't being - used anyway, but...). Ignore double-clicks on "active" columns - (the ones where clicking does something beyond "select"), fixing - bug #811, which is what got me started on this to begin with... - (folder_browser_gui_init): simplify now that MessageList itself is - a widget. Also use message_list->table rather than - e_table_scrolled_get_table. - - * mail-local.c (mail_local_reconfigure_folder): Add "mail_" to - the beginning of this function name to match its prototype and the - other vague namespace conventions in the mailer. - - * mail-callbacks.c (select_all, invert_selection): Use ml->table. - (configure_folder): s/local_reconfigure_folder/mail_&/ - - * mail-ops.c (do_flag_messages): clean up the cleanup a bit - - * mail-tools.c (mail_tool_quote_message): Remove an unused - variable. - -2000-12-11 Not Zed - - * local-config.glade: reordered the options and added maildir, - mbox, maildir, mh, in that order. - - * mail-local.c (reconfigure_clicked): Added maildir, re-ordered to - match the changed xml file too. - (do_reconfigure_folder): WHoever 'threaded' this code forgot to - check that folder_browser functions shouldn't be called here. - (cleanup_reconfigure_folder): Call it here instead. - (lookup_folder): Blah blah, we have to lookup the folder and - verify its still the same format, joy. Becaause someone thought - it would be wise to make the code 5x more complicated for no - reason, and totally break 'mail reconfigure' in the process. i'm - really happy about that one. - (cleanup_register_folder): Uh, yeah, so like, the - local_store->folders hashtable is supposed to point to like, - LocalFolders, not CamelFolders. - (free_local_folder): Free the localfolder struct properly. - (free_folder): Call above to free data properly. - (get_folder): Fix for fixing folders hashtable. - (local_storage_removed_folder_cb): Same here. - (local_storage_new_folder_cb): Ref the local_store when putting it - in the local_folder. - (cleanup_register_folder): Properly free the local_folder if the - op failed. - (free_local_folder): Unhook events also. - (d): Oops, left debug turned on. - -2000-12-09 Christopher James Lahey - - * message-list.c (message_list_init): Change the "drawfocus" - argument on e_table_scrolled_get_table(etable) instead of on - etable (etable is an ETableScrolled.) - -2000-12-08 Jeffrey Stedfast - - * mail-callbacks.c (save_msg_ok): Check to see if the file already - exists, if it does prompt the user to for permission to overwrite - the file. - (forward_message): g_strdup the cursor_uid if there is only a - single message to be forwarded or we'll segfault later. - - * mail-ops.c (do_save_messages): Rewrote yet again. I'm back to - almost an identical implementation as the first time I wrote this - except now we write the From line which I had forgotten last - time. This means that we no longer have to unlink the .ev-summary - file created and we also use fewer resources (no need to create a - CamelMboxFolder object). - -2000-12-08 JP Rosevear - - * folder-browser.c (on_double_click): the e-table double-click - signal now has extra params - -2000-12-07 Ettore Perazzoli - - * component-factory.c (add_storage): Pass `NULL' as the - @toplevel_node_handler_id arg in `evolution_storage_new()'. - FIXME: We should be passing the ID of the mail component here. - * mail-vfolder.c (vfolder_create_storage): Likewise. - -2000-12-08 Jeffrey Stedfast - - * message-list.c (message_list_get_layout): Set the "Size" field - to sort using integer comparison instead of string. - (filter_size): New function to transform a integer size into a - more readable form. - (ml_value_to_string): Use filter_size. - (ml_value_is_empty): COL_SIZE is no longer a string, so handle - this as an integer. - (ml_initialize_value): Here too. - (ml_free_value): And here. - (ml_duplicate_value): And here too. - (message_list_create_extras): Setup the size etable cell. - -2000-12-08 Christopher James Lahey - - * folder-browser.c: Connect to signals on the ETable instead of - the ETableScrolled. - - * subscribe-dialog.c: Used the e_table_scrolled_get_table function - instead of accessing the variable directly. - -2000-12-08 Christopher James Lahey - - * message-list.c: Connect to signals on the ETable instead of the - ETableScrolled. - -2000-12-07 Christopher James Lahey - - * message-list.c: Got rid of code referencing the ETableScrolled - proxy functions. Changed the call to e_table_set_cursor_row to - send a model row instead of a view row. - -2000-12-07 Jeffrey Stedfast - - * mail-callbacks.c (forward_message): Only do a - message_list_foreach if we plan on attaching messages, otherwise - just use ml->cursor_uid. - - * mail-ops.c (cleanup_forward_messages): If attaching multiple - forwarded message, wrap them in a multipart/digest otherwise just - attach the single message as a message/rfc822. - -2000-12-07 Dan Winship - - * mail-display.c (on_object_requested): Make the iTip hack spew a - g_warning and not crash if you have no identity configured. To be - revisited. - - * mail-callbacks.c: (various) - * folder-browser.c (filter_mlist): - * mail-autofilter.c (filter_gui_add_from_message): - * mail-vfolder.c (vfolder_gui_add_from_message): Add some - g_return_if_fail()s to protect from crashes until the code to - enable/disable commands based on how many messages are selected is - done. - -2000-12-06 Jeffrey Stedfast - - * mail-vfolder.c (vfolder_gui_add_rule): Make the vfolder editor - resize correctly. Fixes bug #835. - -2000-12-06 Dan Winship - - Fix up shutdown so that things that should be destroyed get - destroyed. Among other things, this fixes the bug where IMAP - stores weren't disconnected at shutdown. - - * mail-threads.c (update_active_views): Update for - folder_browser_factory_get_control_list change to EList. - - * folder-browser-factory.c: Turn control_list into an EList so - that we can safely remove items from it while it's being iterated - (which will happen as FolderBrowsers are destroyed at shutdown - while the thread code is trying to update the status bars). - (control_destroy_cb): Just destroy the folder_browser. - (browser_destroy_cb): New callback for FolderBrowser destroy. - Remove the control from control_list here instead of - control_destroy_cb, because the controls don't seem to get - destroyed reliably... - - * component-factory.c: Clean up stuff. - (factory_destroy): Get rid of this. - (owner_unset_cb): Schedule an idle handler to quit. - (idle_quit): Wait for all of the FolderBrowsers to be destroyed - and then destroy the storages and quit. - - * mail-summary.h (create_summary_view): Fix prototype - -2000-12-06 Jeffrey Stedfast - - * mail-config.c (mail_config_folder_to_cachename): Use - e_filename_make_safe (which used to be e_str_make_safe). - - * mail-display.c (make_safe_filename): And here. - - * message-list.c (message_list_drag_data_get): Here too. - -2000-12-06 Dan Winship - - * mail-local.c (cleanup_register_folder): Run the folder_changed - code on message_changed as well, so the unread message counts - update as messages are read. - - * folder-browser.c: Remove bits of filter-on-demand and toolbar - bug workaround cruft that don't do anything useful any more. - - * mail-ops.c (cleanup_load_folder): unref the ref we added in - setup_load_folder. - -2000-12-05 Jeffrey Stedfast - - * mail-display.c (write_data_to_file): Use a charset filter to - make sure the data is written out in the charset it was meant to - be in instead of UTF-8. - - * mail-format.c (mail_format_raw_message): Don't use the raw - message body as the format argument, use "%s" instead. If the raw - message contains %'s then it will segfault otherwise. - -2000-12-04 Dan Winship - - * mail-config-gui.c (service_page_item_new): Fix a typo so that - toggling the "remember password" checkbox will activate the "OK" - button if it was inactive. - -2000-12-05 Ettore Perazzoli - - * mail-vfolder.c (vfolder_create_storage): Updated the call to - `evolution_storage_new()': pass NULL for @toplevel_node_uri. - - * component-factory.c (add_storage): Updated the call to - `evolution_storage_new()': pass NULL for @toplevel_node_uri. - -2000-12-04 Jeffrey Stedfast - - * subscribe-dialog.c (setup_subscribe_folder): Use info->full_name - rather than info->name so that we get the namespace part of the - folder path as well. - -2000-12-04 Ettore Perazzoli - - * folder-browser-factory.c: Updated to define verbs - "MessageForwardInlined" and "MessageForwardAttached" instead of - "MessageForwardInline" and "MessageForwardAttach". - - * folder-browser.c (on_right_click): Make forwarding as an - attachment the default. - - * mail-callbacks.c (forward_inlined): Renamed from `forward_msg'. - (forward_attached): Renamed from `forward_attach'. - * mail-callbacks.h: Updated accordingly. - -2000-12-01 Dan Winship - - * session.c (mail_session_remember_password): Writes out passwords - (to .gnome_private) in our patented proprietary "Best Awesome - Super Encryption 64" ("BASE64") format which could not possibly - ever be cracked by even the most cryptographically knowledgeable - five-year-olds. - (mail_session_init): Load remembered passwords at startup. - (mail_session_forget_passwords): Erase them from disk as well as - memory. - - * mail-config.c: Add "remember_password" field to - MailConfigService. - (mail_config_write_on_exit): Call mail_session_remember_password - for services with "remember_password" set. - * mail-config-gui.c: Add "remember password" checkbox to the - dialogs, and make it appear and disappear as appropriate. - - * component-factory.c (mail_load_storages): Unref the store - regardless of whether or not we're using it, so we don't leak - references to non-storage stores. - -2000-12-01 Jeffrey Stedfast - - * message-list.c (e_mail_address_new): Perform better - error-handling. - -2000-12-01 Radek Doulik - - * mail-ops.c (mail_op_report_status): use mail_op_set_message_plain - - * mail-threads.c (mail_op_set_message_plain): plain version of - mail_op_set_message, doesn't use printf, passes message untouched, - use set_message - (mail_op_set_message): set_message - (set_message): helper function - -2000-11-30 Jeffrey Stedfast - - * mail-ops.c (cleanup_fetch_mail): Don't display a dialog, instead - inform the user that there was no new mail by setting a status - message. - - * message-list.c (message_list_drag_data_get): Use the new - e_str_make_safe function. - - * mail-display.c (make_safe_filename): And here. - - * mail-config.c (mail_config_folder_to_cachename): Here too. - -2000-11-30 Not Zed - - * mail-ops.c (cleanup_load_folder): Set threaded view before - setting the folder (cleanup some flash ons tartup). - - * message-list.c (message_list_init): Initialise a mempool for uid - string storage. - (new_id_from_uid): Added messagelist arg, allocate strings from - uid_pool. - (new_id_from_subject): Same. Fixed all callers. - (remove_node_diff): Dont free uid here. - (build_flat_diff): Nor here. - (clear_tree): Flush the mempool, rather than freeing the id's - directly. - (free_tree_ids): Removed, no longer required. - (free_tree_ids): Likewise. - (message_list_init): Dont connect to the table destroy signal - anymore to free the uid table. - (message_list_destroy): Free the uid pool here. - (*): Use accessors for messageid stuff. - (content_is_attachment): Removed, no longer required. - (ml_tree_value_at): Get the attachment flag directly from the - summary. - (ml_tree_value_at): For 'fake' nodes, try and do something better - than "?" for from, to, and size. - (subtree_size): New function, add up the total size of a subtree. - (subtree_earliest): Get the earliest date from a subtree. - (ml_tree_value_at): Return earliest date sent/received for fake - nodes. - (ml_tree_value_at): Return something to mark a fake subject line - as a fake subject, although i dont know, i guess this buggers up - sorting ... - (subtree_size): Check the info node is still there. - (subtree_earliest): Same here. - (subtree_unread): And here. The info node might vanish if the - folder has changed/is changing and we try and redraw stuff while - its doing it. - (message_list_drag_data_get): Use accessors. - -2000-11-29 Jeffrey Stedfast - - * message-list.c (message_list_drag_data_get): Implement. - (message_list_init): Connect the d&d signal. - - * mail-ops.c (do_save_messages): Use camel a bit more to help us - out. Don't create the file ourselves, treat it as a CamelFolder so - we don't have to worry about formatting. - -2000-11-29 Dan Winship - - * main.c (main): Remove no-longer-needed e_unicode_init. - - * mail-tools.c (mail_tool_quote_message): Fix the allocation here - (again) and put a comment explaining it. (Fixes a crash when - replying.) - -2000-11-28 Dan Winship - - * component-factory.c (owner_set_cb): Wait until after setting up - the local storage to find the Drafts/Outbox/Sent folders. - - * mail-ops.c (do_setup_folder): Use the file: store rather than - mbox:. - -2000-11-28 Jeffrey Stedfast - - * folder-browser-factory.c: Added the SaveAs bonobo menu verb - thingy. - - * mail-callbacks.c (save_msg): New callback for saving messages. - (save_msg_ok): - - * folder-browser.c (on_right_click): Add a Save As menu item. - - * mail-ops.c (cleanup_save_messages): Save all emails to the path - given. - -2000-11-28 Dan Winship - - * mail-local.c (cleanup_register_folder): Fix the initial unread - counts after the last patch. - -2000-11-27 Dan Winship - - * mail-local.c (local_folder_changed): This needs to run from the - main thread, not the camel thread, so add a proxy signal handler - to call mail_op_forward_event. Fixes hangs (eg bugzilla #909). - -2000-11-27 Jeffrey Stedfast - - * mail-display.c: Removed some unecessary debugging printf's - -2000-11-27 Dan Winship - - * mail-config-druid.glade: Revert the new druid for now, until the - corresponding code is done, so that the druid will work again. - -2000-11-21 Iain Holmes - - * mail-config-gui.c (mail_config): Don't use the "delete-event" - signal. - -2000-11-21 Iain Holmes - - * mail-display.c (pixbuf_for_mime_type): free fm_icon. - - * component-factory (summary_fn): Remove the configure param. - (factory_destroy): Made into a generic function so that the - summary_factory can be ref-counted as well as the normal - factory. - -2000-11-21 Dan Winship - - * Makefile.am: add GPGME_CFLAGS and GPGME_LIBS - -2000-11-21 Jeffrey Stedfast - - * mail-config.c (mail_config_view_source): New function to return - if user wants to view message source. - (mail_config_set_view_source): New function to set whether the - view wants to view source. - - * mail-ops.c (mail_do_view_message_sources): Removed. We're not - gonna view-source this way anymore. - - * folder-browser-factory.c: Removed the ViewSource bonobo verb - from the Message menu. - (control_activate): Added ViewSource. - - * folder-browser.c (on_right_click): Removed Message menu item to - view message source. - (folder_browser_toggle_view_source): New callback to set whether - or not the MailDisplay shows the raw message or the pretty-ified - message. - - * mail-callbacks.c: Removed view_source. - - * mail-display.c (redisplay): If toggle_raw is set then display - the raw message else display the pretty formatted message. - (mail_display_redisplay): New function to force the redisplay of a - message. - - * mail-format.c (mail_format_raw_message): New function to - write the raw message data. - -2000-11-21 Not Zed - - * mail-vfolder.c (vfolder_uri_to_folder): IF we dont find a - source, clear the exception and ignore it silently. for e.g. if - the user reconfigured their mailboxes and one of them no longer - exists. - -2000-11-21 Radek Doulik - - * mail-display.c: #include - -2000-11-21 Not Zed - - * message-thread.[ch]: Removed. No longer serves a purpose. - - * Makefile.am (evolution_mail_SOURCES): Removed message-thread.[ch]. - - * message-list.c (build_subtree): - (node_equal): - (add_node_diff): - (build_subtree_diff): - (do_regenerate_messagelist): - (cleanup_regenerate_messagelist): Changed to use camel-folder-thread. - (message_list_set_folder): If we get set a new folder, unhook any - events before unrefing the folder too (the folder is never reset - currently, but this would cause problems). - (subtree_unread): Check for uid null, wont crash, but its a bug. - (ml_tree_value_at): If the uid is null, then fake an obviously bad - line. - (build_subtree): Yeah well, we can't like freeze/thaw here, - because this is called recursive, and freeze/thaw isn't - recursive, like pre model and post model change was. - (build_tree): Maybe we can try it here, although i dont think - it'll help much. - (build_flat): And this is also a tree. yes a tree. - (build_tree): Added changes arg. If set, then try the 'diff' - approach, unless the tree is already empty. - (message_list_set_threaded): Dont clear the tree here. - (message_list_set_search): Or here. - -2000-11-20 Not Zed - - * message-list.c (save_node_state): Save out the md5 hash of the - messageid as hex, since thats all we have for those nodes. - (build_subtree): Expand the messageid to a hex string first, then - check it. - (add_node_diff): And the same here. - - * message-thread.c (thread_messages): Changed for changes to - messageid/references items. - (id_hash, id_equal): New functions to hash on the binary message id hash. - (thread_messages): removed some more no longer used dead code. - -2000-11-20 Jeffrey Stedfast - - * message-list.c (e_mail_address_compare): New comparison function - that will replace address_compare if/when we ever go to save the - preparsed addresses in the ETable rather than parsing them each - time. Also fixed it so that we should get better sorting when - addresses don't contain name parts (I was checking for NULL but - not '\0'). - (address_compare): Use e_mail_address_compare. - -2000-11-19 Peter Williams - - * mail-ops.c (update_changed_folders): Instead of making the CORBA - call in the dispatch thread, store the new display names and have - cleanup_fetch_mail make the CORBA calls. Fixes deadlocks. - (cleanup_fech_mail): Loop through the update_infos and make the - CORBA calls. - (setup_fetch_mail): Clear some new data items. - -2000-11-17 Jeffrey Stedfast - - * mail-format.c (mail_generate_reply): Use the new quote_message - function and make it start with "On %s, %s wrote:" since people - seem to want that. - - * mail-ops.c (cleanup_forward_messages): Use the new quote_message - function. - - * mail-tools.c (mail_tool_quote_message): New convenience function - to quote a message body (since both the reply and forward code do - similar quoting) - -2000-11-17 Not Zed - - * message-list.c (message_list_destroy): Before we destroy - ourselves, unhook ourselves from the folder update events. Should - fix a common crash on exit case. - -2000-11-16 Jeffrey Stedfast - - * folder-browser-factory.c: Added the MessageViewSource bonobo - menu verb. - - * mail-ops.c (mail_do_save_messages): New async function to save - messages as individual files in a given path. - -2000-11-15 Jeffrey Stedfast - - * folder-browser-factory.c: Added a new Forward as Attachment - bonobo menu item verb. - - * mail-view.c (view_forward_msg): Updated to reflect changes to - mail_do_forward_message(). It now forwards the message without - attaching it - is this what we want? - - * mail-ops.c (mail_do_view_message_sources): New async function to - display message source dialog windows. - (setup_forward_messages): If we were asked not to forward the - message(s) as attachment(s) and the user chose more than a single - message, then default to making each message an attachment. - (cleanup_forward_messages): If we aren't forwarding the message as - an attachment, then quote the text and set the composer's body - with it. - - * mail-callbacks.c (view_source): New callback to view the message - source of all messages that are currently selected. - (forward_attach): New callback to forward a message as an - attachment (forward_msg is now for forwarding a message without it - being an attachment). - (forward_message): Convenience function for forwarding messages. - -2000-11-13 Jeffrey Stedfast - - * subscribe-dialog.c (subscribe_do_subscribe_folder): Take a - 'subscribe' argument so that this can function as a subscribe AND - unsibscribe method. - (describe_subscribe_folder): Updated. - (do_subscribe_folder): Updated. - (cleanup_subscribe_folder): Updated. - (subscribe_folder_info): Pass along a TRUE as the 'subscribe' - param. - (unsubscribe_folder_info): Pass along a FALSE as the 'subscribe' - param. - -2000-11-13 Christopher James Lahey - - * message-list.c: Removed some e_table_model calls and replaced - them with e_tree_model calls. - -2000-11-12 Dan Winship - - * mail-local.c (mail_do_register_folder): Do this the normal way - rather than calling mail_operation_wait_for_finish. There was some - reason for it originally, but it no longer applies. This makes - adding new folders from the folder selection dialog no longer - hang. - -2000-11-12 Jeffrey Stedfast - - * mail-ops.c (do_filter_ondemand): Sync the source folder. - -2000-11-11 Matt Bissiri - - * evolution-mail.oafinfo: - * mail-threads.c: (retrieve_shell_view_interface_from_control): - Update the remaining "IDL:Evolution*" to "IDL:GNOME/Evolution*" - to sync up with yesterday's IDL re-scoping. - -2000-11-10 Michael Meeks - - * Makefile.am ($(EVOLUTION_MAIL_CORBA_GENERATED)): sort include order. - -2000-11-09 Jeffrey Stedfast - - * subscribe-dialog.glade[.h]: New glade file for possibly using to - create the subscribe dialog. - -2000-11-08 Radek Doulik - - * mail-format.c (mail_generate_reply): likewise - - * mail-callbacks.c (create_msg_composer): added send_html arg to - e_msg_composer_new_with_sig_file call - -2000-11-07 Jeffrey Stedfast - - * mail-search-dialogue.c (mail_search_dialogue_construct): Allow - rule part to expand when the user resizes the dialog. - -2000-11-07 Jeffrey Stedfast - - * folder-browser.c (search_save): Don't handle custom searching - anymore... we don't want this. - (search_full): Same. - (folder_browser_search_menu_activated): Set the search entry - widget sensitive. - (folder_browser_search_query_changed): Same. - -2000-11-07 Jeffrey Stedfast - - * folder-browser.c (search_full_clicked): Updated to use the - ESearchBar object rather than the previously used search widgets. - (search_full): Same. - (search_save): Same. Also use enums to make it a little easier to - read now that we have to have enums anyway. - (folder_browser_search_menu_activated): New ESearchBar menu - callback. - (folder_browser_search_query_changed): New ESearchBar query - callback. Replaces search_set() - (folder_browser_clear_search): Updated to use the ESearchBar - object rather than the previously used search widgets. - (folder_browser_gui_init): Don't hand construct a search widget, - use the new ESearchBar convenience widget. - - * mail-ops.c (cleanup_load_folder): Updated to reflect changes to - FolderBrowser. - -2000-11-07 Jesse Pavel - - * mail-display.c (pixmap_press): modified some of the EPopupMenu - structures to account for differences in the popup menu API (as - informed by Jeff. - (on_object_requested): passed the user's default email address - to the iTip control. - -2000-11-07 Ettore Perazzoli - - * Makefile.am (INCLUDES): Add the composer dirs. - -2000-11-07 Not Zed - - * mail-display.c (on_object_requested): God, I sure wish people - would listen when i'm saying i'm changing and API. I mean - I even mailed everyone and everything. Can't see any changelog - either. - -2000-11-06 Not Zed - - * mail-autofilter.c (rule_from_message): Updates for api changes. - - * mail-tools.c (mail_tool_generate_forward_subject): Fixed for api - changes. Sigh, whoever wrote the multithread code of the mailer, - had little idea. You can't just lock for getting a const value, - until you are finished with it, cause the owner still owns it. - Fixed this too. Yuck, what a horrid forwarding format, can we - change this, or make it configurable? The mail headers show who - forwarded it, we dont need to duplicate it in that UGLY subject. - - * mail-format.c (write_field_to_stream): Removed some jeffness. - dont g_strdup stuff we dont need to, and remove the - value_is_encoded thing since we can get the unencoded address - now. - (write_address): New function to write an address field. - (write_headers): Uses write_address to write addresses, cleaner, - fixed the god-awful unreadable indenting too. - (handle_text_plain): Use a 'smarter' printf format, so we dont - need to allocate and copy substrings unecessarily (esp since - they're about to be allocated any copied another few times - anyway *sigh*). - (write_field_to_stream): Commented out the isprint check, which - afaik serves no purpose. - (list_add_addresses): New function to build a list of - display-ready addresses. Although I think the composer then uses - these as internet-ready addresses. It should probably take a list - of CamelAddress's if thats what it wants. - (mail_generate_reply): Cleaned up the address list creation stuff - a heap, and fixes for camel api changes. Also fixed a small - memory leak as a side effect (fulladdr wasn't freed if it was the - same as the sender). - - * mail-display.c (on_object_requested): Changed for interface - changes to the from address. I think passing the encoded - (internet version) of the address is right here. - -2000-11-06 Jeffrey Stedfast - - * folder-browser.c (on_right_click): Move filter stuff into a - submenu of the popup menu. - -2000-11-06 Jesse Pavel - - * mail-display.c: used Camel to parse the full address before - passing the email address to my iTip control. - -2000-11-06 Dan Winship - - First draft of folder tree unread message indication for /local - mail folders. - - * mail-local.c: Add a new CamelStore subclass, MailLocalStore, - which attaches to an Evolution_LocalStorage on one side and - CamelSession on the other, and keeps track of local folders. Some - of this code was previously in mail-local-storage.c, which no - longer exists. - (local_reconfigure_folder, etc): Various mail_op-related cleanups, - and wrap d() around a bunch of printfs. - - * mail-tools.c (mail_tool_get_local_inbox_url, - mail_tool_get_local_movemail_url): Removed - (mail_tool_get_local_inbox): Simplified. - (mail_tool_do_movemail): Remove unused dest_url variable. - (mail_tool_uri_to_folder): Simplify. Now down to two cases - (vfolder, and everything else). - - * component-factory.c (owner_set_cb): Pass evolution_dir to - mail_local_storage_startup. - - * Makefile.am (evolution_mail_SOURCES): Remove - mail-local-storage.[ch] - - * mail-summary.c: Remove mail-local-storage.h include - -2000-11-06 Kjartan Maraas - - * mail-autofilter.c: Fix up #include - * mail-crypto.c: Same here. - * mail-search-dialog.c: Here too. - * main.c: Fix indentation of #ifdef - * message-thread.c: Fix include. - -2000-11-06 Jeffrey Stedfast - - * mail-callbacks.c (delete_msg): Don't invert the flag. - (undelete_msg): Same (when multiple messages are selected). - -2000-11-06 Jeffrey Stedfast - - * folder-browser-factory.c: Updated to have the same menu items as - the new right-click menu - eventually these 2 menus should be the - same. - - * folder-browser.c (on_right_click): Now correctly handles the - case of multiple selection. - - * mail-callbacks.c (enumerate_msg): Make public so it can be used - in other source files (it's a useful function!) - -2000-11-05 Jeffrey Stedfast - - * folder-browser.c (on_right_click): Added an "Undelete" option to - the right-click menu and also set a mask so it was only selectable - if the message is marked as deleted. Also set a mask for "Mark as - Read" and "Mark as Unread". - - * mail-callbacks.c (undelete_msg): New callback to undelete - messages. - -2000-11-03 Dan Winship - - * message-list.c (cleanup_regenerate_messagelist): don't free the - MessageList search when it's being reused - -2000-11-03 Jeffrey Stedfast - - * mail-local.c (mail_local_map_uri): Don't show the passwd in the - url string. - (mail_tool_local_uri_to_folder): Same. - (do_reconfigure_folder): Same. - -2000-11-03 Jeffrey Stedfast - - * Makefile.am: Added new header files. - - * component-factory.c (owner_set_cb): - s/session_init/mail_session_init - - * session.c: Renamed public functions to mail_session_*. - FIXME: Rename session.c to mail-session.c - - * folder-browser-factory.c: #include "mail-callbacks.h", #include - "mail-session.h" and replace forget_passwords with - mail_session_forget_passwords - - * mail.h: Move session prototypes to mail-session.h, Move - mail-crypto prototypes to mail-crypto.h, Move mail-callback - prototypes to mail-callbacks.h - - * mail-session.h: New header file containing public prototypes - for session.c - - * mail-format.c: #include "mail-crypto.h" - - * mail-view.c: - * folder-browser.c: #include "mail-callbacks.h" - - * mail-crypto.h: New header file containing public prototypes - for mail-crypto.c - - * mail-callbacks.h: New header file containing public prototypes - for mail-callbacks.c - - * message-list.c (message_list_get_layout): Set useful defaults. - (message_list_setup_etable): Don't set the Outbox defaults on a - folder just because it doesn't have a corresponding saved file. - -2000-11-03 Dan Winship - - * mail-config-gui.c (service_page_item_new): url_flags are now on - CamelProvider, not CamelService - - * main.c: - * subscribe-dialog.c: - * mail-threads.c: Kill warnings - -2000-11-03 Federico Mena Quintero - - * Makefile.am: Clean the idl-generated files properly. - -2000-11-03 Not Zed - - * mail-view.c: Added mail-display.h. - - * mail-autofilter.c: Removed unecessary headers. Who ran indent - over this code? Sigh. - - * mail-ops.c (display_message_input_s): Added messagedisplay. - (mail_do_display_message): Added messagedisplay arg. - (mail_do_display_message): Dont bother doing another thread when - we know we dont have a uid. - (): Added folder-browser.h to headers. Sigh. - - * folder-browser-factory.c (control_activate): Setup the - viewthreaded callback to the folder_browser function. - - * folder-browser.c (my_folder_browser_init): Connect to - right_click of etable of the messagelist here. - (on_right_click): Changed for argument changes. - (folder_browser_toggle_threads): Changed to take a fb, and to set - threaded mode on the messagelist. - (my_folder_browser_init): Connect also to the double_click signal. - (my_folder_browser_init): Connect to the message_selected signal - of the message_list. - (on_message_selected): Signal handler for message selected. - (my_folder_browser_init): Fix for change to message_list_new(). - - * message-list.h: Dont include folder-browser.h. - (message_list_toggle_threads): Moved into folder-browser.h. - (struct _MessageList): Removed folderbrowser. - - * mail.h: Dont include folder-browser.h here either, but - mail-types.h instead. - Moved prototypes moved into folder-browser.c into - folder-browser.h. (vfolder_*, filter_*). - - * mail-display.h: Dont include folder-browser.h here, but - mail-types.h and specific camel headers. - - * message-thread.c (sort_node): Invert the sort order logic so the - list is sorted in mailbox order, not reverse mailbox order. - - * message-list.c (free_tree_ids): Fix a merge foo. - (remove_node_diff): Removed unused row argument. Fixed - callers/prototype. - (clear_tree): pre_change on the removal of the root node. - (build_flat): Only perform pre_change if we are rebuilding the - whole lot. For incremental change let etable do its thing. - (build_tree): Likewise for building the tree view. If making - incremental updates, do them as we build it. - (vfolder_subject): - (vfolder_sender): - (vfolder_recipient): - (filter_subject): - (filter_sender): - (filter_recipient): - (filter_mlist): - (on_right_click): Moved to folder-browser.c, where they belong. - (message_list_init): Dont connect to right_click anymore. - (message_list_toggle_threads): Moved to folder-browser.c, renamed. - (on_double_click): Moved to folder-browser.c - (on_click): Set the flags directly, rather than in anothre thread, - which is just not necessary. - (message_list_class_init): Added a new signal 'message_selected', - to indicate when a message was selected. - (on_cursor_change_idle): Emit a signal, rather than directly - triggering the display update. - (select_row): Removed, no longer used. - (idle_select_row): And this too. - (select_msg): Removed as well. - (message_list_select): Emit a signal, rather - thandisplaying/clearing the mail-display directly. - (mark_msg_seen): Moved to folder-browser.c - (message_list_new): Removed folderbrowser argument. - -2000-11-02 Jeffrey Stedfast - - * message-list.c (on_right_click): Sync with message - menu. Addresses bugzilla bug #778. - -2000-11-02 Christopher James Lahey - - * message-list.c: Turn on draw grid for the main ETable (this may - not be working in ETable itself.) - -2000-11-01 Jeffrey Stedfast - - * mail-threads.c (mail_op_set_message): fmt argument should be - const. - -2000-11-01 Dan Winship - - Make "Get Mail" even more functional on IMAP (scans all folders), - and do a first cut at folder tree highlighting (for IMAP/news - only). - - * mail-ops.c (do_fetch_mail): For imap (sigh, we *still* shouldn't - be hardcoding that), rescan the store's folder tree, rescan each - changed folder for new messages, and update the shell folder tree. - (do_scan_subfolders): Update for component-factory.c changes, and - set folder display names and highlights appropriately when - building the storage. - - * component-factory.c (add_storage): Make this static (was - mail_add_new_storage). Use camel_service_get_name for the name - rather than url->host. (Among other things, this lets you use a - single machine as both an IMAP server and a news server.) - (mail_lookup_storage): Hash storages based on their CamelStore - rather than the URL. - (factory_destroy): Disconnect each of the CamelStores in the - storages_hash. - - * subscribe-dialog.c (cleanup_subscribe_folder): - * mail-vfolder.c (vfolder_refresh): Pass "highlighted" flag to - evolution_storage_new_folder - -2000-11-01 Jeffrey Stedfast - - * mail-ops.c (mail_op_report_status): Don't call the default - logging function. - (do_fetch_mail): Set the logfile and don't pass the logfile to - filter_driver_set_status_func - it's purpose has been altered. - (do_filter_ondemand): Same. - -2000-11-02 Not Zed - - ** Merged in camel-incremental-branch. - - * mail-format.c (mail_get_message_body): Jeff! Sigh. - We should definetly not be strduping the - content, it has already been copied and duplicated. Look at - get_data_wrapper_text. - -2000-11-01 Chris Toshok - - * subscribe-dialog.h: add fields search_entry and search_top. - - * subscribe-dialog.c: add mail-ops.c style async operations for - getting the store (to remove deadlock in the case where a auth - dialog is dismissed at startup and then the subscribe dialog is - brought up), and subscribing/unsubscribing to folders. One case - remains, that is getting the list of all folders. - (subscribe_search): flesh out this function - (build_tree): use the search_top field so we can search for - groups/folders. - (subscribe_dialog_destroy): free search_top. - (subscribe_dialog_construct): init search_top. - -2000-10-30 Iain Holmes - - * mail-summary.c (generate_folder_summaries): Fix spelling :) - Set folder->uri to NULL for the Inbox. - -2000-10-26 Iain Holmes - - * mail-summary.c (generate_html_summary): Add view:// uris to - switch the display to that folder. - -2000-11-01 Jeffrey Stedfast - - * folder-browser-factory.c: Hmmm, someone can't spell Filder, - er...I mean Filter ;-) - -2000-11-01 Jeffrey Stedfast - - * mail-autofilter.c (rule_from_message): If the name is NULL or - empty, then set the title to "Mail from

". Closes - bugzilla bug #777. Also when filtering on Subject, set the file - name to "Subject is " rather than just "" - I - think this is a bit more user-friendly. - (strip_re): Use unsigned char when passing to is() - functions from ctype.h. - (rule_add_subject): Use the "is" rule instead of "contains". - -2000-11-01 Jesse Pavel - - * mail-display.c: added property bag support for Bonobo - controls, support which helps only the iTip control, currently. - -2000-11-01 Dan Winship - - * mail-display.c (pixbuf_gen_idle): Lots of fixes and - simplifications. Should get rid of the "missing icon" problem. - There is still a problem with some images failing to get - thumbnails, even though they display correctly. - (pixbuf_for_mime_type): New function to try really hard to get the - right icon for a MIME type, including looking in mc and nautilus's - pixmap directories. - (on_object_requested): Always use pixbuf_gen_idle, even for - non-image types, to prevent code duplication. - -2000-10-31 Jeffrey Stedfast - - * mail-format.c (mail_get_message_body): Shouldn't we be - strdup'ing the content? This seems to fix the memory corruption - problems. - (mail_generate_reply): Make sure that the last char in the - generated reply text is '\0' (when body text doesn't end with a - \n, a random char will appear otherwise). - -2000-10-31 Dan Winship - - * mail-config-gui.c (do_test_service): Update for - camel_service_disconnect change. - -2000-10-31 Jeffrey Stedfast - - * mail-autofilter.c (filter_gui_add_for_mailing_list): Match "is" - rather than "contains" now that we have the "is"-rule. - -2000-10-30 Dan Winship - - * mail-config-gui.c (config_do_query_authtypes): Redo this so that - it works for all pages, not just the first page. (Now that this is - finally working again, I expect Anna to finish her redesign in the - next 15 minutes.) - (service_page_item_new): Fix up the sizing of the Auth line to - look more like everything else. - -2000-10-29 Dan Winship - - * mail-tools.c (mail_tool_uri_to_folder): Simplify this a lot by - making IMAP and NNTP use the same code, now that the IMAP - namespace doesn't need special magic handling. - - * message-list.c (mail_do_regenerate_messagelist): Don't try to - regenerate the message list if there is no folder. (The Bonobo UI - code will call this as the callback for the "Threaded View" - command.) - - * mail-ops.c (do_fetch_mail): Sync the folder before refreshing so - we don't lose flag settings. - -2000-10-27 Jeffrey Stedfast - - * mail-callbacks.c (composer_send_cb): Check to make sure that the - recipient list is neither NULL nor a 0-length list of addresses - and pop up a dialog letting the user know why we are not allowing - him/her to send the message. - -2000-10-26 Dan Winship - - * mail-display.c (write_data_to_file): Don't destroy a dialog - after run_and_close'ing it. - -2000-10-26 Jeffrey Stedfast - - * mail-callbacks.c (composer_send_cb): Check for the TO recipient - list being NULL and don't send. - -2000-10-25 Jeffrey Stedfast - - * mail-ops.c (do_send_mail): Don't forget to unref the - FilterDriver. - - * mail-callbacks.c (apply_filters): New callback for applying - on-demand filters. (removed the old on-demand filters callback). - - * mail-ops.c (do_filter_ondemand): Rewrote to apply "incoming" - filters to all selected messages. - (mail_do_filter_ondemand): No longer takes a FilterContext - argument or a destination folder argument (why did we ever need - this last one??) but now takes a uids argument. - - * folder-browser-factory.c: Add a MessageApplyFilters menu item. - -2000-10-25 Iain Holmes - - * mail-summary.[ch]: Updated for the new ExecutiveSummary code. - - * Makefile.am: Added the summary files and the evolution-services CFLAGS - and LIB stuff. - - * component-factory.c: Re-enabled the summary stuff. - -2000-10-25 Dan Winship - - * main.c (main): Pass send/postpone signal handler functions to - evolution_composer_factory_init. - -2000-10-25 Jeffrey Stedfast - - * subscribe-dialog.c (subscribe_select_all): Implemented. - (subscribe_invert_selection): (was unselect_all) Implemented. - -2000-10-25 Dan Winship - - * message-list.c: Add a "flagged" column, based on the Camel - "flagged" flag, for assigning an arbitrary "hey, I care about - this" flag to a message. - (ml_tree_set_value_at): Remove - (ml_tree_is_cell_editable): No, it's not. - (on_click): Handle the read/unread and flagged fields via the - click handler. Among other things, this makes it not select - a message when you change its read status. - -2000-10-24 Dan Winship - - * subscribe-dialog.c (folder_info_subscribed, - subscribe_folder_info, unsubscribe_folder_info): Don't prepend "/" - to the folder's full_name. Deal with hierarchy in the - EvolutionStorage tree better. - (storage_tree_path): Helper function to build a storage path from - a CamelFolderInfo. - -2000-10-23 Dan Winship - - * *: Add some missing _()s and N_()s. - -2000-10-23 Dan Winship - - * Makefile.am (INCLUDES): Update EVOLUTION_LOCALEDIR. - -2000-10-23 Jeffrey Stedfast - - * mail-ops.c (do_send_mail): Apply outgoing filters to the - message. - -2000-10-23 Christopher James Lahey - - * message-list.c: Fixed a possible error in row numberings. This - needs to be changed quite a bit anyway, but this should make - things slightly nicer in some cases. - -2000-10-23 Christopher James Lahey - - * folder-browser.c: Made the top of the folder browser a little - prettier. - - * mail-display.c, mail-vfolder.c: Made more dialogs resizable. - -2000-10-23 Jeffrey Stedfast - - * mail-autofilter.c (filter_gui_add_from_message): Don't forget to - set the rule source! (eg "incoming", "demand", or "outgoing") - -2000-10-22 Ettore Perazzoli - - * message-list.c (message_list_init): Always display the vertical - scrollbar. - - * mail-display.c (mail_display_new): Always display the vertical - scrollbar. - -2000-10-20 Jeffrey Stedfast - - * mail-config.h: #include - -2000-10-20 Michael Meeks - - * mail.h: s/BonoboUIHandler/BonoboUIComponent/ - - * mail-callbacks.c (run_filter_ondemand): ditto. - - * session.c (forget_passwords): ditto. - -2000-10-20 Dan Winship - - * evolution-mail.oafinfo: Declare composer factory. - - * main.c (main): Initialize it - -2000-10-19 Chris Toshok - - * message-list.c (nuke_uids): e-tree-model is now opaque. use the - accessor to get the root node. - -2000-10-19 Jeffrey Stedfast - - * mail-callbacks.c: #include "mail-vfolder.h" - (vfolder_edit_vfolders): Don't call the dummy vfolder_edit - function. - - * folder-browser-factory.c: s/VFolderEdit/SetVFolder - -2000-10-19 Dan Winship - - * mail-ops.c: (do_fetch_mail): For an imap store, just refresh the - INBOX. - - * folder-browser-factory.c (control_deactivate): Don't sync - non-existent folders. - * message-list.c (nuke_uids): Don't traverse non-existent trees. - -2000-10-19 Ettore Perazzoli - - * Makefile.am (glade_messages): New. - (EXTRA_DIST): Add `$(glade_messages)'. - -2000-10-19 Dan Winship - - * mail-ops.c: Clean up some old #if 0 code. - -2000-10-19 Jeffrey Stedfast - - * mail-format.c (mail_generate_reply): Get the MailConfigIdentity - *before* we create a new composer object so that we can set the - signature file. - -2000-10-18 Michael Meeks - - * folder-browser-factory.c (register_ondemand): kill. - (create_ondemand_hooks): die. - (control_activate): remove hook. - - * test-mail.c (create_container): kill old UI handler. - -2000-10-18 Christopher James Lahey - - * message-list.c: Fixed some column widths. - -2000-11-02 Not Zed - - * message-list.c (get_message_info): Call get_message_uid to get - the uid, save some duplicated code. - (folder_changed): Handle the case of a NULL changes input. - - * message-thread.c (thread_messages): Removed pointless - variable/assignment 'container'. - (thread_messages): Try and cope with duplicate message id's. - -2000-11-01 Not Zed - - * mail-callbacks.c (main_select_first_unread): Changed to use 0 as - the first row to select a message. - - * mail-ops.h (mail_do_regenerate_messagelist): Removed from - header. This function is no longer public since it is really an - internal message-list function. - - * folder-browser.c (search_full_clicked): Call the set_search() - function, rather than messagelist_rebuild, which is going private. - (search_set): Same here. - (folder_browser_clear_search): And here. - (etable_key): Call message_list_select() instead of - message_list_home and message_list_end. Removing some odd code - duplication. - - * message-thread.c (do_thread_messages): Moved the mail lock to - here, rather than locking for each message lookup (which is - useless anyway). This is still not correct either, as the tree - references folder data ... but a bit better than it was. - (thread_messages): Removed the mail tool lock stuff, lock in - higher functions. - - * message-list.h: Added a threaded indicator to the message list - itself. - (threaded_view): removed a mystery variable. - - * message-list.c (do_regenerate_messagelist): Made the code a - little more readable. - (build_tree): Fixed argument to be a thread_messages struct, not a - container. - (cleanup_regenerate_messagelist): Free changeinfo. - (mail_do_regenerate_messagelist): If we are adding changes to a - flat view, we dont need to goto the other thread at all, so - process immediately. - (message_list_toggle_threads): Clear the tree if we're changing - the view mode. - (message_list_toggle_threads): And reset the rowmap, since it is no - longer valid. - (build_tree): If we are building into an already empty tree, just - build into that (probably irrelevant optimisation). - (build_subtree): Build hte subtree in the same order as we got it, - not inverted order. - (message_list_set_threaded): New function to select the threaded - view/flat view. - (mail_do_regenerate_messagelist): Removed references to - mail_config, get it from the ml->threaded var instead. - (message_list_destroy): No longer free the key data for the - uid_rowmap. - (new_id_from_uid): Convert a uid string into an id string. - (new_id_from_subject): Likewise for subject strings. - 'id' strings replace the 'uid:' and 'subject:' stuff with - accessors and macros and use less memory and is more readable. - (id_is_uid): macro to check if an id string is a uid. - (id_uid): Returns the uid part of a uid id string. - (id_subject): Returns the uid part of a subject id string. - (build_subtree): Use the new id functions, and dont duplicate the - uid in the uid rowmap, but just reference it from the tree node. - (node_equal): Use new id functions. - (add_node_diff): And here too. - (remove_node_diff): And here. Also remove the uid from the - rowmap, and dont free it anymore. - (get_message_info): And here. - (get_message_uid): And here. - (subtree_unread): And here. - (ml_tree_value_at): " - (ml_tree_set_value_at): Noted a memory leak. do_flag_messages() - doesn't free the contents of the uid array, just the uid array - (well that i can tell, teh code has more problems anyway). - (ml_tree_set_value_at): And fix the id accessors. - (save_node_state): " - (build_flat): Use id macros/functions. Dont alloc memory for hash - key. - (build_flat_diff): Use id macros. - (build_flat_diff): Remove the hash table entry before freeing its - key data (in the node). - (free_key): Removed. Keys are no longer alloc'd. - (clear_tree): When we clear the tree, also clear the uid_rowmap, - as it is no longer valid (or contains allocated keys!). - (free_tree_ids): Renamed from nuke_uids. - (free_ids_cb): Renamed from nuke_uids_cb. - (free_tree_ids): Changed arg to be a ETreeModel directly. - (ml_tree_value_at): Map id to subject using the right macro. - (free_tree_ids): Check we have any nodes to traverse first. - (build_flat): Insert to row -1 to append the nodes (faster). - (remove_node_diff): Only remove the uid rowmap entry if it is - referencing this node (i.e. the key string is the same key string, - not just a matching key string). - (add_node_diff): Remove the uid rowmap entry before inserting a - new one to force the key to be replaced. This is required as the - tree may temporarily contain duplicate messages during the - rebuilding phase. - (message_list_set_search): New function, set the search string. - Only redo the search if it has changed, etc. - (mail_do_regenerate_messagelist): Made static. There is no need - for external code to call this. - (message_list_set_folder): NOP if the new folder is the same. - (message_list_set_folder): Clear the tree before rebuilding it. - (message_list_select): Ok, this wins the award for 'most bizarre - interface'. Changed the start row to mean the end of the list if - we supply -1, rather than the start of the list. Also fixed the - endpoints (it would never select message 0 if searching - backwards). - (idle_select_row): Changed start row to 0 from -1. - (message_list_end): Removed. - (message_list_home): Removed. - (go_to_message): Removed. message_list_select can do this. - (message_list_select): Check that direction is one of the valid - ones, otherwise we could be thrown for loops. - -2000-10-31 Not Zed - - * message-list.c (node_equal): Compares an etree node with a - message-thread node to see if they point to the same object. - (add_node_diff): Adds a new thread node to the etree. - (remove_node_diff): Removed an etree node, freeing any additional - data. - (build_subtree_diff): Takes an existing etree definition, and a - new thread definition and makes the etree match, using as few - operations as possible. - (do_regenerate_messagelist): No longer free/clear the uid/rowmap - here. - (regenerate_messagelist_input_t): Added a tree field - are we - building a tree view? - (regnerate_messagelist_data_t): Added a tree field, if we built a - tree result. Added a changes parameter, for building diff's after - search/etc. - (mail_do_regenerate_messagelist): Setup the tree indicator. - (build_flat_diff): Apply a changeset to a message list. - (build_flat): Added a changes argument, if present, use - build_flat_diff() to build the list. - (do_regenerate_messagelist): If we are generating a threaded view, - build the threaded list here, rather in another separate - invocation. - (cleanup_regenerate_messagelist): Call build_tree directly on the - threaded list. - (message_list_init): Init the uid_rowmap hash table here instead - of somewhere odd. - (message_list_destroy): Assume uid_rowmap exists. - (do_regenerate_messagelist): Remove the code here that is messing - with the message list data (search/uid_rowmap). We're in a - different thread boys ... - -2000-10-26 Not Zed - - * message-list.c (cleanup_regenerate_messagelist): Fixed some - logic to make more sense (gboolean)!pointer replaced with - (pointer != NULL). - (build_tree): Put the tree pre/post change stuff in here, where it - should be. - (build_flat): Same here. - (cleanup_regenerate_messagelist): Remove model_changed stuff here. - (setup_regenerate_messagelist): Remove pre_change stuff here. - -2000-10-20 Not Zed - - * message-list.c (main_folder_changed): Perform incremental update - of the display for flat view. - (ml_tree_value_at): Spit out a mroe meaningful warning when we - can't find the uid in our tree, in the folder. - - * message-thread.c (thread_messages): Made public. - (thread_messages_free): Made public. - (thread_messages): Now we also return a struct _thread_messages, - which is passed to other functions. - (container_free): Renamed from thread_messages_free. - (thread_messages_free): Take a thread_messages argument. - (thread_messages_add): New function to add a list of uid's to the - thread list. - (thread_messages_remove): Likewise, for removing them. - (cleanup_thread_messages): Change for struct changes. - (do_thread_messages): Likewise. - -2000-10-19 Not Zed - - * mail-tools.c (mail_tool_do_movemail): removed unused var - - * folder-browser.c (search_full_clicked): Fix for api changes, - such as it can be called an api, its mroe an utter mess infact. - (search_set): Same. - (search_set): And here. - (folder_browser_clear_search): And here. - - * message-list.c (folder_changed): Copy and forward the changeinfo - list to the mian thread. - (main_folder_changed): Free the changeinfo. Todo: something smart - with this information. - (struct regenerate_messagelist_input_s): Added a changes field. - (mail_do_regenerate_messagelist): Added a change list argument. - (message_list_set_folder): Fix for mail_do_regenreate_messagelist - api. - (message_list_toggle_threads): Same. - -2000-10-18 Iain Holmes - - * mail-config-gui.c (mail_config): Make all the CLists have passive - titles. - (identity_dialog): Make the default button the "OK" button, and set - the dialog to close on pressing return on the entryboxes. - -2000-10-17 Iain Holmes - - * mail-config-gui.c (service_page_item_new): Disable the optionmenu - because it is empty. - (service_page_item_auth_fill): Enable the optionmenu as there's stuff - in it now. - - * mail-callbacks.c (reply_to_sender): Call check_send_configuration - when we have the FolderBrowser because if it is done in mail_reply - (with passing NULL) it will only be able to continue if the mailer - has already been configured. - (reply_to_all): Same. - -2000-10-18 Not Zed - - * folder-browser.c (folder_browser_gui_init): No, we REALLY dont - want to perform an immediate search as the keys are pressed. - - * mail-display.c (on_object_requested): Kill a minor warning with - a cast. - - * mail-config.c: Include mising ctype.h to kill a warning. - - * message-thread.c (main): Fixed the test case for api changes. - - * message-list.c (message_list_drag_data_get): Set some flags to - get_folder(). I dont even think this will work because - mail_tool_get_folder doesn't handle file url's. - - * mail-vfolder.c (vfolder_uri_to_folder): Pass appropriate flags. - - * mail-ops.c (do_setup_folder): Pass appropriate flags. Hmm, - whats the difference between setup and create. *shrug* - (do_create_folder): Pass appropriate flags to get_folder. Needs a - way to specify the index flag. - - * mail-tools.c (mail_tool_get_folder_from_urlname): Changed create - to flags argument. - (mail_tool_get_local_inbox_url): Add an index argument. - (mail_tool_get_local_inbox): honour index flag. - (mail_tool_get_inbox): Changed for api change. - (mail_tool_uri_to_folder): Fixed calls to store_get_folder(); - - * mail-local.c (load_metainfo): Added an indexed field to the metainfo. - (save_metainfo): And save it too. - (do_reconfigure_folder): Honour index flag when creating the new - folder. Do not open the old folder with an index at all. - (mail_local_map_uri): Add an index argument - tells if the mbox is - indexed. - (mail_tool_local_uri_to_folder): Create & pass flags properly. - (#include gnome.h): Dont include all of gnome, just what we use, - and explicity include xml-memory, so we get xmlFree(). - -2000-10-16 Jeffrey Stedfast - - * folder-browser.c (search_full_clicked): Un #if 0'd out - (search_full): Same. - (folder_browser_gui_init): Connect search_full and search_activate. - (search_set): Uncomment search_full() - - * Makefile.am: Re-add `mail-search-dialogue.h' and - `mail-search-dialogue.c'. - -2000-10-16 Jeffrey Stedfast - - * mail-format.c (mail_generate_reply): Decode recipient names so - that they display nicely in the To and Cc fields. - (write_field_to_stream): Now takes another argument - 'value_is_encoded' so that we know if we should decode that string - before proceding onward. Since the message subject is already - decoded before it's passed in, we don't want to decode it again - (wasted cpu time and/or any 8bit chars will be assumed to be - latin1 encoded and thus the decoded value will be corrupt). - -2000-10-16 Chris Toshok - - * mail-config-gui.c (service_page_get_url): only set the url->user - field if the user string is non-NULL and not empty. - -2000-10-16 Not Zed - - * message-list.c (message_list_setup_etable): Uh, fixed jeff's - wrong fix for setting the speficiation (the function changed to - set_state(), as can be seen in the e_table-scrolled_load_state() - call only 2 lines above). - -2000-10-13 Not Zed - - * message-list.c (message_list_setup_etable): oops, chose the - wrong thing to cut out after a merge conflict. - -2000-10-15 Chris Toshok - - * message-list.c (subtree_unread): ETreePath != GNode now, use - accessors. - (ml_tree_value_at): same. - (save_node_state): same. - (save_tree_state): same. - (nuke_uids_cb): convert to e_tree_model_node_traverse required - type. - (nuke_uids): g_node_traverse -> e_tree_model_node_traverse. - -2000-10-14 Ettore Perazzoli - - * evolution-mail.oafinfo: Add "evolution:shell-component-icon" - attribute. - -2000-10-13 Jeffrey Stedfast - - * message-list.c (message_list_setup_etable): Don't free the - service name. - -2000-10-12 Jeffrey Stedfast - - * mail-ops.c (do_fetch_mail): sync & expunge the source folder - after filtering. - -2000-10-12 Jeffrey Stedfast - - * message-list.c (message_list_setup_etable): Create the 'spec' - and 'extras' arguments and call e_table_scrolled_new() rather than - set_specification as that function no longer (?) exists. - - Also started to add drag & drop functionality to something like - Nautilus (but #if 0'd it out until I had time to finish it and - till after 0.6). - -2000-10-12 Not Zed - - * message-list.c (message_list_setup_etable): Duh, fix the test - for the folder name, strstr != strcmp is it. - -2000-10-10 Not Zed - - * message-list.c (folder_to_cachename): Removed, changed callers - to use mail_config_folder_to_cachename instead. - - * mail-config.c (mail_config_folder_to_cachename): New utility - function to get a cache name for a folder. - - * mail-tools.c (mail_tool_do_movemail): Changed to return the path - to the mbox, rather than opening a folder of it. - - * mail-ops.c (mail_incorporate_messages): Dont bother making the - pseudo messageinfo, filder_driver_filter_message will do it for - us. - (report_status): Callback to report status of filtering operation. - (do_fetch_mail): Changed significantly - for the api changes to - the filtering system. Also now incorporates a mailbox file - directly, without having to import it into a camel folder first. - (mail_incorporate_messages): Removed entirely, no longer needed. - - * mail-vfolder.c (vfolder_refresh): Fix for context api changes. - (vfolder_uri_to_folder): Likewise. - - * folder-browser-factory.c (create_ondemand_hooks): Changed for - api changes. Also only adds demand filters to the menu (fixed a - small logic bug). - -2000-10-11 Chris Toshok - - * subscribe-dialog.c (folder_etree_value_at): special case for - folders with NULL urls (which aren't selected/subscribeable). - (unsubscribe_folder_info): can't (un)subscribe from folders with - non-NULL urls. - (subscribe_folder_info): same. - -2000-10-12 Christopher James Lahey - - * message-list.c: Replace To with From except in Drafts, Outbox, - or Sent boxes. Make Subject column pay attention to text - attributes like bold and strikethrough. - -2000-10-12 Iain Holmes - - * component-factory.c: Disable the executive summary. - -2000-10-11 Chris Toshok - - * subscribe-dialog.c (FOLDER_ETABLE_SPEC): set expansion to 0.0, - minimum-width to 16, and resizable to false for the subscribed - column. - (folder_info_subscribed): new function so we can do the correct - path munging. - (subscribe_folder_info): only add the folder to the storage if - there wasn't an exception subscribing it. - (unsubscribe_folder_info): same, but unsubscribing. - (folder_etree_value_at): use folder_info_subscribed. - (folder_toggle_cb): same. - (unsubscribe_folder_foreach): same. - (subscribe_folder_foreach): same. - (subscribe_dialog_gui_init): set the bold column on the text cell, - and add the subscribed pixbuf. - -2000-10-11 Anna Marie Dirks - * mail-threads.c: Changed the password-getting dialog so that the - text entry has focus. - -2000-10-11 Chris Toshok - - * subscribe-dialog.c (STORE_ETABLE_SPEC): change cell type to - "string" since we're not including it in the extras. - -2000-10-11 Christopher James Lahey - - * message-list.c, message-list.h, subscribe-dialog.c: Changed - these to use the proper form for the column element. - -2000-10-11 Christopher James Lahey - - * message-list.c, message-list.h, subscribe-dialog.c: Updated - these to the new ETable style of specifications. - -2000-10-11 Chris Toshok - - * subscribe-dialog.c (subscribe_dialog_gui_init): convert to the - new gal e-table stuff. - (html_size_req): - (html_new): - (put_html): #if 0 out the html functions since description stuff - isn't used and we don't want the warnings. - -2000-10-11 Chris Toshok - - * subscribe-dialog.c (subscribe_dialog_gui_init): remove the html - description stuff for now. - -2000-10-10 Chris Toshok - - * subscribe-dialog.c (folder_toggle_cb): umm.. duh :) only - subscribe if it's not subscribed, and vice versa. - (subscribe_folder_foreach): make sure to call - e_tree_model_node_changed. - (unsubscribe_folder_foreach): make sure to call - e_tree_model_node_changed. - -2000-10-10 Chris Toshok - - * mail-ops.c (setup_scan_subfolders): add a ref to input->storage - here so that the ref/unref pattern more closely matches other - mail-ops. also, this keeps the storage from being freed when we - hit the unref in cleanup_scan_subfolders, which is important - because we maintain a reference to it in the storage_hash in - component-factory.c - - * subscribe-dialog.h: add storage field. - - * subscribe-dialog.c (subscribe_folder_info): new function, - subscribe to a folder given it's CamelFolderInfo, and add it to - the shell - we're generating a path from the name of the folder - which is bad. - (unsubscribe_folder_info): same (except we unsubscribe and remove - from the shell). - (storage_selected_cb): unref the currently selected storage. - (subscribe_dialog_destroy): unref the currently selected storage. - (subscribe_dialog_construct): sc->storage = NULL. - - * component-factory.c (mail_lookup_storage): new function, to look - up a EvolutionStorage corresponding to a CamelService. we ref the - EvolutionStorage before passing it back. - (mail_add_new_storage): insert the storage into storages_hash if - result is EVOLUTION_STORAGE_OK. - - * mail.h: add prototype for mail_lookup_storage. - -2000-10-10 Larry Ewing - - * mail-format.c (mail_generate_reply): make sure we dup the return - value of get_reply_to or get_from when building the recipient list. - -2000-10-10 Iain Holmes - - * mail-summary.c (generate_html_summary): Removed the
  • from the - HTML. - -2000-10-10 Cody Russell - - * mail-threads.c: Added #include - -2000-10-09 Iain Holmes - - * mail-summary.c: Removed the extra arguments to rule_context_load. - -2000-10-09 Chris Toshok - - * subscribe-dialog.c, subscribe-dialog.h: use our own etable to - display the stores, and get them from the mail-config api. put - #if 0'ed code in place to add/remove the folders from the shell - when they're subscribed/unsusbcribed. also, react to double - clicks in the folder etable by toggling subscription status. - -2000-10-08 Iain Holmes - - * mail-summary.c (create_summary_view): Updated to use new icon code. - -2000-10-08 Iain Holmes - - * mail-summary.c (generate_html_summary): Generic function to - recreate the HTML of the summary. Checks all the folder summaries. - (generate_folder_summarys): Create a summary of all the vfolders - and the Inbox. - (create_summary_view): Generate the folder summarys before the - HTML. - -2000-10-09 Ettore Perazzoli - - * folder-browser.c: Don't #include "mail-search-dialogue.h" as - it's missing from the repository. - (search_full_clicked): Temporarily `#if 0'ed out. - (search_full): Likewise. - (folder_browser_gui_init): Don't connect `search_full'. - (create_option_menu): Don't connect `search_menu_deactivate'. - (folder_browser_gui_init): Don't connect `search_activate'. - (search_set): Don't do `search_full()'. - (folder_browser_gui_init): Likewise. - - * Makefile.am (evolution_mail_SOURCES): Remove - `mail-search-dialogue.h' and `mail-search-dialogue.c' as NotZed - forgot to put them into CVS. - -2000-10-06 Not Zed - - * mail-search-dialogue.c: New widget, full search dialogue for - mail. - - * folder-browser.c (search_set): If we click on custom search, run - the full search dialogue. - (folder_browser_gui_init): Add a button to perform a full search. - (search_full): Bring up the mail search dialogue asynchronously. - (search_full_clicked): Handle search options. - (folder_browser_destroy): Free the saved rule if there is one - there. - (search_options[]): Added a custom option option - brings up the - full search dialogue. - (search_set): Disable the search entry if we are doing a full - search. - - * mail-vfolder.c (vfolder_create_storage): Yay, finally - depeterised this stuff. - (vfolder_uri_to_folder): Removed an irrelevant comment. - - * mail-callbacks.c (filter_edit): And here. - - * mail-ops.c (do_fetch_mail): And here too. - - * mail-autofilter.c (filter_gui_add_from_message): Fixed call to - context_load. - (filter_gui_add_for_mailing_list): And here too. - - * folder-browser-factory.c (create_ondemand_hooks): Remove that - ondemand callback snot. - -2000-10-05 Not Zed - - * message-list.c (message_list_init_etable): Build the etable once - we know what folder we are going to use. - (save_header_state): Save the header spec to a cache file. - (message_list_destroy): Save the header spec. - (message_list_setup_etable): Setup the etable spec for this - folder, from a saved version if one exists, or to suit the folder - type (sent/received). - (message_list_set_folder): Setup the etable here once we have a folder. - -2000-10-09 Michael Meeks - - * message-list.c (message_list_toggle_threads): re-write. - - * folder-browser-factory.c (control_activate): update paths, need - CVS HEAD bonobo, use a listener not a verb. - -2000-10-08 Miguel de Icaza - - * mail-ops.c (mail_incorporate_messages): Tag string for translation - (do_flag_messages): ditto. - - * mail-threads.c (pipe_write): Repeates writes on EINTRS. - (pipe_read): Repeats reads on EINTRS. - (mail_operation_queue): Use pipe_write - (mail_op_set_percentage): ditto. - (mail_op_hide_progressbar): ditto. - (mail_op_show_progressbar): ditto. - (mail_op_set_message): ditto. - (mail_op_get_password): ditto. - (mail_op_error): ditto. - (mail_op_forward_event): ditto. - (mail_operations_terminate): ditto. - (dispatch): use pipe_read. - (dispatch): use pipe_write - (dispatch): ditto. - - * mail-ops.c (mail_incorporate_messages): Only show message being - incorporated every 2 seconds, to avoid a bunch of CORBA round trips. - (do_transfer_messages): ditto. - (do_forward_messages): ditto. - -2000-10-07 Miguel de Icaza - - * mail-ops.c (do_fetch_mail): Move the functionality to - incorporate messages into mail_incorporate_messages. - (mail_load_evolution_rule_context): New function. Move the - functionality for loading the context rules to its own function. - -2000-10-06 Iain Holmes - - * mail-summary.c: Fix the locking up of the mail by only calling - camel functions from the camel thread, and ORBit functions from - the GTK thread. Watch for the message-changed signal again. - - * component-factory.c (summary_fn, component_factory_init): - Re-enabled it, cos I think it works again. - - * mail-display.h: Remove the pb_cache. - - * Makefile.am: Readd the mail-summary.[ch] files and add the - evolution-services library to the link. - -2000-10-06 Chris Toshok - - * mail-ops.c (do_scan_subfolders): set the @subscribed_only - parameter to TRUE, since the subscribe UI is the only interface - that should show unsubscribed groups. - -2000-10-06 Ettore Perazzoli - - * mail-ops.c (do_scan_subfolders): Add missing @subscribed_only - parameter in the call to `camel_store_get_folder_info()'. [FALSE, - I hope that's right.] - -2000-10-05 Jeffrey Stedfast - - * mail-format.c (write_field_to_stream): Decode the header before - writing it to the header box. - - * mail-callbacks.c (send_receieve_mail): fetch mail before - sending, this is a temp fix for POP-before-SMTP authentication. - -2000-10-05 Michael Meeks - - * component-factory.c (summary_fn, component_factory_init): - Disable summary stuff, it appears to be badly broken. - - * Makefile.am (evolution_mail_SOURCES): add mail-summary.[ch] - - * subscribe-dialog.c (update_pixmaps): upd. - (set_pixmap): upd. - (subscribe_dialog_gui_init): upd. - remove redundant and annoying forward definitions. - - * folder-browser-factory.c (control_deactivate): upd. - (control_activate_cb): upd. - (control_activate): upd. - (set_pixmap): upd. - (update_pixmaps): upd. - (register_ondemand): upd. - (create_ondemand_hooks): upd. - -2000-10-04 Jeffrey Stedfast - - * message-list.c (address_compare): Use CamelInternetAddress - instead of my quick hack (aka InternetAddress). - -2000-10-05 Iain Holmes - - * mail-summary.c: Don't watch for the message-changed signal. - -2000-10-05 Iain Holmes - - * component-factory.c (component_factory_init): Setup the summary - factory as well. - (summary_fn): New function to create the ExecutiveSummaryComponent. - - * mail-summary.c: Create the view, and update it when something - changes. - -2000-10-04 Iain Holmes - - * mail-display.c (on_object_requested): Removed the pixbuf cache - as it would return the pixbufs in the reverse order every so often - and generally get all confused. - -2000-10-04 Dan Winship - - * folder-browser-factory.c (control_deactivate): Add back the - "sync folder on leave" hack that got lost in the UIHandler merge. - -2000-10-04 Jeffrey Stedfast - - * folder-browser-factory.c: Instead of UnSelectAll, we want - InvertSelection. - - * mail-callbacks.c (select_all): Finished this function. - (invert_selection): Finished. (was unselect_all - but that's not - what we really wanted as it'd be pointless. invert_selection is a - much more useful callback :-) - -2000-10-04 Chris Toshok - - * mail-tools.c (mail_tool_get_root_of_store): remove news specific - check. - (mail_tool_uri_to_folder): news: -> nntp: - -2000-10-04 Jeffrey Stedfast - - * mail-ops.c (do_filter_ondemand): Don't expunge the source - mailbox on completion. - -2000-10-04 Dan Winship - - * mail-ops.c (do_scan_subfolders): Don't try to add_folders if - get_folder_info returned NULL. - -2000-10-04 Not Zed - - * message-list.c (message_list_init_header): Fix the attachment - icon width. - (content_is_attachment): Perform some simple tests to see if the - message contains an attachment. - (build_subtree): Kill a pointless warning. - -2000-10-04 Miguel de Icaza - - * mail-callbacks.c (delete_msg): Added a comment to a piece of - code that I was trying to "fix" just to find that the strange - behaviour here that was about to be fixed, was actually a fix to - the problem I was trying to fix. - - So put the original comments from Dan, and will hope that someone - with more knowledge about this can figure why the delete key wont - delete messages and select the next unread message. - -2000-10-02 Chris Toshok - - * subscribe-dialog.c (subscribe_dialog_destroy): destroy our - tree_model and remove the root node. also, release_unref our - control and view, and unref the listener. - - * mail-tools.c (mail_tool_uri_to_folder): news url's contain host - names too, now. - -2000-10-02 Chris Toshok - - * subscribe-dialog.c, subscribe-dialog.h: add a - storage-set-view-listener, and add a little printf saying what - storage was selected. - -2000-10-02 Chris Toshok - - * subscribe-dialog.c (subscribe_dialog_gui_init): get - Evolution::StorageSetView interface on our storage set view - control, and set "show_folders" to FALSE. - -2000-10-02 Chris Toshok - - * Makefile.am (INCLUDES): add -I$(top_srcdir)/widgets/misc - - * subscribe-dialog.c (subscribe_dialog_gui_init): change the - window title to Manage Subscriptions, bold subscribed folders, and - add a title bar ala the evolution shell (but without the close - button). - -2000-10-02 Chris Toshok - - * subscribe-dialog.h: add fields for the storage set - Bonobo_Control and Evolution_StorageSetView interfaces. - - * subscribe-dialog.c (subscribe_dialog_gui_init): create the uih - as early as possible, and add the storage set view to the left - side of the hpaned. - -2000-09-22 Michael Meeks - - * folder-browser-factory.c (set_pixmap): upd. - (control_activate): upd. - -2000-10-02 Dan Winship - - * mail-config-gui.c: Remove "Port" entry from source dialog. We'll - use "host:port" like Netscape and other programs do. - (service_page_get_url): If host ends in ":###", use that as port. - (service_page_set_url): If URL contains a port, append it to the - hostname, separated by a colon. - -2000-10-02 Chris Toshok - - * Makefile.am (evolution_mail_SOURCES): subscribe-control.[ch] -> - subscribe_dialog.[ch] - - * mail-callbacks.c (manage_subscriptions): subscribe_control -> - subscribe_dialog. Also, pass the shell to subscribe_dialog_new. - - * mail-types.h: SubscribeControl -> SubscribeDialog. - - * subscribe-dialog.c, subscribe-dialog.h: rename from - subscribe-control.[ch]. - - * subscribe-dialog.c (subscribe_dialog_construct): pass - Evolution_Shell in. - (subscribe_dialog_new): takes Evolution_Shell argument now. - -2000-10-02 Chris Toshok - - * message-list.c (message_list_init_renderers): remove the 2 tree - pixbufs, so adjust the offsets to the score pixbufs. also, pass - NULL for the open/closed pixbufs to the tree cell renderer. - -2000-10-02 Dan Winship - - * mail-ops.c (mail_do_scan_subfolders, etc): Update for - CamelFolderInfo changes. - - * message-list.c (message_list_destroy): Don't save_tree_state if - there's no folder associated with the MessageList. - - * folder-browser.c (folder_browser_set_uri): Only call - mail_do_load_folder if the URI is not "". - -2000-10-02 Iain Holmes - - * mail-display.[ch]: Add a cache for the pixbufs, hashed on CID, - so that we only have to make a thumbnail once. - -2000-10-01 Iain Holmes - - * mail-display.c: Generate the thumbnails on an idle function so - that the user interface isn't locked. Checks in case the widget it - will use to display the image isn't destroyed. - -2000-10-01 Iain Holmes - - * mail-display.c (on_object_requested): If the attachment is an - image display a thumbnail of it, instead of the generic image - icon. - -2000-09-29 Miguel de Icaza - - * folder-browser-factory.c: Add print preview verb here. - - * mail-callbacks.c (do_mail_print): Handle printing here, the - complete engine. - (mail_print_preview_msg): new. does print previewing. - (mail_print_msg): does printing of the message. - -2000-09-29 Chris Toshok - - * subscribe-control-factory.c, subscribe-control-factory.h: nuked. - - * subscribe-control.c, subscribe-control.h: lots of changes. we - now pop up a dialog, and will have a storage set view on our left - side, like the shell does. - - * mail.h: add prototype for manage_subscriptions. - - * mail-callbacks.c (manage_subscriptions): new function, pops up - the subscribe dialog. - - * folder-browser-factory.c: add the verb for managing - subscriptions. - - * Makefile.am (evolution_mail_SOURCES): add subscribe-control.[ch] - again. - -2000-09-28 Chris Toshok - - * subscribe-control.h (subscribe_search): added prototype. - - * subscribe-control.c (subscribe_search): new function. - - * subscribe-control-factory.c (make_folder_search_widget): new - function, to add search widget to toolbar. - (control_activate): create the search widget and add it to the - toolbar. - -2000-09-28 Jeffrey Stedfast - - * mail-ops.c (do_send_queue): Messages should be appended to Sent - as Seen. - (do_send_mail): Same. - -2000-09-28 Ettore Perazzoli - - * Makefile.am: Don't compile `subscribe-control' for now. It - needs to be converted to the new UI handler code in Bonobo; it - doesn't compile right now. - -2000-09-27 Chris Toshok - - * subscribe-control.c (subscribe_refresh_list): new function. - - * subscribe-control.h (subscribe_refresh_list): new prototype. - - * subscribe-control-factory.c (update_pixmaps): add RefreshList - pixmap. also, add it to the verbs list. - -2000-09-27 Chris Toshok - - * mail-types.h: add SubscribeControl typedef. - - * Makefile.am (evolution_mail_SOURCES): add the subscribe stuff. - - * subscribe-control-factory.h * subscribe-control-factory.c * - subscribe-control.c: * subscribe-control.h: Mostly mocked up - subscribe ui. - -2000-09-27 Jeffrey Stedfast - Note: We need a configuration option to specify whether to log - filtering actions or not. - - * mail-ops.c (do_filter_ondemand): Updated to pass a log file - pointer to filter_driver_run. - (do_fetch_mail): Same. - (mail_do_fetch_mail): Fixed a compiler warning. - -2000-09-27 Jeffrey Stedfast - - * mail-callbacks.c (composer_postpone_cb): Fix it so that "send - later" will still mark a message as being replied, forwarded, - whatever. Closes bug #568 on bugzilla. - -2000-09-27 Jeffrey Stedfast - - * mail-ops.c (do_filter_ondemand): If the message has been - deleted, don't try filtering it - skip to the next message. Fixes - bugzilla bug #639. - -2000-09-25 Jeffrey Stedfast - - * folder-browser-factory.c: Shuffling (un)select all menu items to - the Edit menu. - -2000-09-25 Jeffrey Stedfast - - * folder-browser-factory.c: Added new menu items - - * mail-callbacks.c (mark_as_seen): New callback to mark all - selected messages as Seen. - (mark_as_unseen): New callback to mark all selected messages as - Unseen. - (select_all): New callback to select all messages (not yet - finished) - (unselect_all): New callback to unselect all messages (not yet - finished) - -2000-09-25 Not Zed - - * message-list.c (folder_to_cachename): Function to convert a - folder name/path to a filename for per-folder data. - (save_tree_state): - (load_tree_state): - (free_tree_state): For loading/saving the state of the expansion - of nodes in the tree. - (message_list_destroy): Save the tree state when done. - (save_node_state): Changed logic, we save when the node should be - closed on startup. i.e. any new nodes with children automatically - default to being open. - (subtree_unread): Check for unread messages in a subtree. So - false messages (for tree roots) are properly displayed. - -2000-09-25 Jeffrey Stedfast - - * message-list.c (address_compare): Updated to use Nat's - ENameWestern parser. - - * Makefile.am: link against e-util/ename/libename.la - -2000-09-25 Dan Winship - - * mail-ops.c: CamelException is not for compile-time errors. - Replace lots of argument checks in setup_ functions with - g_return_if_fails in the public functions. Also remove some - prototypes that weren't needed because they were for static - functions that are defined before they're used. - -2000-09-23 Michael Meeks - - * folder-browser-factory.c (set_pixmap): upd. - (control_activate): upd. - -2000-09-23 Ettore Perazzoli - - * message-list.c (internet_address_new_from_string): Skip spaces - at the beginning of the string first before doing anything else. - The code that follows doesn't like the first character of the - string to be a space. - -2000-09-22 Jeffrey Stedfast - - * message-list.c (address_compare): New comparison function for - email addresses. - (subject_compare): New comparison function for message subjects. - (message_list_init_header): Updated to use the new compare funcs. - -2000-09-21 Jeffrey Stedfast - - * mail-format.c (mail_generate_reply): Fixed some memory - leakage. Call free_recipients() so we don't leak memory. - -2000-09-19 Jeffrey Stedfast - - * mail-ops.c (do_scan_subfolders): Use the folder's full_name so - recursive directory structures display correctly ;-) - -2000-09-19 Dan Winship - - * mail-ops.c (do_scan_subfolders): Update for CamelFolder changes - (subfolder_names -> subfolder_info). - -2000-09-19 Dan Winship - - * mail-callbacks.c (create_msg_composer, compose_msg, send_to_url, - mail_reply, forward_msg): * mail-format.c (mail_generate_reply): * - mail-ops.c (cleanup_edit_messages): - - * mail-view.c (view_forward_msg): Deal with NULL composer. - -2000-09-18 Dan Winship - - * main.c (main): Call gnome_vfs_init() since the composer now does - file operations (to get the MIME type of attachments). - -2000-09-18 Jeffrey Stedfast - - * message-list.c: Removed COL_ONLINE_STATUS because we don't want - that. Renamed COL_PRIORITY to COL_SCORE and set it up to sort-of - work, I'm not really sure which renderer I should use. - -2000-09-18 Christopher James Lahey - - * Makefile.am: Added $(EXTRA_GNOME_CFLAGS) and - $(EXTRA_GNOME_LIBS). Removed unneeded libraries. - - * component-factory.c, folder-browser-factory.c, folder-browser.c, - mail-callbacks.c, mail-config-gui.c, mail-display.c, - mail-display.h, main.c, message-list.c, message-list.h: Fixed the - #include lines to deal properly with gal. - -2000-09-16 Michael Meeks - - * Makefile.am (INCLUDES): add datadir - - * folder-browser-factory.c (control_activate): use it. - -2000-09-15 Dan Winship - - * mail-callbacks.c (transfer_msg): Revert **Temp fix** from below - since the relevant shell bug has been fixed now. - - * mail-ops.c (do_fetch_mail): Fix the sense of the "keep on - server" check so we're not doing this backwards. Don't - get_message_flags, because POP doesn't support it and it's - pointless anyway since we're setting deleted, not toggling it. - call camel_folder_sync with expunge=TRUE so that the deletions are - actually recorded. - -2000-09-15 Dan Winship - - This bug was so much fun to fix the first time that I decided to - fix it again. - - 2000-07-11 Dan Winship - - * mail-ops.c (real_send_mail): Set the post_send_data flag - rather than toggling it. (Maybe we'll need more control - over it later, but for now, the only flag we set is - "replied", and we want that set, not toggled.) - -2000-09-14 Jeffrey Stedfast - - * mail-callbacks.c (transfer_msg): **Temp fix** Send "" as the - default folder to select as anything else seems to cause a - segfault in shell's user_get_folder(). - (check_configured): A spoon full of 'line wrapping' makes the - medicine go down, the medicine go dowwwwn... - -2000-09-14 Iain Holmes - - * mail-callbacks.c (check_configured): Ask if you want to - configure the mail client if it isn't configured already. - (check_send_configuration): Remove the error box if mail isn't - configured. - (send_queued_mail): Same. - -2000-09-14 Dan Winship - - * mail-ops.c (setup_append_mail): camel_folder_append is perfectly - happy to take a NULL info. - -2000-09-14 Michael Meeks - - * folder-browser-factory.c: move fn to bonobo. - (set_pixmap): update. - (control_deactivate): add bonobo_ui_handler_unset_container - -2000-09-14 Christopher James Lahey - - * mail-config-gui.h: Changed the include here because it caused - make distcheck to fail for me. I changed it from to - "shell/Evolution.h". This seems to have fixed things. - -2000-09-14 Jeffrey Stedfast - - * mail-ops.c (do_fetch_mail): Only use the cache if the user plans - to keep_on_server. - -2000-09-14 Michael Meeks - - * folder-browser-factory.c (control_deactivate): kill - warning. (control_activate): set threaded toggle state, - add freeze / thaw. - (set_pixmap, fill_toolbar, update_pixmaps): update. - -2000-09-13 Christopher James Lahey - - * folder-browser-factory.c: Fixed a warning (Missing include - file.) - -2000-09-12 Ettore Perazzoli - - ($(EVOLUTION_MAIL_CORBA_GENERATED)): Add space after `-I'. - -2000-09-12 Ettore Perazzoli - - * Makefile.am: Remove `ui.xml' stuff. - -2000-09-12 Dan Winship - - * mail-local-storage.c (mail_local_storage_startup): set - folder_tree before adding the listener, since that will eventually - invoke callbacks that will look at it. - - * folder-browser-factory.c (control_deactivate): sync the folder - on deactivate. - -2000-09-12 Ettore Perazzoli - - * message-list.c (on_right_click): Also display the name of the - mailing list in the "Filter on Mailing List" item for additional - Coolness factor. - - * mail-autofilter.c (filter_gui_add_for_mailing_list): Create the - rule with `filter_filter_new()' so that it also has an action - part. - - * mail-mlist-magic.c (get_header): Use the right header name to - retrieve the header. - -2000-09-12 Ettore Perazzoli - - * message-list.c (on_right_click): Grey out the mailing list - filter item if `mail_mlist_magic_detect_list()' returns NULL on - this message [i.e., if we cannot figure out a mailing list for - this message]. - (filter_mlist): Good boys don't use F words. - - * mail-mlist-magic.c (check_sender): Work safely if - `header_name_return' or `header_value_return' are NULL. - (check_x_been_there): Likewise. - (check_delivered_to): Likewise. - (check_x_mailing_list): Likewise. - (check_x_loop): Likewise. - (get_header): Use the right header name to retrieve the header. - - * message-list.c (on_right_click): Mark strings for translation. - -2000-09-12 Ettore Perazzoli - - * folder-browser-factory.c: Use the latest, shiny, amazing TigerT - art for the toolbar. - - * component-factory.c: #include "mail-local-storage.h". - (owner_set_cb): Removed unused variable. - - * message-list.c (filter_sender): Made static. - (filter_recipient): Likewise. - (filter_subject): Likewise. - (vfolder_recipient): Likewise. - (vfolder_sender): Likewise. - (vfolder_subject): Likewise. - - * mail.h (vfolder_subject): Removed prototype [WTF was this doing - here?!?!]. - (vfolder_sender): Likewise. - (vfolder_recipient): Likewise. - (filter_subject): Likewise. - (filter_sender): Likewise. - (filter_recipient): Likewise. - - * message-list.c: Added a new "Filter on mailing list" menu item. - (filter_mlist): Callback for this menu item. Use - `filter_gui_add_for_mailing_list' to pop up the filter dialog with - the appropriate rule. - - * mail-autofilter.c (filter_gui_add_for_mailing_list): New. - - * message-thread.c (dump_tree): Removed unused variable. - - * mail-mlist-magic.c: New. - * mail-mlist-magic.h: New. - - * mail-autofilter.c (rule_match_recipients): Mark strings for - translation. - (rule_from_message): Likewise. - (filter_gui_add_from_message): Likewise. - -2000-09-12 Jeffrey Stedfast - - * mail-ops.c (do_fetch_mail): Was trying to unhook an event from - the wrong folder - oops. - -2000-09-12 Not Zed - - * message-thread.c: Reverted to version 1.15. - (remove_node): Ok, if a node has a parent, remove it from the - parent list, otherwise remove it from the (supplied) root list. - (group_root_set): When we merge children, free the lost node. - (thread_messages_free): Remove the return, run as is. - (prune_empty): Plugged another small leak. - -2000-09-11 Jeffrey Stedfast - - * mail-callbacks.c (run_filter_ondemand): Updated to use the new - mail_do_filter_ondemand. - - * mail-ops.c (do_fetch_mail): Update to use the new - filter_driver_run args. - (do_filter_ondemand): Updated to use the new filter_driver_run - args. - (mail_do_filter_ondemand): Take a FilterContext as a argument - instead of a driver as we need to destroy the filter inside the - do_filter_ondemand function and things'd get messy. - -2000-09-11 Jeffrey Stedfast - - * mail-ops.c (do_fetch_mail): Don't have the filter driver - self_destruct. - -2000-09-11 Jeffrey Stedfast - - * mail-ops.c (do_fetch_mail): If we're fetching from an mbox - formatted file then we need to do some special-casing. - -2000-09-11 Ettore Perazzoli - - * component-factory.c (owner_set_cb): Call - `mail_local_storage_startup()' to set up handling of the local - storage. - - * mail-local-storage.c: New. - * mail-local-storage.h: New. - -2000-09-11 Christopher James Lahey - - * mail-display.c: Fixed some warnings. - -2000-09-11 Dan Winship - - * mail-display.c, mail-format.c: Another big rewrite of this - stuff. Now all (well, most) attachments get a small icon with a - description and a (non-obvious) right-click pop-up menu with - options to save, open in an external program, or show/hide inline. - - TODO: antialias the icon, add more options to the pop-up for - certain MIME types, add an icon to the headers, fix PGP to work - like everything else, fix message/external-body to work again, - add some icon caching action, etc, etc. - -2000-09-09 Jeffrey Stedfast - - * mail-ops.c (do_fetch_mail): Use the CamelUIDCache so that we - only retrieve *new* messages and also send notes to the status bar - telling it which message we're downloading so that Ettore can - sleep at night ;-) - -2000-09-09 Jeffrey Stedfast - - * mail-ops.c (do_fetch_mail): Updated to not send hook/unhook data - to filter_driver_run as it no longer takes those args. - (do_filter_ondemand): Same. Also wrap filtering in freeze/thaw to - prevent signals from being queued up - -2000-09-09 Jeffrey Stedfast - - * mail-ops.c (do_fetch_mail): Freeze the default folder before - filtering and thaw it afterward to prevent a ton of - "folder_changed" signals from being queued. - -2000-09-08 Christopher James Lahey - - * folder-browser.c, mail-config-gui.c, mail-ops.c: Fixed some - warnings. - - * message-list.c: Added base ETableModel functions. - -2000-09-08 Jeffrey Stedfast - - * mail-ops.c (do_fetch_mail): Updated to pass a CamelMessageInfo - to filter_driver_run - (do_filter_ondemand): Same. - -2000-09-07 Jeffrey Stedfast - - * mail-ops.c (do_filter_ondemand): Updated to check the boolean - return code from filter_driver_run to find out whether or not the - message was filtered so that it can decide whether or not to - delete the message from the source folder or not. - -2000-09-07 Jesse Pavel - - * mail-format.c (mail_generate_reply) Changed the behavior of - Reply-to-All so that the sender's address does not appear in - the cc: list. - -2000-09-07 Jeffrey Stedfast - - * mail-ops.c (do_fetch_mail): Updated to pass an exception to - filter_driver_run and also check the exception before deleting the - message from the source folder. - (do_filter_ondemand): Updated to pass an exception to - filter_driver_run - -2000-09-07 Dan Winship - - * session.c (session_init): Pass a storage dir to - camel_session_new now. - - * main.c (main): Can't call session_init here now, because it - requires evolution_dir to be set. - - * component-factory.c (owner_set_cb): call session_init here. - - * mail-ops.c (do_fetch_mail): Fix previous fix. (Free the uids, - just do it correctly.) - -2000-09-07 Jeffrey Stedfast - - * mail-ops.c (do_fetch_mail): Don't free uids, let the camel - folder do that when it gets finalized - -2000-09-06 Jeffrey Stedfast - - * mail-ops.c (mail_do_filter_ondemand): New async function to - filter messages on demand. - (do_fetch_mail): Updated to filter 1 message at a time using the - new filter-driver code - - * mail-callbacks.c (composer_postpone_cb): Send NULL as the - message info. - (run_filter_ondemand): Use mail_do_filter_ondemand instead of - filter_driver_run - - * mail-tools.c: Removed mail_tool_filter_contents_into and - mail_tool_fetch_mail_into_searchable as they have now been - deprecated. - -2000-09-06 Dan Winship - - * message-list.c (clear_tree): set the data to NULL for the tree - root, so nuke_uids won't try to free anything. - -2000-09-06 Ettore Perazzoli - - * folder-browser.c (folder_browser_new): @shell made const. - `CORBA_Object_duplicate()' it before storing it. - (folder_browser_destroy): Free the shell object with - `CORBA_Object_release()', not `CORBA_free()'. - - * folder-browser-factory.c (folder_browser_factory_new_control): - @shell made const. - -2000-09-05 Dan Winship - - * mail-display.c (make_safe_filename): - * mail-format.c (handle_mystery): - * mail-identify.c (mail_identify_mime_part): - camel_mime_part_get_filename now deals with both - Content-Disposition and Content-Type. - -2000-09-05 Peter Williams - - * mail-ops.c (cleanup_load_folder): Check for NULL folder. - (mail_do_setup_folder): Copy the 'name' parameter so that - we can free it. - - * message-list.c (nuke_uids): Depth '-1' means "unlimited", not 0. - -2000-09-05 Dan Winship - - * component-factory.c (owner_set_cb): Re-rename "Sent". - - * folder-browser.c (fb_resize_cb): Remove the "+ 90" here since it - seems to break things for me, and it's not commented anyway and - there's no excuse for adding 90 to a number with no explanation. - -2000-09-05 Peter Williams - - * folder-browser.c (folder_browser_destroy): Don't free the shell; - it's not ours. - -2000-09-05 Dan Winship - - * mail-tools.c (mail_tool_move_folder_contents): only call - camel_folder_get_message_info if the folder has - summary_capability. Don't hack up a fake CamelMessageInfo: - append_message will take NULL. - - * mail-ops.c: Replace mail_do_setup_draftbox, - mail_do_setup_outbox, and mail_do_setup_sentbox with - mail_do_setup_folder. - (do_send_mail, do_send_queue): s/sentbox_folder/sent_folder/ - - * component-factory.c (owner_set_cb): Use mail_do_setup_folder, - rename sentbox_folder to sent_folder, and call - mail_operation_wait_for_finish after the setup_folder calls in - case anything needs to use the _folder variables. - -2000-09-04 Jeffrey Stedfast - - * mail-format.c (mail_generate_reply): Applied Jesse's patch that - will append a signature to the replied message text - - * folder-browser-factory.c: Changed "Send & Receieve" back to "Get - Mail" temporarily so that the toolbar buttons don't all get - stretched to some weird proportion - -2000-09-03 JP Rosevear - - * mail-config.c (mail_config_add_news): Copy the passed in item - before adding - (mail_config_add_source): ditto - (mail_config_add_identity): ditto - - * mail-config-gui.c (mail_config): We don't actually need a notebook - pointer. - (identities_edit_clicked): Don't explicitly destroy, we are using - gtk_clist_set_data_full now - (sources_edit_clicked): ditto - (news_edit_clicked): ditto - (mail_config): Use gtk_clist_set_row_data_full to kill leaks - -2000-09-03 Jeffrey Stedfast - - * folder-browser-factory.c: Change the "Get Mail" toolbar button - to become "Send & Receieve" - - * mail-callbacks.c (send_queued_mail): New callback function for - sending queued mail - (send_receieve_mail): New callback for Send & Receieve that - basically just calls send_queued_mail and then fetch_mail - - * mail-ops.c (cleanup_send_mail): Mod to be able to handle a NULL - composer window - (setup_send_mail): Modified to handle a NULL composer widget - (mail_do_send_queue): New convenience async function to send all - messages in a folder (aka all messages in a queue) - -2000-09-02 Jeffrey Stedfast - - * mail-tools.c (mail_tool_move_folder_contents): Since POP3 - doesn't implement get_message_info, we need to check for info to - be NULL. In this case, we need to make our own info structure to - pass to append_message and then remember to free it - afterward. Should we even bother with get_message_info? And if so, - should we then implement get_message_info for POP3? - -2000-09-02 Ettore Perazzoli - - * folder-browser.c (etable_key): Make the `Home' key to move to - the beginning of the list and `End' to the end of it, using - `message_list_home()' and `message_list_end()'. - - * message-list.c (message_list_home): New. - (message_list_end): New. - - * folder-browser.c (folder_browser_new): Don't ref the shell here. - (folder_browser_destroy): Don't unref the shell. Instead, - `CORBA_free()' the object reference. - - * folder-browser-factory.c (control_activate): Bind "Open in New - Window" to `Ctrl-O'. - -2000-09-02 Lauris Kaplinski - - * mail-config-gui.c: Use e_utf8 wrappers - - * main.c (main): Do e_unicode_init, so we are not confusing - libunicode - -2000-09-01 Christopher James Lahey - - * folder-browser.c: Removed a warning. - -2000-09-01 Jeffrey Stedfast - - * mail-callbacks.c (compose_msg): Attach a callback to the - postpone signal - (send_to_url): Same - (mail_reply): Same - (forward_msg): Same - (composer_postpone_cb): Callback function for the postpone signal - - * mail-ops.c (mail_do_setup_outbox): New convenience function to - load the Outbox folder - (mail_do_setup_sentbox): Same, but for Sentbox. - (do_send_mail): Now saves messages in Sentbox if sent successfully - (mail_do_append_mail): New convenience async function for - appending messages to a folder - - * component-factory.c: Added outbox_folder and sent_folder - (owner_set_cb): Call our new convenience functions to load Outbox - and Sentbox - -2000-09-01 Ettore Perazzoli - - * mail-ops.c (cleanup_scan_subfolders): Update for the extra arg - needed by `evolution_storage_new_folder()'. - * mail-vfolder.c (vfolder_refresh): Likewise. - -2000-08-31 Peter Williams - - * folder-browser.c (folder_browser_new): Don't ref the shell: - causes a race upon exit. - (folder_browser_destroy): Don't unref it. - - * mail-config-gui.c (service_page_item_new): Add a checkbutton - "use default port" to make life simple. - (service_page_get_url): Honor use_default_port. - (service_page_set_url): Set use_default_port based on the input - URL. - (toggle_port): New function, sets the sensitivity of the - port entry based on "use default port" - - (config_do_query_authtypes): Make this asynchronous, as it - may involve connecting to a server. - (service_page_detect): Call the async auth querier. - (service_page_item_new): Put the authentication stuff in if - the url_flags have URL_ALLOW_AUTH. Call the async auth querier - to get the info. - -2000-08-30 Ettore Perazzoli - - * mail-view.c (mail_view_create): Make the HTML widget grab the - focus. - -2000-08-30 Peter Williams - - * mail-config-gui.c (do_test_service): Explicitly connect to - the service again. - - * component-factory.c (mail_load_storages): Now that - camel_service_get_provider exists, use it to make this function - much simpler. - -2000-08-29 Peter Williams - - * folder-browser.c (folder_browser_new): Ref the Evolution_Shell. - Is this correct, or is it a circular reference? - -2000-08-29 Dan Winship - - * mail-ops.c (mail_do_send_mail): Update this and related - functions to no longer take a From address. (The composer deals - with it itself now.) - (do_send_mail): Add the Evolution version back to the X-Mailer - header (this change got lost in the thread migration). - - * mail-callbacks.c (composer_send_cb): Don't re-fetch the From - address. It's set by the composer now. Don't free the - post_send_data from here. - (mail_reply): Attach to the composer's destroy signal to free the - psd. (The current code would free it more than once if an error - occurred while trying to send the first time.) - -2000-08-28 Peter Williams - - * mail-config-gui.c (mail_config_apply_clicked): Add new news sources, - not only stores. - -2000-08-28 Jeffrey Stedfast - - * mail-callbacks.c (composer_send_cb): Free the from address when - we're done with it. Also, e_msg_composer_hdrs_get_from returns - alloc'd memory so don't strdup it. - -2000-08-28 Peter Williams - - * mail-ops.c (do_transfer_messages): Add status messages. - (do_flag_messages): Same. - (do_scan_subfolders): Same. - (do_forward_messages): Same. - (do_view_messages): Same. - -2000-08-28 Ettore Perazzoli - - * mail-view.c (mail_view_create): Use `gnome_app_set_toolbar()' - the easy way instead of doing things manually with `GnomeDock' and - `gnome_app_add_toolbar()'. - (MINIMUM_WIDTH): New #define. - (MINIMUM_HEIGHT): New #define. - (view_size_allocate_cb): New, callback for the "size_allocate" - signal of the mail view. It saves the last allocation in a static - `last_allocation' variable. - (mail_view_create): Connect it. - (set_default_size): New function. Set the default width/height to - the last allocation width/height; if the width/height is less than - the `MINIUM_WIDTH' or `MINIMUM_HEIGHT', use that value instead. - - * mail-tools.c (mail_tool_move_folder_contents): Show `i + 1', not - `i', so that we correctlly start counting from one instead of zero. - -2000-08-28 Peter Williams - - * *.c: s,mail_dialog_run,gnome_dialog_run,g. - - * main.c (main): Since only the main thread is dealing with GTK+, - free the GDK threads mutex and never worry about locking again. - -2000-08-28 Jeffrey Stedfast - - * mail-crypto.c (mail_crypto_openpgp_encrypt): Fix to prevent - possible buffer overflows and a logic fix. - -2000-08-27 Jeffrey Stedfast - - * mail-crypto.c (mail_crypto_openpgp_clearsign): New crypto - function to clearsign plaintext - -2000-08-27 Ariel Rios - - * folder-browser-factory.c (control_activate): Added bonobo menu - handler for mark_all_deleted function. - - * mail.h: (mark_all_deleted): Added prototype. - - * mail-callbacks.c (mark_all_deleted): Added callback for marking - all displayed messages in a folder as deleted. - -2000-08-26 Ettore Perazzoli - - * mail-view.c (mail_view_create): Use - `gtk_window_set_default_size' on the toplevel instead of - `gtk_widget_set_usize()', and make the default size smaller. - -2000-08-25 Christopher James Lahey - - * mail-crypto.c: Fixed an uninitialized variable. - -2000-08-26 JP Rosevear - - * evolution-mail.gnorba: Kill - - * Makefile.am: Remove gnorba related stuff - -2000-08-25 Peter Williams - - * mail-config-gui.c (service_page_item_new): If the service wants - a host, also let the user specify a port. - (MailDialogServicePageItem): Add members for the port GtkEntry and - the default port. - (service_page_get_url): Translate the port in the entry back into - the CamelURL. - (service_page_set_url): Read in the port from the URL or use - the default. - -2000-08-25 Jeffrey Stedfast - - * mail-crypto.c (mail_crypto_openpgp_encrypt): Implemented PGP 2.x - encryption. We only need to get the passphrase if we plan to sign - the text, otherwise we don't need to worry about getting the - passphrase. - -2000-08-24 Lauris Kaplinski - - * folder-browser.c: Use e_utf8 wrappers - - * mail-config-gui.c: Use e_utf8 wrappers - -2000-08-24 Peter Williams - - * folder-browser-factory.c (control_activate): Add all the - functions from message-list.c's popup menu to the main - menu as well - - * message-list.c (vfolder_subject): These functions become - public. - - * mail-callbacks.c (mark_all_seen): Don't call camel_folder_get_uids - here. IMAP, for example, will try to communicate with the IMAP - server during that call. - - * mail-ops.c (cleanup_fetch_mail): Tell the user - which URL has no new mail, as they may be checking - more than one source. - (mail_do_flag_all_messages): New function. Flags all of - the messages in a folder. Something of a hack. This merely - extends the flag_messages operation; it doesn't implement - a new one. - (do_flag_messages et al): Fetch the uids if we need to; - use camel_folder_free_uids if necessary, etc. - - * mail-tools.c (mail_tool_move_folder_contents): Add - messages to tell the user what's going on. - -2000-08-24 Christopher James Lahey - - * folder-browser-factory.c: Fixed some warnings in the uihandler - code. - -2000-08-24 Peter Williams - - * component-factory.c (mail_load_storages): New function. - Loads a list of URI's as mail storages, and inserts them - into the shell's folder tree if appropriate (really, only - puts them into the folder tree.) - (mail_add_new_storage): Insert a storage into the folder - tree. Not always appropriate (eg, /var/spool/mail/user is - a storage that shouldn't be in the folder tree.) - (create_view): Generate the Evolution_Shell and pass it - to folder_browser_factor_new_control so that its member - 'shell' can be set. - (owner_set_cb): Instead of create_news_storage and - creating the imap storages, load the news storages and - mail storages via mail_load_storages(). - - * folder-browser-factory.c (control_activate): Change to - use providers_config again instead of mail_config. Pass - the folderbrowser so that the config code knows where - to insert the new storages if any are created. Pass - forget_passwords the folderbriwser, too, for good luck. - (folder_browser_factory_new_control): Take a new parameter, - the Evolution_Shell that we belong to. The field in - FolderBrowser has been there but was never getting set by - anything, and we need this to be able to insert new storages - into the shell's folder list. - - * folder-browser.c (folder_browser_new): Accept the - new Evolution_Shell parameter. Set it. (Should we - ref it or something?) - - * mail-config-gui.c (struct MailDruidDialog): Store an - Evolution_Shell. With this we can insert the stores into - the shell's folder list. - (struct MailDialog): Same. - (service_page_item_changed): Close a leak. - (identity_dialog): Unswitch the Add/Edit identity titles. - (news_dialog): Analogous to above. - (mail_druid_finish): Add the new mail source to the shell - view. - (mail_config_druid): Take a new Evolution_Shell parameter - for later use. - (mail_config_apply_clicked): Add all the mail sources to - the shell view. - (mail_config): Take a new Evolution_Shell parameter. - - * mail-callbacks.c (check_configured): Accept a FolderBrowser - so that we know where to put the new storages if any are - created. Almost all the callbacks are passed a FB * anyway - so this isn't a big deal. - (check_send_configuration): Make sure that we're configured - enough to be able to send mail. composer_send_cb() used to - do this, but it would need a FolderBrowser *, and there are - too many entry points to composer_send_cb to make this - feasible. - (fetch_mail): Pass the extra parm to check_configured(). - (free_psd): Move so that composer_send_cb can call this - directly. - (composer_send_cb): Don't check for proper configuration - here -- it is the caller's responsiblity to call - check_send_configuration(). Call free_psd() directly. - (compose_msg): Call check_send_configuration(). - (send_to_url): Same. This is called from mail-display.c, - though, and cannot reasonably be passed a FB. So: we can't - start up the config dialog directly; the user must do it - manually. Oh well. - (mail_reply): Same as above. - (forward_msg): Same as compose_msg(). - (edit_msg): Same as above. - (providers_config): Reenable so that we can pass mail_config - its FolderBrowser. - - * mail-display.c (write_data_to_file): Use the much more - straightforward run_and_close to retrieve the user's answer, - instead of the reply callback stuff. - - * mail-threads.c (mail_dialog_run): New wrapper for - gnome_dialog_run that will take care of the GDK lock correctly. - Far far more complicated than it should be. - (mail_dialog_run_and_close): Analogous to above. - (read_msg): Set inside_read_msg and unset it for the benefit - of the two above functions. Don't bracket ourselves in - GDK_THREADS_ENTER/_LEAVE anymore. - (mail_operation_queue): Use mail_dialog_run_and_close. - (show_error): As above. - (get_password): As above. - - * mail-display.c (write_data_to_file): This has the only - exception to the rule that "use mail_dialog_run(_and_close) - instead of the gnome equivalent always." Not quite sure why - it doesn't work here (the file selection window?). - - * mail-config-gui.c (identity_dialog): Change to - mail_dialog_run_and_close. - (source_dialog): Same as above. - (news_dialog): Same as above. - (cleanup_test_service): Same as above. - (mail_config): Change to mail_dialog_run(). - - * session.c (mail_request_dialog): Change to - mail_dialog_run_and_close. - - * mail-tools.c (mail_tool_uri_to_folder_noex): As above. - - * mail-ops.c (cleanup_fetch_mail): As above. - - * mail-local.c (local_reconfigure_folder): As above. - - * mail-callbacks.c (check_send_configuration): As above. - (ask_confirm_for_empty_subject): As above. - (edit_msg): As above. - (filter_edit): As above. - -2000-08-23 Dan Winship - - * folder-browser-factory.c (control_activate): Reformat a bit, - make "Folder" appear before "Message", fill in the Message menu - more. - -2000-08-23 Peter Williams - - * mail-ops.c (describe_fetch_mail): Don't use the camel calls - to describe the operation. - -2000-08-22 Peter Williams - - * mail-tools.c (mail_tool_get_folder_from_urlname): Don't connect - to the service explicitly. - (mail_tool_send_via_transport): Don't connect to the transport - explicitly. - (mail_tool_get_root_of_store): Same. - - * mail-config-gui.c (do_test_service): Just try camel_session_get_service, - which will now connect for us. - - * message-thread.h: Add a note about *next being the first member - of struct _container... if it isn't, everything goes Very Wrong. - - * message-thread.c (free_container): Extra debug print. - (remove_node): Handle the case of empty containers holding the child - that we're interested in. - (thread_messages_free): Extra debug print. - -2000-08-20 Jeremy Wise - * folder-browser.c: (fb_resize_cb) Added function to monitor resize - of the e_paned in the main view. - -2000-08-18 Peter Williams - - * mail-tools.c (mail_tool_filter_contents_into): Fix a race. filter_driver_run is an - async operation so it won't even be started by the time we sync the folders and check - for the movemailbox to be emtpy. Thus the empty check for the movemail would fail - 99% of the time. - - * mail-callbacks.c (run_filter_ondemand): Pass he new argument to the ever-mushrooming - filter_driver_run. - -2000-08-17 Peter Williams - - * folder-browser-factory.c (control_activate): Fix menu item names. - (register_ondemand): Put the ondemand hooks into the new folder menu. - -2000-08-17 Ettore Perazzoli - - * mail-vfolder.c (vfolder_gui_add_rule): Use stock OK/Cancel - buttons and add i18n support. - - * folder-browser-factory.c (control_activate): Changed menu item - label from "Mark all messages seen" to "Mark All Messages as - Read". Changed capitalization of some other menu items. - (control_activate): Put the message- and folder- related menu - items in new "Message" and "Folder" subtrees which are created in - the `' item created by the shell. - (control_deactivate): Updated accordingly. - (control_activate): Put the filter and vfolder editors, the mail - configuration and the "forget password" command into the - "settings" menu. - (control_deactivate): Updated accordingly. - - * mail-config-gui.c (transport_page_new): Add translation mark. - (service_page_new): Show the menu items before appending them. - (service_page_item_new): Use `GTK_FILL' for the "Detect supported - types..." button. - - * local-config.glade: Change the apply button into an ok button. - -2000-08-17 Peter Williams - - Implement filtering on demand. - - * folder-browser-factory.c (register_ondemand): New function. Callback - to put the filter-on-demand filters into the bonobo UIH; - (create_ondemand_hooks): New function. Read in our on-demand filters - and hook them into the UI. - (remove_ondemand_hooks): New function. Remove the hooks when done with - them. - (control_activate): Call create_ondemand_hooks() - (control_deactivate): Call remove_ondemand_hooks(); - - * mail-callbacks.c (run_filter_ondemand): New function. Callback - for running a filter on demand. - (filter_edit): Pass NULLs as the new arguments to rule_context_load. - - * mail.h: Prototype run_filter_ondemand(); - - * folder-browser.c (oc_destroy): New function. Iterator to destroy - an fb_ondemand_closure. - (folder_browser_destroy): Free the data associated with the ondemand - menu items. - (my_folder_browser_init): Clear the filter_ variables. - - * folder-browser.h: Two new members of FolderBrowser: filter_menu_paths, - a list of fb_ondemand_closures so that the menu items can be freed and - removed; and filter_context, a permanently loaded FilterContext for - running the ondemand filters. Prototype the new fb_ondemand_closure - structure. - - * mail-autofilter.c (filter_gui_add_from_message): Pass NULLs as the - new parameters to rule_context_load (we don't need to hook up ondemand - menu items...) - - * mail-tools.c (mail_tool_filter_get_folder_func): Rename from - get_folder_func() and make public so mail-callbacks.c:run_filter_ondemand() - can use it too. - (mail_tool_filter_contents_into): Use the new name of get_folder_func. - Pass NULLs as the extra arguments to rule_context_load. Pass the - extra source type to filter_driver_run (only use INCOMING). - - * mail-tools.h: Publicly prototype mail_tool_filter_get_folder_func() - - * mail-vfolder.c (vfolder_create_storage): Pass NULLs as the extra - arguments to rule_context_load. - - * message-list.c (message_list_init): Free our strdup'd uids when - the table model gets destroyed. - (nuke_uids): New function. Walk the tree nodes to free the uids. - (nuke_uids_cb): New callback for nuke_uids(); - - -2000-08-16 Richard Hult - - * mail-ops.c (cleanup_display_message): Use a configurable timeout. - - * mail-config.c (mail_config_set_mark_as_seen_timeout): New function - for the settable mark-as-seen timeout. - (mail_config_mark_as_seen_timeout): Likewise. - (mail_config_write): Write the timeout setting. - (config_read): Read timeout setting. - - * mail-config-gui.c (mail_config): Add option for the settable - mark-as-seen timeout. - (mail_config_apply_clicked): Likewise. - (timeout_changed): New function for the timeout setting. - -2000-08-16 Peter Williams - - * message-thread.c (walk_containers): More (default disabled) - mem debugging here. Fix the big leaks. - - * mail-format.c (get_url_for_icon): Copy the url_path so that - it can't get freed under us. - - * mail-threads.c (mail_operation_queue): Fix a leak. - - * mail-ops.c (mail_do_display_message): Fix another leak. - - * message-list.c (message_list_destroy): Remove the seen_id timeout - if necessary. - - * mail-local.c (mail_tool_local_uri_to_folder): Fix a leak. - - * session.c (auth_callback): Fix a leak. Almost seems as if - I've been using Purify... - - -2000-08-15 Peter Williams - - * message-thread.c (alloc_container): Add support for debugging - container allocations -- currently disabled. Make sure that - the g_strfreev works. - - * message-list.c (main_message_changed): Address bug #496 -- - possible race when forwading a message_changed event. - - * mail-threads.c (dispatch): Close the dispatch thread's half of - pipes when about to exit. - (mail_operations_terminate): Close the main thread's half of the - pipes when about to exit. - (all): Add i18n support. - - * mail-tools.c (all): Add i18n support. - - * mail-ops.c (transfer_messages): Generalize move_messages into - transfer_messages so that we can copy too. - (all): Add i18n supprt where appropriate. - - * mail-ops.h: Prototype the new mail_do_transfer_messages. - - * folder-browser-factory.c: Add a UI hook for copy_msg. - - * mail-callbacks.c (transfer_msg): Generalize move so that it supports - copy as well, and add a callback 'copy_msg'. - - * message-list.c (on_right_click): Add a right-click hook for Copy Message. - - * session.c (mail_request_dialog): Don't deadlock when in main thread. - -2000-08-14 Peter Williams - - * mail-threads.c (show_error): Fix the error dialogs. - (read_msg): Re-enable them. - - * mail-ops.c (do_scan_subfolders): Silence a compile warning. - -2000-08-13 Jeffrey Stedfast - - * mail-crypto.c (mail_crypto_openpgp_encrypt): Added support for - encrypting via PGP 5.0 - -2000-08-13 Ettore Perazzoli - - * mail-ops.c (cleanup_create_folder): Release the listener object - with `CORBA_Object_release()', not `CORBA_free()'. - -2000-08-13 Ettore Perazzoli - - * main.c (main): Set the signal handlers for `SIGSEGV' and - `SIGBUS' to the default ones. - -2000-08-13 Jeffrey Stedfast - - * mail-config.c (mail_config_write): Set config->configured to - TRUE - -2000-08-13 Ettore Perazzoli - - * mail-config-gui.c (mail_config_druid): Don't - `GDK_THREADS_ENTER()'/`GDK_THREADS_LEAVE()'. - -2000-08-13 Ettore Perazzoli - - * mail-threads.c (update_active_views): Just iterate through all - the controls, not just the active ones. - - * folder-browser-factory.c: Don't keep track of active controls. - Rather, keep track of all of them. - (folder_browser_factory_get_active_control_list): Removed. - (folder_browser_factory_get_control_list): New. - -2000-08-13 Dan Winship - - * Makefile.am (evolution_mail_SOURCES): add mail-local.h - -2000-08-13 Ettore Perazzoli - - * mail-threads.c (read_msg): For now, don't do anything about - errors. - -2000-08-13 Dan Winship - - * mail-format.c (add_url): Fix some freed-memory references - - * mail-threads.c (get_password): Don't free the prompt. It - doesn't belong to you. - -2000-08-13 Ettore Perazzoli - - * mail-ops.c (mail_do_create_folder): Duplicate the listener - object. - (cleanup_create_folder): Free the listener. - -2000-08-13 Jeffrey Stedfast - - * mail-threads.c (get_password): Don't wrap the gnome_dialog_run - in GDK_THREADS_ENTER/LEAVE - -2000-08-13 Ettore Perazzoli - - * folder-browser-factory.c (control_destroy_cb): Remove the - control from the active control list, if it's there. - - * mail.h (folder_browser_factory_new_control): Removed prototype. - (folder_browser_factory_init): Removed prototype. - - * folder-browser-factory.h: New. - - * folder-browser-factory.c: New static variable `active_controls', - list of the currently active controls. - (control_activate): Add the control to it. - (control_deactivate): Remove the control from it. - (folder_browser_factory_get_active_control_list): New. - - * mail-threads.c (mail_operations_get_status): New function. - - * folder-browser.c (folder_browser_gui_init): Add i18n support for - the labels. - - [The following is actually from a patch by Peter Williams - .] - - * Removed types `PERCENTAGE', `HIDE_PBAR', `SHOW_PBAR'. New - struct `block_info_s'. Removed all the code to create and destroy - the progress window. - -2000-08-13 Jeffrey Stedfast - - * component-factory.c (create_news_storage): Updated to reflect - changes to mail_do_scan_subfolders - (create_imap_storage): Same. - - * mail-ops.c (mail_do_scan_subfolders): No longer takes an - add_INBOX argument - -2000-08-13 Dan Winship - - * mail-ops.c (do_scan_subfolders): Lose a reference to the store - on purpose. To be fixed later. - -2000-08-12 Dan Winship - - * component-factory.c (create_imap_storage): Take the source as a - command-line argument rather than fetching it from mail-config. - (owner_set_cb): Call create_imap_storage on each configured IMAP - store. - - * mail-format.c (decode_pgp): Redo this so that the lock icon - remains active after a failed decryption so you can click on it - and try again. - (try_inline_pgp, handle_multipart_encrypted): Put a border around - the decrypted data. - - * message-list.c (cleanup_regenerate_messagelist): Don't clear the - tree here. If two "folder_changed"s arrive in close succession, - then one possible ordering of events is - cleanup_regenerate_messagelist, cleanup_regenerate_messagelist, - cleanup_thread_messages, cleanup_thread_messages. Which would - result in the message list being filled in twice without being - cleared in between. So don't clear it until the rebuilding - function itself is called. - (clear_tree): New function to empty out the ETreeModel in the - message list. - (build_tree): Change to simpler interface. Call clear_tree. - (build_subtree): Does most of the work of the old build_tree - (build_flat): Remove unused arg. Call clear_tree. - - * message-thread.c (cleanup_thread_messages): Update for - build_tree interface change. - - * mail-ops.c (do_send_mail): Don't leak the transport. - - * mail-tools.c (mail_tool_get_folder_from_urlname): Don't ref the - store returned from camel_session_get_store. It's already reffed. - (mail_tool_get_root_of_store): Ditto. - (mail_tool_send_via_transport): Remove some commented-out code and - fix it to not leave the transport connected if sending fails. - - * mail-callbacks.c (delete_msg): Toggling a flag is an - "instantaneous" operation, so if we're only doing one, just do it - and return, rather than queueing it for the other thread. This - makes the "Delete" key work correctly (move to the next message) - again. - - * mail-identify.c: Remove workaround for gnome-vfs 0.2 bug. - - * mail-format.c (lookup_handler): Remove workaround for function - introduced between gnome-vfs 0.2 and 0.3, since we depend on 0.3 - now. - -2000-08-12 Michael Meeks - - * main.c (main): kill using_oaf assertion. - -2000-08-11 Peter Williams - - * Makefile.am: Make it so that test-mail links - -2000-08-11 JP Rosevear - - * folder-browser-factory.c (control_activate): Move menu items - that affect a single message together, ditto with ones that - affect multiple messages, put a separator in. - -2000-08-11 Christopher James Lahey - - * mail-format.c, mail-tools.h, message-list.c: Fixed a warning. - -2000-08-11 Dan Winship - - * mail-display.c, mail-format.c: Redo this again. Get rid of - struct mail_format_data and move most of that info into - MailDisplay itself, and pass the MailDisplay around. Add a GData** - to MailDisplay, and put the urls hash table into that. Also add - the ability to redisplay the currently-displayed message (with the - same GData**), and add a "show_pgp" datum to it that controls - whether or not to decrypt PGP messages, and redo the PGP stuff - (again) to take that into account. Now you don't get the annoying - PGP password dialog box without any warning. - -2000-08-11 Peter Williams - - * mail-config-gui.c (service_acceptable): Make verify-service - an asynchronous operation. - - * Makefile.am (noinst_PROGRAMS): Don't build test-thread - while mail-threads.c is in flux. - - * mail-threads.c (mail_operation_queue): Make the error - and query dialogs modal. - - * mail-local.c (update_progress): Don't use the - temporarily-disabled mail_op_set_percentage(). - -2000-08-11 Chris Toshok - - * mail-config.c (mail_config_get_default_news): use config->news - instead of config->sources. - -2000-08-11 Dan Winship - - * mail-format.c (destroy_part): Update this for CamelObject - (try_inline_pgp): Deal with decrypting here rather than trying to - pawn the data off to handle_multipart_encrypted, since it most - likely won't be correct (won't have the proper MIME headers inside - the encrypted part). - (handle_multipart_encrypted): Add code from Nathan Thompson-Amato - to re-MIME-parse the decrypted data after decrypting. - - * mail-crypto.c (mail_crypto_openpgp_{de,en}crypt): Get the - password here rather than having it passed in. Remove some dead - code. - - * session.c (mail_request_dialog): Allow this to work in either a - sync or an async context. - -2000-08-11 Peter Williams - - * mail-tools.c (mail_tool_fetch_mail_into_searchable): Don't - do the imap check here... it's a silly place. - - * mail-ops.c (do_fetch_mail): Do the imap check here. - -2000-08-11 JP Rosevear - - * mail-config-gui.c (service_page_new): Work around - gtk option menu bug. - (service_page_item_auth_fill): ditto - -2000-08-11 Peter Williams - - * mail-threads.c (read_msg): Fix the new FORWARD_EVENT handler - (didn't free msg, didn't write newline in the debug) - - * mail-local.c (local_reconfigure_folder): Make the dialog - modal. - - * mail-callbacks.c (select_first_unread): Fix some warnings. - - * mail-threads.c (mail_op_forward_event): New function that - writes a FORWARD_EVENT signal to the compipe, to allow Camel - events to be handled in the main thread. - (read_msg): Handle a FORWARD_EVENT. - - * mail-callbacks.c (select_first_unread): Forward the - event into the main thread to prevent the GTK calls in the - dispatcher thread. - (main_select_first_unread): New name of old select_first_unread. - - * message-list.c (folder_changed): Same as above. - (main_folder_changed): Same as above. - (message_changed): Same as above. - (main_message_changed): Same as above. - - * mail-format.c (free_byte_array): Note about using - mail_op_forward_event. (cmm_destroyed): Same. - -2000-08-11 Dan Winship - - * message-list.c (message_list_select): If the caller passes "-1" - for the model row, translate that to view row 0. - - * message-list.c (idle_select_row): - * mail-callbacks.c (select_first_unread): Use new - message_list_select kludge^H^H^H^H^H^Hfeature - -2000-08-11 JP Rosevear - - * mail-config-gui.c (source_dialog): Allow the window - to be growable - - * mail-config.c: use void in empty declarations - -2000-08-11 Peter Williams - - * mail-config.c (mail_config_get_news): Change () to (void) - if a function takes no arguments. - - * mail-config.h: Prototype mail_config_get_{sources,news}x - -2000-08-11 JP Rosevear - - * mail-config-gui.c (identity_dialog): iddialog, not sdialog - (news_edit_clicked): Kill leftover c-p crud - -2000-08-11 JP Rosevear - - * mail-config-gui.c (news_edit_clicked): Check nrow, not srow. - -2000-08-11 JP Rosevear - - * mail-config-gui.c (service_acceptable): Use camel_object_unref - instead of gtk_object_unref - (mail_druid_finish): Use new config accessors - (mail_config_druid): No need to call config functions - (news_add_clicked): Increments maxnrow, not maxsrow - (mail_config_apply_clicked): Use new config accessors - (mail_config): ditto - - * component-factory.c (create_imap_storage): Use new - config accessors - (create_news_storage): ditto - - * mail-config.glade: Set news clist name correctly - - * mail-config.c (config_read): Rename from mail_config_read and - made private - no one should need to do a read manually. - (mail_config_set_send_html): New accessor - (mail_config_add_identity): ditto - (mail_config_get_sources): ditto - (mail_config_add_source): ditto - (mail_config_get_default_news): ditto - (mail_config_get_news): ditto - (mail_config_add_news): ditto - - * mail-config.h: Prototype new accessors. Config struct is now - in mail-config.c and hidden from the world. - -2000-08-11 Dan Winship - - * mail-ops.c (describe_fetch_mail): Use camel_service_get_name - rather than showing the URL to the user. - -2000-08-11 Peter Williams - - * mail-ops.c (do_refile_messages): Freeze the folders while moving. - (do_flag_messages): Same. - - * mail-threads.c (get_password_clicked): Fix the case when the - user /doesn't/ use escape to cancel the dialog :-/ - (show_error_clicked): Same. - -2000-08-11 Dan Winship - - * mail-tools.c (mail_tool_get_folder_name): Add a function to - return a useful name for a folder (not just "mbox" or "mh" for - any local folder.) - - * mail-ops.c: Use mail_tool_get_folder_name rather than - folder->full_name when printing folder names. - -2000-08-11 Not Zed - - * mail-tools.c (mail_tool_get_local_inbox_url): Properly handle - different local file formats. The folder isn't always mbox. - (mail_tool_do_movemail): Movemail always uses an mbox format - however. - (mail_tool_get_local_movemail_url): What is the mbox url, it is - always the same type, mbox. - (mail_tool_fetch_mail_into_searchable): Same here. - - * mail-local.c (mail_local_map_uri): Map a local uri to the real uri. - -2000-08-10 Christopher James Lahey - - * folder-browser-factory.c, message-list.c, message-thread.c, - session.c: Fixed some warnings. - -2000-08-10 Dan Winship - - * session.c (session_init): Don't call e_setup_base_dir. It was - wrong and it doesn't exist any more. - - * component-factory.c (owner_set_cb): Update for changed - prototype, and record the evolution_homedir. Move call to - mail_config_init here from session.c so it happens after - evolution_dir is initialized. - - * mail.h: define "extern char *evolution_dir;" (formerly in - e-util/e-setup.h) - - * component-factory.c, mail-callbacks.c, mail-config-gui.c, - mail-config.c, mail-display.c, mail-format.c, mail-ops.c, - mail-tools.c, session.c: Remove "e-util/e-setup.h" include. - -2000-08-10 Peter Williams - - * test-thread.c (queue_ops): Use mail_operations_terminate() to - close the other thread nicely. - - * mail-threads.c (get_password_deleted): Handle the "close" event - as a cancel. - (show_error): Same. - -2000-08-10 Dan Winship - - * mail-tools.c (mail_tool_get_folder_from_urlname): Add a - "gboolean create" argument to pass to camel_store_get_folder. - - * mail-ops.c (do_create_folder, do_setup_draftbox): - * mail-local.c (mail_tool_local_uri_to_folder): - * mail-vfolder.c (vfolder_uri_to_folder): Add create flag to - mail_tool_get_folder_from_urlname calls. - -2000-08-10 Jeffrey Stedfast - - * mail-callbacks.c (composer_send_cb): Fix compile warning by - casting the object to a CamelObject - -2000-08-10 Peter Williams - - * mail-tools.c (mail_tool_filter_contents_into): Delete the source - folder if told to and if it's empty - (mail_tool_get_local_movemail_path): New function. - -2000-08-10 Dan Winship - - * mail-callbacks.c (reply_to_all): Fix a bug in the async changes. - (This was identical to reply_to_sender.) - -2000-08-10 Not Zed - - * mail-local.c (do_local_reconfigure_folder): Update for - append_message api change. - - * message-list.c (message_list_regenerate): Change for search api - change. - (ml_tree_value_at): Add a colour column, based on the colour - assigned in the summary. - (message_list_init_renderers): Init colour column. - -2000-08-09 Peter Williams - - * mail-display.c (part_for_url): Remove a gtk_object_get_data - -2000-08-09 Cody Russell - - * folder-browser-factory.c, mail-view.c: Make the toolbars - honor the user's gnomecc settings for detachable toolbars. - -2000-08-09 Jeffrey Stedfast - - * mail-ops.c (composer_send_cb): Get the from address set in the - composer, if that fails ONLY THEN get the default from mail config - - * mail-config.c (mail_config_get_identities): New convenience - function for getting a list of the configured identities - -2000-08-09 Dan Winship - - * mail-display.c (on_object_requested): Support controls as well - as embeddables. - -2000-08-09 Jeffrey Stedfast - - * mail-view.c (mail_view_create): Changed to only take a - FolderBrowser argument - - * mail-ops.c (real_view_msg): Create a new FolderBrowser for each - message being opened in a new window. Also set the - message_list->cursor_uid and mail_display->current_message to the - appropriate values. - (real_view_msg): Updated to reflect changes in the mail_view_create - - * message-list.c (on_right_click): Nicify a little, add in a menu - separator between VFolder and Filter stuff. - - * mail-ops.c (real_view_msg): Set the UID of the message that is - being displayed - -2000-08-09 Ettore Perazzoli - - * folder-browser-factory.c (control_activate): Use - `GNOME_STOCK_MENU_*' things instead of `GNOME_STOCK_PIXMAP_*' - things, that are too big and look bad. - -2000-08-09 Peter Williams - - * mail-view.c (mail_view_create): Save the top window so that on_close - can find it [with set_data]. - (on_close): Recover the top window. - - * mail-threads.c (read_msg): Destroy the window instead of hiding it. - -2000-08-09 Not Zed - - * mail-autofilter.c (filter_gui_add_from_message): Helper function - to add with confirm. - (rule_match_recipients): Dont set real name if its empty for the - filter name. - (rule_match_subject): was cutting ] off mailing list names. - - * message-list.c (on_right_click): Added menu to install - vfolders/filters from message. - -2000-08-09 Not Zed - - * mail-autofilter.c: New file to hold auto filter/vfolder stuff. - -2000-08-09 Christopher James Lahey - - * mail-display.c, mail-format.c, mail-ops.c: Fixed some warnings. - - * message-list.c: Fix the call to e_popup_menu_run to match the - new signature. - -2000-08-09 Ettore Perazzoli - - * folder-browser-factory.c (control_activate): Create a "print - message" menu item. - -2000-08-09 Jeffrey Stedfast - - * message-list.c (message_list_init): Attached a double_click - signal handler - (on_double_click): Our lovely new double_click callback. Will - display the current selected message in a new window - -2000-08-08 Jeremy Wise - * mail-config.[ch], folder-browser.c: Added configuration work to - save the size of the vpaned widget. It will be functional when the - e_paned widget emits a "resized" signal - -2000-08-08 Jeffrey Stedfast - - * mail-config.h: Added void as an argument to functions not - needing any parameters to avoid compile warnings. - -2000-08-08 Jeremy Wise - * mail-config.[ch], main.c, folder-browser-factory.c: State of the - threaded list toggle is now saved via gnome_config - -2000-08-08 Dan Winship - - * mail-config-gui.c (service_page_item_new): Attach a signal - handler to call the "changed" function when the user clicks the - "keep on server" checkbox. - -2000-08-08 Jeffrey Stedfast - - * mail-ops.c (view_msg): New convenience function with params of a - normal Gtk callback function. We also now create a new - FolderBrowser object so that the message-view window isn't tied to - the display in the main window - (view_message): Now calls view_msg (this function is a bonobo - callback and can't be used with gtk widgets) - (edit_msg): Same idea as view_msg() - (edit_message): Again, same as view_message() - - * message-list.c (on_right_click): Callback for creating an - e-popup-menu - (message_list_init): Added a right_click event to trigger a pop-up - menu to be displayed - -2000-08-08 Dan Winship - - * mail-config-gui.c: Add "Don't delete messages from server" - button to remote SOURCEs that aren't STORAGEs (ie, POP). - (provider_list): Only list SOURCEs. (ie, not mh) - - * mail-config.c: Save/load "keep_on_server" flag. - - * mail-ops.c (fetch_remote_mail): New function, split out of - real_fetch_mail. Deals with copying mail from a remote server into - a temporary mbox, possibly using a CamelUIDCache to leave the - messages on the server. - - * mail-crypto.c, mail-format.c, message-thread.c: Fix some - compiler warnings. - - * mail-format.c (mail_generate_reply): Fix up format of addresses. - (write_headers): Use CamelAddress functions to simplify this. - -2000-08-08 Jeffrey Stedfast - - * mail-view.c: Lets get rid of the last separator in the toolbar - until we add n/p - -2000-08-08 Ettore Perazzoli - - * mail-threads.c (queue_window_delete_event_cb): Callback for - "delete_event", just doing nothing. - (create_queue_window): Connect it to the "delete_event" signal of - the progress dialog. - -2000-08-08 Peter Williams - - * mail-threads.c (remove_next_pending): Sanity check for - job queue, which seems to have some issues. - (read_msg): Make sure that the next operation isn't started - before the last one is cleaned up. - - * mail-callbacks.c (fetch_mail): Fix erroneous free. - - * mail-config-gui.c (mail_config_druid): Wrap the gtk_main call. - - * mail-ops.c (do_flag_messages): Allow specification of whether - to set the flags unconditionally or toggle their current state. - - * message-list.c (ml_tree_set_value_at): Toggle the seen status; - don't set it unconditionally. - - * mail-callbacks.c (delete_msg): Toggle the deletion status; - don't set it unconditionally. - - * mail-tools.c (mail_tool_do_movemail): Fix for undeclared tmpfd. - - * mail-local.c (local_reconfigure_folder): Big rewrite; make into - an asynchronous operation. Use some mail tools to make life easy. - -2000-08-08 Dan Winship - - * main.c (main): Move mail_config_init after session_init, since - it depends on evolution_dir being set. - -2000-08-08 JP Rosevear - - * mail-ops.c (check_configured): Use config accessors - (fetch_mail): ditto - (composer_send_cb): ditto - (create_msg_composer): ditto - - * mail-config-gui.h: Update API - - * mail-config.h: Update API - - * mail-config.c: Add accessor functions - (mail_config_is_configured): accessor function - (mail_config_get_default_identity): ditto - (mail_config_get_default_source): ditto - (mail_config_get_transport): ditto - (mail_config_send_html): ditto - (identity_copy): Make public - (identity_destroy): ditto - (identity_destroy_each): ditto - (service_copy): ditto - (service_destroy): ditto - (service_destroy_each): ditto - (mail_config_init): Rename from init_config and make public - (mail_config_clear): Rename from clear_config and make public - (mail_config_read): Rename from read_config and make public - (mail_config_write): Reanme from write_config and make public - - * main.c (main): Call mail_config_init. - - * mail.h: Include mail-config-gui.h - - * mail-config-gui.c: Move config gui stuff here. - (source_dialog): Kill memory leak from debug leftovers. - Make sure returned source is NULL by default - -2000-08-07 Not Zed - - * mail-local.c (local_reconfigure_folder): Redone to show a - dialogue first, and show progress of whats happening as its done. - - * Makefile.am (glade_DATA): Added local-config.glade, for mailbox - reconfig dialogue. - -2000-08-04 Not Zed - - * folder-browser.c (mail_uri_to_folder): Use local_uri_to_folder() - for local uri's (file://). - - * mail-local.c (local_uri_to_folder): Handle looking up folder - storage type before opening the store/folder. - (local_reconfigure_folder): Function to reconfigure the format of - a local mailbox into another storage format. - - * Makefile.am (evolution_mail_SOURCES): Added mail-local.c and - missing mail-vfolder.h. - -2000-08-07 Jeffrey Stedfast - - * Makefile.am: Added mail-view.c - - * folder-browser-factory.c (control_activate): Adda menu item for - viewing the message - - * mail-view.c: New file containing methods for viewing messages in - separate windows - - * mail-ops.c (view_message): New callback for viewing messages in - a new window. - -2000-08-07 Jeffrey Stedfast - - * component-factory.c (real_create_generic_storage): New function - to replace real_create_imap_storage and real_create_news_storage - (create_imap_storage): Updated. - (create_news_storage): Updated. - -2000-08-07 Peter Williams - - * mail-ops.c (cleanup_edit_messages): New operation: edit_messages - For continuing draft messages. - (attach_messages): Fix accidental 0 datasize. - (do_setup_draftbox): New operation: setup_draftbox. Soooo hacky. - - * mail-callbacks.c: Move fejj's edit message to the async home. - - * component-factory.c (owner_set_cb): Use mail_do_setup_draftbox. - - -2000-08-07 Jeffrey Stedfast - - * mail-display.c: - * component-factory.c: s/strncasecmp/g_strncasecmp - - * mail-format.c (write_headers): Get rid of kludge around subject - beginning with spaces. - (mail_generate_reply): Get rid of kludge around subject beginning - with spaces and also use g_strncasecmp instead of strncasecmp for - portability - - * mail-ops.c (forward_msg): Get rid of kludges around subject - beginning with spaces. - -2000-08-07 Dan Winship - - * message-list.c (message_list_select): Clarify that the input row - is a model row, and swap it to a view row when finding the - next/previous row. - (idle_select_row): Select view row 0, not model row 0. - - * mail-ops.c (select_first_unread): Start from view row 0, not - model row 0. - -2000-08-07 Jeffrey Stedfast - - * mail-format.c (mail_get_message_body): Renamed from reply_body() - so other functions can use it - (mail_generate_reply): Updated to reflect function name changes - - * mail-ops.c (real_edit_msg): Attach a callback to the send signal - -2000-08-07 Jeffrey Stedfast - - * folder-browser-factory.c (control_activate): New menu item under - Actions to allow editing of messages. - - * mail-ops.c (edit_message): New function for editing messages. - - * component-factory.c (owner_set_cb): Create a global reference to - the Drafts mbox folder for the Composer to use - -2000-08-06 JP Rosevear - - * mail-config.c (ndialog_page_undone): Desensitize ok button - (sdialog_page_undone): ditto - (iddialog_page_undone): ditto - (news_page_new): Typo - news, not mail - (transport_page_new): Typo - transport, not source - (identity_dialog): Set undone callback - (source_dialog): ditto - (news_dialog): ditto - (mail_druid_identity_undone): Desensitize next button and - mark done flag as false - (mail_druid_source_undone): ditto - (mail_druid_transport_undone): ditto - (mail_druid_identity_done): Mark done flag as true - (mail_druid_source_done): ditto - (mail_druid_transport_done): ditto - (mail_druid_prepare): Use done flag to set next button - sensitivity, fixes #467 - -2000-08-06 Jeffrey Stedfast - - * mail-crypto.c (mail_crypto_openpgp_encrypt): Added support for - encrypting with GnuPG. Support for PGP5 and PGP2 are still in - progress. - -2000-08-05 Dan Winship - - * folder-browser-factory.c (control_activate): Remove bonobo 0.15 - vs 0.15-and-a-half ifdef, since we require post-0.16 now. - -2000-08-04 Dan Winship - - * mail-threads.c (mail_operation_wait_for_finish): Don't use - "while (gtk_events_pending ()) gtk_main_iteration ();" inside - another tight loop, because it makes the thread spin rather than - blocking and waiting like it should. - -2000-08-04 Peter Williams - - * message-thread.c (do_thread_messages): Uninitialized variable - fix. - - * mail-threads.c (read_msg): Small leak fix. - - * component-factory.c (owner_unset_cb): Use mail_operations_ - terminate() instead of wait_for_finish(). - - * mail-threads.c (mail_operation_queue): Centralize the clur - handling functions; fix a race condition where the dispatcher - would overwrite the closure before the main thread could - free the old one. - (mail_operations_terminate): New function, wait for ops to - finished and kill the other thread. - (dispatch): changes to die when terminate is called (abort - on NULL spec). - - * mail-ops.c (cleanup_display_message): Fix improper handling - of displaying a NULL message (which means clear the message - display). - -2000-08-04 Ettore Perazzoli - - * message-list.c (message_list_regenerate): Free the GPtrArray - correctly instead of using `g_strfreev()'. - -2000-08-04 Michael Meeks - - * folder-browser-factory.c (control_activate): release the ui_handler - after set_container. - -2000-08-03 Michael Meeks - - * mail-config.c (identity_page_new): only whack the sig in if the - file exists. - - * component-factory.c (factory_fn): count running instances, - attach destroy signal (factory_destroy): add. - - * main.c (main): pass orb around. - -2000-08-03 Jeffrey Stedfast - - * mail-ops.c (composer_send_cb): Yay, no more compiler warnings - - * mail-config.c: set config = NULL - (provider_list) Eek! Initialize news to NULL! Also, use - g_slist_prepend() for "performance" gains ;-) - (init_config): Set the config member data to NULL just to be on - the safe side - (clear_config): Don't bother freeing slist data if the slist is - NULL - -2000-08-03 Peter Williams - - * mail-ops.c (op_forward_messages): Use the new dynamic - operation naming. - - * message-thread.c (describe_thread_messages): Ditto. - - * message-list.c (describe_regenerate_messagelist): Ditto. - - * mail-threads.c (get_password_clicked): Dynamic generation - of descriptive text for mail operations. "Opening a folder" -> - "Opening INBOX". Supported only so far, will be implemented - quickly. - g_strdup() the old_message when changing the queue_window_label's - text. - - * main.c (main): One more gconf reference to take out... - - * mail-ops.c (composer_send_cb): Check for an identity before - sending. - -2000-08-03 JP Rosevear - - * mail-config.glade: Increase window size slightly, rename - "Transport" to "Mail Transport" - - * mail-config.c (init_config): Remove gconf references - (clear_config): ditto - (read_config): ditto - (write_config): ditto - (mail_config): Null provider lists before filling them - (mail_config_druid): ditto - (identity_page_new): Increase spacing of vbox - (service_page_new): ditto - - * Makefile.am: Remove gconf references. - -2000-08-02 Dan Winship - - * mail-config.c (service_page_item_new): Make the "test settings" - button FILL rather than SHRINK so it doesn't end up oddly-placed. - - * mail-config-druid.glade: Make the icon background dark blue - like the surrounding area. - -2000-08-02 Peter Williams - - * component-factory.c (owner_unset_cb): Wait for async operations - to finish before exiting. - -2000-08-02 Christopher James Lahey - - * mail-ops.c, message-list.c: Emit "model_pre_change" where - appropriate. - -2000-08-02 Peter Williams - - * mail-config.h: #ifdef _MAIL_CONFIG_H protect the header. - -2000-08-01 Peter Williams - - * mail-threads.c: Implement Solaris threads. Attempt - to join to the thread upon exit -- hopefully prevents - all those nasty zombie processes from popping up :-( - -2000-08-01 Dan Winship - - * mail-crypto.c: New code to spawn off GPG/PGP to do stuff. - Currently only deals with decryption. From Nathan Thompson-Amato - , with bunches of changes from me. - - * session.c (mail_request_dialog): Expose the password dialog to - the rest of the app (for use by the GPG/PGP code). - - * mail-format.c (handle_text_plain): Handle special inline data - types. (Currently uuencoding, BinHex, and PGP encryption.) This is - not the best way to deal with it, but it works for now. - (try_inline_pgp): Convert an inline PGP-encrypted message into a - multipart/encrypted part. - (try_inline_binhex): Convert an inline BinHex attachment into an - application/mac-binhex40 part (which we currently don't deal - with...) - (try_uudecoding): Convert a uuencoded attachment to an - application/octet-stream part. - (handle_multipart_encrypted): Deal with RFC2015 MIME-encoded PGP - encrypted messages. (From ndt.) - - * mail-display.c (mail_text_write, mail_error_write): New utility - functions. - - * Makefile.am (evolution_mail_SOURCES): add mail-crypto.c - -2000-07-31 Christopher James Lahey - - * component-factory.c, folder-browser.c: Fixed some warnings. - - * message-list.c: Made the icon column non sortable. - -2000-07-31 Dan Winship - - * mail-config.c (service_page_set_url): Fix a NULL-pointer strcmp - noticed by peterw. - -2000-07-31 Not Zed - - * mail-vfolder.h: Header for vfolder functions. - - * folder-browser.c (mail_uri_to_folder): Use new scheme to open - vfolders. - (search_save): New button/function to save a search as a vfolder. - - * mail-vfolder.c (vfolder_edit): Made asynchronous. - (vfolder_uri_to_folder): New function for loading vfolders and - setting up their source folders. - (vfolder_refresh): Change shell vfolder uri's to indirect - references rather than the real vfolder uri. - (vfolder_gui_add_rule): Add a rule with user confirmation. - (vfolder_create_part): Get a new part by name, for creating rules - in code. - - * message-thread.c (thread_messages): Check for uid lookup - failure, which indicates an error in the folder or calling code. - -2000-07-29 Not Zed - - * component-factory.c (create_view): Remove hack to pass the - storage around. - - * folder-browser-factory.c (control_activate): Changed to call - renamed vfolder editor. - - * mail-ops.c (vfolder_edit_vfolders): renamed from vfolder_edit, - call new edit function. - (vfolder_editor_clicked): Removed. - (filter_druid_clicked): - (filter_edit): Updated for api change. - (real_fetch_mail): Fixed up for api change and fucked up indent. - (filter_get_folder): callback for filter driver. - - * mail-vfolder.c: New file to manage virtual folders. - -2000-07-29 JP Rosevear - - * mail-format.c (mail_generate_reply): Use new mail config stuff - - * component-factory.c (create_imap_storage): Use new mail config - stuff - (create_news_storage): ditto - - * evolution-mail.schemas: Gconf schema for evolution mail - - * mail-config-druid.glade: Gladification of config druid - - * mail-config.h: New header with config structs. - - * mail-config.c: Rewrite of GUI configuration tools to use - new config structs. Stores multiple identities and sources now. - Still only uses the first one found. - (mail_config_fetch): Returns MailConfig struct to caller - for configuration queries. - (mail_config): Renamed function to show mail config dialog. - (mail_config_druid): Renamed function to show mail config druid. - - * mail-ops.c (create_msg_composer): Use - e_msg_composer_new_with_sig_file and new config stuff - (check_configured): Use new config stuff - (fetch_mail): ditto - (composer_send_cb): ditto - -2000-07-28 Cody Russell - * mail-ops.c, mail.h: Added mark_all_seen(), to mark every - message in the list with CAMEL_MESSAGE_SEEN. - - * folder-browser-factory.c: Added "Actions/Mark all seen". - -2000-07-27 Jeffrey Stedfast - - * mail-config.c: Lets fix Dan's kludge the Right Way (tm) - (set_service_url): Only strip off the leading "/" from the - url->path if url->host is NULL - (get_service_url): Only prepend a leading "/" to the path if the - host is NULL - -2000-07-27 Dan Winship - - * mail-config.c (get_service_url): toss in a kludge to deal with - the IMAP vs mbox path problem for now. - -2000-07-26 Christopher James Lahey - - * message-list.c, message-list.h: Removed counting of selected - messages. - -2000-07-26 Dan Winship - - * mail-ops.c (real_fetch_mail): Don't create the tmp_mbox before - calling movemail, because the external movemail requires it to not - exist. Contrariwise, delete it in the cleanup code if it's empty. - Update for camel_movemail interface change. Do the "No new - messages" dialog in the mbox case as well as the remote mail - issue. - -2000-07-26 Jeffrey Stedfast - - * mail-ops.c: s/struct refile_data/struct move_data - (real_move_msg): Renamed from real_refile_msg() - (move_msg): Renamed from refile_msg() - - * folder-browser-factory.c: Changed Refile to Move. - -2000-07-26 Dan Winship - - * mail-format.c (lookup_handler): Update for OAF and for external - apps as well as components. - (handle_via_external): Handler to set up for data that can be - displayed by an external application. - - * mail-display.c (on_link_clicked, etc): Refactor the save_data() - code and add launch_external() as a handler for - x-evolution-external URLs. - (embeddable_destroy_cb): Remove this, since it seems like it's all - wrong. - (on_object_requested): Update for OAF, and fix some bugs. - -2000-07-25 Jeffrey Stedfast - - * mail-config.c (get_service_url): Always prepend a leading "/" to - the url->path. - (set_service_url): Added more error checking and also strip the - leading '/' from the url->path - (create_identity_page): Set the signature file to the one specified in - the identity record, else set the default path to ~/.sugnature - -2000-07-25 Michael Meeks - - * mail-config.c (create_identity_page): set default signature to - ~/.signature - -2000-07-25 Peter Williams - - * mail-ops.c (reply): Check for the case of fb->mail_display-> - current_message = NULL, which shouldn't happen, but has happened - to me. - -2000-07-25 Dan Winship - - * message-thread.c (group_root_set): Don't group together messages - with the same non-Re: subject and no References/In-Reply-To. More - often than not, they're unrelated. (eg, "[No subject]".) - (thread_messages): Handle messages with no Message-Id. "This - shouldn't happen", but it does sometimes, and it's not much code - to make it just work. - -2000-07-25 Ettore Perazzoli - - * mail-config.c (create_service_page): Call - `gtk_option_menu_set_menu()' as the last thing, as `GtkOptionMenu' - is fscking broken. Also, `gtk_widget_show()' the individual menu - items. - -2000-07-24 Dan Winship - - * message-list.c (mark_msg_seen, ml_tree_set_value_at, - message_list_regenerate): Update for CamelFolder API changes. - (Certain functions no longer take a CamelException.) - - * mail-ops.c (real_fetch_mail, real_send_mail, real_delete_msg): - ditto - - * component-factory.c (real_create_imap_storage, - real_create_news_storage): ditto - -2000-07-24 Dan Winship - - * component-factory.c, folder-browser-factory.c, test-mail.c: - Remove GOAD support. - - * main.c: Remove GOAD support. - (main): More "guess the build mistake" fun, this time for the - failure to initialize Bonobo case. - -2000-07-24 Peter Williams - - * mail-tools.c (mail_tool_set_uid_flags): Change - function to faithfully pass parameters to - camel_folder_set_message_flags; this function is - somewhat useless now. Other files synced with - API change. - - * mail-ops.c (op_display_message): Change "display - a message" into "retrieve a messsage" in the - description of mail_op_display_message. - - * mail-threads.c (display_timeout): New function. - Only display the progress dialog if the operation - takes more than a second to perform. - (hide_queue_window): New function. Hide the queue - window as an idle function... I'm thinking maybe - the problem with hiding it was due to us not - being in a GTK event sequence? Perhaps it's only - the timeout, which was not being cancelled, which - is now. - - * message-list.c (get_message_uid): New function, - copy of get_message_info, except gets only the - UID, as that's all that most functions want, and - we avoid a Camel call. - -2000-07-23 Ettore Perazzoli - - * mail-ops.c (create_message_composer): New. - (compose_msg): Use it. - (send_to_url): Likewise. - (forward_msg): Likewise. - - * folder-browser-factory.c (control_activate): Use `_()' instead - of `N_()'. - -2000-07-21 Peter Williams - - * message-thread.c (setup_thread_messages): New - operation: thread_messages, simple wrapper around - thread_messages () and thread_messages_free(); - - * message-list.c (cleanup_regenerate_messagelist): - Use new thread_messages operation instead of just - calling ... thread_messages :-) - - * folder-browser.c (folder_browser_destroy): Use new - sync_folder operation instead of calling camel_folder_sync - directly. - - * component-factory.c (create_folder): Changed to use - new create_folder operation. - - * mail-ops.c (mail_do_create_folder): New operation: create - folder. New operation: sync folder. - - * mail-format.c (cmm_destroyed): Remove the url hashtable from - the larger hashtable when it gets destroyed. - - * mail-callbacks.c (fetch_mail): Pass a hook function and data - down the chain to pick up the folder_changed and change the view. - - * mail-ops.c: Rename from mail-ops-new.c now that it's a little more - solid. - (fetch_mail): Add new options to hook and unhook an event while the - filter driver runs. A hack, but all of the operations are to some - extent. - (cleanup_fetch_mail): Unref the destination folder if not NULL. - * mail-tools.c (mail_tool_filter_contents_into): Intermediate the - event hook/unhook hack here. - -2000-07-20 Peter Williams - - * mail-ops-new.c (setup_send_mail): Fix silly forgetting-to-ref - problem on some sends (when not replying). Note the early exit - path with a big comment. - - * message-list.c (message_list_set_folder): Don't call - folder_changed, call mail_do_regenerate_messagelist, as - the GDK_THREADS_ENTER in the former can deadlock us! - - * folder-browser.c (folder_browser_set_uri): Ah, screw it. - Make 'load folder' asynchronous and pretend that it always - succeeds. - - * mail-ops-new.c (mail_do_load_folder): New operation, loads - a folder into a FolderBrowser. - - * mail-threads.c (read_msg): Check if the exception is - a user cancel; don't complain if it is. - (mail_operation_queue): Same. - (dispatch_func): Same. - -2000-07-20 Peter Williams - - * mail-ops-new.c (cleanup_send_mail): Fix evil mistaken - unref. - - * test-thread.c: Fit the new mail_operation_spec prototype. - - * mail-callbacks.c (composer_send_cb): Hide the composer upon - start of send operation. - - * folder-browser.c: #include "mail-ops-new.h" - - * mail-threads.h: Change text fields of mail_operation_spec to - provide two forms of the name. - - * mail-threads.c: Use appropriate new string fields. - (dispatch_func): Hide the progressbar by default. - - * message-list.c (op_regenerate_messagelist): Fix the datasize from - 0 -> sizeof (regenerate_messagelist_data_t). Add the new gerund and - infinitive strings. - (do_regenerate_messagelist): Include some code that fell between the - cracks. - - * mail-ops-new.c (op_scan_subfolders): Same datasize fix for - scan_subfolders. - (op_forward_message): Same. - (all): Add new gerund and inifinitive strings for mail_operation_spec. - (cleanup_send_mail): Destroy the composer on success; re-show it on - error. I'm so clever! - -2000-07-20 Ettore Perazzoli - - * component-factory.c (factory_fn): Updated for the new - `evolution_shell_component_new()' arg. - -2000-07-19 Jeffrey Stedfast - - * message-thread.c (thread_messages): What if message info is NULL? - -2000-07-17 Peter Williams - - * component-factory.c (real_create_{imap,news}_storage): Instead of - directly calling evolution_storage_new_folder, queue up a list of - folders to register so that we don't do our CORBA in The Other Thread. - (create_{imap,news}_storage): Changes ancillary to the above. - (add_new_mailbox): New function to queue up a folder - (cleanup_create_info): New function to dequeue the folders and free mem. - - * test-thread.c: s,ENABLE_BROKEN_THREADS,USE_BROKEN_THREADS -- oops - - * mail-format.c: (mail_lookup_url_table): New function to get the url - table associated with a CamelMimeMessage because we can no longer - gtk_object_get_data on it. - - * mail-display.c: replace 'gtk_object_get_data( message, "urls" )' - with 'mail_lookup_url_table( message )' - -2000-07-16 Jeffrey Stedfast - - * folder-browser.c, component-factory.c: Initial code to support - IMAP folders that don't use "/" as a directory separator. - -2000-07-15 Ettore Perazzoli - - * mail-ops.c (set_x_mailer_header): New helper function to set the - `X-Mailer:' header to to `Evolution [Developer - Preview]". - (real_send_mail): Call it. - -2000-07-14 Peter Williams - - * message-list.c (message_list_set_folder): Ported to CamelObject: - GTK_OBJECT->CAMEL_OBJECT; gtk_signal_connect->camel_object_hook_event; - GDK_THREADS_ENTER/LEAVE around "changed" event hooks. - - * folder-browser.c (folder_browser_destroy): likewise. - (mail_uri_to_folder): likewise. - (folder_browser_load_folder): likewise. - -2000-07-14 Ettore Perazzoli - - * Makefile.am (evolution_mail_LDADD): Add `GCONF_LIBS'. - -2000-07-14 Dan Winship - - * mail-format.c (write_headers): put a

    at the end of the - header table. (I think there used to be whitespace after it, but - then some gtkhtml change got rid of it...) - (handle_text_plain): Don't do this

    . Instead, CONVERT_NL and
    -	CONVERT_SPACES and wrap it in . Now if the sender didn't
    -	include any newlines, it will be wrapped to the width of the
    -	window instead of extending off into infinity.
    -
    -2000-07-13  Dan Winship  
    -
    -	* message-list.c (message_list_destroy): Only unref the folder if
    -	it's been set.
    -
    -	* folder-browser.c (folder_browser_destroy): Only sync the folder
    -	if it's been set.
    -
    -2000-07-13  Jonathan Blandford  
    -
    -	* mail-config.c (create_transport):
    -	s/CAMEL_SERVICE_NEED_HOST/CAMEL_SERVICE_URL_NEED_HOST.
    -
    -2000-07-13  Dan Winship  
    -
    -	* mail-config.c (add_row): Add a "gboolean required" argument, and
    -	set its value on the entry.
    -	(create_source, create_transport): Create rows for URL elements if
    -	the URL ALLOWs them. Mark them required if it NEEDs them.
    -	(service_note_doneness): Only require the required fields to be
    -	filled in.
    -
    -	Now the IMAP config page allows the user to enter a path, but
    -	doesn't require it.
    -	
    -2000-07-13  Jeffrey Stedfast  
    -
    -	* mail-ops.c (real_fetch_mail): Back to the old way to avoid
    -	g_warnings, yay. Also fix append to send a flags argument (0)
    -
    -2000-07-12  Chris Toshok  
    -
    -	* mail-config.c (providers_config_new): fix some cut & paste bung.
    -
    -2000-07-12  Chris Toshok  
    -	
    -	* mail-format.c (setup_function_table): add "message/news" to the
    -	mime_function_table using the same handler as message/rfc822.
    -
    -2000-07-12  Chris Toshok  
    -
    -	* mail-config.glade*: add news server tab to dialog.
    -
    -	* mail-config.c (on_NewsServerConfigDialogButton_clicked): new function.
    -	(on_clistNewsServers_select_row): new function.
    -	(on_cmdNewsServersAdd_clicked): new function.
    -	(on_cmdNewsServersEdit_clicked): new function.
    -	(on_cmdNewsServersDelete_clicked): new function.
    -	(providers_config_new): mirror the source tab's code to fill in
    -	the news server tab.
    -	(write_config): save out the news server.
    -	(create_news_server_config_dialog): new function.
    -	(create_news_server_page): new function.
    -
    -2000-07-12  Peter Williams  
    -
    -	* mail-display.c (save_data): Change from evolution_dir to
    -	g_get_home_dir() for default location of save file.
    -
    -2000-07-11  Dan Winship  
    -
    -	* Update for CamelFolder API changes
    -
    -2000-07-11  Jeffrey Stedfast  
    -
    -	* mail-ops.c (real_fetch_mail): Changed to use 
    -	camel_folder_move_message_to () rather than get_message () and then
    -	append_message (). This also makes it so we don't have to worry about
    -	fetching message flags to pass to the new append_message () method.
    -
    -	* folder-browser.c (folder_browser_load_folder): Disable
    -	Search capability menu/entry if folder doesn't support it.
    -
    -	* message-list.c (message_list_regenerate): Don't perform
    -	a search if the folder doesn't support it.
    -
    -2000-07-11  Dan Winship  
    -
    -	* mail-ops.c (real_send_mail): Set the post_send_data flag rather
    -	than toggling it. (Maybe we'll need more control over it later,
    -	but for now, the only flag we set is "replied", and we want
    -	that set, not toggled.)
    -
    -2000-07-10  Dan Winship  
    -
    -	* folder-browser-factory.c (control_activate): Work with both
    -	current and 0.15 bonobo
    -
    -	* kill more debugging messages
    -
    -	* mail-ops.c (real_fetch_mail): Don't multiply free dest_url.
    -
    -	* message-list.c (message_list_select): Update
    -	message_list_select_next to do either next or previous.
    -
    -	* folder-browser.c (etable_key): Make 'n' and 'p' do next and
    -	previous unread message.
    -
    -	* mail-ops.c (select_first_unread): Update.
    -	(real_fetch_mail): clean up a bit.
    -
    -2000-07-10  Ettore Perazzoli  
    -
    -	* mail-ops.c (forward_msg): Initialize `fwd_subj' to NULL if
    -	`from' is NULL.
    -
    -2000-07-10  Jeffrey Stedfast  
    -
    -	* mail-ops.c (real_fetch_mail): Fixed broken POP fetching
    -
    -2000-07-10  Ettore Perazzoli  
    -
    -	* component-factory.c: Removed variable `browsers'.
    -	(create_view): Don't update it.
    -	(owner_unset_cb): Don't sync the folders here anymore, because at
    -	this point the folder browser is dead already so we cannot get a
    -	valid list of folders from it anymore.
    -
    -	* folder-browser.c (folder_browser_destroy): Sync the associated
    -	mailbox first.
    -
    -2000-07-10  Christopher James Lahey  
    -
    -	* message-list.c, message-list.h: Switched from ETable to
    -	ETableScrolled.
    -
    -2000-07-10  Jeffrey Stedfast  
    -
    -	* mail-ops.c (real_fetch_mail): Fixed movemail so that it too would
    -	deliver to Inbox.
    -
    -2000-07-09  Dan Winship  
    -
    -	* message-list.c (get_message_info): Don't g_warn if the user
    -	selects a fake tree parent.
    -	(message_list_select_next): Ignore fake rows
    -	(build_tree): Store the "root_subject" for fake rows
    -	(ml_tree_value_at): Display the correct subject for fake rows.
    -	(on_cursor_change_cmd): Update for the other changes and set
    -	cursor_uid to NULL when the cursor is on a fake row.
    -
    -	* mail-ops.c (reply): Don't try to reply when no (real) message is
    -	selected.
    -	(forward_msg): Ditto.
    -
    -2000-07-09  Christopher James Lahey  
    -
    -	* message-list.c: Remove setting of dnd_code since that's handled
    -	internally to ETable.
    -
    -2000-07-08  Dan Winship  
    -
    -	* folder-browser.c (etable_key): Fix up the pageup/pagedown
    -	increment a bit.
    -
    -	* folder-browser-factory.c (control_activate): Add a "Threaded
    -	Message List" item to the "View" menu.
    -
    -	* message-list.c (message_list_toggle_threads): Handler for that.
    -	(build_flat): New function to build a "flat" message list using
    -	the tree model.
    -	(message_list_regenerate): Build tree or flat message list
    -	depending on the global setting.
    -
    -	* message-thread.c (get_root_subject): fix a "Re:" parsing bug
    -
    -2000-07-08  Jeffrey Stedfast  
    -
    -	* mail-ops.c (real_fetch_mail): Always dump incoming messages to
    -	Inbox (assuming not filtered to another location).
    -
    -2000-07-08  Ettore Perazzoli  
    -
    -	* folder-browser-factory.c (control_activate): Move the
    -	"Expunge" item to the "Action" menu.
    -	(control_deactivate): Accordingly.
    -
    -2000-07-08  Dan Winship  
    -
    -	* mail-ops.c (forward_msg): Deal with having multiple selected
    -	messages.
    -
    -	* mail-format.c (mail_generate_forward): Removed. (Integrated into
    -	forward_msg)
    -
    -2000-07-08  Jeffrey Stedfast  
    -
    -	* message-list.c (build_tree): Small fix to stop uid data from
    -	being set on a message-list tree node when it didn't correspond
    -	to an actual message.
    -
    -2000-07-08  Dan Winship  
    -
    -	* message-list.c (get_message_info): Fix Jeff's FIXME: This does
    -	get called with out-of-range data sometimes, so we do need the
    -	check. Use e_table_model_row_count to get the actual right answer.
    -
    -2000-07-07  Jeffrey Stedfast  
    -
    -	* message-list.c (get_message_info): This wasn't quite right, it
    -	will now work but still isn't perfect. See FIXME comment.
    -
    -2000-07-07  Dan Winship  
    -
    -	* message-thread.c (remove_node): Add another argument "clast"
    -	pointing to the container before the current one in the list,
    -	which it can update if that turns out to be the one that it
    -	removed.
    -	(group_root_set): Update for remove_node change, and remove both
    -	nodes in the "subjects are common" case. Fixes a bug that would
    -	cause the message list to be truncated if this rule was invoked.
    -
    -	(sort_node): sort the tree by the original order of the messages
    -	in the folder rather than by date.
    -
    -2000-07-07  Dan Winship  
    -
    -	* message-list.c: Lots of changes. Store uids as node data on the
    -	tree nodes and use those rather than rows where possible. (The
    -	concept of "row" is just getting too complicated.) Get rid of the
    -	summary_table, because given a uid we can call
    -	camel_folder_get_message_info, which makes more sense than keeping
    -	a separate uid->row hash table ourselves.
    -
    -	(get_message_info): update
    -	(get_message_row): removed
    -	(ml_col_cound, ml_row_count, ml_value_at, ml_set_value_at,
    -	ml_cell_is_editable, ml_duplicate_value, ml_free_value,
    -	ml_initialize_value, ml_value_is_empty, ml_value_to_string):
    -	Removed. We always use the tree model now.
    -	(message_list_init): Remove the non-tree code.
    -	(build_tree): store uids in the tree rather than row numbers,
    -	and build the message_list->uid_rowmap to map from uids to rows
    -	when needed.
    -	(message_list_regenerate): Renamed from _set_search, since it's
    -	used to redraw in non-search cases too.
    -	(message_changed): Use the uid_rowmap to get a model row number.
    -
    -	* message-thread.c (thread_messages): Change the interface on this
    -	to work with the new MessageList.
    -
    -	* folder-browser.c (search_set, folder_browser_clear_search): 
    -	s/message_list_set_search/message_list_regenerate/
    -
    -2000-07-07  Christopher James Lahey  
    -
    -	* message-list.c (get_message_info): Handle a row number of -1
    -	properly.
    -
    -2000-07-06  Dan Winship  
    -
    -	* message-list.c (get_message_info): Map tree model row numbers to
    -	summary row numbers.
    -	(ml_tree_value_at, ml_tree_set_value_at,
    -	ml_tree_is_cell_editable): So don't do that here.
    -
    -2000-07-06  JP Rosevear  
    -
    -	* mail-config.glade*: Glade files for the configuration dialog.
    -	
    -	* mail-config.c (providers_config_new): Build the dialog with
    -	glade.
    -
    -2000-07-06  Dan Winship  
    -
    -	* folder-browser-factory.c, folder-browser.c, mail-ops.c,
    -	message-list.c: fix warnings.
    -
    -	* main.c (main): gtkhtmllib_init is no more. Call gconf_init
    -	directly instead.
    -
    -	* message-list.c (message_list_select_next): New function to
    -	select the first message on or after the given row that meets
    -	certain flag criteria.
    -
    -	* mail-ops.c (real_fetch_mail): call message_list_select_next to
    -	select first unread message in current folder if it changes.
    -	(real_delete_msg): Remove the code to move the etable cursor. It
    -	only makes sense really if you deleted the message with the
    -	keyboard, so do it from etable_key.
    -
    -	* folder-browser.c (etable_key): call message_list_select_next to
    -	select next non-deleted message after Delete.
    -
    -	* mail-identify.c: Add a workaround for a small gnome-vfs 0.2 bug
    -	so we don't need to require CVS gnome-vfs.
    -
    -2000-07-06  Not Zed  
    -
    -	* message-thread.c (sort_thread): sort messages based on date for
    -	the initial sort order.
    -	(thread_messages_free): Implement.
    -
    -	* message-list.c (message_list_init_header): Setup the subject
    -	renderer to a tree in tree mode.
    -	(on_cursor_change_cmd): For a tree model, map the view row to the
    -	data row.
    -	(build_tree): Builds the tree data structure of all messages.
    -	(message_list_set_search): For a tree model, build the tree here.
    -	(ml_tree_icon_at): Icon callback, returns nothing.
    -	(ml_tree_value_at):
    -	(ml_tree_set_value_at): 
    -	(ml_tree_is_cell_editable): Maps tree node to data row, and calls
    -	the equivalent table callback
    -	(message_list_init_renderers): Setup the tree renderer if needed.
    -	(message_list_init): set the root node invisible afterall.
    -	(message_list_set_search): Clear the old tree before putting in a
    -	new one.
    -
    -	* message-list.h: Add a tree renderer to render list, and
    -	tree_view indicator.
    -
    -	* message-thread.[ch]: Code for message threading. 
    -
    -2000-07-05  Dan Winship  
    -
    -	* mail-identify.c (mail_identify_mime_part): Oops. My gnome-vfs
    -	was out-of-date. Update for changed function name.
    -
    -2000-07-05  Dan Winship  
    -
    -	* mail-identify.c (mail_identify_mime_part): Use the gnomevfs
    -	sniff buffer interface to try to identify the MIME type when
    -	everything else fails.
    -
    -	* mail-display.c (on_object_requested):
    -	* mail-format.c (lookup_handler, handle_undisplayable,
    -	handle_audio): s/gnome_mime/gnome_vfs_mime/
    -
    -	* Makefile.am: Add gnomevfs stuff
    -
    -2000-07-03  Ettore Perazzoli  
    -
    -	* component-factory.c (create_folder): Get rid of a compiler
    -	warning by making sure `folder' is always initialized to some
    -	value for any code path.
    -
    -2000-07-03  Dan Winship  
    -
    -	* message-list.c (select_msg): call mail_display_set_message with
    -	NULL if the message we tried to select doesn't exist (probably
    -	meaning we tried to selecte the first message and the folder is
    -	empty.)
    -
    -	* mail-display.c (mail_display_set_message): deal with NULL as an
    -	input (meaning "undisplay previous message and display nothing").
    -
    -2000-07-02  Dan Winship  
    -
    -	* mail-ops.c (real_fetch_mail): Remove hack to redisplay the
    -	inbox, since folder_changed signals will now be emitted
    -	appropriately.
    -
    -	* component-factory.c (create_vfolder_storage): Fix
    -	filter_driver_new invocation.
    -
    -	* Makefile.am (bin_PROGRAMS): test-mail and test-thread should be
    -	noinst.
    -
    -	* mail-ops.c (real_fetch_mail): 
    -	(vfolder_editor_clicked): 
    -	* component-factory.c (create_vfolder_storage):
    -	Pass mail_uri_to_folder and rules to filter_driver_new.
    -
    -2000-07-02  Ettore Perazzoli  
    -
    -	* folder-browser.c (mail_uri_to_folder): Fix double freeing of the
    -	local exception `ex'.
    -
    -2000-07-01  Ettore Perazzoli  
    -
    -	* mail-ops.c (refile_msg): Only allow type "mail" in the folder
    -	selection dialog.
    -
    -2000-07-01  Dan Winship  
    -
    -	* pixmaps.h, pixmaps/*.xpm: Removed. These aren't being used any
    -	more. (The real pixmaps are in ../art.)
    -
    -2000-07-01  Jeffrey Stedfast  
    -
    -	* message-list.c (get_message_info):
    -	(select_msg): Updated to reflect camel-folder changes.
    -
    -	* mail-ops.c (real_fetch_mail): Modified to reflect camel-folder
    -	changes.
    -
    -2000-06-30  Dan Winship  
    -
    -	* mail-ops.c (print_msg): Use gnome-print to do a print preview.
    -
    -	* folder-browser-factory.c: Hook up "Print" button.
    -
    -	* message-list.c (message_list_foreach): New function, a wrapper
    -	around e_table_selected_row_foreach, which calls the callback
    -	function with UIDs rather than row numbers.
    -
    -	* folder-browser-factory.c: Remove never-used "Find" button from
    -	the toolbar and replace it with "Refile". (We need a better icon
    -	for this...). Hook up "Refile" to "refile_msg".
    -
    -	* mail-ops.c (refile_msg): Call the shell's user_select_folder
    -	routine, and then use message_list_foreach and real_refile_msg to
    -	do the work.
    -	(delete_msg): Update to use message_list_foreach.
    -
    -	* folder-browser.c (mail_uri_to_folder): new function, extracted
    -	from folder_browser_load_folder, to turn a URI into a folder.
    -	(folder_browser_load_folder): Use it.
    -
    -2000-06-30  Peter Williams  
    -
    -	* component-factory.c (create_news_storage, create_imap_storage):
    -	Fixed to use new EvolutionShellClient proxy thingamajiggie.
    -
    -2000-06-30  Dan Winship  
    -
    -	* message-list.c (on_row_selection): use the ETable row_selection
    -	signal to track how many rows are selected. Eventually we will use
    -	this info to disable toolbar buttons when you have too few/too
    -	many messages selected, but the current toolbar widget doesn't
    -	allow that.
    -
    -	* message-list.h, message-list.c, mail-ops.c: Change selected_row
    -	and selected_uid fields of MessageList to cursor_row and
    -	cursor_uid to be more correct according to the new ETable
    -	interfaces.
    -
    -2000-06-30  Ettore Perazzoli  
    -
    -	* component-factory.c: Eeek.  Fix typo: add missing star in the
    -	declaration of `global_shell_client'.
    -
    -2000-06-29  Ettore Perazzoli  
    -
    -	* component-factory.c: Replace `global_shell_interface' with
    -	`global_shell_client'.
    -
    -2000-06-29  Jeffrey Stedfast  
    -
    -	* mail-ops.c (delete_msg): Clean up compile warnings
    -	(real_fetch_mail): Fetching from IMAP should do nothing
    -
    -2000-06-29  Christopher James Lahey  
    -
    -	* mail-ops.c: Handle multiple deletes (change by Peter Williams.)
    -
    -2000-06-29  Jeffrey Stedfast  
    -
    -	* folder-browser-factory.c: Changed "Send" to "Compose" to
    -	avoid user confusion. Compose is a little more intuitive.
    -	Also changed the pixmap to MAIL_NEW instead of MAIL_SND
    -
    -	* mail-ops.c (compose_msg): Renamed to avoid confusion
    -
    -2000-06-29  Dan Winship  
    -
    -	* component-factory.c (create_imap_storage, create_news_storage):
    -	remove some code incorrectly copied and pasted from
    -	create_vfolder_storage which caused vfolder creation to stop
    -	working.
    -
    -2000-06-29  Christopher James Lahey  
    -
    -	* message-list.c, mail-ops.c: Changed the name of
    -	e_table_select_row to e_table_set_cursor_row.
    -
    -2000-06-29  Peter Williams  
    -
    -	* message-list.c (message_list_init): Set the dnd_code of the
    -	ETableHeader to something so that Solaris sprintf doesn't die
    -	on a NULL string.
    -
    -	* mail-config.c (providers_config_new): Check for a null "transport"
    -	string (not all OS' handle NULL strings well *cough* Solaris)
    -
    -2000-06-28  Dan Winship  
    -
    -	* mail-format.c (mail_generate_forward): add default subjects
    -
    -	* component-factory.c (create_folder): Refuse to create folders
    -	not of type "mail", and correctly create an empty "mbox" folder
    -	for new folders in /local.
    -
    -	* main.c (init_corba): Call od_assert_using_oaf() or
    -	od_assert_using_goad() as appropriate to make sure people didn't
    -	somehow trick the build system.
    -
    -2000-06-28  Jeffrey Stedfast  
    -
    -	* message-list.c: Added prototype for filter_date to make
    -	it build cleanly
    -
    -2000-06-27  Christopher James Lahey  
    -
    -	* message-list.c: Made dates display grouping information
    -	properly.
    -
    -2000-06-27  Peter Williams  
    -
    -	* message-list.c (mark_msg_seen): Need to return a value
    -	on error.
    -
    -	* main.c (main): Don't start threads or enter threads if
    -	there's no threading! Sigh.
    -
    -	* test-thread.c: Don't compile if no threads.
    -
    -	* session.c: Work without broken threads.
    -
    -	* message-list.c (filter_date): Solve the ctime_r problem the
    -	correct way, with the magic of autoconf.
    -
    -2000-06-27  Christopher James Lahey  
    -
    -	* message-list.c: Work around mismatched ctime_r functions.  This
    -	will be fixed.
    -
    -2000-06-27  Peter Williams  
    -
    -	* mail-threads.c: Don't compile this if we don't have
    -	threads enabled. This should maybe be on the Makefile.am
    -	level.
    -
    -2000-06-27  Michael Zucchi  
    -
    -	* component-factory.c (owner_set_cb): Put in a gross hack to
    -	export the shell reference elsewhere.
    -
    -2000-06-26  Christopher James Lahey  
    -
    -	* message-list.c: Added a value_to_string handler.
    -
    -2000-06-26  Peter Williams  
    -
    -	* component-factory.c, mail-ops.c: #ifdef the threads stuff so
    -	that if USE_BROKEN_THREADS is not defined we just call the functions
    -	in the main thread.
    -
    -	* mail-threads.h: Don't declare funcs if USE_BROKEN_THREADS not
    -	defined.
    -
    -	* mail-threads.c: Put the query and message boxes on top so that
    -	you can see them.
    -
    -2000-06-26  Jeffrey Stedfast  
    -
    -	* mail-config.c (error_dialog): va_start() returns void, don't
    -	assign it's retval to a variable.
    -
    -2000-06-26  Ettore Perazzoli  
    -
    -	* main.c (main): Call `GDK_THREADS_ENTER()' and
    -	`GDK_THREADS_LEAVE()' around the main loop as in the examples from
    -	the GTK+ FAQ.
    -
    -	* mail-threads.c (DEBUG): New macro for debugging.
    -	(read_msg): Use it.
    -
    -2000-06-25  Peter Williams  
    -
    -	* Makefile.am: Clean up the various _LIBS and _CFLAGS
    -	to work with simpler THREADS_LIBS and THREADS_CFLAGS scheme.
    -
    -2000-06-23  Jeffrey Stedfast  
    -
    -	* folder-browser.c (folder_browser_load_folder): Improved the
    -	code to separate the imap namespace from the folder name.
    -
    -2000-06-23  Peter Williams  
    -
    -	* component-factory.c: Include e-util/e-setup.h for the
    -	prototype of evolution_dir; prototype create_news_storage.
    -	(real_create_imap_storage, real_create_news_storage): New
    -	functions moving the camel stuff into the async callback.
    -	(create_imap_storage, create_news_storage): Chopped in
    -	half to move camel stuff as above.
    -
    -	* mail-ops.c: Include "mail-threads.h" for threading protos.
    -	(real_fetch_mail, real_send_mail, real_expunge_folder): 
    -	New functions moving the camel stuff into the async callback.
    -	(async_mail_exception_dialog): A version of mail_exception_dialog
    -	to be called from the async handlers (just calls mail_op_error())
    -	(fetch_mail, expunge_folder, composer_send_cb): Cut in half to
    -	move camel stuff as above.
    -	(cleanup_send_mail): Clean up after the async real_send_mail
    -	with the gtk_object_destroys et al.
    -
    -	* mail-threads.c: Instead of hiding the progress bar, make it
    -	zip back and forth constantly.
    -	(progress_timeout): New func. Timeout called to make the pbar
    -	shimmy.
    -	(timeout_toggle): New func. Turn on and off the shimmy effect.
    -	(check_cond): New func. Make sure that the GCond for modal
    -	operation is initialized before mail_op_{error,get_password}.
    -	(show_error_clicked, read_msg, get_password_clicked): Move
    -	over to timeout_toggle.
    -	(mail_op_error,mail_op_get_password): Add check_cond() call.
    -
    -	* main.c: (main) Call g_thread_init.
    -
    -	* session.c: Change auth_callback stuff over to assume that it's
    -	being called async. Note: no real good way to tell if this is
    -	the case or not.
    -	(request_callback): ifdef'ed out
    -	(evolution_auth_callback): Use mail_op_get_password.
    -	
    -2000-06-22  Jeffrey Stedfast  
    -
    -	* folder-browser.c (folder_browser_load_folder): Now should
    -	correctly get the selected folder from the given URL.
    -
    -2000-06-22  Chris Toshok  
    -
    -	* folder-browser.c (folder_browser_load_folder): add handling for
    -	loading "news:" folders.
    -
    -	* component-factory.c (create_news_storage): add a root for news
    -	source.
    -	(owner_set_cb): call create_news_storage.
    -
    -2000-06-22  Jeffrey Stedfast  
    -
    -	* folder-browser.c (folder_browser_load_folder): Updated to
    -	prepend url-> path if it exists for that imap store.
    -
    -	* component-factory.c (create_imap_storage): Modified to not
    -	prepend a hard-coded namespace.
    -
    -2000-06-22  Chris Toshok  
    -
    -	* mail-ops.c (fetch_mail_cleanup): new function, passed as arg to
    -	mail_operation_try.
    -	(fetch_mail): add cleanup func arg.
    -
    -2000-06-22  Christopher James Lahey  
    -
    -	* message-list.c: Changed ml_value_at to return "" instead of NULL
    -	in some cases.
    -
    -2000-06-22  Peter Williams  
    -	* Makefile.am: Add GNOME_EXTRA_LIBS so that we get libgthread
    -	in our LIBS for evolution-mail.
    -	
    -	* mail-threads.c: Make the dialog boxes for error and
    -	question non-modal. They're modal relative to the dispatch
    -	thread, but before they would also eg lock up the toolbar
    -	buttons (while the menus, managed by another process, were
    -	active -- a weird effect).
    -	
    -2000-06-22  Peter Williams  
    -
    -	* mail-threads.[ch]: Extra argument to mail_operation_try:
    -	'cleanup', a function to be called in the main thread after
    -	the dispatcher thread exits. gtk_object_destroy's et al may
    -	attempt to unmap windows so we can't do them in the dispatcher
    -	thread :-(
    -
    -	* test-thread.c: Updated with demo of new argument working.
    -
    -2000-06-22  Peter Williams  
    -
    -	* test-thread.c (op_5): New tests for the get_password
    -	hook.
    -
    -	* mail-threads.[ch]: New hook, mail_op_get_password, for
    -	getting a user response from an async operation. The operation
    -	blocks while waiting for the response. A big whole mutex 
    -	condition threading blocking dealie to make sure that it 
    -	works.
    -
    -	Also the error hook creates a dialog again, which also needs
    -	to block its caller while we wait for the user to press ok.
    -
    -2000-06-22  Peter Williams  
    -
    -	* mail-threads.c (various functions): Prettify the UI
    -	so that the progress bar doesn't become all huge 'n stuff.
    -	(mail_operation_try): Now save the operation's description,
    -	so that we can display it later as the default message.
    -	(read_msg): When the operation starts set the label to its
    -	UI-friendly name.
    -	(dispatch_func): Free the saved prettyname.
    -
    -2000-06-21  Christopher James Lahey  
    -
    -	* message-list.c: Removed an erroneous comment.
    -
    -2000-06-21  Dan Winship  
    -
    -	* mail-config.c (create_transport_page): Make this not crash if
    -	you don't have a transport configured.
    -	
    -	* message-list.c: Update received date to work like sent date.
    -
    -2000-06-21  Peter Williams  
    -
    -	* mail-thread.{c,h}: New files -- a simple API for executing
    -	the major mail ops (fetch_mail etc) asynchronously, allowing
    -	the operations to send messages and update a progress bar.
    -
    -	* test-thread.{c,h}: Tests the mail-thread API.
    -
    -	* Makefile.am: add mail-thread.[ch] to evolution_mail_SOURCES
    -	and declare the test_thread noinst_PROGRAM.
    -
    -2000-06-21  Peter Williams  
    -
    -	* mail-format.c (mail_generate_reply): Include "e-setup.h" to
    -	get the prototype for evolution_dir.
    -
    -2000-06-20  Jeffrey Stedfast  
    -
    -	* component-factory.c (create_imap_storage): Oops. Should
    -	have checked for a NULL sources.
    -
    -2000-06-20  Dan Winship  
    -
    -	* message-list.c (mark_msg_seen): Quick hack to prevent a NULL
    -	pointer dereference. Things need to be cleaned up a bit more here
    -	though.
    -
    -	* mail-sources.c: Oops. This should have been removed a long time
    -	ago.
    -
    -2000-06-20  Jeffrey Stedfast  
    -
    -	* folder-browser.c (folder_browser_load_folder): Working on getting 
    -	this to work :)
    -
    -	* component-factory.c (create_imap_storage): Should now correctly
    -	construct the folder path allowing the selection of a folder.
    -
    -2000-06-20  Ettore Perazzoli  
    -
    -	* mail-format.c (mail_generate_reply): Declare `evolution_dir'.
    -	Ugly, ugly, ugly, but I am not sure where it should go instead.
    -
    -2000-06-19  Ettore Perazzoli  
    -
    -	* mail-ops.c (ask_confirm_for_empty_subject): New function to ask
    -	confirmation for an empty subject line.
    -	(composer_send_cb): Use it if the subject is empty and only send
    -	the message if the user confirms.
    -
    -2000-06-20  Jeffrey Stedfast  
    -
    -	* component-factory.c (create_imap_storage): Now creates the IMAP
    -	storage (listing subfolders and such)
    -
    -2000-06-19  Dan Winship  
    -
    -	* mail-format.c (find_preferred_alternative): add an option to
    -	prefer text/plain.
    -	(reply_body): add an option to prefer text/plain
    -	(mail_generate_reply): Check the mail sending preferences, and
    -	generate a text/plain reply if the user prefers to send plain text
    -	(and we have a text/plain part to generate a reply from).
    -
    -2000-06-19  Jeffrey Stedfast  
    -
    -	* mail-config.c (providers_config_new): Should now correctly display
    -	the Transport page (made it set the optionmenu correctly, before it
    -	would only set SMTP).
    -	(create_transport_page): Updated to set the page info to sendmail/smtp
    -	based on the url.
    -	(create_service_page): Had to add some code to set data on some objects
    -	so I could grab the objects I needed to modify in the above function.
    -
    -2000-06-18  Jeffrey Stedfast  
    -
    -	* folder-browser.c (folder_browser_load_folder): started to add
    -	code to load an IMAP folder.
    -	
    -	* component-factory.c: Started to add a create_imap_storage 
    -	method so that we can eventually have our IMAP store displayed 
    -	in the tree view.
    -	(create_vfolder_storage): Renamed from
    -	create_test_storage().
    -	(owner_set_cb): Updated.
    -
    -2000-06-17  Dan Winship  
    -
    -	* message-list.c (message_list_set_folder): Prevent double-freeing
    -	action on summary_table and uid_rowmap.
    -
    -2000-06-16  Dan Winship  
    -
    -	* message-list.c (ml_set_value_at): Implement clicking on the
    -	envelope icon to set read/unread. Based on a patch by clahey.
    -	(select_msg): keep the timeout id for the "seen" flagging in the
    -	message_list structure, so ml_set_value_at can clear it so it
    -	doesn't re-mark a message seen after you click it unseen.
    -
    -2000-06-16  Dan Winship  
    -
    -	* message-list.c (get_message_row): new function to do a uid to
    -	row mapping.
    -	(mark_msg_seen, select_msg, message_changed,
    -	message_list_set_folder): Update for Camel flag changes.
    -	(on_cursor_change_cmd): Rename "row_to_select" to "selected_row",
    -	and keep a "selected_uid" as well.
    -
    -	* mail-ops.c (composer_send_cb): Update for Camel flag changes,
    -	and fix some memory-handling bugs. (Free the post_send_data when
    -	the composer is destroyed, not when the user clicks "send", which
    -	could happen never, or more than once.)
    -	(delete_msg): Update for Camel flag changes, and fix the "holding
    -	down the delete key skips some messages" bug.
    -
    -2000-06-15  Dan Winship  
    -
    -	* mail-ops.c (fetch_mail): 
    -	* component-factory.c (owner_unset_cb): 
    -	* message-list.c (message_list_set_folder): Update for CamelFolder
    -	changes.
    -
    -	* folder-browser.c (folder_browser_clear_search): New function to
    -	revert back to non-searching mode.
    -
    -	* mail-ops.c (fetch_mail): Use folder_browser_clear_search.
    -
    -	* mail-display.c (on_url_requested): if the document requests an
    -	unknown URL, it's not an error; just ignore the URL.
    -
    -	* mail-ops.c (fetch_mail): If there's no new mail, tell the user.
    -
    -2000-06-14  Radek Doulik  
    -
    -	* main.c (main): call gtkhtmllib_init here
    -
    -2000-06-13  Jeffrey Stedfast  
    -
    -	* mail-config.c (on_SourceConfigDialogButton_clicked): Make sure source
    -	is always pointing to something, so a blank is not written to the config file
    -	on close.
    -
    -2000-06-13  Ettore Perazzoli  
    -
    -	* Makefile.am (SHELL_OBJS): Removed.
    -	(evolution_mail_LDADD): Use `libeshell.a'.  Also use
    -	`top_builddir' consistently.
    -
    -2000-06-12  Jeffrey Stedfast  
    -
    -	* mail-config.c: Got rid of sources_max_row and identities_max_row
    -	as they are not really needed (just use clist->rows)
    -	(on_cmdSourcesEdit_clicked): Modified to make 'source'
    -	point to the data being edited.
    -	(on_cmdSourcesAdd_clicked): Adds a new clist item and selects it so the
    -	editor knows where to stick the data when it's done.
    -
    -2000-06-12  Federico Mena Quintero  
    -
    -	* message-list.c: Removed the ETableModel thaw handler.
    -
    -2000-06-12  Dan Winship  
    -
    -	* folder-browser.c (folder_browser_set_uri): Return the result of
    -	folder_browser_load_folder.
    -	(get_prop, set_prop, folder_browser_properties_init): Remove. No
    -	longer needed.
    -
    -	* folder-browser-factory.c (folder_browser_factory_new_control):
    -	Add a "uri" argument, return NULL if setting it fails.
    -	(folder_browser_factory_new_control): Remove property bag stuff.
    -	(folder_browser_factory_init, folder_browser_factory): Remove
    -	this, since we're using the component factory now.
    -
    -	* component-factory.c (create_view): Update for
    -	folder_browser_factory_new_control change and return NOTFOUND as
    -	appropriate.
    -
    -	* main.c (main): Don't call folder_browser_factory_init.
    -
    -	* mail-format.c (mail_generate_reply): Fix the subject generation
    -	so we don't get "Re:  Re:". This is working around something that
    -	may later be declared a misfeature in Camel.
    -
    -2000-06-10  Ettore Perazzoli  
    -
    -	* component-factory.c (create_folder): New stub implementation for
    -	the folder creation function in the EvolutionShellComponent we
    -	expose [it simply returns success all the time].
    -	(factory_fn): Pass this function to `evolution_shell_component_new'.
    -
    -2000-06-09  Dan Winship  
    -
    -	* folder-browser.c (folder_browser_new): Add a serial number to
    -	FolderBrowser.
    -
    -	* folder-browser-factory.c (control_activate, control_deactivate):
    -	Include fb serial number in the name of the Bonobo toolbar to
    -	prevent problems with disappearing toolbars. This is a kludge and
    -	should go away.
    -
    -
    -	* mail-ops.c (expunge_folder): display error from
    -	camel_folder_expunge if there is one.
    -
    -	* message-list.c (select_row): install an idle function to
    -	select the row rather than doing it directly. Ugh. What a
    -	kludge, but at least it works now.
    -
    -	* session.c (evolution_auth_callback): Update for
    -	CamelAuthCallback changes. (Uncache passwords when asked to.)
    -
    -	* mail-ops.c (fetch_mail): close and expunge the source folder
    -	after copying it to a local folder.
    -
    -2000-06-09  Ettore Perazzoli  
    -
    -	* component-factory.c (create_view): Updated to match the changes
    -	to the definition of `EvolutionShellComponentCreateFn'.  If @type
    -	is not "mail", return an "unsupported type" error.
    -	(factory_fn): Pass NULL for the `remove_folder' and
    -	`create_folder' functions.
    -
    -2000-06-09  Dan Winship  
    -
    -	* mail-format.c: Redo things a bit so that whitespace-only
    -	text parts aren't displayed. (In particular, so that
    -	whitespace-only subparts of multipart/mixed aren't displayed as
    -	separate (empty) parts.)
    -
    -2000-06-06  Dan Winship  
    -
    -	* mail-ops.c (fetch_mail): 
    -	* folder-browser.c (folder_browser_load_folder): Update for folder
    -	creation/existence changes.
    -
    -	* message-list.c (message_list_set_folder): Remove the code to
    -	create the folder if it doesn't exist, since we don't want to do
    -	that.
    -
    -2000-06-05  Dan Winship  
    -
    -	* mail-ops.c (composer_send_cb): Leave the composer window around
    -	if the message doesn't get sent.
    -
    -2000-06-05  Matt Loper  
    -
    -	* folder-browser.c (etable_key): Allow "GDK_KP_Delete", a keypad
    -	delete key, to delete a message.
    -
    -2000-06-05  Dan Winship  
    -
    -	* session.c (evolution_auth_callback): Remember passwords between
    -	calls.
    -	(forget_passwords): Callback for "Forget Passwords" menu item.
    -
    -	* folder-browser-factory.c (control_activate): 
    -	(control_deactivate): Add "Forget Passwords" menu item.
    -
    -	* mail.h, mail-ops.c: fix some function prototypes
    -
    -	* folder-browser.c (etable_key): Add "Delete" = delete message.
    -
    -	* mail-format.c (mail_generate_forward): Update for new composer
    -	attachment interface.
    -
    -2000-06-02  Jeffrey Stedfast  
    -
    -	* mail-config.c (providers_config_new): Added a new notebook
    -	page that allowed for mail format (text/plain or 
    -	multipart/alternative)
    -
    -2000-06-02  Dan Winship  
    -
    -	* message-list.c (filter_date): If the date in the summary is 0,
    -	output "?".
    -
    -	* component-factory.c (create_view): keep a GList of folder
    -	browsers created
    -	(owner_unset_cb): Go through the list and close each folder before
    -	exiting so they sync their summary state, etc to disk.
    -
    -	* mail-ops.c (fetch_mail): Use camel_service_connect, not
    -	connect_with_url, since we already passed the URL into
    -	camel_session_get_store.
    -
    -2000-06-02  Christopher James Lahey  
    -
    -	* message-list.c: Use camel_folder_free_summary instead of
    -	g_ptr_array_free.  Unref the folder when we're done with it.
    -
    -2000-06-02  Christopher James Lahey  
    -
    -	* session.c: Revert removal of e_setup_base_dir.
    -
    -2000-06-02  Dan Winship  
    -
    -	* folder-browser.c (my_folder_browser_init): Connect to ETable's
    -	key_press signal.
    -	(etable_key): scroll mail on space/backspace.
    -
    -2000-06-02  Christopher James Lahey  
    -
    -	* message-list.c: Made sent column as wide as from column.
    -
    -2000-06-02  Jeffrey Stedfast  
    -
    -	* mail-config.c (on_cmdSourcesAdd_clicked): Changed identity_row
    -	to source_row as this is a Sources clist we are dealing with and
    -	not an identity clist
    -	(on_cmdSourcesEdit_clicked): same
    -	(on_cmdSourcesDelete_clicked): again, same
    -	(on_cmdSourcesEdit_clicked): Source editor now fills in data from
    -	the clist
    -
    -2000-06-01  Dan Winship  
    -
    -	* message-list.c: Add a date column.	
    -	(COL_SENT_WIDTH_MIN): Make this wider.
    -	(ml_value_at): return the sent date (as a time_t) for COL_SENT.
    -	(Fix COL_TO too while I'm here.) 
    -	(ml_duplicate_value, ml_free_value, ml_initialize_value,
    -	ml_value_is_empty): COL_SENT is numeric now.
    -	(message_list_init_renderers): Create a date renderer (using
    -	text_filter to translate the time_t into a string).
    -	(message_list_init_header): Use render_date for COL_SENT.
    -
    -2000-06-01  Christopher James Lahey  
    -
    -	* session.c: Don't call e_setup_base_dir.
    -
    -2000-06-01  Dan Winship  
    -
    -	* mail-format.c (mail_generate_forward): Fix forwarding to work
    -	for people other than me. :) [Although apparently it doesn't
    -	really.]
    -
    -	* mail-ops.c (delete_msg): Add a quick hack to move the selection
    -	down a row when you delete a message.
    -
    -	* mail-format.c (handle_message_rfc822): use 
    rather - than
    to frame the embedded - message. If
     text in the subtable won't fit in the 95% width,
    -	GtkHTML will write past the border of the table (and
    -	
    causes creeping updates so it's not - usable for now). - -2000-06-01 Christopher James Lahey - - * message-list.c (message_list_init): Turn off the grid in our - ETable. - -2000-06-01 Dan Winship - - * mail-format.c (write_headers): Oops. This needs to take a - message argument because we might be writing headers for an - embedded message/rfc822 subpart rather than the root document. - -2000-06-01 Jeffrey Stedfast - - * mail-config.c: Config dialogs are completed. - (service_acceptable): Fixed a segfault caused by duplicate - camel_exception_free() - (providers_config_new): Identity and Source clists are now filled in - when the dialog is created as well as the Transport page - - * folder-browser-factory.c: Renamed Tool/ menu items - Vfolder was changed to Virtual Folder and - Configure Camel Providers was changed to Mail Configuration - -2000-06-01 Ettore Perazzoli - - * Makefile.am (evolution_mail_LDADD): Link with - `libemiscwidgets.a'. - - * mail-display.c (mail_display_new): Use an EScrollFrame instead - of a GtkScrolledWindow. - (mail_display_set_message): Likewise. - - * mail-display.h: Replace the GtkScrolledWindow with an - EScrollFrame. - -2000-06-01 Dan Winship - - * component-factory.c (owner_unset_cb): Quit when the shell exits. - This is a kludge, but a pretty necessary one until the refcounting - bugs that keep the component from exiting properly are fixed. - -2000-05-31 Jeffrey Stedfast - - * mail-config.c: Partially implemented the source - configuration, seems to segfault due to a destroyed - gnome dialog being destroyed again in the method - on_SourceConfigDialogButton_clicked() - -2000-05-31 Dan Winship - - * mail-format.c (free_url, handle_text_enriched, - get_url_for_icon): Fix up memory management of x-evolution-data - URLs so the URLs and/or their data don't get freed while there are - still references to them. - - * message-list.c (message_list_init_header): redo the (unused) - online status column to no longer refer to pixmaps that no longer - exist. - -2000-06-01 Ettore Perazzoli - - * folder-browser-factory.c (control_activate): Put the toolbar - into a frame to make it look like standard GNOME toolbars. Also, - set `GNOME_DOCK_ITEM_BEH_NEVER_VERTICAL' so that it does not do - evil things when its moved to the left or the right of the window. - -2000-05-31 Jeffrey Stedfast - - * mail-config.c: Configuration dialog now allows - adding/editing/deleting of Identities (which leaves - adding/editing/deleting of sources left to implement). - The data is also saved when the dialog is exited via - the OK button. - -2000-05-31 Dan Winship - - * mail-format.c (mail_format_mime_message): Initialize the "urls" - hash table stored on the message and store cid and other URLs - there rather than as object data on the message. - (get_cid): rewrite this a bunch - (handle_text_enriched): move the code from write_iframe_string() - into here, since it's the only place that actually needs it. - (handle_text_html): simplify this a lot. We can use a cid: URL - here rather than x-evolution-data. - (get_url_for_icon): New routine to return URLs for icons, and - cache the results, so we don't have to keep re-reading the icon - files (and so we can't be spoofed into reading non-icon files). - (handle_mystery, handle_audio): use get_url_for_icon. - - * mail-display.c (save_data): move the CamelMimePart filename - extracting code from get_cid to here. - (on_link_clicked, on_object_requested): Update for cid: changes. - (on_url_requested): Kill off the kludgy, exploitable x-gnome-icon - URL schema, update cid and x-evolution-data to match - mail-format.c. - - It should now be easier to implement RFC 2557 (Content-Location, - etc), but that RFC still pretty much sucks. - -2000-05-30 Dan Winship - - * mail-format.c: Redo this back to the old way: a single GtkHTML - with various things inline in it. (Gets rid of flicker, simplifies - some scrolling, selecting, and printing issues.) - (handle_text_enriched, handle_text_html): Use ", xed); - add_url ("data_urls", xed, ba, md); - - return TRUE; -} - -static gboolean -handle_text_html (CamelMimePart *part, const char *mime_type, - MailDisplay *md) -{ - const char *location; - - mail_html_write (md->html, md->stream, "\n\n"); - - /* FIXME: deal with relative URLs */ - location = get_location (part, md); - if (!location) - location = get_cid (part, md); - mail_html_write (md->html, md->stream, - "", location); - return TRUE; -} - -static gboolean -handle_image (CamelMimePart *part, const char *mime_type, MailDisplay *md) -{ - mail_html_write (md->html, md->stream, "", - get_cid (part, md)); - return TRUE; -} - -static gboolean -handle_multipart_mixed (CamelMimePart *part, const char *mime_type, - MailDisplay *md) -{ - CamelDataWrapper *wrapper = - camel_medium_get_content_object (CAMEL_MEDIUM (part)); - CamelMultipart *mp; - int i, nparts; - gboolean output = FALSE; - - g_return_val_if_fail (CAMEL_IS_MULTIPART (wrapper), FALSE); - mp = CAMEL_MULTIPART (wrapper); - - nparts = camel_multipart_get_number (mp); - for (i = 0; i < nparts; i++) { - if (i != 0 && output) - mail_html_write (md->html, md->stream, - "
    " - "
    \n"); - - part = camel_multipart_get_part (mp, i); - - output = format_mime_part (part, md); - } - - return TRUE; -} - -static gboolean -handle_multipart_encrypted (CamelMimePart *part, const char *mime_type, - MailDisplay *md) -{ - CamelDataWrapper *wrapper; - CamelMimePart *mime_part; - CamelException ex; - - wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (part)); - - g_return_val_if_fail (CAMEL_IS_MULTIPART (wrapper), FALSE); - - /* Currently we only handle RFC2015-style PGP encryption. */ - if (!camel_pgp_mime_is_rfc2015_encrypted (part)) - return handle_multipart_mixed (part, mime_type, md); - - camel_exception_init (&ex); - mime_part = mail_crypto_pgp_mime_part_decrypt (part, &ex); - - if (camel_exception_is_set (&ex)) { - /* I guess we just treat this as a multipart/mixed */ - camel_exception_clear (&ex); - return handle_multipart_mixed (part, mime_type, md); - } else { - /* replace the encrypted part with the decrypted part */ - /* FIXME: will this cause problems anywhere? -- seems to work okay so far */ - camel_medium_set_content_object (CAMEL_MEDIUM (part), - camel_medium_get_content_object (CAMEL_MEDIUM (mime_part))); - camel_object_unref (CAMEL_OBJECT (mime_part)); - - /* and continue on our merry way... */ - return format_mime_part (part, md); - } -} - -static gboolean -handle_multipart_signed (CamelMimePart *part, const char *mime_type, - MailDisplay *md) -{ - CamelDataWrapper *wrapper; - CamelMultipart *mp; - CamelException *ex; - gboolean output = FALSE; - CamelCipherValidity *valid; - int nparts, i; - - wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (part)); - - g_return_val_if_fail (CAMEL_IS_MULTIPART (wrapper), FALSE); - - ex = camel_exception_new (); - - if (camel_pgp_mime_is_rfc2015_signed (part)) { - valid = mail_crypto_pgp_mime_part_verify (part, ex); - } else { - camel_exception_free (ex); - return handle_multipart_mixed (part, mime_type, md); - } - - if (!valid) { - camel_exception_free (ex); - return handle_multipart_mixed (part, mime_type, md); - } - - camel_exception_free (ex); - - /* now display all the subparts (there should be only 1) *except* the signature (last part) */ - mp = CAMEL_MULTIPART (wrapper); - - nparts = camel_multipart_get_number (mp); - for (i = 0; i < nparts - 1; i++) { - if (i != 0 && output) - mail_html_write (md->html, md->stream, - "
    " - "
    \n"); - - part = camel_multipart_get_part (mp, i); - - output = format_mime_part (part, md); - } - - mail_write_authenticity (md, valid); - camel_cipher_validity_free (valid); - - mail_html_write (md->html, md->stream, ""); - - return TRUE; -} - -/* As seen in RFC 2387! */ -static gboolean -handle_multipart_related (CamelMimePart *part, const char *mime_type, - MailDisplay *md) -{ - CamelDataWrapper *wrapper = - camel_medium_get_content_object (CAMEL_MEDIUM (part)); - CamelMultipart *mp; - CamelMimePart *body_part, *display_part = NULL; - CamelContentType *content_type; - const char *start; - int i, nparts; - - g_return_val_if_fail (CAMEL_IS_MULTIPART (wrapper), FALSE); - - mp = CAMEL_MULTIPART (wrapper); - nparts = camel_multipart_get_number (mp); - - content_type = camel_mime_part_get_content_type (part); - start = header_content_type_param (content_type, "start"); - if (start) { - int len; - - /* The "start" parameter includes <>s, which Content-Id - * does not. - */ - len = strlen (start) - 2; - - for (i = 0; i < nparts; i++) { - const char *cid; - - body_part = camel_multipart_get_part (mp, i); - cid = camel_mime_part_get_content_id (body_part); - - if (!strncmp (cid, start + 1, len) && - strlen (cid) == len) { - display_part = body_part; - break; - } - } - } else { - /* No start parameter, so it defaults to the first part. */ - display_part = camel_multipart_get_part (mp, 0); - } - - if (!display_part) { - /* Oops. Hrmph. */ - return handle_multipart_mixed (part, mime_type, md); - } - - /* Record the Content-ID/Content-Location of any non-displayed parts. */ - for (i = 0; i < nparts; i++) { - body_part = camel_multipart_get_part (mp, i); - if (body_part == display_part) - continue; - - get_cid (body_part, md); - get_location (body_part, md); - } - - /* Now, display the displayed part. */ - return format_mime_part (display_part, md); -} - -/* RFC 2046 says "display the last part that you are able to display". */ -static CamelMimePart * -find_preferred_alternative (CamelMultipart *multipart, gboolean want_plain) -{ - int i, nparts; - CamelMimePart *preferred_part = NULL; - MailMimeHandler *handler; - - nparts = camel_multipart_get_number (multipart); - for (i = 0; i < nparts; i++) { - CamelMimePart *part = camel_multipart_get_part (multipart, i); - CamelContentType *type = camel_mime_part_get_content_type (part); - char *mime_type = header_content_type_simple (type); - - g_strdown (mime_type); - if (want_plain && !strcmp (mime_type, "text/plain")) - return part; - handler = mail_lookup_handler (mime_type); - if (handler && (!preferred_part || !handler->generic)) - preferred_part = part; - g_free (mime_type); - } - - return preferred_part; -} - -static gboolean -handle_multipart_alternative (CamelMimePart *part, const char *mime_type, - MailDisplay *md) -{ - CamelDataWrapper *wrapper = - camel_medium_get_content_object (CAMEL_MEDIUM (part)); - CamelMultipart *multipart; - CamelMimePart *mime_part; - - g_return_val_if_fail (CAMEL_IS_MULTIPART (wrapper), FALSE); - - multipart = CAMEL_MULTIPART (wrapper); - - mime_part = find_preferred_alternative (multipart, FALSE); - if (mime_part) - return format_mime_part (mime_part, md); - else - return handle_multipart_mixed (part, mime_type, md); -} - -/* RFC 1740 */ -static gboolean -handle_multipart_appledouble (CamelMimePart *part, const char *mime_type, - MailDisplay *md) -{ - CamelDataWrapper *wrapper = - camel_medium_get_content_object (CAMEL_MEDIUM (part)); - CamelMultipart *multipart; - - g_return_val_if_fail (CAMEL_IS_MULTIPART (wrapper), FALSE); - - multipart = CAMEL_MULTIPART (wrapper); - - /* The first part is application/applefile and is not useful - * to us. The second part _may_ be displayable data. Most - * likely it's application/octet-stream though. - */ - part = camel_multipart_get_part (multipart, 1); - return format_mime_part (part, md); -} - -static gboolean -handle_message_rfc822 (CamelMimePart *part, const char *mime_type, - MailDisplay *md) -{ - CamelDataWrapper *wrapper = - camel_medium_get_content_object (CAMEL_MEDIUM (part)); - - g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (wrapper), FALSE); - - mail_html_write (md->html, md->stream, "
    "); - mail_format_mime_message (CAMEL_MIME_MESSAGE (wrapper), md); - mail_html_write (md->html, md->stream, "
    "); - - return TRUE; -} - -static gboolean -handle_message_external_body (CamelMimePart *part, const char *mime_type, - MailDisplay *md) -{ - CamelContentType *type; - const char *access_type; - char *url = NULL, *desc = NULL; - char *fmt; - - type = camel_mime_part_get_content_type (part); - access_type = header_content_type_param (type, "access-type"); - if (!access_type) - goto fallback; - - if (!g_strcasecmp (access_type, "ftp") || - !g_strcasecmp (access_type, "anon-ftp")) { - const char *name, *site, *dir, *mode, *ftype; - char *path; - - name = header_content_type_param (type, "name"); - site = header_content_type_param (type, "site"); - if (name == NULL || site == NULL) - goto fallback; - dir = header_content_type_param (type, "directory"); - mode = header_content_type_param (type, "mode"); - - /* Generate the path. */ - if (dir) { - const char *p = dir + strlen (dir); - - path = g_strdup_printf ("%s%s%s%s", - *dir == '/' ? "" : "/", - dir, - *p == '/' ? "" : "/", - name); - } else { - path = g_strdup_printf ("%s%s", - *name == '/' ? "" : "/", - name); - } - - if (mode && *mode == 'A') - ftype = ";type=A"; - else if (mode && *mode == 'I') - ftype = ";type=I"; - else - ftype = ""; - - url = g_strdup_printf ("ftp://%s%s%s", site, path, ftype); - g_free (path); - fmt = e_utf8_from_locale_string (_("Pointer to FTP site (%s)")); - desc = g_strdup_printf (fmt, url); - g_free (fmt); - } else if (!g_strcasecmp (access_type, "local-file")) { - const char *name, *site; - - name = header_content_type_param (type, "name"); - if (name == NULL) - goto fallback; - site = header_content_type_param (type, "site"); - - url = g_strdup_printf ("file://%s%s", *name == '/' ? "" : "/", - name); - if (site) { - fmt = e_utf8_from_locale_string (_("Pointer to local file (%s) " - "valid at site \"%s\"")); - desc = g_strdup_printf (fmt, name, site); - g_free (fmt); - } else { - fmt = e_utf8_from_locale_string (_("Pointer to local file (%s)")); - desc = g_strdup_printf (fmt, name); - g_free (fmt); - } - } else if (!g_strcasecmp (access_type, "URL")) { - const char *urlparam; - char *s, *d; - - /* RFC 2017 */ - - urlparam = header_content_type_param (type, "url"); - if (urlparam == NULL) - goto fallback; - - /* For obscure MIMEy reasons, the URL may be split into - * multiple words, and needs to be rejoined. (The URL - * must have any real whitespace %-encoded, so we just - * get rid of all of it. - */ - url = g_strdup (urlparam); - s = d = url; - - while (*s) { - if (!isspace ((unsigned char)*s)) - *d++ = *s; - s++; - } - *d = *s; - - fmt = e_utf8_from_locale_string (_("Pointer to remote data (%s)")); - desc = g_strdup_printf (fmt, url); - g_free (fmt); - } - - fallback: - if (!desc) { - if (access_type) { - fmt = e_utf8_from_locale_string (_("Pointer to unknown external data " - "(\"%s\" type)")); - desc = g_strdup_printf (fmt, access_type); - g_free (fmt); - } else - desc = e_utf8_from_locale_string (_("Malformed external-body part.")); - } - -#if 0 /* FIXME */ - handle_mystery (part, md, url, "gnome-globe.png", desc, - url ? "open it in a browser" : NULL); -#endif - - g_free (desc); - g_free (url); - return TRUE; -} - -static gboolean -handle_via_bonobo (CamelMimePart *part, const char *mime_type, - MailDisplay *md) -{ - mail_html_write (md->html, md->stream, - "", - get_cid (part, md), mime_type); - return TRUE; -} - -/** - * mail_get_message_rfc822: - * @message: the message - * @want_plain: whether the caller prefers plain to html - * @cite: whether or not to cite the message text - * - * See mail_get_message_body() below for more details. - * - * Return value: an HTML string representing the text parts of @message. - **/ -static char * -mail_get_message_rfc822 (CamelMimeMessage *message, gboolean want_plain, gboolean cite) -{ - CamelDataWrapper *contents; - GString *retval; - const CamelInternetAddress *cia; - char *text, *citation, *buf, *html; - time_t date_val; - int offset; - - contents = camel_medium_get_content_object (CAMEL_MEDIUM (message)); - text = mail_get_message_body (contents, want_plain, cite); - if (!text) - text = g_strdup (""); - citation = cite ? "> " : ""; - retval = g_string_new (NULL); - - /* Kludge: if text starts with "
    ", wrap it around the
    -	 * headers too so we won't get a blank line between them for the
    -	 * 

    to

     switch.
    -	 */
    -	if (!g_strncasecmp (text, "
    ", 5))
    -		g_string_sprintfa (retval, "
    ");
    -
    -	/* create credits */
    -	cia = camel_mime_message_get_from (message);
    -	buf = camel_address_format (CAMEL_ADDRESS (cia));
    -	if (buf) {
    -		html = e_text_to_html (buf, E_TEXT_TO_HTML_CONVERT_NL | E_TEXT_TO_HTML_CONVERT_URLS);
    -		g_string_sprintfa (retval, "%sFrom: %s
    ", - citation, html); - g_free (html); - g_free (buf); - } - - cia = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_TO); - buf = camel_address_format (CAMEL_ADDRESS (cia)); - if (buf) { - html = e_text_to_html (buf, E_TEXT_TO_HTML_CONVERT_NL | E_TEXT_TO_HTML_CONVERT_URLS); - g_string_sprintfa (retval, "%sTo: %s
    ", - citation, html); - g_free (html); - g_free (buf); - } - - cia = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_CC); - buf = camel_address_format (CAMEL_ADDRESS (cia)); - if (buf) { - html = e_text_to_html (buf, E_TEXT_TO_HTML_CONVERT_NL | E_TEXT_TO_HTML_CONVERT_URLS); - g_string_sprintfa (retval, "%sCc: %s
    ", - citation, html); - g_free (html); - g_free (buf); - } - - buf = (char *) camel_mime_message_get_subject (message); - if (buf) { - html = e_text_to_html (buf, E_TEXT_TO_HTML_CONVERT_NL | E_TEXT_TO_HTML_CONVERT_URLS); - g_string_sprintfa (retval, "%sSubject: %s
    ", - citation, html); - g_free (html); - } - - date_val = camel_mime_message_get_date (message, &offset); - buf = header_format_date (date_val, offset); - html = e_text_to_html (buf, E_TEXT_TO_HTML_CONVERT_NL | E_TEXT_TO_HTML_CONVERT_URLS); - g_string_sprintfa (retval, "%sDate: %s
    ", citation, html); - g_free (html); - - if (!g_strncasecmp (text, "
    ", 5))
    -		g_string_sprintfa (retval, "%s
    %s", citation, text + 5); - else - g_string_sprintfa (retval, "%s
    %s", citation, text); - g_free (text); - - buf = retval->str; - g_string_free (retval, FALSE); - return buf; -} - -/** - * mail_get_message_body: - * @data: the message or mime part content - * @want_plain: whether the caller prefers plain to html - * @cite: whether or not to cite the message text - * - * This creates an HTML string representing @data. If @want_plain is %TRUE, - * it will be an HTML string that looks like a text/plain representation - * of @data (but it will still be HTML). - * - * If @cite is %TRUE, the message will be cited as a reply, using "> "s. - * - * Return value: the HTML string, which the caller must free, or - * %NULL if @data doesn't include any data which should be forwarded or - * replied to. - **/ -char * -mail_get_message_body (CamelDataWrapper *data, gboolean want_plain, gboolean cite) -{ - CamelMultipart *mp; - CamelMimePart *subpart; - int i, nparts; - char *subtext, *old, *div; - char *text = NULL; - CamelContentType *mime_type; - - mime_type = camel_data_wrapper_get_mime_type_field (data); - - /* If it is message/rfc822 or message/news, extract the - * important headers and recursively process the body. - */ - if (header_content_type_is (mime_type, "message", "rfc822") || - header_content_type_is (mime_type, "message", "news")) - return mail_get_message_rfc822 (CAMEL_MIME_MESSAGE (data), want_plain, cite); - - /* If it's a vcard or icalendar, ignore it. */ - if (header_content_type_is (mime_type, "text", "x-vcard") || - header_content_type_is (mime_type, "text", "calendar")) - return NULL; - - /* Get the body data for other text/ or message/ types */ - if (header_content_type_is (mime_type, "text", "*") || - header_content_type_is (mime_type, "message", "*")) { - text = get_data_wrapper_text (data); - if (text && !header_content_type_is (mime_type, "text", "html")) { - char *html = e_text_to_html (text, E_TEXT_TO_HTML_PRE | (cite ? E_TEXT_TO_HTML_CITE : 0)); - g_free (text); - text = html; - } - return text; - } - - /* If it's not message and it's not text, and it's not - * multipart, we don't want to deal with it. - */ - if (!header_content_type_is (mime_type, "multipart", "*")) - return NULL; - - mp = CAMEL_MULTIPART (data); - - if (header_content_type_is (mime_type, "multipart", "alternative")) { - /* Pick our favorite alternative and reply to it. */ - - subpart = find_preferred_alternative (mp, want_plain); - if (!subpart) - return NULL; - - data = camel_medium_get_content_object (CAMEL_MEDIUM (subpart)); - return mail_get_message_body (data, want_plain, cite); - } - - /* Otherwise, concatenate all the parts that we can. */ - if (want_plain) { - if (cite) - div = "
    \n> ----
    \n>
    \n"; - else - div = "
    \n----
    \n
    \n"; - } else - div = "


    "; - - nparts = camel_multipart_get_number (mp); - for (i = 0; i < nparts; i++) { - subpart = camel_multipart_get_part (mp, i); - - data = camel_medium_get_content_object (CAMEL_MEDIUM (subpart)); - subtext = mail_get_message_body (data, want_plain, cite); - if (!subtext) - continue; - - if (text) { - old = text; - text = g_strdup_printf ("%s%s%s", old, div, subtext); - g_free (subtext); - g_free (old); - } else - text = subtext; - } - - return text; -} diff --git a/mail/mail-identify.c b/mail/mail-identify.c deleted file mode 100644 index e3a0eefb14..0000000000 --- a/mail/mail-identify.c +++ /dev/null @@ -1,123 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * Author : - * Dan Winship - * - * Copyright 2000, Ximian, Inc. (www.ximian.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include - -#include -#include -#include -#include "mail.h" - -static const char *identify_by_magic (CamelDataWrapper *data, MailDisplay *md); - -/** - * mail_identify_mime_part: - * @part: a CamelMimePart - * @md: the MailDisplay @part is being shown in - * - * Try to identify the MIME type of the data in @part (which presumably - * doesn't have a useful Content-Type). - * - * Return value: the MIME type, which the caller must free, or %NULL - * if it could not be identified. - **/ -char * -mail_identify_mime_part (CamelMimePart *part, MailDisplay *md) -{ - const char *filename, *name_type = NULL, *magic_type = NULL; - CamelDataWrapper *data; - - filename = camel_mime_part_get_filename (part); - if (filename) { - /* GNOME-VFS will misidentify TNEF attachments as MPEG */ - if (!strcmp (filename, "winmail.dat")) - return g_strdup ("application/vnd.ms-tnef"); - - name_type = gnome_vfs_mime_type_from_name_or_default (filename, NULL); - } - - data = camel_medium_get_content_object (CAMEL_MEDIUM (part)); - if (!camel_data_wrapper_is_offline (data)) - magic_type = identify_by_magic (data, md); - - /* If GNOME-VFS doesn't recognize the data by magic, but it - * contains English words, it will call it text/plain. If the - * filename-based check came up with something different, use - * that instead. - */ - if (magic_type && name_type && !strcmp (magic_type, "text/plain")) - return g_strdup (name_type); - - /* If the MIME part data was online, and the magic check - * returned something, use that, since it's more reliable. - */ - if (magic_type) - return g_strdup (magic_type); - - /* Otherwise try guessing based on the filename */ - if (name_type) - return g_strdup (name_type); - - /* Another possibility to try is the x-mac-type / x-mac-creator - * parameter to Content-Type used by some Mac email clients. That - * would require a Mac type to mime type conversion table. - */ - - /* If the data part is offline, then we didn't try magic - * before, so force it to be loaded so we can try again later. - * FIXME: In a perfect world, we would not load the content - * just to identify the MIME type. - */ - if (camel_data_wrapper_is_offline (data)) - mail_content_loaded (data, md, TRUE, NULL, NULL); - - return NULL; -} - -static const char * -identify_by_magic (CamelDataWrapper *data, MailDisplay *md) -{ - GnomeVFSMimeSniffBuffer *sniffer; - CamelStream *memstream; - const char *type; - GByteArray *ba; - - ba = g_byte_array_new (); - memstream = camel_stream_mem_new_with_byte_array (ba); - camel_data_wrapper_write_to_stream (data, memstream); - if (ba->len) { - sniffer = gnome_vfs_mime_sniff_buffer_new_from_memory (ba->data, ba->len); - type = gnome_vfs_get_mime_type_for_buffer (sniffer); - gnome_vfs_mime_sniff_buffer_free (sniffer); - } else - type = NULL; - camel_object_unref (CAMEL_OBJECT (memstream)); - - return type; -} diff --git a/mail/mail-importer.c b/mail/mail-importer.c deleted file mode 100644 index cfe7476ef2..0000000000 --- a/mail/mail-importer.c +++ /dev/null @@ -1,262 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* mail-importer.c - * - * Authors: Iain Holmes - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "mail-importer.h" -#include "mail-local.h" -#include "mail.h" - - -static GList *importer_modules = NULL; - -extern char *evolution_dir; - -static GNOME_Evolution_Storage local_storage = NULL; - -/* Prototype */ - -void mail_importer_uninit (void); - -/** - * mail_importer_create_folder: - * parent_path: The path of the parent folder. - * name: The name of the folder to be created. - * description: A description of the folder. - * listener: A BonoboListener for notification. - * - * Attempts to create the folder @parent_path/@name. When the folder has been - * created, or there is an error, the "evolution-shell:folder-created" event is - * emitted on @listener. The BonoboArg that is sent to @listener is a - * GNOME_Evolution_Storage_FolderResult which has two elements: result and path. - * Result contains the error code, or success, and path contains the complete - * physical path to the newly created folder. - */ -void -mail_importer_create_folder (const char *parent_path, - const char *name, - const char *description, - const BonoboListener *listener) -{ - Bonobo_Listener corba_listener; - CORBA_Environment ev; - char *path, *physical; - char *real_description; - - g_return_if_fail (local_storage != NULL); - g_return_if_fail (listener != NULL); - g_return_if_fail (BONOBO_IS_LISTENER (listener)); - - path = g_concat_dir_and_file (parent_path, name); - physical = g_strdup_printf ("file://%s/local/%s", evolution_dir, - parent_path); - - corba_listener = bonobo_object_corba_objref (BONOBO_OBJECT (listener)); - - /* Darn CORBA wanting non-NULL values for strings */ - real_description = CORBA_string_dup (description ? description : ""); - - - CORBA_exception_init (&ev); - GNOME_Evolution_Storage_asyncCreateFolder (local_storage, - path, "mail", - real_description, physical, - corba_listener, &ev); - CORBA_exception_free (&ev); - g_free (path); - g_free (physical); -} - -/** - * mail_importer_add_line: - * importer: A MailImporter structure. - * str: Next line of the mbox. - * finished: TRUE if @str is the last line of the message. - * - * Adds lines to the message until it is finished, and then adds - * the complete message to the folder. - */ -void -mail_importer_add_line (MailImporter *importer, - const char *str, - gboolean finished) -{ - CamelMimeMessage *msg; - CamelMessageInfo *info; - CamelException *ex; - - if (importer->mstream == NULL) { - importer->mstream = CAMEL_STREAM_MEM (camel_stream_mem_new ()); - } - - camel_stream_write (CAMEL_STREAM (importer->mstream), str, - strlen (str)); - - if (finished == FALSE) - return; - - camel_stream_reset (CAMEL_STREAM (importer->mstream)); - info = g_new0 (CamelMessageInfo, 1); - info->flags = CAMEL_MESSAGE_SEEN; - - msg = camel_mime_message_new (); - camel_data_wrapper_construct_from_stream (CAMEL_DATA_WRAPPER (msg), - CAMEL_STREAM (importer->mstream)); - - camel_object_unref (CAMEL_OBJECT (importer->mstream)); - importer->mstream = NULL; - - ex = camel_exception_new (); - camel_folder_append_message (importer->folder, msg, info, ex); - camel_object_unref (CAMEL_OBJECT (msg)); - - camel_exception_free (ex); - g_free (info); -} - -/* module management */ -static GList * -get_importer_list (void) -{ - DIR *dir; - struct dirent *d; - GList *importers_ret = NULL; - - dir = opendir (MAIL_IMPORTERSDIR); - if (!dir) { - g_warning ("No importers dir: %s", MAIL_IMPORTERSDIR); - return NULL; - } - - while ((d = readdir (dir))) { - char *path, *ext; - - ext = strchr (d->d_name, '.'); - if (!ext || strcmp (ext, ".so") != 0) - continue; - - path = g_concat_dir_and_file (MAIL_IMPORTERSDIR, d->d_name); - importers_ret = g_list_prepend (importers_ret, path); - } - - closedir (dir); - return importers_ret; -} - -static void -free_importer_list (GList *list) -{ - for (; list; list = list->next) { - g_free (list->data); - } - - g_list_free (list); -} - -/** - * mail_importer_init: - * - * Initialises all the importers - */ -void -mail_importer_init (EvolutionShellClient *client) -{ - GList *importers, *l; - - if (importer_modules != NULL) { - return; - } - - local_storage = evolution_shell_client_get_local_storage (client); - - if (!g_module_supported ()) { - g_warning ("Could not initialise the importers as module loading" - " is not supported on this system"); - return; - } - - importers = get_importer_list (); - if (importers == NULL) - return; - - for (l = importers; l; l = l->next) { - GModule *module; - - module = g_module_open (l->data, 0); - if (!module) { - g_warning ("Could not load: %s: %s", (char *) l->data, - g_module_error ()); - } else { - void *(*mail_importer_module_init) (); - - if (!g_module_symbol (module, "mail_importer_module_init", - (gpointer *)&mail_importer_module_init)) { - g_warning ("Could not load %s: No initialisation", - (char *) l->data); - g_module_close (module); - } - - mail_importer_module_init (); - importer_modules = g_list_prepend (importer_modules, module); - } - } - - free_importer_list (importers); -} - -/** - * mail_importer_uninit: - * - * Unloads all the modules. - */ -void -mail_importer_uninit (void) -{ - CORBA_Environment ev; - GList *l; - - for (l = importer_modules; l; l = l->next) { - g_module_close (l->data); - } - - g_list_free (importer_modules); - importer_modules = NULL; - - CORBA_exception_init (&ev); - bonobo_object_release_unref (local_storage, &ev); - local_storage = NULL; - CORBA_exception_free (&ev); -} - diff --git a/mail/mail-importer.h b/mail/mail-importer.h deleted file mode 100644 index 23b555d6b8..0000000000 --- a/mail/mail-importer.h +++ /dev/null @@ -1,50 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* mail-importer.h - * - * Authors: Iain Holmes - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __MAIL_IMPORTER_H__ -#define __MAIL_IMPORTER_H__ - -#include -#include -#include -#include - -typedef struct _MailImporter MailImporter; -struct _MailImporter { - CamelFolder *folder; - CamelStreamMem *mstream; - - gboolean frozen; /* Is folder frozen? */ -}; - -void mail_importer_init (EvolutionShellClient *client); -void mail_importer_uninit (void); - -void mail_importer_add_line (MailImporter *importer, - const char *str, - gboolean finished); -void mail_importer_create_folder (const char *parent_path, - const char *name, - const char *description, - const BonoboListener *listener); -#endif diff --git a/mail/mail-local.c b/mail/mail-local.c deleted file mode 100644 index c5b10fde0f..0000000000 --- a/mail/mail-local.c +++ /dev/null @@ -1,1128 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* mail-local.c: Local mailbox support. */ - -/* - * Authors: - * Michael Zucchi - * Peter Williams - * Ettore Perazzoli - * Dan Winship - * - * Copyright 2000 Ximian, Inc. (www.ximian.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include - -#include -#include -#include -#include - -#include "gal/widgets/e-gui-utils.h" -#include "e-util/e-path.h" - -#include "Evolution.h" -#include "evolution-storage.h" -#include "evolution-shell-component.h" -#include "evolution-storage-listener.h" - -#include "camel/camel.h" - -#include "mail.h" -#include "mail-local.h" -#include "mail-tools.h" -#include "folder-browser.h" -#include "mail-mt.h" -#include "mail-folder-cache.h" -#include "mail-vfolder.h" - -#define d(x) x - -/* ** MailLocalStore ** (protos) ************************************************** */ - -#define MAIL_LOCAL_STORE_TYPE (mail_local_store_get_type ()) -#define MAIL_LOCAL_STORE(obj) (CAMEL_CHECK_CAST((obj), MAIL_LOCAL_STORE_TYPE, MailLocalStore)) -#define MAIL_LOCAL_STORE_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), MAIL_LOCAL_STORE_TYPE, MailLocalStoreClass)) -#define MAIL_IS_LOCAL_STORE(o) (CAMEL_CHECK_TYPE((o), MAIL_LOCAL_STORE_TYPE)) - -typedef struct { - CamelStore parent_object; -} MailLocalStore; - -typedef struct { - CamelStoreClass parent_class; -} MailLocalStoreClass; - -static CamelType mail_local_store_get_type (void); - -/* ** MailLocalFolder ** (protos) ************************************************* */ - -#define MAIL_LOCAL_FOLDER_TYPE (mail_local_folder_get_type ()) -#define MAIL_LOCAL_FOLDER(obj) (CAMEL_CHECK_CAST((obj), MAIL_LOCAL_FOLDER_TYPE, MailLocalFolder)) -#define MAIL_LOCAL_FOLDER_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), MAIL_LOCAL_FOLDER_TYPE, MailLocalFolderClass)) -#define MAIL_IS_LOCAL_FOLDER(o) (CAMEL_CHECK_TYPE((o), MAIL_LOCAL_FOLDER_TYPE)) - -struct _local_meta { - char *path; /* path of metainfo */ - - char *format; /* format of mailbox */ - char *name; /* name of actual mbox */ - int indexed; /* is body indexed? */ -}; - -typedef struct { - CamelFolder parent_object; - - CamelFolder *real_folder; - CamelStore *real_store; - - struct _local_meta *meta; - - GMutex *real_folder_lock; /* no way to use the CamelFolder's lock, so... */ -} MailLocalFolder; - -typedef struct { - CamelFolderClass parent_class; -} MailLocalFolderClass; - -static CamelType mail_local_folder_get_type (void); - -#ifdef ENABLE_THREADS -#define LOCAL_FOLDER_LOCK(folder) (g_mutex_lock (((MailLocalFolder *)folder)->real_folder_lock)) -#define LOCAL_FOLDER_UNLOCK(folder) (g_mutex_unlock (((MailLocalFolder *)folder)->real_folder_lock)) -#else -#define LOCAL_FOLDER_LOCK(folder) -#define LOCAL_FOLDER_UNLOCK(folder) -#endif - -/* ** MailLocalFolder ************************************************************* */ - -static struct _local_meta * -load_metainfo(const char *path) -{ - xmlDocPtr doc; - xmlNodePtr node; - struct _local_meta *meta; - - d(printf("Loading folder metainfo from : %s\n", path)); - - meta = g_malloc0(sizeof(*meta)); - meta->path = g_strdup(path); - - doc = xmlParseFile(path); - if (doc == NULL) - goto dodefault; - - node = doc->root; - if (strcmp(node->name, "folderinfo")) - goto dodefault; - - node = node->childs; - while (node) { - if (!strcmp(node->name, "folder")) { - char *index, *txt; - - txt = xmlGetProp(node, "type"); - meta->format = g_strdup(txt?txt:"mbox"); - xmlFree(txt); - - txt = xmlGetProp(node, "name"); - meta->name = g_strdup(txt?txt:"mbox"); - xmlFree(txt); - - index = xmlGetProp(node, "index"); - if (index) { - meta->indexed = atoi(index); - xmlFree(index); - } else - meta->indexed = TRUE; - - } - node = node->next; - } - xmlFreeDoc(doc); - return meta; - - dodefault: - meta->format = g_strdup("mbox"); /* defaults */ - meta->name = g_strdup("mbox"); - meta->indexed = TRUE; - xmlFreeDoc(doc); - return meta; -} - -static void -free_metainfo(struct _local_meta *meta) -{ - g_free(meta->path); - g_free(meta->format); - g_free(meta->name); - g_free(meta); -} - -static gboolean -save_metainfo(struct _local_meta *meta) -{ - xmlDocPtr doc; - xmlNodePtr root, node; - int ret; - - d(printf("Saving folder metainfo to : %s\n", meta->path)); - - doc = xmlNewDoc("1.0"); - root = xmlNewDocNode(doc, NULL, "folderinfo", NULL); - xmlDocSetRootElement(doc, root); - - node = xmlNewChild(root, NULL, "folder", NULL); - xmlSetProp(node, "type", meta->format); - xmlSetProp(node, "name", meta->name); - xmlSetProp(node, "index", meta->indexed?"1":"0"); - - ret = xmlSaveFile(meta->path, doc); - xmlFreeDoc(doc); - - return ret; -} - -/* forward a bunch of functions to the real folder. This pretty - * much sucks but I haven't found a better way of doing it. - */ - -/* We need to do it without having locked our folder, otherwise - we can get sync hangs with vfolders/trash */ -static void -mlf_refresh_info(CamelFolder *folder, CamelException *ex) -{ - MailLocalFolder *mlf = MAIL_LOCAL_FOLDER(folder); - CamelFolder *f; - - LOCAL_FOLDER_LOCK(mlf); - f = mlf->real_folder; - camel_object_ref((CamelObject *)f); - LOCAL_FOLDER_UNLOCK(mlf); - - camel_folder_refresh_info(f, ex); - camel_object_unref((CamelObject *)f); -} - -static void -mlf_sync(CamelFolder *folder, gboolean expunge, CamelException *ex) -{ - MailLocalFolder *mlf = MAIL_LOCAL_FOLDER(folder); - CamelFolder *f; - - LOCAL_FOLDER_LOCK(mlf); - f = mlf->real_folder; - camel_object_ref((CamelObject *)f); - LOCAL_FOLDER_UNLOCK(mlf); - - camel_folder_sync(f, expunge, ex); - camel_object_unref((CamelObject *)f); -} - -static void -mlf_expunge(CamelFolder *folder, CamelException *ex) -{ - MailLocalFolder *mlf = MAIL_LOCAL_FOLDER(folder); - CamelFolder *f; - - LOCAL_FOLDER_LOCK(mlf); - f = mlf->real_folder; - camel_object_ref((CamelObject *)f); - LOCAL_FOLDER_UNLOCK(mlf); - - camel_folder_expunge(f, ex); - camel_object_unref((CamelObject *)f); -} - -static void -mlf_append_message(CamelFolder *folder, CamelMimeMessage *message, const CamelMessageInfo *info, CamelException *ex) -{ - MailLocalFolder *mlf = MAIL_LOCAL_FOLDER(folder); - CamelFolder *f; - - LOCAL_FOLDER_LOCK(mlf); - f = mlf->real_folder; - camel_object_ref((CamelObject *)f); - LOCAL_FOLDER_UNLOCK(mlf); - - camel_folder_append_message(f, message, info, ex); - camel_object_unref((CamelObject *)f); -} - -static CamelMimeMessage * -mlf_get_message(CamelFolder *folder, const char *uid, CamelException *ex) -{ - MailLocalFolder *mlf = MAIL_LOCAL_FOLDER(folder); - CamelMimeMessage *ret; - CamelFolder *f; - - LOCAL_FOLDER_LOCK(mlf); - f = mlf->real_folder; - camel_object_ref((CamelObject *)f); - LOCAL_FOLDER_UNLOCK(mlf); - - ret = camel_folder_get_message(f, uid, ex); - camel_object_unref((CamelObject *)f); - - return ret; -} - -static GPtrArray * -mlf_search_by_expression(CamelFolder *folder, const char *expression, CamelException *ex) -{ - MailLocalFolder *mlf = MAIL_LOCAL_FOLDER (folder); - GPtrArray *ret; - CamelFolder *f; - - LOCAL_FOLDER_LOCK(mlf); - f = mlf->real_folder; - camel_object_ref((CamelObject *)f); - LOCAL_FOLDER_UNLOCK(mlf); - - ret = camel_folder_search_by_expression(f, expression, ex); - camel_object_unref((CamelObject *)f); - - return ret; -} - -static void -mlf_search_free(CamelFolder *folder, GPtrArray *result) -{ - MailLocalFolder *mlf = MAIL_LOCAL_FOLDER(folder); - CamelFolder *f; - - LOCAL_FOLDER_LOCK(mlf); - f = mlf->real_folder; - camel_object_ref((CamelObject *)f); - LOCAL_FOLDER_UNLOCK(mlf); - - camel_folder_search_free(f, result); - camel_object_unref((CamelObject *)f); -} - -static void -mlf_set_message_user_flag(CamelFolder *folder, const char *uid, const char *name, gboolean value) -{ - MailLocalFolder *mlf = MAIL_LOCAL_FOLDER(folder); - CamelFolder *f; - - LOCAL_FOLDER_LOCK(mlf); - f = mlf->real_folder; - camel_object_ref((CamelObject *)f); - LOCAL_FOLDER_UNLOCK(mlf); - - camel_folder_set_message_user_flag(mlf->real_folder, uid, name, value); - camel_object_unref((CamelObject *)f); -} - -static void -mlf_set_message_user_tag(CamelFolder *folder, const char *uid, const char *name, const char *value) -{ - MailLocalFolder *mlf = MAIL_LOCAL_FOLDER(folder); - CamelFolder *f; - - LOCAL_FOLDER_LOCK(mlf); - f = mlf->real_folder; - camel_object_ref((CamelObject *)f); - LOCAL_FOLDER_UNLOCK(mlf); - - camel_folder_set_message_user_tag(mlf->real_folder, uid, name, value); - camel_object_unref((CamelObject *)f); -} - -/* and, conversely, forward the real folder's signals. */ - -static void -mlf_proxy_message_changed(CamelObject *real_folder, gpointer event_data, gpointer user_data) -{ - camel_object_trigger_event((CamelObject *)user_data, "message_changed", event_data); -} - -static void -mlf_proxy_folder_changed(CamelObject *real_folder, gpointer event_data, gpointer user_data) -{ - camel_object_trigger_event((CamelObject *)user_data, "folder_changed", event_data); -} - -static void -mlf_unset_folder (MailLocalFolder *mlf) -{ - CamelFolder *folder = (CamelFolder *)mlf; - - g_assert(mlf->real_folder); - - camel_object_unhook_event(CAMEL_OBJECT(mlf->real_folder), - "message_changed", - mlf_proxy_message_changed, - mlf); - camel_object_unhook_event(CAMEL_OBJECT(mlf->real_folder), - "folder_changed", - mlf_proxy_folder_changed, - mlf); - - camel_object_unref((CamelObject *)folder->summary); - folder->summary = NULL; - camel_object_unref((CamelObject *)mlf->real_folder); - mlf->real_folder = NULL; - camel_object_unref((CamelObject *)mlf->real_store); - mlf->real_store = NULL; - - folder->permanent_flags = 0; - folder->has_summary_capability = 0; - folder->has_search_capability = 0; -} - -static gboolean -mlf_set_folder(MailLocalFolder *mlf, guint32 flags, CamelException *ex) -{ - CamelFolder *folder = (CamelFolder *)mlf; - char *uri; - - g_assert(mlf->real_folder == NULL); - - uri = g_strdup_printf("%s:%s%s", mlf->meta->format, ((CamelService *)folder->parent_store)->url->path, folder->full_name); - d(printf("opening real store: %s\n", uri)); - mlf->real_store = camel_session_get_store(session, uri, ex); - g_free(uri); - if (mlf->real_store == NULL) - return FALSE; - - if (mlf->meta->indexed) - flags |= CAMEL_STORE_FOLDER_BODY_INDEX; - - mlf->real_folder = camel_store_get_folder(mlf->real_store, mlf->meta->name, flags, ex); - if (mlf->real_folder == NULL) - return FALSE; - - if (mlf->real_folder->has_summary_capability) { - folder->summary = mlf->real_folder->summary; - camel_object_ref((CamelObject *)mlf->real_folder->summary); - } - - folder->permanent_flags = mlf->real_folder->permanent_flags; - folder->has_summary_capability = mlf->real_folder->has_summary_capability; - folder->has_search_capability = mlf->real_folder->has_search_capability; - - camel_object_hook_event((CamelObject *)mlf->real_folder, "message_changed", mlf_proxy_message_changed, mlf); - camel_object_hook_event((CamelObject *)mlf->real_folder, "folder_changed", mlf_proxy_folder_changed, mlf); - - return TRUE; -} - -static void -mlf_class_init (CamelObjectClass *camel_object_class) -{ - CamelFolderClass *camel_folder_class = CAMEL_FOLDER_CLASS (camel_object_class); - - /* override all the functions subclassed in providers/local/ */ - - camel_folder_class->refresh_info = mlf_refresh_info; - camel_folder_class->sync = mlf_sync; - camel_folder_class->expunge = mlf_expunge; - camel_folder_class->append_message = mlf_append_message; - camel_folder_class->get_message = mlf_get_message; - camel_folder_class->search_free = mlf_search_free; - - camel_folder_class->search_by_expression = mlf_search_by_expression; - camel_folder_class->set_message_user_flag = mlf_set_message_user_flag; - camel_folder_class->set_message_user_tag = mlf_set_message_user_tag; -} - -static void -mlf_init (CamelObject *obj) -{ - MailLocalFolder *mlf = MAIL_LOCAL_FOLDER (obj); - -#ifdef ENABLE_THREADS - mlf->real_folder_lock = g_mutex_new(); -#endif -} - -static void -mlf_finalize (CamelObject *obj) -{ - MailLocalFolder *mlf = MAIL_LOCAL_FOLDER (obj); - - if (mlf->real_folder) - mlf_unset_folder(mlf); - - free_metainfo(mlf->meta); - -#ifdef ENABLE_THREADS - g_mutex_free (mlf->real_folder_lock); -#endif -} - -static CamelType -mail_local_folder_get_type (void) -{ - static CamelType mail_local_folder_type = CAMEL_INVALID_TYPE; - - if (mail_local_folder_type == CAMEL_INVALID_TYPE) { - mail_local_folder_type = camel_type_register(CAMEL_FOLDER_TYPE, - "MailLocalFolder", - sizeof (MailLocalFolder), - sizeof (MailLocalFolderClass), - mlf_class_init, - NULL, - mlf_init, - mlf_finalize); - } - - return mail_local_folder_type; -} - -static MailLocalFolder * -mail_local_folder_construct(MailLocalFolder *mlf, MailLocalStore *parent_store, const char *full_name, CamelException *ex) -{ - const char *name; - char *metapath; - - name = strrchr(full_name, '/'); - if (name == NULL) - name = full_name; - name = name + 1; - - d(printf("constructing local folder: full = %s, name = %s\n", full_name, name)); - - camel_folder_construct(CAMEL_FOLDER (mlf), CAMEL_STORE(parent_store), full_name, name); - - metapath = g_strdup_printf("%s/%s/local-metadata.xml", ((CamelService *)parent_store)->url->path, full_name); - mlf->meta = load_metainfo(metapath); - g_free(metapath); - - return mlf; -} - -static gboolean -mail_local_folder_reconfigure (MailLocalFolder *mlf, const char *new_format, CamelException *ex) -{ - CamelStore *fromstore = NULL; - CamelFolder *fromfolder = NULL; - char *oldformat = NULL; - char *tmpname; - char *store_uri; - GPtrArray *uids; - int real_folder_frozen = FALSE; - - camel_operation_start(NULL, _("Reconfiguring folder")); - - /* first things first */ - g_assert (ex); - LOCAL_FOLDER_LOCK (mlf); - - /* first, 'close' the old folder */ - if (mlf->real_folder) { - camel_folder_sync(mlf->real_folder, FALSE, ex); - if (camel_exception_is_set (ex)) - goto cleanup; - mlf_unset_folder(mlf); - } - - store_uri = g_strdup_printf("%s:%s%s", mlf->meta->format, - ((CamelService *)((CamelFolder *)mlf)->parent_store)->url->path, ((CamelFolder *)mlf)->full_name); - fromstore = camel_session_get_store(session, store_uri, ex); - g_free(store_uri); - if (fromstore == NULL) - goto cleanup; - - oldformat = mlf->meta->format; - mlf->meta->format = g_strdup(new_format); - - /* rename the old mbox and open it again, without indexing */ - tmpname = g_strdup_printf ("%s_reconfig", mlf->meta->name); - d(printf("renaming %s to %s, and opening it\n", mlf->meta->name, tmpname)); - - camel_store_rename_folder(fromstore, mlf->meta->name, tmpname, ex); - if (camel_exception_is_set(ex)) - goto cleanup; - - /* we dont need to set the create flag ... or need an index if it has one */ - fromfolder = camel_store_get_folder(fromstore, tmpname, 0, ex); - if (fromfolder == NULL || camel_exception_is_set(ex)) { - /* try and recover ... */ - camel_exception_clear(ex); - camel_store_rename_folder(fromstore, tmpname, mlf->meta->name, ex); - goto cleanup; - } - - /* create a new mbox */ - d(printf("Creating the destination mbox\n")); - - if (!mlf_set_folder(mlf, CAMEL_STORE_FOLDER_CREATE, ex)) { - d(printf("cannot open destination folder\n")); - /* try and recover ... */ - camel_exception_clear(ex); - camel_store_rename_folder(fromstore, tmpname, mlf->meta->name, ex); - goto cleanup; - } - - real_folder_frozen = TRUE; - camel_folder_freeze(mlf->real_folder); - - uids = camel_folder_get_uids(fromfolder); - camel_folder_move_messages_to(fromfolder, uids, mlf->real_folder, ex); - camel_folder_free_uids(fromfolder, uids); - if (camel_exception_is_set(ex)) - goto cleanup; - - camel_folder_expunge(fromfolder, ex); - - d(printf("delete old mbox ...\n")); - camel_object_unref(CAMEL_OBJECT(fromfolder)); - fromfolder = NULL; - camel_store_delete_folder(fromstore, tmpname, ex); - - /* switch format */ - g_free(oldformat); - oldformat = NULL; - if (save_metainfo(mlf->meta) == FALSE) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Cannot save folder metainfo; " - "you'll probably find you can't\n" - "open this folder anymore: %s: %s"), - mlf->meta->path, strerror(errno)); - } - - cleanup: - if (oldformat) { - g_free(mlf->meta->format); - mlf->meta->format = oldformat; - } - if (mlf->real_folder == NULL) - mlf_set_folder (mlf, CAMEL_STORE_FOLDER_CREATE, ex); - if (fromfolder) - camel_object_unref((CamelObject *)fromfolder); - if (fromstore) - camel_object_unref((CamelObject *)fromstore); - - LOCAL_FOLDER_UNLOCK (mlf); - - if (real_folder_frozen) - camel_folder_thaw(mlf->real_folder); - - camel_operation_end(NULL); - - return !camel_exception_is_set(ex); -} - -/* ******************************************************************************** */ - -static CamelObjectClass *local_store_parent_class = NULL; - -static CamelFolder * -mls_get_folder(CamelStore *store, const char *folder_name, guint32 flags, CamelException *ex) -{ - MailLocalStore *local_store = MAIL_LOCAL_STORE (store); - MailLocalFolder *folder; - char *physical_uri; - - d(printf("get_folder: %s", folder_name)); - - folder = (MailLocalFolder *)camel_object_new(MAIL_LOCAL_FOLDER_TYPE); - folder = mail_local_folder_construct(folder, local_store, folder_name, ex); - if (folder == NULL) - return NULL; - - if (!mlf_set_folder(folder, flags, ex)) { - camel_object_unref(CAMEL_OBJECT(folder)); - return NULL; - } - - if (flags & CAMEL_STORE_FOLDER_CREATE) { - if (save_metainfo(folder->meta) == -1) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Cannot save folder metainfo to %s: %s"), - folder->meta->path, strerror(errno)); - camel_object_unref(CAMEL_OBJECT (folder)); - return NULL; - } - } - - /* FIXME: why is this here? */ - physical_uri = g_strdup_printf("file://%s/%s", ((CamelService *)store)->url->path, folder_name); - mail_folder_cache_note_folder(physical_uri, CAMEL_FOLDER (folder)); - g_free(physical_uri); - - return (CamelFolder *)folder; -} - -static void -mls_delete_folder(CamelStore *store, const char *folder_name, CamelException *ex) -{ - CamelStore *real_store; - char *metapath, *uri; - CamelException local_ex; - struct _local_meta *meta; - - d(printf("Deleting folder: %s %s\n", ((CamelService *)store)->url->path, folder_name)); - - camel_exception_init(&local_ex); - - /* find the real store for this folder, and proxy the call */ - metapath = g_strdup_printf("%s%s/local-metadata.xml", ((CamelService *)store)->url->path, folder_name); - meta = load_metainfo(metapath); - uri = g_strdup_printf("%s:%s%s", meta->format, ((CamelService *)store)->url->path, folder_name); - real_store = (CamelStore *)camel_session_get_service(session, uri, CAMEL_PROVIDER_STORE, ex); - g_free(uri); - if (real_store == NULL) { - g_free(metapath); - free_metainfo(meta); - return; - } - - camel_store_delete_folder(real_store, meta->name, &local_ex); - if (camel_exception_is_set(&local_ex)) { - camel_exception_xfer(ex, &local_ex); - g_free(metapath); - free_metainfo(meta); - return; - } - - free_metainfo(meta); - - if (unlink(metapath) == -1) { - camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Cannot delete folder metadata %s: %s"), - metapath, strerror(errno)); - } - - g_free(metapath); -} - -static char * -mls_get_name (CamelService *service, gboolean brief) -{ - if (brief) - return g_strdup("local"); - - return g_strdup("Local mail folders"); -} - -static void -mls_class_init (CamelObjectClass *camel_object_class) -{ - CamelStoreClass *camel_store_class = CAMEL_STORE_CLASS(camel_object_class); - CamelServiceClass *camel_service_class = CAMEL_SERVICE_CLASS(camel_object_class); - - /* virtual method overload -- the bare minimum */ - camel_service_class->get_name = mls_get_name; - camel_store_class->get_folder = mls_get_folder; - camel_store_class->delete_folder = mls_delete_folder; - - local_store_parent_class = camel_type_get_global_classfuncs (CAMEL_STORE_TYPE); -} - -static CamelType -mail_local_store_get_type (void) -{ - static CamelType mail_local_store_type = CAMEL_INVALID_TYPE; - - if (mail_local_store_type == CAMEL_INVALID_TYPE) { - mail_local_store_type = camel_type_register ( - CAMEL_STORE_TYPE, "MailLocalStore", - sizeof (MailLocalStore), - sizeof (MailLocalStoreClass), - (CamelObjectClassInitFunc) mls_class_init, - NULL, - NULL, - NULL); - } - - return mail_local_store_type; -} - -/* ** Local Provider ************************************************************** */ - -static CamelProvider local_provider = { - "file", "Local mail", NULL, "mail", - CAMEL_PROVIDER_IS_STORAGE, CAMEL_URL_NEED_PATH, - /* ... */ -}; - -/* There's only one "file:" store. */ -static guint -non_hash (gconstpointer key) -{ - return 0; -} - -static gint -non_equal (gconstpointer a, gconstpointer b) -{ - return TRUE; -} - -static void -mail_local_provider_init (void) -{ - /* Register with Camel to handle file: URLs */ - local_provider.object_types[CAMEL_PROVIDER_STORE] = MAIL_LOCAL_STORE_TYPE; - - local_provider.service_cache = g_hash_table_new (non_hash, non_equal); - camel_session_register_provider (session, &local_provider); -} - -/* ** Local Storage Listener ****************************************************** */ - -static void -local_storage_destroyed_cb (EvolutionStorageListener *storage_listener, - void *data) -{ - CORBA_Environment ev; - - CORBA_exception_init (&ev); - bonobo_object_release_unref (data, &ev); - CORBA_exception_free (&ev); -} - - -static void -local_storage_new_folder_cb (EvolutionStorageListener *storage_listener, - const char *path, - const GNOME_Evolution_Folder *folder, - void *data) -{ - if (strcmp (folder->type, "mail") != 0) - return; - - mail_folder_cache_set_update_lstorage (folder->physicalUri, - data, - path); - mail_folder_cache_note_name (folder->physicalUri, folder->displayName); -} - -#if 0 -static void -local_storage_removed_folder_cb (EvolutionStorageListener *storage_listener, - const char *path, - void *data) -{ - if (strcmp (folder->type, "mail") != 0) - return; - - /* anything to do? */ -} -#endif - -static void -storage_listener_startup (EvolutionShellClient *shellclient) -{ - EvolutionStorageListener *local_storage_listener; - GNOME_Evolution_StorageListener corba_local_storage_listener; - GNOME_Evolution_Storage corba_storage; - CORBA_Environment ev; - - corba_storage = evolution_shell_client_get_local_storage (shellclient); - if (corba_storage == CORBA_OBJECT_NIL) { - g_warning ("No local storage available from shell client!"); - return; - } - - local_storage_listener = evolution_storage_listener_new (); - corba_local_storage_listener = evolution_storage_listener_corba_objref ( - local_storage_listener); - - gtk_signal_connect (GTK_OBJECT (local_storage_listener), - "destroyed", - GTK_SIGNAL_FUNC (local_storage_destroyed_cb), - corba_storage); - gtk_signal_connect (GTK_OBJECT (local_storage_listener), - "new_folder", - GTK_SIGNAL_FUNC (local_storage_new_folder_cb), - corba_storage); - /*gtk_signal_connect (GTK_OBJECT (local_storage_listener), - * "removed_folder", - * GTK_SIGNAL_FUNC (local_storage_removed_folder_cb), - * corba_storage); - */ - - CORBA_exception_init (&ev); - GNOME_Evolution_Storage_addListener (corba_storage, - corba_local_storage_listener, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("Cannot add a listener to the Local Storage."); - CORBA_exception_free (&ev); - return; - } - CORBA_exception_free (&ev); -} - -/* ** The rest ******************************************************************** */ - -static MailLocalStore *global_local_store; - -void -mail_local_storage_startup (EvolutionShellClient *shellclient, const char *evolution_path) -{ - mail_local_provider_init (); - - global_local_store = MAIL_LOCAL_STORE(camel_session_get_service (session, "file:/", CAMEL_PROVIDER_STORE, NULL)); - - if (!global_local_store) { - g_warning ("No local store!"); - return; - } - - storage_listener_startup (shellclient); -} - - -/*---------------------------------------------------------------------- - * Local folder reconfiguration stuff - *----------------------------------------------------------------------*/ - -/* - open new - copy old->new - close old - rename old oldsave - rename new old - open oldsave - delete oldsave - - close old - rename oldtmp - open new - open oldtmp - copy oldtmp new - close oldtmp - close oldnew - -*/ - -/* we should have our own progress bar for this */ - -struct _reconfigure_msg { - struct _mail_msg msg; - - FolderBrowser *fb; - char *newtype; - GtkWidget *frame; - GtkWidget *apply; - GtkWidget *cancel; - GtkOptionMenu *optionlist; - CamelFolder *folder_out; -}; - -static char * -reconfigure_folder_describe (struct _mail_msg *mm, int done) -{ - struct _reconfigure_msg *m = (struct _reconfigure_msg *)mm; - - return g_strdup_printf (_("Changing folder \"%s\" to \"%s\" format"), - m->fb->uri, - m->newtype); -} - -static void -reconfigure_folder_reconfigure (struct _mail_msg *mm) -{ - struct _reconfigure_msg *m = (struct _reconfigure_msg *)mm; - CamelFolder *local_folder = NULL; - - d(printf("reconfiguring folder: %s to type %s\n", m->fb->uri, m->newtype)); - - if (strncmp (m->fb->uri, "file:", 5)) { - camel_exception_setv (&mm->ex, CAMEL_EXCEPTION_SERVICE_UNAVAILABLE, - _("%s may not be reconfigured because it is not a local folder"), - m->fb->uri); - return; - } - - local_folder = mail_tool_uri_to_folder (m->fb->uri, &mm->ex); - if (camel_exception_is_set (&mm->ex)) { - g_warning ("Can't resolve URI \"%s\" for reconfiguration!", m->fb->uri); - return; - } - - mail_local_folder_reconfigure (MAIL_LOCAL_FOLDER (local_folder), m->newtype, &mm->ex); - m->folder_out = local_folder; -} - -static void -reconfigure_folder_reconfigured (struct _mail_msg *mm) -{ - struct _reconfigure_msg *m = (struct _reconfigure_msg *)mm; - /*char *uri;*/ - - if (camel_exception_is_set (&mm->ex)) { - gnome_error_dialog (_("If you can no longer open this mailbox, then\n" - "you may need to repair it manually.")); - } - - message_list_set_folder (m->fb->message_list, m->folder_out, FALSE); -} - -static void -reconfigure_folder_free (struct _mail_msg *mm) -{ - struct _reconfigure_msg *m = (struct _reconfigure_msg *)mm; - - camel_object_unref (CAMEL_OBJECT (m->folder_out)); - gtk_object_unref (GTK_OBJECT (m->fb)); - g_free (m->newtype); -} - -static struct _mail_msg_op reconfigure_folder_op = { - reconfigure_folder_describe, - reconfigure_folder_reconfigure, - reconfigure_folder_reconfigured, - reconfigure_folder_free, -}; - -/* hash table of folders that the user has a reconfig-folder dialog for */ -static GHashTable *reconfigure_folder_hash = NULL; - -static void -reconfigure_clicked (GnomeDialog *dialog, int button, struct _reconfigure_msg *m) -{ - if (button == 0) { - GtkWidget *menu, *item; - - /* hack to clear the message list during update */ - /* we need to do this because the message list caches - * CamelMessageInfos from the old folder. */ - message_list_set_folder(m->fb->message_list, NULL, FALSE); - - menu = gtk_option_menu_get_menu(m->optionlist); - item = gtk_menu_get_active(GTK_MENU(menu)); - m->newtype = g_strdup(gtk_object_get_data((GtkObject *)item, "type")); - - gtk_widget_set_sensitive (m->frame, FALSE); - gtk_widget_set_sensitive (m->apply, FALSE); - gtk_widget_set_sensitive (m->cancel, FALSE); - - e_thread_put (mail_thread_queued, (EMsg *)m); - } else - mail_msg_free ((struct _mail_msg *)m); - - if (button != -1) { - /* remove this folder from our hash since we are done with it */ - g_hash_table_remove (reconfigure_folder_hash, m->fb->folder); - if (g_hash_table_size (reconfigure_folder_hash) == 0) { - /* additional cleanup */ - g_hash_table_destroy (reconfigure_folder_hash); - reconfigure_folder_hash = NULL; - } - - gnome_dialog_close (dialog); - } -} - -void -mail_local_reconfigure_folder (FolderBrowser *fb) -{ - GladeXML *gui; - GnomeDialog *gd; - struct _reconfigure_msg *m; - char *name, *title; - GList *p; - GtkWidget *menu; - char *currentformat; - int index=0, history=0; - - if (fb->folder == NULL) { - g_warning ("Trying to reconfigure nonexistant folder"); - return; - } - - if (!reconfigure_folder_hash) - reconfigure_folder_hash = g_hash_table_new (NULL, NULL); - - if ((gd = g_hash_table_lookup (reconfigure_folder_hash, fb->folder))) { - gdk_window_raise (GTK_WIDGET (gd)->window); - return; - } - - /* check if we can work on this folder */ - if (!MAIL_IS_LOCAL_FOLDER (fb->folder)) { - e_notice (NULL, GNOME_MESSAGE_BOX_WARNING, - _("You cannot change the format of a non-local folder.")); - return; - } - - m = mail_msg_new (&reconfigure_folder_op, NULL, sizeof (*m)); - - gui = glade_xml_new (EVOLUTION_GLADEDIR "/local-config.glade", "dialog_format"); - gd = (GnomeDialog *)glade_xml_get_widget (gui, "dialog_format"); - - name = mail_tool_get_folder_name (fb->folder); - title = g_strdup_printf (_("Reconfigure %s"), name); - gtk_window_set_title (GTK_WINDOW (gd), title); - g_free (title); - g_free (name); - - m->frame = glade_xml_get_widget (gui, "frame_format"); - m->apply = glade_xml_get_widget (gui, "apply_format"); - m->cancel = glade_xml_get_widget (gui, "cancel_format"); - m->optionlist = (GtkOptionMenu *)glade_xml_get_widget (gui, "option_format"); - m->newtype = NULL; - m->fb = fb; - m->folder_out = NULL; - gtk_object_ref (GTK_OBJECT (fb)); - - /* dynamically create the folder type list from camel */ - /* we assume the list is static and never freed */ - currentformat = MAIL_LOCAL_FOLDER (fb->folder)->meta->format; - p = camel_session_list_providers(session, TRUE); - menu = gtk_menu_new(); - while (p) { - CamelProvider *cp = p->data; - - /* we only want local storages */ - /* hack it so we also dont see file or spool stores, which aren't really meant for this */ - if ((cp->flags & (CAMEL_PROVIDER_IS_REMOTE|CAMEL_PROVIDER_IS_STORAGE)) == CAMEL_PROVIDER_IS_STORAGE - && strcmp(cp->protocol, "file") - && strcmp(cp->protocol, "spool")) { - GtkWidget *item; - char *label; - - if (strcmp(cp->protocol, currentformat) == 0) - history = index; - - label = g_strdup_printf("%s (%s)", cp->protocol, _(cp->name)); - item = gtk_menu_item_new_with_label(label); - g_free(label); - gtk_object_set_data((GtkObject *)item, "type", cp->protocol); - gtk_widget_show(item); - gtk_menu_append(GTK_MENU(menu), item); - index++; - } - p = p->next; - } - gtk_option_menu_remove_menu (GTK_OPTION_MENU(m->optionlist)); - gtk_option_menu_set_menu (GTK_OPTION_MENU(m->optionlist), menu); - gtk_option_menu_set_history(GTK_OPTION_MENU(m->optionlist), history); - - gtk_label_set_text ((GtkLabel *)glade_xml_get_widget (gui, "label_format"), - MAIL_LOCAL_FOLDER (fb->folder)->meta->format); - - gtk_signal_connect (GTK_OBJECT (gd), "clicked", reconfigure_clicked, m); - gtk_object_unref (GTK_OBJECT (gui)); - - g_hash_table_insert (reconfigure_folder_hash, (gpointer) fb->folder, (gpointer) gd); - - gnome_dialog_run (GNOME_DIALOG (gd)); -} diff --git a/mail/mail-local.h b/mail/mail-local.h deleted file mode 100644 index 54950a38b3..0000000000 --- a/mail/mail-local.h +++ /dev/null @@ -1,38 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* mail-local.h: Local mailbox support. */ - -/* - * Authors: - * Michael Zucchi - * Dan Winship - * - * Copyright 2000 Ximian, Inc. (www.ximian.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef _MAIL_LOCAL_H -#define _MAIL_LOCAL_H - -#include "evolution-shell-client.h" -#include "folder-browser.h" - -void mail_local_storage_startup (EvolutionShellClient *shellclient, - const char *evolution_path); - -void mail_local_reconfigure_folder (FolderBrowser *fb); - -#endif diff --git a/mail/mail-mt.c b/mail/mail-mt.c deleted file mode 100644 index 99277d56b4..0000000000 --- a/mail/mail-mt.c +++ /dev/null @@ -1,902 +0,0 @@ -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "folder-browser-factory.h" -#include "e-util/e-msgport.h" -#include "camel/camel-operation.h" - -#include "evolution-activity-client.h" - -#include "mail-config.h" -#include "camel/camel-url.h" -#include "mail-mt.h" - -/*#define MALLOC_CHECK*/ -#define d(x) - -static void set_stop(int sensitive); -static void mail_enable_stop(void); -static void mail_disable_stop(void); -static void mail_operation_status(struct _CamelOperation *op, const char *what, int pc, void *data); - -#define MAIL_MT_LOCK(x) pthread_mutex_lock(&x) -#define MAIL_MT_UNLOCK(x) pthread_mutex_unlock(&x) - -extern EvolutionShellClient *global_shell_client; - -/* background operation status stuff */ -struct _mail_msg_priv { - int activity_state; /* sigh sigh sigh, we need to keep track of the state external to the - pointer itself for locking/race conditions */ - EvolutionActivityClient *activity; -}; - -/* This is used for the mail status bar, cheap and easy */ -#include "art/mail-new.xpm" - -static GdkPixbuf *progress_icon[2] = { NULL, NULL }; - -/* mail_msg stuff */ -static unsigned int mail_msg_seq; /* sequence number of each message */ -static GHashTable *mail_msg_active; /* table of active messages, must hold mail_msg_lock to access */ -static pthread_mutex_t mail_msg_lock = PTHREAD_MUTEX_INITIALIZER; -static pthread_cond_t mail_msg_cond = PTHREAD_COND_INITIALIZER; - -pthread_t mail_gui_thread; - -static void mail_msg_destroy(EThread *e, EMsg *msg, void *data); - -void *mail_msg_new(mail_msg_op_t *ops, EMsgPort *reply_port, size_t size) -{ - struct _mail_msg *msg; - - MAIL_MT_LOCK(mail_msg_lock); - - msg = g_malloc0(size); - msg->ops = ops; - msg->seq = mail_msg_seq++; - msg->msg.reply_port = reply_port; - msg->cancel = camel_operation_new(mail_operation_status, (void *)msg->seq); - camel_exception_init(&msg->ex); - msg->priv = g_malloc0(sizeof(*msg->priv)); - - g_hash_table_insert(mail_msg_active, (void *)msg->seq, msg); - - d(printf("New message %p\n", msg)); - - MAIL_MT_UNLOCK(mail_msg_lock); - - return msg; -} - -/* either destroy the progress (in event_data), or the whole dialogue (in data) */ -static void destroy_objects(CamelObject *o, void *event_data, void *data) -{ - if (event_data) - gtk_object_unref(event_data); -} - -#ifdef MALLOC_CHECK -#include - -static void -checkmem(void *p) -{ - if (p) { - int status = mprobe(p); - - switch (status) { - case MCHECK_HEAD: - printf("Memory underrun at %p\n", p); - abort(); - case MCHECK_TAIL: - printf("Memory overrun at %p\n", p); - abort(); - case MCHECK_FREE: - printf("Double free %p\n", p); - abort(); - } - } -} -#endif - -void mail_msg_free(void *msg) -{ - struct _mail_msg *m = msg; - void *activity = NULL; - -#ifdef MALLOC_CHECK - checkmem(m); - checkmem(m->cancel); - checkmem(m->priv); -#endif - d(printf("Free message %p\n", msg)); - - if (m->ops->destroy_msg) - m->ops->destroy_msg(m); - - MAIL_MT_LOCK(mail_msg_lock); - - g_hash_table_remove(mail_msg_active, (void *)m->seq); - pthread_cond_broadcast(&mail_msg_cond); - - /* We need to make sure we dont lose a reference here YUCK YUCK */ - /* This is tightly integrated with the code in do_op_status, - as it closely relates to the CamelOperation setup in msg_new() above */ - if (m->priv->activity_state == 1) { - m->priv->activity_state = 3; /* tell the other thread - * to free it itself (yuck yuck) */ - MAIL_MT_UNLOCK(mail_msg_lock); - return; - } else { - activity = m->priv->activity; - } - - MAIL_MT_UNLOCK(mail_msg_lock); - - camel_operation_unref(m->cancel); - camel_exception_clear(&m->ex); - /*g_free(m->priv->what);*/ - g_free(m->priv); - g_free(m); - - if (activity) - mail_proxy_event(destroy_objects, NULL, activity, NULL); -} - -void mail_msg_check_error(void *msg) -{ - struct _mail_msg *m = msg; - char *what = NULL; - char *text; - GnomeDialog *gd; - -#ifdef MALLOC_CHECK - checkmem(m); - checkmem(m->cancel); - checkmem(m->priv); -#endif - - if (!camel_exception_is_set(&m->ex) - || m->ex.id == CAMEL_EXCEPTION_USER_CANCEL) - return; - - if (m->ops->describe_msg) - what = m->ops->describe_msg(m, FALSE); - - if (what) { - text = g_strdup_printf(_("Error while '%s':\n%s"), what, camel_exception_get_description(&m->ex)); - g_free (what); - } else - text = g_strdup_printf(_("Error while performing operation:\n%s"), camel_exception_get_description(&m->ex)); - - gd = (GnomeDialog *)gnome_error_dialog(text); - gnome_dialog_run_and_close(gd); - g_free(text); -} - -void mail_msg_cancel(unsigned int msgid) -{ - struct _mail_msg *m; - - MAIL_MT_LOCK(mail_msg_lock); - m = g_hash_table_lookup(mail_msg_active, (void *)msgid); - - if (m) - camel_operation_cancel(m->cancel); - - MAIL_MT_UNLOCK(mail_msg_lock); -} - - -/* waits for a message to be finished processing (freed) - the messageid is from struct _mail_msg->seq */ -void mail_msg_wait(unsigned int msgid) -{ - struct _mail_msg *m; - int ismain = pthread_self() == mail_gui_thread; - - if (ismain) { - MAIL_MT_LOCK(mail_msg_lock); - m = g_hash_table_lookup(mail_msg_active, (void *)msgid); - while (m) { - MAIL_MT_UNLOCK(mail_msg_lock); - gtk_main_iteration(); - MAIL_MT_LOCK(mail_msg_lock); - m = g_hash_table_lookup(mail_msg_active, (void *)msgid); - } - MAIL_MT_UNLOCK(mail_msg_lock); - } else { - MAIL_MT_LOCK(mail_msg_lock); - m = g_hash_table_lookup(mail_msg_active, (void *)msgid); - while (m) { - pthread_cond_wait(&mail_msg_cond, &mail_msg_lock); - m = g_hash_table_lookup(mail_msg_active, (void *)msgid); - } - MAIL_MT_UNLOCK(mail_msg_lock); - } -} - -EMsgPort *mail_gui_port; -static GIOChannel *mail_gui_channel; -EMsgPort *mail_gui_reply_port; -static GIOChannel *mail_gui_reply_channel; - -/* a couple of global threads available */ -EThread *mail_thread_queued; /* for operations that can (or should) be queued */ -EThread *mail_thread_new; /* for operations that should run in a new thread each time */ - -static gboolean -mail_msgport_replied(GIOChannel *source, GIOCondition cond, void *d) -{ - EMsgPort *port = (EMsgPort *)d; - mail_msg_t *m; - - while (( m = (mail_msg_t *)e_msgport_get(port))) { - -#ifdef MALLOC_CHECK - checkmem(m); - checkmem(m->cancel); - checkmem(m->priv); -#endif - - if (m->ops->reply_msg) - m->ops->reply_msg(m); - mail_msg_check_error(m); - mail_msg_free(m); - } - - return TRUE; -} - -static gboolean -mail_msgport_received(GIOChannel *source, GIOCondition cond, void *d) -{ - EMsgPort *port = (EMsgPort *)d; - mail_msg_t *m; - - while (( m = (mail_msg_t *)e_msgport_get(port))) { -#ifdef MALLOC_CHECK - checkmem(m); - checkmem(m->cancel); - checkmem(m->priv); -#endif - - if (m->ops->receive_msg) - m->ops->receive_msg(m); - if (m->msg.reply_port) - e_msgport_reply((EMsg *)m); - else { - if (m->ops->reply_msg) - m->ops->reply_msg(m); - mail_msg_free(m); - } - } - - return TRUE; -} - -static void -mail_msg_destroy(EThread *e, EMsg *msg, void *data) -{ - mail_msg_t *m = (mail_msg_t *)msg; - -#ifdef MALLOC_CHECK - checkmem(m); - checkmem(m->cancel); - checkmem(m->priv); -#endif - - mail_msg_free(m); -} - -static void -mail_msg_received(EThread *e, EMsg *msg, void *data) -{ - mail_msg_t *m = (mail_msg_t *)msg; - -#ifdef MALLOC_CHECK - checkmem(m); - checkmem(m->cancel); - checkmem(m->priv); -#endif - - if (m->ops->describe_msg) { - char *text = m->ops->describe_msg(m, FALSE); - - d(printf("message received at thread\n")); - camel_operation_register(m->cancel); - camel_operation_start(m->cancel, "%s", text); - g_free(text); - } - - if (m->ops->receive_msg) { - mail_enable_stop(); - m->ops->receive_msg(m); - mail_disable_stop(); - } - - if (m->ops->describe_msg) { - camel_operation_end(m->cancel); - camel_operation_unregister(m->cancel); - } -} - -static void mail_msg_cleanup(void) -{ - e_thread_destroy(mail_thread_queued); - e_thread_destroy(mail_thread_new); - - e_msgport_destroy(mail_gui_port); - e_msgport_destroy(mail_gui_reply_port); - - /* FIXME: channels too, etc */ -} - -void mail_msg_init(void) -{ - mail_gui_reply_port = e_msgport_new(); - mail_gui_reply_channel = g_io_channel_unix_new(e_msgport_fd(mail_gui_reply_port)); - g_io_add_watch(mail_gui_reply_channel, G_IO_IN, mail_msgport_replied, mail_gui_reply_port); - - mail_gui_port = e_msgport_new(); - mail_gui_channel = g_io_channel_unix_new(e_msgport_fd(mail_gui_port)); - g_io_add_watch(mail_gui_channel, G_IO_IN, mail_msgport_received, mail_gui_port); - - mail_thread_queued = e_thread_new(E_THREAD_QUEUE); - e_thread_set_msg_destroy(mail_thread_queued, mail_msg_destroy, 0); - e_thread_set_msg_received(mail_thread_queued, mail_msg_received, 0); - e_thread_set_reply_port(mail_thread_queued, mail_gui_reply_port); - - mail_thread_new = e_thread_new(E_THREAD_NEW); - e_thread_set_msg_destroy(mail_thread_new, mail_msg_destroy, 0); - e_thread_set_msg_received(mail_thread_new, mail_msg_received, 0); - e_thread_set_reply_port(mail_thread_new, mail_gui_reply_port); - - mail_msg_active = g_hash_table_new(NULL, NULL); - mail_gui_thread = pthread_self(); - - atexit(mail_msg_cleanup); -} - -/* ********************************************************************** */ - -/* locks */ -static pthread_mutex_t status_lock = PTHREAD_MUTEX_INITIALIZER; - -/* ********************************************************************** */ - -struct _pass_msg { - struct _mail_msg msg; - const char *prompt; - int secret; - char *result; - char *service_url; - GtkWidget *tb; -}; - -static void -pass_got (char *string, void *data) -{ - struct _pass_msg *m = data; - - if (string) { - const MailConfigAccount *mca; - gboolean remember; - - m->result = g_strdup (string); - - remember = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (m->tb)); - if (m->service_url) { - mca = mail_config_get_account_by_source_url (m->service_url); - if (mca) - mail_config_service_set_save_passwd (mca->source, remember); - else { - mca = mail_config_get_account_by_transport_url (m->service_url); - if (mca) - mail_config_service_set_save_passwd (mca->transport, remember); - else - printf ("Cannot figure out which account owns URL \"%s\" (could before?)\n", - m->service_url); - } - } - } -} - -static void -do_get_pass (struct _mail_msg *mm) -{ - struct _pass_msg *m = (struct _pass_msg *)mm; - const MailConfigAccount *mca; - GtkWidget *dialogue; - GtkWidget *tb, *entry; - GList *children, *iter; - - /* this api is just awful ... hence the hacks */ - dialogue = gnome_request_dialog (m->secret, m->prompt, NULL, - 0, pass_got, m, NULL); - - /* Remember the password? */ - tb = gtk_check_button_new_with_label (_("Remember this password")); - gtk_widget_show (tb); - - if (m->service_url) { - mca = mail_config_get_account_by_source_url (m->service_url); - if (mca) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tb), mca->source->save_passwd); - else { - mca = mail_config_get_account_by_transport_url (m->service_url); - if (mca) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tb), mca->transport->save_passwd); - else { - printf ("Cannot figure out which account owns URL \"%s\"\n", m->service_url); - gtk_widget_hide (tb); - } - } - } - - /* do some dirty stuff to put the checkbutton after the entry */ - entry = NULL; - children = gtk_container_children (GTK_CONTAINER (GNOME_DIALOG (dialogue)->vbox)); - - for (iter = children; iter; iter = iter->next) { - if (GTK_IS_ENTRY (iter->data)) { - entry = GTK_WIDGET (iter->data); - break; - } - } - - g_list_free (children); - - if (entry) { - gtk_object_ref (GTK_OBJECT (entry)); - gtk_container_remove (GTK_CONTAINER (GNOME_DIALOG (dialogue)->vbox), entry); - } - - gtk_box_pack_end (GTK_BOX (GNOME_DIALOG (dialogue)->vbox), - tb, TRUE, FALSE, 0); - - if (entry) { - gtk_box_pack_end (GTK_BOX (GNOME_DIALOG (dialogue)->vbox), entry, TRUE, FALSE, 0); - gtk_widget_grab_focus (entry); - gtk_object_unref (GTK_OBJECT (entry)); - } - - m->tb = tb; - - /* hrm, we can't run this async since the gui_port from which we're called - will reply to our message for us */ - - gtk_window_set_title (GTK_WINDOW(dialogue), "Enter Password"); - gnome_dialog_run_and_close ((GnomeDialog *)dialogue); - - /*gtk_widget_show(dialogue);*/ -} - -static void -do_free_pass(struct _mail_msg *mm) -{ - /*struct _pass_msg *m = (struct _pass_msg *)mm;*/ - - /* the string is passed out so we dont need to free it */ -} - -struct _mail_msg_op get_pass_op = { - NULL, - do_get_pass, - NULL, - do_free_pass, -}; - -/* returns the password, or NULL if cancelled */ -char * -mail_get_password (CamelService *service, const char *prompt, gboolean secret) -{ - char *ret; - struct _pass_msg *m, *r; - EMsgPort *pass_reply; - - pass_reply = e_msgport_new (); - - m = mail_msg_new (&get_pass_op, pass_reply, sizeof (struct _pass_msg)); - - m->prompt = prompt; - m->secret = secret; - if (service) { - m->service_url = camel_url_to_string (service->url, - CAMEL_URL_HIDE_PASSWORD | - CAMEL_URL_HIDE_PARAMS); - } else - m->service_url = NULL; - - if (pthread_self () == mail_gui_thread) { - do_get_pass ((struct _mail_msg *)m); - r = m; - } else { - static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; - - /* we want this single-threaded, this is the easiest way to do it without blocking ? */ - pthread_mutex_lock (&lock); - e_msgport_put (mail_gui_port, (EMsg *)m); - e_msgport_wait (pass_reply); - r = (struct _pass_msg *)e_msgport_get (pass_reply); - pthread_mutex_unlock (&lock); - } - - g_assert (r == m); - - ret = m->result; - - g_free (m->service_url); - mail_msg_free (m); - e_msgport_destroy (pass_reply); - - return ret; -} - -/* ******************** */ - -/* ********************************************************************** */ - -struct _user_message_msg { - struct _mail_msg msg; - const char *type; - const char *prompt; - gboolean allow_cancel; - gboolean result; -}; - -static void -do_user_message (struct _mail_msg *mm) -{ - struct _user_message_msg *m = (struct _user_message_msg *)mm; - GtkWidget *dialog; - - dialog = gnome_message_box_new (m->prompt, m->type, - m->allow_cancel ? GNOME_STOCK_BUTTON_CANCEL : GNOME_STOCK_BUTTON_OK, - m->allow_cancel ? GNOME_STOCK_BUTTON_OK: NULL, - NULL); - gnome_dialog_set_default (GNOME_DIALOG (dialog), 1); - gtk_window_set_policy (GTK_WINDOW (dialog), TRUE, TRUE, TRUE); - - /* hrm, we can't run this async since the gui_port from which we're called - will reply to our message for us */ - m->result = gnome_dialog_run_and_close (GNOME_DIALOG (dialog)) != 0; -} - -struct _mail_msg_op user_message_op = { - NULL, - do_user_message, - NULL, - NULL, -}; - -/* prompt the user with a yes/no question and return the response */ -gboolean -mail_user_message (const char *type, const char *prompt, gboolean allow_cancel) -{ - struct _user_message_msg *m, *r; - EMsgPort *user_message_reply; - gboolean accept; - - user_message_reply = e_msgport_new (); - - m = mail_msg_new (&user_message_op, user_message_reply, sizeof (*m)); - - m->type = type; - m->prompt = prompt; - m->allow_cancel = allow_cancel; - - if (pthread_self () == mail_gui_thread) { - do_user_message ((struct _mail_msg *)m); - r = m; - } else { - static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; - - /* we want this single-threaded, this is the easiest way to do it without blocking ? */ - pthread_mutex_lock (&lock); - e_msgport_put (mail_gui_port, (EMsg *)m); - e_msgport_wait (user_message_reply); - r = (struct _user_message_msg *)e_msgport_get (user_message_reply); - pthread_mutex_unlock (&lock); - } - - g_assert (r == m); - - accept = m->result; - - mail_msg_free (m); - e_msgport_destroy (user_message_reply); - - return accept; -} - -/* ******************** */ - -struct _proxy_msg { - struct _mail_msg msg; - CamelObjectEventHookFunc func; - CamelObject *o; - void *event_data; - void *data; -}; - -static void -do_proxy_event(struct _mail_msg *mm) -{ - struct _proxy_msg *m = (struct _proxy_msg *)mm; - - m->func(m->o, m->event_data, m->data); -} - -struct _mail_msg_op proxy_event_op = { - NULL, - do_proxy_event, - NULL, - NULL, -}; - -int mail_proxy_event(CamelObjectEventHookFunc func, CamelObject *o, void *event_data, void *data) -{ - struct _proxy_msg *m; - int id; - int ismain = pthread_self() == mail_gui_thread; - - if (ismain) { - func(o, event_data, data); - /* id of -1 is 'always finished' */ - return -1; - } else { - /* we dont have a reply port for this, we dont care when/if it gets executed, just queue it */ - m = mail_msg_new(&proxy_event_op, NULL, sizeof(*m)); - m->func = func; - m->o = o; - m->event_data = event_data; - m->data = data; - - id = m->msg.seq; - e_msgport_put(mail_gui_port, (EMsg *)m); - return id; - } -} - -/* ********************************************************************** */ -/* locked via status_lock */ -static int busy_state; - -static void do_set_busy(struct _mail_msg *mm) -{ - set_stop(busy_state > 0); -} - -struct _mail_msg_op set_busy_op = { - NULL, - do_set_busy, - NULL, - NULL, -}; - -static void mail_enable_stop(void) -{ - struct _mail_msg *m; - - MAIL_MT_LOCK(status_lock); - busy_state++; - if (busy_state == 1) { - m = mail_msg_new(&set_busy_op, NULL, sizeof(*m)); - e_msgport_put(mail_gui_port, (EMsg *)m); - } - MAIL_MT_UNLOCK(status_lock); -} - -static void mail_disable_stop(void) -{ - struct _mail_msg *m; - - MAIL_MT_LOCK(status_lock); - busy_state--; - if (busy_state == 0) { - m = mail_msg_new(&set_busy_op, NULL, sizeof(*m)); - e_msgport_put(mail_gui_port, (EMsg *)m); - } - MAIL_MT_UNLOCK(status_lock); -} - -/* ******************************************************************************** */ - -struct _op_status_msg { - struct _mail_msg msg; - - struct _CamelOperation *op; - char *what; - int pc; - void *data; -}; - -static void do_op_status(struct _mail_msg *mm) -{ - struct _op_status_msg *m = (struct _op_status_msg *)mm; - struct _mail_msg *msg; - struct _mail_msg_priv *data; - char *out, *p, *o, c; - int pc; - EvolutionActivityClient *activity; - - g_assert (mail_gui_thread == pthread_self ()); - - MAIL_MT_LOCK (mail_msg_lock); - - msg = g_hash_table_lookup (mail_msg_active, m->data); - if (msg == NULL) { - MAIL_MT_UNLOCK (mail_msg_lock); - return; - } - - data = msg->priv; - - out = alloca (strlen (m->what) * 2 + 1); - o = out; - p = m->what; - while ((c = *p++)) { - if (c == '%') - *o++ = '%'; - *o++ = c; - } - *o = 0; - - pc = m->pc; - - /* so whats all this crap about: - * When we call activity_client, we have a chance of coming - * back to code that will call mail_msg_new or one of many - * calls which may deadlock us. So we need to call corba - * outside of the lock. The activity_state thing is so we can - * properly lock data->activity without having to hold a lock - * ... of course we have to be careful in the free function to - * keep track of it too. - */ - if (data->activity == NULL && global_shell_client) { - char *clientid, *what; - int display; - - /* its being created/removed? well leave it be */ - if (data->activity_state == 1 || data->activity_state == 3) { - MAIL_MT_UNLOCK (mail_msg_lock); - return; - } else { - data->activity_state = 1; - - if (progress_icon[0] == NULL) - progress_icon[0] = gdk_pixbuf_new_from_xpm_data ((const char **)mail_new_xpm); - - MAIL_MT_UNLOCK (mail_msg_lock); - clientid = g_strdup_printf ("%p", msg); - if (msg->ops->describe_msg) - what = msg->ops->describe_msg (msg, FALSE); - else - what = _("Working"); - - if (global_shell_client) { - activity = evolution_activity_client_new (global_shell_client, clientid, - progress_icon, what, TRUE, - &display); - } else { - activity = NULL; - } - - if (msg->ops->describe_msg) - g_free (what); - g_free (clientid); - - MAIL_MT_LOCK (mail_msg_lock); - if (data->activity_state == 3) { - MAIL_MT_UNLOCK (mail_msg_lock); - if (activity) - gtk_object_unref (GTK_OBJECT (activity)); - camel_operation_unref (msg->cancel); - camel_exception_clear (&msg->ex); - g_free (msg->priv); - g_free (msg); - } else { - data->activity_state = 2; - data->activity = activity; - MAIL_MT_UNLOCK (mail_msg_lock); - } - return; - } - } - - activity = data->activity; - if (activity) { - gtk_object_ref (GTK_OBJECT (activity)); - MAIL_MT_UNLOCK (mail_msg_lock); - - evolution_activity_client_update (activity, out, (double)(pc/100.0)); - gtk_object_unref (GTK_OBJECT (activity)); - } -} - -static void -do_op_status_free (struct _mail_msg *mm) -{ - struct _op_status_msg *m = (struct _op_status_msg *)mm; - - g_free (m->what); -} - -struct _mail_msg_op op_status_op = { - NULL, - do_op_status, - NULL, - do_op_status_free, -}; - -static void -mail_operation_status (struct _CamelOperation *op, const char *what, int pc, void *data) -{ - struct _op_status_msg *m; - - d(printf("got operation statys: %s %d%%\n", what, pc)); - - m = mail_msg_new(&op_status_op, NULL, sizeof(*m)); - m->op = op; - m->what = g_strdup(what); - switch (pc) { - case CAMEL_OPERATION_START: - pc = 0; - break; - case CAMEL_OPERATION_END: - pc = 100; - break; - } - m->pc = pc; - m->data = data; - e_msgport_put(mail_gui_port, (EMsg *)m); -} - -/* ******************** */ - -static void -set_stop(int sensitive) -{ - EList *controls; - EIterator *it; - static int last = FALSE; - - if (last == sensitive) - return; - - controls = folder_browser_factory_get_control_list (); - for (it = e_list_get_iterator (controls); e_iterator_is_valid (it); e_iterator_next (it)) { - BonoboControl *control; - BonoboUIComponent *uic; - - control = BONOBO_CONTROL (e_iterator_get (it)); - uic = bonobo_control_get_ui_component (control); - if (uic == CORBA_OBJECT_NIL || bonobo_ui_component_get_container(uic) == CORBA_OBJECT_NIL) - continue; - - bonobo_ui_component_set_prop(uic, "/commands/MailStop", "sensitive", sensitive?"1":"0", NULL); - } - gtk_object_unref(GTK_OBJECT(it)); - last = sensitive; -} diff --git a/mail/mail-mt.h b/mail/mail-mt.h deleted file mode 100644 index e24a359b27..0000000000 --- a/mail/mail-mt.h +++ /dev/null @@ -1,84 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- - * - * Authors: Michael Zucchi - * - * Copyright 2000, Ximian, Inc. (www.ximian.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - -#ifndef _MAIL_MT -#define _MAIL_MT - -#include -#include "camel/camel-exception.h" -#include "e-util/e-msgport.h" -#include "camel/camel-object.h" -#include "camel/camel-operation.h" - -typedef struct _mail_msg { - EMsg msg; /* parent type */ - struct _mail_msg_op *ops; /* operation functions */ - unsigned int seq; /* seq number for synchronisation */ - CamelOperation *cancel; /* a cancellation/status handle */ - CamelException ex; /* an initialised camel exception, upto the caller to use this */ - struct _mail_msg_priv *priv; /* private for internal use */ -} mail_msg_t; - -/* callback functions for thread message */ -typedef struct _mail_msg_op { - char *(*describe_msg)(struct _mail_msg *msg, int complete); - - void (*receive_msg)(struct _mail_msg *msg); /* message received */ - void (*reply_msg)(struct _mail_msg *msg); /* message replied */ - void (*destroy_msg)(struct _mail_msg *msg); /* finalise message */ -} mail_msg_op_t; - -/* setup ports */ -void mail_msg_init(void); - -/* allocate a new message */ -void *mail_msg_new(mail_msg_op_t *ops, EMsgPort *reply_port, size_t size); -void mail_msg_free(void *msg); -void mail_msg_check_error(void *msg); -void mail_msg_cancel(unsigned int msgid); -void mail_msg_wait(unsigned int msgid); - -/* request a string/password */ -char *mail_get_password (CamelService *service, const char *prompt, gboolean secret); - -/* present information and get an ok (or possibly cancel) - * "type" is as for gnome_message_box_new(); - */ -gboolean mail_user_message (const char *type, const char *prompt, gboolean allow_cancel); - -/* forward a camel event (or other call) to the gui thread */ -int mail_proxy_event(CamelObjectEventHookFunc func, CamelObject *o, void *event_data, void *data); - -/* a message port that receives messages in the gui thread, used for sending port */ -extern EMsgPort *mail_gui_port; -/* a message port that receives messages in the gui thread, used for the reply port */ -extern EMsgPort *mail_gui_reply_port; - -/* some globally available threads */ -extern EThread *mail_thread_queued; /* for operations that can (or should) be queued */ -extern EThread *mail_thread_new; /* for operations that should run in a new thread each time */ - -/* The main thread. */ -extern pthread_t mail_gui_thread; - - -#endif /* ! _MAIL_MT */ diff --git a/mail/mail-offline-handler.c b/mail/mail-offline-handler.c deleted file mode 100644 index ba33ee7d2c..0000000000 --- a/mail/mail-offline-handler.c +++ /dev/null @@ -1,245 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* mail-offline-handler.c - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Authors: - * Ettore Perazzoli - * Dan Winship - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "mail-offline-handler.h" -#include "mail.h" -#include "mail-ops.h" - -#include - -#include - -#define PARENT_TYPE bonobo_x_object_get_type () -static BonoboXObjectClass *parent_class = NULL; - -struct _MailOfflineHandlerPrivate { - GNOME_Evolution_OfflineProgressListener listener_interface; -}; - -static void -add_connection (gpointer key, gpointer data, gpointer user_data) -{ - CamelService *service = key; - GNOME_Evolution_ConnectionList *list = user_data; - - if (!(service->provider->flags & CAMEL_PROVIDER_IS_REMOTE) || - !service->connected) - return; - - if (CAMEL_IS_DISCO_STORE (service) && - camel_disco_store_status (CAMEL_DISCO_STORE (service)) == CAMEL_DISCO_STORE_OFFLINE) - return; - - list->_buffer[list->_length].hostName = CORBA_string_dup (service->url->host); - list->_buffer[list->_length].type = CORBA_string_dup (service->provider->name); - list->_length++; -} - -static GNOME_Evolution_ConnectionList * -create_connection_list (void) -{ - GNOME_Evolution_ConnectionList *list; - - list = GNOME_Evolution_ConnectionList__alloc (); - list->_length = 0; - list->_maximum = mail_storages_count (); - list->_buffer = CORBA_sequence_GNOME_Evolution_Connection_allocbuf (list->_maximum); - - mail_storages_foreach (add_connection, list); - - return list; -} - -/* GNOME::Evolution::Offline methods. */ - -static CORBA_boolean -impl__get_isOffline (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - return !camel_session_is_online (session); -} - -static void -impl_prepareForOffline (PortableServer_Servant servant, - GNOME_Evolution_ConnectionList **active_connection_list, - CORBA_Environment *ev) -{ - MailOfflineHandler *offline_handler; - MailOfflineHandlerPrivate *priv; - - offline_handler = MAIL_OFFLINE_HANDLER (bonobo_object_from_servant (servant)); - priv = offline_handler->priv; - - *active_connection_list = create_connection_list (); -} - -static void -went_offline (CamelStore *store, void *data) -{ - MailOfflineHandler *offline_handler = data; - MailOfflineHandlerPrivate *priv; - CORBA_Environment ev; - GNOME_Evolution_ConnectionList *connection_list; - - priv = offline_handler->priv; - - connection_list = create_connection_list (); - - CORBA_exception_init (&ev); - - GNOME_Evolution_OfflineProgressListener_updateProgress (priv->listener_interface, connection_list, &ev); - if (ev._major != CORBA_NO_EXCEPTION) - g_warning ("Error updating offline progress"); - - CORBA_exception_free (&ev); - - /* CORBA_free (connection_list); */ -} - -static void -storage_go_offline (gpointer key, gpointer value, gpointer data) -{ - CamelStore *store = key; - MailOfflineHandler *offline_handler = data; - - mail_store_set_offline (store, TRUE, went_offline, offline_handler); -} - -static void -impl_goOffline (PortableServer_Servant servant, - const GNOME_Evolution_OfflineProgressListener progress_listener, - CORBA_Environment *ev) -{ - MailOfflineHandler *offline_handler; - MailOfflineHandlerPrivate *priv; - - offline_handler = MAIL_OFFLINE_HANDLER (bonobo_object_from_servant (servant)); - priv = offline_handler->priv; - - priv->listener_interface = CORBA_Object_duplicate (progress_listener, ev); - - /* This will disable further auto-mail-check action. */ - camel_session_set_online (session, FALSE); - - /* FIXME: If send/receive active, wait for it to finish */ - - mail_storages_foreach (storage_go_offline, offline_handler); -} - -static void -storage_go_online (gpointer key, gpointer value, gpointer data) -{ - CamelStore *store = key; - - mail_store_set_offline (store, FALSE, NULL, NULL); -} - -static void -impl_goOnline (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - MailOfflineHandler *offline_handler; - MailOfflineHandlerPrivate *priv; - - offline_handler = MAIL_OFFLINE_HANDLER (bonobo_object_from_servant (servant)); - priv = offline_handler->priv; - - /* Enable auto-mail-checking */ - camel_session_set_online (session, TRUE); - - mail_storages_foreach (storage_go_online, NULL); -} - -/* GtkObject methods. */ - -static void -impl_destroy (GtkObject *object) -{ - MailOfflineHandler *offline_handler; - MailOfflineHandlerPrivate *priv; - - offline_handler = MAIL_OFFLINE_HANDLER (object); - priv = offline_handler->priv; - - if (priv->listener_interface != CORBA_OBJECT_NIL) { - CORBA_Environment ev; - - CORBA_exception_init (&ev); - CORBA_Object_release (priv->listener_interface, &ev); - CORBA_exception_free (&ev); - } - - g_free (priv); - - if (GTK_OBJECT_CLASS (parent_class)->destroy != NULL) - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - -/* GTK+ type initialization. */ - -static void -mail_offline_handler_class_init (MailOfflineHandlerClass *klass) -{ - GtkObjectClass *object_class; - POA_GNOME_Evolution_Offline__epv *epv; - - object_class = GTK_OBJECT_CLASS (klass); - object_class->destroy = impl_destroy; - - epv = & klass->epv; - epv->_get_isOffline = impl__get_isOffline; - epv->prepareForOffline = impl_prepareForOffline; - epv->goOffline = impl_goOffline; - epv->goOnline = impl_goOnline; - - parent_class = gtk_type_class (PARENT_TYPE); -} - -static void -mail_offline_handler_init (MailOfflineHandler *offline_handler) -{ - MailOfflineHandlerPrivate *priv; - - priv = g_new (MailOfflineHandlerPrivate, 1); - priv->listener_interface = CORBA_OBJECT_NIL; - - offline_handler->priv = priv; -} - -MailOfflineHandler * -mail_offline_handler_new (void) -{ - MailOfflineHandler *new; - - new = gtk_type_new (mail_offline_handler_get_type ()); - - return new; -} - -BONOBO_X_TYPE_FUNC_FULL (MailOfflineHandler, GNOME_Evolution_Offline, PARENT_TYPE, mail_offline_handler); diff --git a/mail/mail-offline-handler.h b/mail/mail-offline-handler.h deleted file mode 100644 index 6026805a5a..0000000000 --- a/mail/mail-offline-handler.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* mail-offline-handler.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef _MAIL_OFFLINE_HANDLER_H_ -#define _MAIL_OFFLINE_HANDLER_H_ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include "Evolution.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define MAIL_TYPE_OFFLINE_HANDLER (mail_offline_handler_get_type ()) -#define MAIL_OFFLINE_HANDLER(obj) (GTK_CHECK_CAST ((obj), MAIL_TYPE_OFFLINE_HANDLER, MailOfflineHandler)) -#define MAIL_OFFLINE_HANDLER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), MAIL_TYPE_OFFLINE_HANDLER, MailOfflineHandlerClass)) -#define MAIL_IS_OFFLINE_HANDLER(obj) (GTK_CHECK_TYPE ((obj), MAIL_TYPE_OFFLINE_HANDLER)) -#define MAIL_IS_OFFLINE_HANDLER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), MAIL_TYPE_OFFLINE_HANDLER)) - - -typedef struct _MailOfflineHandler MailOfflineHandler; -typedef struct _MailOfflineHandlerPrivate MailOfflineHandlerPrivate; -typedef struct _MailOfflineHandlerClass MailOfflineHandlerClass; - -struct _MailOfflineHandler { - BonoboXObject parent; - - MailOfflineHandlerPrivate *priv; -}; - -struct _MailOfflineHandlerClass { - BonoboXObjectClass parent_class; - - POA_GNOME_Evolution_Offline__epv epv; -}; - - -GtkType mail_offline_handler_get_type (void); -MailOfflineHandler *mail_offline_handler_new (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _MAIL_OFFLINE_HANDLER_H_ */ diff --git a/mail/mail-ops.c b/mail/mail-ops.c deleted file mode 100644 index b8f8e29df4..0000000000 --- a/mail/mail-ops.c +++ /dev/null @@ -1,2177 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* mail-ops.c: callbacks for the mail toolbar/menus */ - -/* - * Authors: Dan Winship - * Jeffrey Stedfast - * Peter Williams - * Michael Zucchi - * - * Copyright 2000,2001 Ximian, Inc. (www.ximian.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -/* #include */ -#include -#include -#include -#include -#include -#include -#include "mail.h" -#include "mail-tools.h" -#include "mail-ops.h" -#include "mail-vfolder.h" -#include "composer/e-msg-composer.h" -#include "folder-browser.h" -#include "e-util/e-html-utils.h" -#include "e-util/e-unicode-i18n.h" - -#include "filter/filter-filter.h" - -#include "mail-mt.h" -#include "mail-folder-cache.h" - -#define d(x) x - -/* used for both just filtering a folder + uid's, and for filtering a whole folder */ -/* used both for fetching mail, and for filtering mail */ -struct _filter_mail_msg { - struct _mail_msg msg; - - CamelFolder *source_folder; /* where they come from */ - GPtrArray *source_uids; /* uids to copy, or NULL == copy all */ - CamelUIDCache *cache; /* UID cache if we are to cache the uids, NULL otherwise */ - CamelOperation *cancel; - CamelFilterDriver *driver; - int delete; /* delete messages after filtering them? */ - CamelFolder *destination; /* default destination for any messages, NULL for none */ -}; - -/* since fetching also filters, we subclass the data here */ -struct _fetch_mail_msg { - struct _filter_mail_msg fmsg; - - CamelOperation *cancel; /* we have our own cancellation struct, the other should be empty */ - int keep; /* keep on server? */ - - char *source_uri; - - void (*done)(char *source, void *data); - void *data; -}; - -static char * -filter_folder_describe (struct _mail_msg *mm, int complete) -{ - return g_strdup (_("Filtering Folder")); -} - -/* filter a folder, or a subset thereof, uses source_folder/source_uids */ -/* this is shared with fetch_mail */ -static void -filter_folder_filter (struct _mail_msg *mm) -{ - struct _filter_mail_msg *m = (struct _filter_mail_msg *)mm; - CamelFolder *folder; - GPtrArray *uids, *folder_uids = NULL; - - if (m->cancel) - camel_operation_register (m->cancel); - - folder = m->source_folder; - - if (folder == NULL || camel_folder_get_message_count (folder) == 0) { - if (m->cancel) - camel_operation_unregister (m->cancel); - return; - } - - if (m->destination) { - camel_folder_freeze (m->destination); - camel_filter_driver_set_default_folder (m->driver, m->destination); - } - - camel_folder_freeze (folder); - - if (m->source_uids) - uids = m->source_uids; - else - folder_uids = uids = camel_folder_get_uids (folder); - - camel_filter_driver_filter_folder (m->driver, folder, m->cache, uids, m->delete, &mm->ex); - - if (folder_uids) - camel_folder_free_uids (folder, folder_uids); - - /* sync and expunge */ - if (!m->cache) - camel_folder_sync (folder, TRUE, camel_exception_is_set (&mm->ex) ? NULL : &mm->ex); - camel_folder_thaw (folder); - - if (m->destination) - camel_folder_thaw (m->destination); - - if (m->cancel) - camel_operation_unregister (m->cancel); -} - -static void -filter_folder_filtered (struct _mail_msg *mm) -{ -} - -static void -filter_folder_free (struct _mail_msg *mm) -{ - struct _filter_mail_msg *m = (struct _filter_mail_msg *)mm; - int i; - - if (m->source_folder) - camel_object_unref (CAMEL_OBJECT (m->source_folder)); - - if (m->source_uids) { - for (i = 0; i < m->source_uids->len; i++) - g_free (m->source_uids->pdata[i]); - - g_ptr_array_free (m->source_uids, TRUE); - } - - if (m->cancel) - camel_operation_unref (m->cancel); - - if (m->destination) - camel_object_unref (CAMEL_OBJECT (m->destination)); - - if (m->driver) - camel_object_unref (CAMEL_OBJECT (m->driver)); -} - -static struct _mail_msg_op filter_folder_op = { - filter_folder_describe, /* we do our own progress reporting? */ - filter_folder_filter, - filter_folder_filtered, - filter_folder_free, -}; - -void -mail_filter_folder (CamelFolder *source_folder, GPtrArray *uids, - const char *type, CamelOperation *cancel) -{ - struct _filter_mail_msg *m; - - m = mail_msg_new (&filter_folder_op, NULL, sizeof (*m)); - m->source_folder = source_folder; - camel_object_ref (CAMEL_OBJECT (source_folder)); - m->source_uids = uids; - m->cache = NULL; - m->delete = FALSE; - if (cancel) { - m->cancel = cancel; - camel_operation_ref (cancel); - } - - m->driver = camel_session_get_filter_driver (session, type, NULL); - - e_thread_put (mail_thread_new, (EMsg *)m); -} - -/* convenience function for it */ -void -mail_filter_on_demand (CamelFolder *folder, GPtrArray *uids) -{ - mail_filter_folder (folder, uids, FILTER_SOURCE_INCOMING, NULL); -} - -/* ********************************************************************** */ - -/* Temporary workaround for various issues. Gone before 0.11 */ -static char * -uid_cachename_hack (CamelStore *store) -{ - CamelURL *url = CAMEL_SERVICE (store)->url; - char *encoded_url, *filename; - - encoded_url = g_strdup_printf ("pop://%s%s%s@%s/", url->user, - url->authmech ? ";auth=" : "", - url->authmech ? url->authmech : "", - url->host); - e_filename_make_safe (encoded_url); - - filename = g_strdup_printf ("%s/config/cache-%s", evolution_dir, encoded_url); - g_free (encoded_url); - - return filename; -} - -static char * -fetch_mail_describe (struct _mail_msg *mm, int complete) -{ - return g_strdup (_("Fetching Mail")); -} - -static void -fetch_mail_fetch (struct _mail_msg *mm) -{ - struct _fetch_mail_msg *m = (struct _fetch_mail_msg *)mm; - struct _filter_mail_msg *fm = (struct _filter_mail_msg *)mm; - int i; - - if (m->cancel) - camel_operation_register (m->cancel); - - if ((fm->destination = mail_tool_get_local_inbox (&mm->ex)) == NULL) { - if (m->cancel) - camel_operation_unregister (m->cancel); - return; - } - - /* FIXME: this should support keep_on_server too, which would then perform a spool - access thingy, right? problem is matching raw messages to uid's etc. */ - if (!strncmp (m->source_uri, "mbox:", 5)) { - char *path = mail_tool_do_movemail (m->source_uri, &mm->ex); - - if (path && !camel_exception_is_set (&mm->ex)) { - camel_folder_freeze (fm->destination); - camel_filter_driver_set_default_folder (fm->driver, fm->destination); - camel_filter_driver_filter_mbox (fm->driver, path, m->source_uri, &mm->ex); - camel_folder_thaw (fm->destination); - - if (!camel_exception_is_set (&mm->ex)) - unlink (path); - } - g_free (path); - } else { - CamelFolder *folder = fm->source_folder = mail_tool_get_inbox (m->source_uri, &mm->ex); - - if (folder) { - /* this handles 'keep on server' stuff, if we have any new uid's to copy - across, we need to copy them to a new array 'cause of the way fetch_mail_free works */ - CamelUIDCache *cache = NULL; - char *cachename; - - cachename = uid_cachename_hack (folder->parent_store); - cache = camel_uid_cache_new (cachename); - g_free (cachename); - - if (cache) { - GPtrArray *folder_uids, *cache_uids, *uids; - - folder_uids = camel_folder_get_uids (folder); - cache_uids = camel_uid_cache_get_new_uids (cache, folder_uids); - if (cache_uids) { - /* need to copy this, sigh */ - fm->source_uids = uids = g_ptr_array_new (); - g_ptr_array_set_size (uids, cache_uids->len); - for (i = 0; i < cache_uids->len; i++) - uids->pdata[i] = g_strdup (cache_uids->pdata[i]); - camel_uid_cache_free_uids (cache_uids); - - fm->cache = cache; - filter_folder_filter (mm); - - /* if we are not to delete the messages or there was an - * exception, save the UID cache */ - if (!fm->delete || camel_exception_is_set (&mm->ex)) - camel_uid_cache_save (cache); - - /* if we are deleting off the server an no exception occured - * then iterate through the folder uids and mark them all - * for deletion. */ - if (fm->delete && !camel_exception_is_set (&mm->ex)) { - camel_folder_freeze (folder); - - for (i = 0; i < folder_uids->len; i++) - camel_folder_delete_message (folder, folder_uids->pdata[i]); - - /* sync and expunge */ - camel_folder_sync (folder, TRUE, &mm->ex); - - camel_folder_thaw (folder); - } - } - camel_uid_cache_destroy (cache); - camel_folder_free_uids (folder, folder_uids); - } else { - filter_folder_filter (mm); - } - - /* we unref the source folder here since we - may now block in finalize (we try to - disconnect cleanly) */ - camel_object_unref (CAMEL_OBJECT (fm->source_folder)); - fm->source_folder = NULL; - } - } - - if (m->cancel) - camel_operation_unregister (m->cancel); - - /* we unref this here as it may have more work to do (syncing - folders and whatnot) before we are really done */ - /* should this be cancellable too? (i.e. above unregister above) */ - camel_object_unref (CAMEL_OBJECT (fm->driver)); - fm->driver = NULL; -} - -static void -fetch_mail_fetched (struct _mail_msg *mm) -{ - struct _fetch_mail_msg *m = (struct _fetch_mail_msg *)mm; - - if (m->done) - m->done (m->source_uri, m->data); -} - -static void -fetch_mail_free (struct _mail_msg *mm) -{ - struct _fetch_mail_msg *m = (struct _fetch_mail_msg *)mm; - - g_free (m->source_uri); - if (m->cancel) - camel_operation_unref (m->cancel); - - filter_folder_free (mm); -} - -static struct _mail_msg_op fetch_mail_op = { - fetch_mail_describe, /* we do our own progress reporting */ - fetch_mail_fetch, - fetch_mail_fetched, - fetch_mail_free, -}; - -/* ouch, a 'do everything' interface ... */ -void -mail_fetch_mail (const char *source, int keep, const char *type, CamelOperation *cancel, - CamelFilterGetFolderFunc get_folder, void *get_data, - CamelFilterStatusFunc *status, void *status_data, - void (*done)(char *source, void *data), void *data) -{ - struct _fetch_mail_msg *m; - struct _filter_mail_msg *fm; - - m = mail_msg_new (&fetch_mail_op, NULL, sizeof (*m)); - fm = (struct _filter_mail_msg *)m; - m->source_uri = g_strdup (source); - fm->delete = !keep; - fm->cache = NULL; - if (cancel) { - m->cancel = cancel; - camel_operation_ref (cancel); - } - m->done = done; - m->data = data; - - fm->driver = camel_session_get_filter_driver (session, type, NULL); - camel_filter_driver_set_folder_func (fm->driver, get_folder, get_data); - if (status) - camel_filter_driver_set_status_func (fm->driver, status, status_data); - - e_thread_put (mail_thread_new, (EMsg *)m); -} - - -/* updating of imap folders etc */ -struct _update_info { - EvolutionStorage *storage; - - void (*done)(CamelStore *, void *data); - void *data; -}; - -static void -do_update_subfolders_rec (CamelStore *store, CamelFolderInfo *info, EvolutionStorage *storage, const char *prefix) -{ - char *path; - - if (info->url) { - /* info->url == URI??? */ - mail_folder_cache_set_update_estorage (info->url, storage); - mail_folder_cache_note_folderinfo (info->url, info); - } - - path = g_strdup_printf ("%s/%s", prefix, info->name); - - if (info->child) - do_update_subfolders_rec (store, info->child, storage, path); - if (info->sibling) - do_update_subfolders_rec (store, info->sibling, storage, prefix); - - g_free (path); -} - -static void -do_update_subfolders (CamelStore *store, CamelFolderInfo *info, void *data) -{ - struct _update_info *uinfo = data; - - if (uinfo && info) { - do_update_subfolders_rec (store, info, uinfo->storage, ""); - } - - if (uinfo->done) - uinfo->done(store, uinfo->data); - - bonobo_object_unref((BonoboObject *)uinfo->storage); - g_free (uinfo); -} - -/* this interface is a little icky */ -int -mail_update_subfolders (CamelStore *store, EvolutionStorage *storage, - void (*done)(CamelStore *, void *data), void *data) -{ - struct _update_info *info; - - /* FIXME: This wont actually work entirely right, as a failure may lose this data */ - /* however, this isn't a big problem ... */ - info = g_malloc0(sizeof(*info)); - info->storage = storage; - bonobo_object_ref((BonoboObject *)storage); - info->done = done; - info->data = data; - - return mail_get_folderinfo(store, do_update_subfolders, info); -} - -/* ********************************************************************** */ -/* sending stuff */ -/* ** SEND MAIL *********************************************************** */ - -extern CamelFolder *sent_folder; - -/* send 1 message to a specific transport */ -static void -mail_send_message(CamelMimeMessage *message, const char *destination, CamelFilterDriver *driver, CamelException *ex) -{ - CamelMessageInfo *info; - CamelTransport *xport = NULL; - CamelFolder *folder; - const char *version, *header; - gchar *acct_header; - char *transport_url = NULL, *sent_folder_uri = NULL; - - if (SUB_VERSION[0] == '\0') - version = "Evolution/" VERSION " (Preview Release)"; - else - version = "Evolution/" VERSION SUB_VERSION " (Preview Release)"; - camel_medium_add_header (CAMEL_MEDIUM (message), "X-Mailer", version); - camel_mime_message_set_date (message, CAMEL_MESSAGE_DATE_CURRENT, 0); - - /* Remove the X-Evolution and X-Evolution-Source headers so we don't send our flags & other info too ;-) */ - camel_medium_remove_header (CAMEL_MEDIUM (message), "X-Evolution"); - camel_medium_remove_header (CAMEL_MEDIUM (message), "X-Evolution-Source"); - - /* Get information about the account this was composed by. */ - acct_header = g_strdup (camel_medium_get_header (CAMEL_MEDIUM (message), "X-Evolution-Account")); - if (acct_header) { - const MailConfigAccount *account; - - account = mail_config_get_account_by_name (acct_header); - camel_medium_remove_header (CAMEL_MEDIUM (message), "X-Evolution-Account"); - if (account) { - transport_url = g_strdup (account->transport->url); - camel_medium_remove_header (CAMEL_MEDIUM (message), "X-Evolution-Transport"); - sent_folder_uri = g_strdup (account->sent_folder_uri); - camel_medium_remove_header (CAMEL_MEDIUM (message), "X-Evolution-Fcc"); - } - } - - if (!transport_url) { - header = camel_medium_get_header (CAMEL_MEDIUM (message), "X-Evolution-Transport"); - if (header) { - transport_url = g_strstrip (g_strdup (header)); - camel_medium_remove_header (CAMEL_MEDIUM (message), "X-Evolution-Transport"); - } - } - - if (!sent_folder_uri) { - header = camel_medium_get_header (CAMEL_MEDIUM (message), "X-Evolution-Fcc"); - if (header) { - sent_folder_uri = g_strstrip (g_strdup (header)); - camel_medium_remove_header (CAMEL_MEDIUM (message), "X-Evolution-Fcc"); - } - } - - xport = camel_session_get_transport (session, transport_url ? transport_url : destination, ex); - g_free (transport_url); - if (!xport) { - g_free (sent_folder_uri); - return; - } - - camel_transport_send (xport, CAMEL_MEDIUM (message), ex); - camel_object_unref (CAMEL_OBJECT (xport)); - if (camel_exception_is_set (ex)) { - g_free (sent_folder_uri); - return; - } - - /* post-process */ - info = camel_message_info_new (); - info->flags = CAMEL_MESSAGE_SEEN; - - /* Re-attach account header */ - if (acct_header) { - camel_medium_add_header (CAMEL_MEDIUM (message), "X-Evolution-Account", acct_header); - g_free (acct_header); - } - - if (driver) { - camel_filter_driver_filter_message (driver, message, info, - NULL, NULL, NULL, "", ex); - - if (camel_exception_is_set (ex)) { - char *description; - ExceptionId id; - - id = camel_exception_get_id (ex); - description = g_strdup (camel_exception_get_description (ex)); - camel_exception_setv (ex, id, "%s\n%s", description, - _("However, the message was successfully sent.")); - g_free (description); - - camel_message_info_free (info); - return; - } - } - - if (sent_folder_uri) { - folder = mail_tool_uri_to_folder (sent_folder_uri, NULL); - g_free (sent_folder_uri); - if (!folder) { - /* FIXME */ - camel_object_ref (CAMEL_OBJECT (sent_folder)); - folder = sent_folder; - } - } else { - camel_object_ref (CAMEL_OBJECT (sent_folder)); - folder = sent_folder; - } - - if (folder) { - camel_folder_append_message (folder, message, info, ex); - if (camel_exception_is_set (ex)) { - char *description; - ExceptionId id; - - id = camel_exception_get_id (ex); - description = g_strdup (camel_exception_get_description (ex)); - camel_exception_setv (ex, id, "%s\n%s", description, - _("However, the message was successfully sent.")); - g_free (description); - } - - camel_folder_sync (folder, FALSE, NULL); - camel_object_unref (CAMEL_OBJECT (folder)); - } - - camel_message_info_free (info); -} - -/* ********************************************************************** */ - -struct _send_mail_msg { - struct _mail_msg msg; - - CamelFilterDriver *driver; - char *destination; - CamelMimeMessage *message; - - void (*done)(char *uri, CamelMimeMessage *message, gboolean sent, void *data); - void *data; -}; - -static char * -send_mail_desc (struct _mail_msg *mm, int done) -{ - struct _send_mail_msg *m = (struct _send_mail_msg *)mm; - char *subject; - const char *subject_utf8; - - subject_utf8 = camel_mime_message_get_subject (m->message); - - if (subject_utf8) { - char *desc; - - subject = e_utf8_to_locale_string (subject_utf8); - desc = g_strdup_printf (_("Sending \"%s\""), subject); - g_free (subject); - return desc; - } else - return g_strdup (_("Sending message")); -} - -static void -send_mail_send (struct _mail_msg *mm) -{ - struct _send_mail_msg *m = (struct _send_mail_msg *)mm; - - mail_send_message (m->message, m->destination, m->driver, &mm->ex); -} - -static void -send_mail_sent (struct _mail_msg *mm) -{ - struct _send_mail_msg *m = (struct _send_mail_msg *)mm; - - if (m->done) - m->done (m->destination, m->message, !camel_exception_is_set (&mm->ex), m->data); -} - -static void -send_mail_free (struct _mail_msg *mm) -{ - struct _send_mail_msg *m = (struct _send_mail_msg *)mm; - - camel_object_unref (CAMEL_OBJECT (m->message)); - g_free (m->destination); -} - -static struct _mail_msg_op send_mail_op = { - send_mail_desc, - send_mail_send, - send_mail_sent, - send_mail_free, -}; - -int -mail_send_mail (const char *uri, CamelMimeMessage *message, - void (*done) (char *uri, CamelMimeMessage *message, gboolean sent, void *data), - void *data) -{ - struct _send_mail_msg *m; - int id; - - m = mail_msg_new (&send_mail_op, NULL, sizeof (*m)); - m->destination = g_strdup (uri); - m->message = message; - camel_object_ref (CAMEL_OBJECT (message)); - m->data = data; - m->done = done; - - id = m->msg.seq; - - m->driver = camel_session_get_filter_driver (session, FILTER_SOURCE_OUTGOING, NULL); - - e_thread_put (mail_thread_new, (EMsg *)m); - return id; -} - -/* ** SEND MAIL QUEUE ***************************************************** */ - -struct _send_queue_msg { - struct _mail_msg msg; - - CamelFolder *queue; - char *destination; - - CamelFilterDriver *driver; - CamelOperation *cancel; - - /* we use camelfilterstatusfunc, even though its not the filter doing it */ - CamelFilterStatusFunc *status; - void *status_data; - - void (*done)(char *destination, void *data); - void *data; -}; - -static void -report_status (struct _send_queue_msg *m, enum camel_filter_status_t status, int pc, const char *desc, ...) -{ - va_list ap; - char *str; - - if (m->status) { - va_start (ap, desc); - str = g_strdup_vprintf (desc, ap); - va_end (ap); - m->status (m->driver, status, pc, str, m->status_data); - g_free (str); - } -} - -static void -send_queue_send(struct _mail_msg *mm) -{ - struct _send_queue_msg *m = (struct _send_queue_msg *)mm; - extern CamelFolder *sent_folder; /* FIXME */ - GPtrArray *uids; - int i; - - d(printf("sending queue\n")); - - uids = camel_folder_get_uids (m->queue); - if (uids == NULL || uids->len == 0) - return; - - if (m->cancel) - camel_operation_register (m->cancel); - - for (i = 0; i < uids->len; i++) { - CamelMimeMessage *message; - CamelMessageInfo *info; - int pc = (100 * i) / uids->len; - - report_status (m, CAMEL_FILTER_STATUS_START, pc, _("Sending message %d of %d"), i+1, uids->len); - - info = camel_folder_get_message_info (m->queue, uids->pdata[i]); - if (info && info->flags & CAMEL_MESSAGE_DELETED) - continue; - - message = camel_folder_get_message (m->queue, uids->pdata[i], &mm->ex); - if (camel_exception_is_set (&mm->ex)) - break; - - mail_send_message (message, m->destination, m->driver, &mm->ex); - - if (camel_exception_is_set (&mm->ex)) - break; - - camel_folder_set_message_flags (m->queue, uids->pdata[i], CAMEL_MESSAGE_DELETED, CAMEL_MESSAGE_DELETED); - } - - if (camel_exception_is_set (&mm->ex)) - report_status (m, CAMEL_FILTER_STATUS_END, 100, _("Failed on message %d of %d"), i+1, uids->len); - else - report_status (m, CAMEL_FILTER_STATUS_END, 100, _("Complete.")); - - if (m->driver) { - camel_object_unref((CamelObject *)m->driver); - m->driver = NULL; - } - - camel_folder_free_uids (m->queue, uids); - - if (!camel_exception_is_set (&mm->ex)) - camel_folder_expunge (m->queue, &mm->ex); - - if (sent_folder) - camel_folder_sync (sent_folder, FALSE, NULL); - - if (m->cancel) - camel_operation_unregister (m->cancel); -} - -static void -send_queue_sent(struct _mail_msg *mm) -{ - struct _send_queue_msg *m = (struct _send_queue_msg *)mm; - - if (m->done) - m->done(m->destination, m->data); -} - -static void -send_queue_free(struct _mail_msg *mm) -{ - struct _send_queue_msg *m = (struct _send_queue_msg *)mm; - - if (m->driver) - camel_object_unref((CamelObject *)m->driver); - camel_object_unref((CamelObject *)m->queue); - g_free(m->destination); - if (m->cancel) - camel_operation_unref(m->cancel); -} - -static struct _mail_msg_op send_queue_op = { - NULL, /* do our own reporting, as with fetch mail */ - send_queue_send, - send_queue_sent, - send_queue_free, -}; - -/* same interface as fetch_mail, just 'cause i'm lazy today (and we need to run it from the same spot?) */ -void -mail_send_queue(CamelFolder *queue, const char *destination, - const char *type, CamelOperation *cancel, - CamelFilterGetFolderFunc get_folder, void *get_data, - CamelFilterStatusFunc *status, void *status_data, - void (*done)(char *destination, void *data), void *data) -{ - struct _send_queue_msg *m; - - m = mail_msg_new(&send_queue_op, NULL, sizeof(*m)); - m->queue = queue; - camel_object_ref((CamelObject *)queue); - m->destination = g_strdup(destination); - if (cancel) { - m->cancel = cancel; - camel_operation_ref(cancel); - } - m->status = status; - m->status_data = status_data; - m->done = done; - m->data = data; - - m->driver = camel_session_get_filter_driver (session, type, NULL); - camel_filter_driver_set_folder_func (m->driver, get_folder, get_data); - - e_thread_put(mail_thread_new, (EMsg *)m); -} - -/* ** APPEND MESSAGE TO FOLDER ******************************************** */ - -struct _append_msg { - struct _mail_msg msg; - - CamelFolder *folder; - CamelMimeMessage *message; - CamelMessageInfo *info; - - void (*done)(CamelFolder *folder, CamelMimeMessage *msg, CamelMessageInfo *info, int ok, void *data); - void *data; -}; - -static char * -append_mail_desc (struct _mail_msg *mm, int done) -{ - return g_strdup (_("Saving message to folder")); -} - -static void -append_mail_append (struct _mail_msg *mm) -{ - struct _append_msg *m = (struct _append_msg *)mm; - - camel_mime_message_set_date(m->message, CAMEL_MESSAGE_DATE_CURRENT, 0); - camel_folder_append_message(m->folder, m->message, m->info, &mm->ex); -} - -static void -append_mail_appended (struct _mail_msg *mm) -{ - struct _append_msg *m = (struct _append_msg *)mm; - - if (m->done) - m->done(m->folder, m->message, m->info, !camel_exception_is_set(&mm->ex), m->data); -} - -static void -append_mail_free (struct _mail_msg *mm) -{ - struct _append_msg *m = (struct _append_msg *)mm; - - camel_object_unref((CamelObject *)m->message); - camel_object_unref((CamelObject *)m->folder); -} - -static struct _mail_msg_op append_mail_op = { - append_mail_desc, - append_mail_append, - append_mail_appended, - append_mail_free -}; - -void -mail_append_mail (CamelFolder *folder, CamelMimeMessage *message, CamelMessageInfo *info, - void (*done)(CamelFolder *folder, CamelMimeMessage *msg, CamelMessageInfo *info, int ok, void *data), - void *data) -{ - struct _append_msg *m; - - g_assert(CAMEL_IS_FOLDER (folder)); - g_assert(CAMEL_IS_MIME_MESSAGE (message)); - - m = mail_msg_new (&append_mail_op, NULL, sizeof (*m)); - m->folder = folder; - camel_object_ref (CAMEL_OBJECT (folder)); - m->message = message; - camel_object_ref (CAMEL_OBJECT (message)); - m->info = info; - - m->done = done; - m->data = data; - - e_thread_put (mail_thread_new, (EMsg *)m); -} - -/* ** TRANSFER MESSAGES **************************************************** */ - -struct _transfer_msg { - struct _mail_msg msg; - - CamelFolder *source; - GPtrArray *uids; - gboolean delete; - char *dest_uri; - - void (*done)(gboolean ok, void *data); - void *data; -}; - -static char * -transfer_messages_desc (struct _mail_msg *mm, int done) -{ - struct _transfer_msg *m = (struct _transfer_msg *)mm; - - return g_strdup_printf(m->delete?_("Moving messages to %s"):_("Copying messages to %s"), - m->dest_uri); - -} - -static void -transfer_messages_transfer (struct _mail_msg *mm) -{ - struct _transfer_msg *m = (struct _transfer_msg *)mm; - CamelFolder *dest; - char *desc; - void (*func) (CamelFolder *, GPtrArray *, - CamelFolder *, - CamelException *); - - if (m->delete) { - func = camel_folder_move_messages_to; - desc = _("Moving"); - } else { - func = camel_folder_copy_messages_to; - desc = _("Copying"); - } - - dest = mail_tool_uri_to_folder (m->dest_uri, &mm->ex); - if (camel_exception_is_set (&mm->ex)) - return; - - camel_folder_freeze (m->source); - camel_folder_freeze (dest); - - if (CAMEL_IS_VTRASH_FOLDER (dest)) { - if (m->delete) { - int i; - - /* Just mark all the messages as deleted */ - for (i = 0; i < m->uids->len; i++) - camel_folder_delete_message (m->source, m->uids->pdata[i]); - } else { - /* no-op - can't copy messages to*/ - } - } else { - if (dest == m->source) { - int i; - - /* Undelete the messages if they are marked as deleted */ - for (i = 0; i < m->uids->len; i++) - camel_folder_set_message_flags (m->source, m->uids->pdata[i], - CAMEL_MESSAGE_DELETED, 0); - } else { - (func) (m->source, m->uids, dest, &mm->ex); - } - } - - camel_folder_thaw (m->source); - camel_folder_thaw (dest); - camel_folder_sync (dest, FALSE, NULL); - camel_object_unref (CAMEL_OBJECT (dest)); -} - -static void -transfer_messages_transferred (struct _mail_msg *mm) -{ - struct _transfer_msg *m = (struct _transfer_msg *)mm; - - if (m->done) - m->done (!camel_exception_is_set (&mm->ex), m->data); -} - -static void -transfer_messages_free (struct _mail_msg *mm) -{ - struct _transfer_msg *m = (struct _transfer_msg *)mm; - int i; - - camel_object_unref (CAMEL_OBJECT (m->source)); - g_free (m->dest_uri); - for (i = 0; i < m->uids->len; i++) - g_free (m->uids->pdata[i]); - g_ptr_array_free (m->uids, TRUE); - -} - -static struct _mail_msg_op transfer_messages_op = { - transfer_messages_desc, - transfer_messages_transfer, - transfer_messages_transferred, - transfer_messages_free, -}; - -void -mail_transfer_messages (CamelFolder *source, GPtrArray *uids, - gboolean delete_from_source, - const char *dest_uri, - void (*done) (gboolean ok, void *data), - void *data) -{ - struct _transfer_msg *m; - - g_assert(CAMEL_IS_FOLDER (source)); - g_assert(uids != NULL); - g_assert(dest_uri != NULL); - - m = mail_msg_new(&transfer_messages_op, NULL, sizeof(*m)); - m->source = source; - camel_object_ref (CAMEL_OBJECT (source)); - m->uids = uids; - m->delete = delete_from_source; - m->dest_uri = g_strdup (dest_uri); - m->done = done; - m->data = data; - - e_thread_put(mail_thread_queued, (EMsg *)m); -} - -/* ** SCAN SUBFOLDERS ***************************************************** */ - -struct _get_folderinfo_msg { - struct _mail_msg msg; - - CamelStore *store; - CamelFolderInfo *info; - void (*done)(CamelStore *store, CamelFolderInfo *info, void *data); - void *data; -}; - -static char * -get_folderinfo_desc (struct _mail_msg *mm, int done) -{ - struct _get_folderinfo_msg *m = (struct _get_folderinfo_msg *)mm; - char *ret, *name; - - name = camel_service_get_name((CamelService *)m->store, TRUE); - ret = g_strdup_printf(_("Scanning folders in \"%s\""), name); - g_free(name); - return ret; -} - -static void -add_vtrash_info (CamelStore *store, CamelFolderInfo *info) -{ - CamelFolderInfo *fi, *vtrash; - char *uri, *path; - CamelURL *url; - - g_return_if_fail (info != NULL); - - for (fi = info; fi->sibling; fi = fi->sibling) { - if (!strcmp (fi->name, CAMEL_VTRASH_NAME)) - break; - } - - /* create our vTrash URL */ - url = camel_url_new (info->url, NULL); - path = g_strdup_printf ("/%s", CAMEL_VTRASH_NAME); - camel_url_set_path (url, path); - g_free (path); - uri = camel_url_to_string (url, CAMEL_URL_HIDE_ALL); - camel_url_free (url); - - if (fi->sibling) { - /* We're going to replace the physical Trash folder with our vTrash folder */ - vtrash = fi; - g_free (vtrash->full_name); - g_free (vtrash->name); - g_free (vtrash->url); - } else { - /* There wasn't a Trash folder so create a new folder entry */ - vtrash = g_new0 (CamelFolderInfo, 1); - vtrash->parent = fi; - fi->sibling = vtrash; - } - - /* Fill in the new fields */ - vtrash->full_name = g_strdup (U_("Trash")); - vtrash->name = g_strdup (U_("Trash")); - vtrash->url = g_strdup_printf ("vtrash:%s", uri); - vtrash->unread_message_count = -1; - g_free (uri); -} - -static void -get_folderinfo_get (struct _mail_msg *mm) -{ - struct _get_folderinfo_msg *m = (struct _get_folderinfo_msg *)mm; - guint32 flags = CAMEL_STORE_FOLDER_INFO_RECURSIVE; - - if (camel_store_supports_subscriptions (m->store)) - flags |= CAMEL_STORE_FOLDER_INFO_SUBSCRIBED; - - m->info = camel_store_get_folder_info (m->store, NULL, flags, &mm->ex); - if (m->info && m->info->url && (m->store->flags & CAMEL_STORE_VTRASH)) - add_vtrash_info (m->store, m->info); -} - -static void -get_folderinfo_got (struct _mail_msg *mm) -{ - struct _get_folderinfo_msg *m = (struct _get_folderinfo_msg *)mm; - - if (camel_exception_is_set (&mm->ex)) { - char *url; - - url = camel_service_get_url (CAMEL_SERVICE (m->store)); - g_warning ("Error getting folder info from store at %s: %s", - url, camel_exception_get_description (&mm->ex)); - g_free (url); - } - - /* 'done' is probably guaranteed to fail, but... */ - - if (m->done) - m->done (m->store, m->info, m->data); -} - -static void -get_folderinfo_free (struct _mail_msg *mm) -{ - struct _get_folderinfo_msg *m = (struct _get_folderinfo_msg *)mm; - - if (m->info) - camel_store_free_folder_info(m->store, m->info); - camel_object_unref((CamelObject *)m->store); -} - -static struct _mail_msg_op get_folderinfo_op = { - get_folderinfo_desc, - get_folderinfo_get, - get_folderinfo_got, - get_folderinfo_free, -}; - -int -mail_get_folderinfo (CamelStore *store, void (*done)(CamelStore *store, CamelFolderInfo *info, void *data), void *data) -{ - struct _get_folderinfo_msg *m; - int id; - - m = mail_msg_new(&get_folderinfo_op, NULL, sizeof(*m)); - m->store = store; - camel_object_ref((CamelObject *)store); - m->done = done; - m->data = data; - id = m->msg.seq; - - e_thread_put(mail_thread_new, (EMsg *)m); - - return id; -} - -/* ********************************************************************** */ - -static void -do_scan_subfolders (CamelStore *store, CamelFolderInfo *info, void *data) -{ - EvolutionStorage *storage = data; - - if (info) { - gtk_object_set_data (GTK_OBJECT (storage), "connected", GINT_TO_POINTER (TRUE)); - mail_storage_create_folder (storage, store, info); - } -} - -/* synchronous function to scan the & and add folders in a store */ -void -mail_scan_subfolders (CamelStore *store, EvolutionStorage *storage) -{ - int id; - - id = mail_get_folderinfo (store, do_scan_subfolders, storage); - /*mail_msg_wait(id);*/ -} - -/* ** ATTACH MESSAGES ****************************************************** */ - -struct _build_data { - void (*done)(CamelFolder *folder, GPtrArray *uids, CamelMimePart *part, char *subject, void *data); - void *data; -}; - -static void -do_build_attachment (CamelFolder *folder, GPtrArray *uids, GPtrArray *messages, void *data) -{ - struct _build_data *d = data; - CamelMultipart *multipart; - CamelMimePart *part; - char *subject; - int i; - - if (messages->len == 0) { - d->done(folder, messages, NULL, NULL, d->data); - g_free(d); - return; - } - - if (messages->len == 1) { - part = mail_tool_make_message_attachment(messages->pdata[0]); - } else { - multipart = camel_multipart_new(); - camel_data_wrapper_set_mime_type(CAMEL_DATA_WRAPPER (multipart), "multipart/digest"); - camel_multipart_set_boundary(multipart, NULL); - - for (i=0;ilen;i++) { - part = mail_tool_make_message_attachment(messages->pdata[i]); - camel_multipart_add_part(multipart, part); - camel_object_unref((CamelObject *)part); - } - part = camel_mime_part_new(); - camel_medium_set_content_object(CAMEL_MEDIUM (part), CAMEL_DATA_WRAPPER(multipart)); - camel_object_unref((CamelObject *)multipart); - - camel_mime_part_set_description(part, _("Forwarded messages")); - } - - subject = mail_tool_generate_forward_subject(messages->pdata[0]); - d->done(folder, messages, part, subject, d->data); - g_free(subject); - camel_object_unref((CamelObject *)part); - - g_free(d); -} - -void -mail_build_attachment(CamelFolder *folder, GPtrArray *uids, - void (*done)(CamelFolder *folder, GPtrArray *messages, CamelMimePart *part, char *subject, void *data), void *data) -{ - struct _build_data *d; - - d = g_malloc(sizeof(*d)); - d->done = done; - d->data = data; - mail_get_messages(folder, uids, do_build_attachment, d); -} - -/* ** LOAD FOLDER ********************************************************* */ - -/* there hsould be some way to merge this and create folder, since both can - presumably create a folder ... */ - -struct _get_folder_msg { - struct _mail_msg msg; - - char *uri; - CamelFolder *folder; - void (*done) (char *uri, CamelFolder *folder, void *data); - void *data; -}; - -static char * -get_folder_desc (struct _mail_msg *mm, int done) -{ - struct _get_folder_msg *m = (struct _get_folder_msg *)mm; - - return g_strdup_printf(_("Opening folder %s"), m->uri); -} - -static void -get_folder_get (struct _mail_msg *mm) -{ - struct _get_folder_msg *m = (struct _get_folder_msg *)mm; - - m->folder = mail_tool_uri_to_folder (m->uri, &mm->ex); -} - -static void -get_folder_got (struct _mail_msg *mm) -{ - struct _get_folder_msg *m = (struct _get_folder_msg *)mm; - - if (m->done) - m->done (m->uri, m->folder, m->data); -} - -static void -get_folder_free (struct _mail_msg *mm) -{ - struct _get_folder_msg *m = (struct _get_folder_msg *)mm; - - g_free (m->uri); - if (m->folder) - camel_object_unref (CAMEL_OBJECT (m->folder)); -} - -static struct _mail_msg_op get_folder_op = { - get_folder_desc, - get_folder_get, - get_folder_got, - get_folder_free, -}; - -int -mail_get_folder (const char *uri, void (*done) (char *uri, CamelFolder *folder, void *data), void *data) -{ - struct _get_folder_msg *m; - int id; - - m = mail_msg_new (&get_folder_op, NULL, sizeof (*m)); - m->uri = g_strdup (uri); - m->data = data; - m->done = done; - - id = m->msg.seq; - e_thread_put (mail_thread_new, (EMsg *)m); - return id; -} - -/* ** GET STORE ******************************************************* */ - -struct _get_store_msg { - struct _mail_msg msg; - - char *uri; - CamelStore *store; - void (*done) (char *uri, CamelStore *store, void *data); - void *data; -}; - -static char * -get_store_desc (struct _mail_msg *mm, int done) -{ - struct _get_store_msg *m = (struct _get_store_msg *)mm; - - return g_strdup_printf(_("Opening store %s"), m->uri); -} - -static void -get_store_get (struct _mail_msg *mm) -{ - struct _get_store_msg *m = (struct _get_store_msg *)mm; - - m->store = camel_session_get_store (session, m->uri, &mm->ex); -} - -static void -get_store_got (struct _mail_msg *mm) -{ - struct _get_store_msg *m = (struct _get_store_msg *)mm; - - if (m->done) - m->done (m->uri, m->store, m->data); -} - -static void -get_store_free (struct _mail_msg *mm) -{ - struct _get_store_msg *m = (struct _get_store_msg *)mm; - - g_free (m->uri); - if (m->store) - camel_object_unref (CAMEL_OBJECT (m->store)); -} - -static struct _mail_msg_op get_store_op = { - get_store_desc, - get_store_get, - get_store_got, - get_store_free, -}; - -int -mail_get_store (const char *uri, void (*done) (char *uri, CamelStore *store, void *data), void *data) -{ - struct _get_store_msg *m; - int id; - - m = mail_msg_new (&get_store_op, NULL, sizeof (*m)); - m->uri = g_strdup (uri); - m->data = data; - m->done = done; - - id = m->msg.seq; - e_thread_put (mail_thread_new, (EMsg *)m); - return id; -} - -/* ** REMOVE FOLDER ******************************************************* */ - -struct _remove_folder_msg { - struct _mail_msg msg; - - char *uri; - gboolean removed; - void (*done) (char *uri, gboolean removed, void *data); - void *data; -}; - -static char * -remove_folder_desc (struct _mail_msg *mm, int done) -{ - struct _remove_folder_msg *m = (struct _remove_folder_msg *)mm; - - return g_strdup_printf (_("Removing folder %s"), m->uri); -} - -static void -remove_folder_get (struct _mail_msg *mm) -{ - struct _remove_folder_msg *m = (struct _remove_folder_msg *)mm; - CamelStore *store; - CamelFolder *folder; - GPtrArray *uids; - gchar *full_name; - int i; - - m->removed = FALSE; - - folder = mail_tool_uri_to_folder (m->uri, &mm->ex); - - store = camel_folder_get_parent_store (folder); - if (!store) - return; - camel_object_ref (CAMEL_OBJECT (store)); - - /* Delete every message in this folder, then expunge it */ - uids = camel_folder_get_uids (folder); - for (i = 0; i < uids->len; i++) - camel_folder_delete_message (folder, uids->pdata[i]); - camel_folder_sync (folder, TRUE, &mm->ex); - camel_folder_free_uids (folder, uids); - - /* close the folder */ - full_name = g_strdup (camel_folder_get_full_name (folder)); - camel_object_unref (CAMEL_OBJECT (folder)); - - /* Then delete the folder from the store */ - camel_store_delete_folder (store, full_name, &mm->ex); - g_free (full_name); - m->removed = !camel_exception_is_set (&mm->ex); - camel_object_unref (CAMEL_OBJECT (store)); -} - -static void -remove_folder_got (struct _mail_msg *mm) -{ - struct _remove_folder_msg *m = (struct _remove_folder_msg *)mm; - - if (m->removed) { - /* Remove this folder from the folder cache */ - mail_folder_cache_remove_folder (m->uri); - } - - if (m->done) - m->done (m->uri, m->removed, m->data); -} - -static void -remove_folder_free (struct _mail_msg *mm) -{ - struct _remove_folder_msg *m = (struct _remove_folder_msg *)mm; - - g_free (m->uri); -} - -static struct _mail_msg_op remove_folder_op = { - remove_folder_desc, - remove_folder_get, - remove_folder_got, - remove_folder_free, -}; - -void -mail_remove_folder (const char *uri, void (*done) (char *uri, gboolean removed, void *data), void *data) -{ - struct _remove_folder_msg *m; - - m = mail_msg_new (&remove_folder_op, NULL, sizeof (*m)); - m->uri = g_strdup (uri); - m->data = data; - m->done = done; - - e_thread_put (mail_thread_new, (EMsg *)m); -} - -/* ** SYNC FOLDER ********************************************************* */ - -struct _sync_folder_msg { - struct _mail_msg msg; - - CamelFolder *folder; - void (*done) (CamelFolder *folder, void *data); - void *data; -}; - -static char *sync_folder_desc(struct _mail_msg *mm, int done) -{ - struct _sync_folder_msg *m = (struct _sync_folder_msg *)mm; - - return g_strdup_printf (_("Storing folder \'%s\'"), - camel_folder_get_full_name (m->folder)); -} - -static void sync_folder_sync(struct _mail_msg *mm) -{ - struct _sync_folder_msg *m = (struct _sync_folder_msg *)mm; - - camel_folder_sync(m->folder, FALSE, &mm->ex); -} - -static void sync_folder_synced(struct _mail_msg *mm) -{ - struct _sync_folder_msg *m = (struct _sync_folder_msg *)mm; - - if (m->done) - m->done(m->folder, m->data); -} - -static void sync_folder_free(struct _mail_msg *mm) -{ - struct _sync_folder_msg *m = (struct _sync_folder_msg *)mm; - - camel_object_unref((CamelObject *)m->folder); -} - -static struct _mail_msg_op sync_folder_op = { - sync_folder_desc, - sync_folder_sync, - sync_folder_synced, - sync_folder_free, -}; - -void -mail_sync_folder(CamelFolder *folder, void (*done) (CamelFolder *folder, void *data), void *data) -{ - struct _sync_folder_msg *m; - - m = mail_msg_new(&sync_folder_op, NULL, sizeof(*m)); - m->folder = folder; - camel_object_ref((CamelObject *)folder); - m->data = data; - m->done = done; - - e_thread_put(mail_thread_queued, (EMsg *)m); -} - -/* ******************************************************************************** */ - -static char *refresh_folder_desc(struct _mail_msg *mm, int done) -{ - return g_strdup(_("Refreshing folder")); -} - -static void refresh_folder_refresh(struct _mail_msg *mm) -{ - struct _sync_folder_msg *m = (struct _sync_folder_msg *)mm; - - camel_folder_refresh_info(m->folder, &mm->ex); -} - -/* we just use the sync stuff where we can, since it would be the same */ -static struct _mail_msg_op refresh_folder_op = { - refresh_folder_desc, - refresh_folder_refresh, - sync_folder_synced, - sync_folder_free, -}; - -void -mail_refresh_folder(CamelFolder *folder, void (*done) (CamelFolder *folder, void *data), void *data) -{ - struct _sync_folder_msg *m; - - m = mail_msg_new(&refresh_folder_op, NULL, sizeof(*m)); - m->folder = folder; - camel_object_ref((CamelObject *)folder); - m->data = data; - m->done = done; - - e_thread_put(mail_thread_new, (EMsg *)m); -} - -/* ******************************************************************************** */ - -static char *expunge_folder_desc(struct _mail_msg *mm, int done) -{ - return g_strdup(_("Expunging folder")); -} - -static void expunge_folder_expunge(struct _mail_msg *mm) -{ - struct _sync_folder_msg *m = (struct _sync_folder_msg *)mm; - - camel_folder_expunge(m->folder, &mm->ex); -} - -/* we just use the sync stuff where we can, since it would be the same */ -static struct _mail_msg_op expunge_folder_op = { - expunge_folder_desc, - expunge_folder_expunge, - sync_folder_synced, - sync_folder_free, -}; - -void -mail_expunge_folder(CamelFolder *folder, void (*done) (CamelFolder *folder, void *data), void *data) -{ - struct _sync_folder_msg *m; - - m = mail_msg_new(&expunge_folder_op, NULL, sizeof(*m)); - m->folder = folder; - camel_object_ref((CamelObject *)folder); - m->data = data; - m->done = done; - - e_thread_put(mail_thread_new, (EMsg *)m); -} - -/* ** GET MESSAGE(s) ***************************************************** */ - -struct _get_message_msg { - struct _mail_msg msg; - - CamelFolder *folder; - char *uid; - void (*done) (CamelFolder *folder, char *uid, CamelMimeMessage *msg, void *data); - void *data; - CamelMimeMessage *message; - CamelOperation *cancel; -}; - -static char *get_message_desc(struct _mail_msg *mm, int done) -{ - struct _get_message_msg *m = (struct _get_message_msg *)mm; - - return g_strdup_printf(_("Retrieving message %s"), m->uid); -} - -static void get_message_get(struct _mail_msg *mm) -{ - struct _get_message_msg *m = (struct _get_message_msg *)mm; - - m->message = camel_folder_get_message(m->folder, m->uid, &mm->ex); -} - -static void get_message_got(struct _mail_msg *mm) -{ - struct _get_message_msg *m = (struct _get_message_msg *)mm; - - if (m->done) - m->done(m->folder, m->uid, m->message, m->data); -} - -static void get_message_free(struct _mail_msg *mm) -{ - struct _get_message_msg *m = (struct _get_message_msg *)mm; - - g_free(m->uid); - camel_object_unref((CamelObject *)m->folder); - camel_operation_unref(m->cancel); -} - -static struct _mail_msg_op get_message_op = { - get_message_desc, - get_message_get, - get_message_got, - get_message_free, -}; - -void -mail_get_message(CamelFolder *folder, const char *uid, void (*done) (CamelFolder *folder, char *uid, CamelMimeMessage *msg, void *data), void *data, EThread *thread) -{ - struct _get_message_msg *m; - - m = mail_msg_new(&get_message_op, NULL, sizeof(*m)); - m->folder = folder; - camel_object_ref((CamelObject *)folder); - m->uid = g_strdup(uid); - m->data = data; - m->done = done; - m->cancel = camel_operation_new(NULL, NULL); - - e_thread_put(thread, (EMsg *)m); -} - -/* ********************************************************************** */ - -struct _get_messages_msg { - struct _mail_msg msg; - - CamelFolder *folder; - GPtrArray *uids; - GPtrArray *messages; - - void (*done) (CamelFolder *folder, GPtrArray *uids, GPtrArray *msgs, void *data); - void *data; -}; - -static char * get_messages_desc(struct _mail_msg *mm, int done) -{ - struct _get_messages_msg *m = (struct _get_messages_msg *)mm; - - return g_strdup_printf(_("Retrieving %d message(s)"), m->uids->len); -} - -static void get_messages_get(struct _mail_msg *mm) -{ - struct _get_messages_msg *m = (struct _get_messages_msg *)mm; - int i; - CamelMimeMessage *message; - - for (i=0; iuids->len; i++) { - int pc = ((i+1) * 100) / m->uids->len; - - message = camel_folder_get_message(m->folder, m->uids->pdata[i], &mm->ex); - camel_operation_progress(mm->cancel, pc); - if (message == NULL) - break; - - g_ptr_array_add(m->messages, message); - } -} - -static void get_messages_got(struct _mail_msg *mm) -{ - struct _get_messages_msg *m = (struct _get_messages_msg *)mm; - - if (m->done) - m->done(m->folder, m->uids, m->messages, m->data); -} - -static void get_messages_free(struct _mail_msg *mm) -{ - struct _get_messages_msg *m = (struct _get_messages_msg *)mm; - int i; - - for (i=0;iuids->len;i++) - g_free(m->uids->pdata[i]); - g_ptr_array_free(m->uids, TRUE); - for (i=0;imessages->len;i++) { - if (m->messages->pdata[i]) - camel_object_unref((CamelObject *)m->messages->pdata[i]); - } - g_ptr_array_free(m->messages, TRUE); - camel_object_unref((CamelObject *)m->folder); -} - -static struct _mail_msg_op get_messages_op = { - get_messages_desc, - get_messages_get, - get_messages_got, - get_messages_free, -}; - -void -mail_get_messages(CamelFolder *folder, GPtrArray *uids, - void (*done) (CamelFolder *folder, GPtrArray *uids, GPtrArray *msgs, void *data), - void *data) -{ - struct _get_messages_msg *m; - - m = mail_msg_new(&get_messages_op, NULL, sizeof(*m)); - m->folder = folder; - camel_object_ref((CamelObject *)folder); - m->uids = uids; - m->messages = g_ptr_array_new(); - m->data = data; - m->done = done; - - e_thread_put(mail_thread_new, (EMsg *)m); -} - -/* ** SAVE MESSAGES ******************************************************* */ - -struct _save_messages_msg { - struct _mail_msg msg; - - CamelFolder *folder; - GPtrArray *uids; - char *path; - void (*done)(CamelFolder *folder, GPtrArray *uids, char *path, void *data); - void *data; -}; - -static char *save_messages_desc(struct _mail_msg *mm, int done) -{ - struct _save_messages_msg *m = (struct _save_messages_msg *)mm; - - return g_strdup_printf(_("Saving %d messsage(s)"), m->uids->len); -} - -/* tries to build a From line, based on message headers */ -/* this is a copy directly from camel-mbox-summary.c */ - -static char *tz_months[] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" -}; - -static char *tz_days[] = { - "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" -}; - -static char * -build_from(struct _header_raw *header) -{ - GString *out = g_string_new("From "); - char *ret; - const char *tmp; - time_t thetime; - int offset; - struct tm tm; - - tmp = header_raw_find(&header, "Sender", NULL); - if (tmp == NULL) - tmp = header_raw_find(&header, "From", NULL); - if (tmp != NULL) { - struct _header_address *addr = header_address_decode(tmp); - - tmp = NULL; - if (addr) { - if (addr->type == HEADER_ADDRESS_NAME) { - g_string_append(out, addr->v.addr); - tmp = ""; - } - header_address_unref(addr); - } - } - if (tmp == NULL) - g_string_append(out, "unknown@nodomain.now.au"); - - /* try use the received header to get the date */ - tmp = header_raw_find(&header, "Received", NULL); - if (tmp) { - tmp = strrchr(tmp, ';'); - if (tmp) - tmp++; - } - - /* if there isn't one, try the Date field */ - if (tmp == NULL) - tmp = header_raw_find(&header, "Date", NULL); - - thetime = header_decode_date(tmp, &offset); - thetime += ((offset / 100) * (60 * 60)) + (offset % 100) * 60; - gmtime_r(&thetime, &tm); - g_string_sprintfa(out, " %s %s %d %02d:%02d:%02d %4d\n", - tz_days[tm.tm_wday], - tz_months[tm.tm_mon], tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_year + 1900); - - ret = out->str; - g_string_free(out, FALSE); - return ret; -} - -static void -save_messages_save (struct _mail_msg *mm) -{ - struct _save_messages_msg *m = (struct _save_messages_msg *)mm; - CamelStreamFilter *filtered_stream; - CamelMimeFilterFrom *from_filter; - CamelStream *stream; - int fd, i; - char *from; - - fd = open (m->path, O_WRONLY | O_CREAT | O_TRUNC, 0666); - if (fd == -1) { - camel_exception_setv(&mm->ex, CAMEL_EXCEPTION_SYSTEM, - _("Unable to create output file: %s\n %s"), m->path, strerror(errno)); - return; - } - - stream = camel_stream_fs_new_with_fd(fd); - from_filter = camel_mime_filter_from_new(); - filtered_stream = camel_stream_filter_new_with_stream(stream); - camel_stream_filter_add(filtered_stream, (CamelMimeFilter *)from_filter); - camel_object_unref((CamelObject *)from_filter); - - for (i=0; iuids->len; i++) { - CamelMimeMessage *message; - int pc = ((i+1) * 100) / m->uids->len; - - message = camel_folder_get_message(m->folder, m->uids->pdata[i], &mm->ex); - camel_operation_progress(mm->cancel, pc); - if (message == NULL) - break; - - /* we need to flush after each stream write since we are writing to the same fd */ - from = build_from(((CamelMimePart *)message)->headers); - if (camel_stream_write_string(stream, from) == -1 - || camel_stream_flush(stream) == -1 - || camel_data_wrapper_write_to_stream((CamelDataWrapper *)message, (CamelStream *)filtered_stream) == -1 - || camel_stream_flush((CamelStream *)filtered_stream) == -1) { - camel_exception_setv(&mm->ex, CAMEL_EXCEPTION_SYSTEM, - _("Error saving messages to: %s:\n %s"), m->path, strerror(errno)); - g_free(from); - camel_object_unref((CamelObject *)message); - break; - } - g_free(from); - camel_object_unref((CamelObject *)message); - } - - camel_object_unref((CamelObject *)filtered_stream); - camel_object_unref((CamelObject *)stream); -} - -static void save_messages_saved(struct _mail_msg *mm) -{ - struct _save_messages_msg *m = (struct _save_messages_msg *)mm; - - if (m->done) - m->done(m->folder, m->uids, m->path, m->data); -} - -static void save_messages_free(struct _mail_msg *mm) -{ - struct _save_messages_msg *m = (struct _save_messages_msg *)mm; - int i; - - for (i=0;iuids->len;i++) - g_free(m->uids->pdata[i]); - g_ptr_array_free(m->uids, TRUE); - camel_object_unref((CamelObject *)m->folder); - g_free(m->path); -} - -static struct _mail_msg_op save_messages_op = { - save_messages_desc, - save_messages_save, - save_messages_saved, - save_messages_free, -}; - -int -mail_save_messages(CamelFolder *folder, GPtrArray *uids, const char *path, - void (*done) (CamelFolder *folder, GPtrArray *uids, char *path, void *data), void *data) -{ - struct _save_messages_msg *m; - int id; - - m = mail_msg_new(&save_messages_op, NULL, sizeof(*m)); - m->folder = folder; - camel_object_ref((CamelObject *)folder); - m->uids = uids; - m->path = g_strdup(path); - m->data = data; - m->done = done; - - id = m->msg.seq; - e_thread_put(mail_thread_new, (EMsg *)m); - - return id; -} - -/* ** SAVE PART ******************************************************* */ - -struct _save_part_msg { - struct _mail_msg msg; - - CamelMimePart *part; - char *path; - void (*done)(CamelMimePart *part, char *path, int saved, void *data); - void *data; -}; - -static char *save_part_desc(struct _mail_msg *mm, int done) -{ - return g_strdup(_("Saving attachment")); -} - -static void -save_part_save (struct _mail_msg *mm) -{ - struct _save_part_msg *m = (struct _save_part_msg *)mm; - CamelMimeFilterCharset *charsetfilter; - CamelContentType *content_type; - CamelStreamFilter *filtered_stream; - CamelStream *stream_fs; - CamelDataWrapper *data; - const char *charset; - - stream_fs = camel_stream_fs_new_with_name (m->path, O_WRONLY | O_CREAT | O_TRUNC, 0600); - if (stream_fs == NULL) { - camel_exception_setv (&mm->ex, 1, _("Cannot create output file: %s:\n %s"), m->path, - g_strerror (errno)); - return; - } - - /* we only convert text/ parts, and we only convert if we have to - null charset param == us-ascii == utf8 always, and utf8 == utf8 obviously */ - /* this will also let "us-ascii that isn't really" parts pass out in - proper format, without us trying to treat it as what it isn't, which is - the same algorithm camel uses */ - - data = camel_medium_get_content_object (CAMEL_MEDIUM (m->part)); - content_type = camel_mime_part_get_content_type (m->part); - if (header_content_type_is (content_type, "text", "*") - && (charset = header_content_type_param (content_type, "charset")) - && g_strcasecmp (charset, "utf-8") != 0) { - charsetfilter = camel_mime_filter_charset_new_convert ("utf-8", charset); - filtered_stream = camel_stream_filter_new_with_stream (stream_fs); - if (charsetfilter) { - camel_stream_filter_add (filtered_stream, CAMEL_MIME_FILTER (charsetfilter)); - camel_object_unref (CAMEL_OBJECT (charsetfilter)); - } - } else { - /* no we can't use a CAMEL_BLAH() cast here, since its not true, HOWEVER - we only treat it as a normal stream from here on, so it is OK */ - filtered_stream = (CamelStreamFilter *)stream_fs; - camel_object_ref (CAMEL_OBJECT (stream_fs)); - } - - if (camel_data_wrapper_write_to_stream (data, CAMEL_STREAM (filtered_stream)) == -1 - || camel_stream_flush (CAMEL_STREAM (filtered_stream)) == -1) - camel_exception_setv (&mm->ex, 1, _("Could not write data: %s"), g_strerror (errno)); - - camel_object_unref (CAMEL_OBJECT (filtered_stream)); - camel_object_unref (CAMEL_OBJECT (stream_fs)); -} - -static void -save_part_saved (struct _mail_msg *mm) -{ - struct _save_part_msg *m = (struct _save_part_msg *)mm; - - if (m->done) - m->done (m->part, m->path, !camel_exception_is_set (&mm->ex), m->data); -} - -static void -save_part_free (struct _mail_msg *mm) -{ - struct _save_part_msg *m = (struct _save_part_msg *)mm; - - camel_object_unref (CAMEL_OBJECT (m->part)); - g_free (m->path); -} - -static struct _mail_msg_op save_part_op = { - save_part_desc, - save_part_save, - save_part_saved, - save_part_free, -}; - -int -mail_save_part (CamelMimePart *part, const char *path, - void (*done)(CamelMimePart *part, char *path, int saved, void *data), void *data) -{ - struct _save_part_msg *m; - int id; - - m = mail_msg_new (&save_part_op, NULL, sizeof (*m)); - m->part = part; - camel_object_ref (CAMEL_OBJECT (part)); - m->path = g_strdup (path); - m->data = data; - m->done = done; - - id = m->msg.seq; - e_thread_put (mail_thread_queued, (EMsg *)m); - - return id; -} - - -/* ** GO OFFLINE ***************************************************** */ - -struct _set_offline_msg { - struct _mail_msg msg; - - CamelStore *store; - gboolean offline; - void (*done)(CamelStore *store, void *data); - void *data; -}; - -static char *set_offline_desc(struct _mail_msg *mm, int done) -{ - struct _set_offline_msg *m = (struct _set_offline_msg *)mm; - char *service_name = camel_service_get_name (CAMEL_SERVICE (m->store), TRUE); - char *msg; - - msg = g_strdup_printf (_("Disconnecting from %s"), service_name); - g_free (service_name); - return msg; -} - -static void set_offline_do(struct _mail_msg *mm) -{ - struct _set_offline_msg *m = (struct _set_offline_msg *)mm; - - if (CAMEL_IS_DISCO_STORE (m->store) && - camel_disco_store_can_work_offline (CAMEL_DISCO_STORE (m->store))) { - if (m->offline) { - CamelFolder *inbox; - - /* FIXME. Something more generic here... */ - inbox = camel_store_get_inbox (m->store, NULL); - if (inbox) { - camel_disco_folder_prepare_for_offline ( - CAMEL_DISCO_FOLDER (inbox), - "(match-all (not (system-flag \"Seen\")))", - &mm->ex); - camel_folder_sync (inbox, FALSE, NULL); - camel_object_unref (CAMEL_OBJECT (inbox)); - if (camel_exception_is_set (&mm->ex)) - return; - } - } - - camel_disco_store_set_status (CAMEL_DISCO_STORE (m->store), - m->offline ? CAMEL_DISCO_STORE_OFFLINE : - CAMEL_DISCO_STORE_ONLINE, &mm->ex); - } else { - if (m->offline) { - camel_service_disconnect (CAMEL_SERVICE (m->store), - TRUE, &mm->ex); - } - } -} - -static void set_offline_done(struct _mail_msg *mm) -{ - struct _set_offline_msg *m = (struct _set_offline_msg *)mm; - - if (m->done) - m->done(m->store, m->data); -} - -static void set_offline_free(struct _mail_msg *mm) -{ - struct _set_offline_msg *m = (struct _set_offline_msg *)mm; - - camel_object_unref((CamelObject *)m->store); -} - -static struct _mail_msg_op set_offline_op = { - set_offline_desc, - set_offline_do, - set_offline_done, - set_offline_free, -}; - -void -mail_store_set_offline (CamelStore *store, gboolean offline, - void (*done)(CamelStore *, void *data), - void *data) -{ - struct _set_offline_msg *m; - - m = mail_msg_new(&set_offline_op, NULL, sizeof(*m)); - m->store = store; - camel_object_ref((CamelObject *)store); - m->offline = offline; - m->data = data; - m->done = done; - - e_thread_put(mail_thread_queued, (EMsg *)m); -} diff --git a/mail/mail-ops.h b/mail/mail-ops.h deleted file mode 100644 index b1f429ba64..0000000000 --- a/mail/mail-ops.h +++ /dev/null @@ -1,156 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * Authors: - * Peter Williams - * Michael Zucchi - * - * Copyright 2000, 2001 Ximian, Inc. (www.ximian.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef MAIL_OPS_H -#define MAIL_OPS_H - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#include "camel/camel-folder.h" -#include "camel/camel-filter-driver.h" -#include "camel/camel-mime-message.h" -#include "camel/camel-operation.h" - -#include "evolution-storage.h" /*EvolutionStorage */ -#include "e-util/e-msgport.h" - -void mail_append_mail (CamelFolder *folder, CamelMimeMessage *message, CamelMessageInfo *info, - void (*done)(CamelFolder *folder, CamelMimeMessage *msg, CamelMessageInfo *info, int ok, void *data), - void *data); - -void mail_transfer_messages (CamelFolder *source, GPtrArray *uids, - gboolean delete_from_source, - const char *dest_uri, - void (*done) (gboolean ok, void *data), - void *data); - -/* get a single message, asynchronously */ -void mail_get_message (CamelFolder *folder, const char *uid, - void (*done) (CamelFolder *folder, char *uid, CamelMimeMessage *msg, void *data), - void *data, - EThread *thread); - -/* get several messages */ -void mail_get_messages (CamelFolder *folder, GPtrArray *uids, - void (*done) (CamelFolder *folder, GPtrArray *uids, GPtrArray *msgs, void *data), - void *data); - -/* same for a folder */ -int mail_get_folder (const char *uri, - void (*done) (char *uri, CamelFolder *folder, void *data), void *data); - -/* and for a store */ -int mail_get_store (const char *uri, - void (*done) (char *uri, CamelStore *store, void *data), void *data); - -/* build an attachment */ -void mail_build_attachment (CamelFolder *folder, GPtrArray *uids, - void (*done)(CamelFolder *folder, GPtrArray *messages, - CamelMimePart *part, char *subject, void *data), - void *data); - -void mail_sync_folder (CamelFolder *folder, - void (*done) (CamelFolder *folder, void *data), - void *data); - -void mail_refresh_folder (CamelFolder *folder, - void (*done) (CamelFolder *folder, void *data), - void *data); - -void mail_expunge_folder (CamelFolder *folder, - void (*done) (CamelFolder *folder, void *data), - void *data); - -/* get folder info asynchronously */ -int mail_get_folderinfo (CamelStore *store, - void (*done)(CamelStore *store, CamelFolderInfo *info, void *data), - void *data); - -/* remove an existing folder */ -void mail_remove_folder (const char *uri, - void (*done) (char *uri, gboolean removed, void *data), - void *data); - -/* transfer (copy/move) a folder */ -void mail_xfer_folder (const char *src_uri, const char *dest_uri, gboolean remove_source, - void (*done) (char *src_uri, char *dest_uri, gboolean remove_source, - CamelFolder *folder, void *data), - void *data); - -/* save messages */ -int mail_save_messages (CamelFolder *folder, GPtrArray *uids, const char *path, - void (*done) (CamelFolder *folder, GPtrArray *uids, char *path, void *data), - void *data); - -int mail_save_part (CamelMimePart *part, const char *path, - void (*done)(CamelMimePart *part, char *path, int saved, void *data), - void *data); - -int mail_send_mail (const char *uri, CamelMimeMessage *message, - void (*done) (char *uri, CamelMimeMessage *message, gboolean sent, void *data), - void *data); - -/* scan subfolders and add them to the storage, synchronous */ -/* FIXME: Move this to component-factory.c */ -void mail_scan_subfolders (CamelStore *store, EvolutionStorage *storage); -/* not sure about this one though */ -int mail_update_subfolders (CamelStore *store, EvolutionStorage *storage, - void (*done)(CamelStore *, void *data), - void *data); - -/* yeah so this is messy, but it does a lot, maybe i can consolidate all user_data's to be the one */ -void mail_send_queue (CamelFolder *queue, const char *destination, - const char *type, CamelOperation *cancel, - CamelFilterGetFolderFunc get_folder, void *get_data, - CamelFilterStatusFunc *status, void *status_data, - void (*done)(char *destination, void *data), - void *data); - -void mail_fetch_mail (const char *source, int keep, - const char *type, CamelOperation *cancel, - CamelFilterGetFolderFunc get_folder, void *get_data, - CamelFilterStatusFunc *status, void *status_data, - void (*done)(char *source, void *data), - void *data); - -void mail_filter_folder (CamelFolder *source_folder, GPtrArray *uids, - const char *type, CamelOperation *cancel); - -/* convenience function for above */ -void mail_filter_on_demand (CamelFolder *folder, GPtrArray *uids); - -/* Work Offline */ -void mail_store_set_offline (CamelStore *store, gboolean offline, - void (*done)(CamelStore *, void *data), - void *data); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* MAIL_OPS_H */ diff --git a/mail/mail-search-dialogue.c b/mail/mail-search-dialogue.c deleted file mode 100644 index 0f633edeba..0000000000 --- a/mail/mail-search-dialogue.c +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * Authors: Not Zed - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include -#include - -#include "mail-search-dialogue.h" - -static void mail_search_dialogue_class_init (MailSearchDialogueClass *class); -static void mail_search_dialogue_init (MailSearchDialogue *gspaper); -static void mail_search_dialogue_finalise (GtkObject *obj); - -static GnomeDialogClass *parent_class; - -guint -mail_search_dialogue_get_type (void) -{ - static guint type = 0; - - if (!type) { - GtkTypeInfo type_info = { - "MailSearchDialogue", - sizeof(MailSearchDialogue), - sizeof(MailSearchDialogueClass), - (GtkClassInitFunc)mail_search_dialogue_class_init, - (GtkObjectInitFunc)mail_search_dialogue_init, - (GtkArgSetFunc)NULL, - (GtkArgGetFunc)NULL - }; - - type = gtk_type_unique (gnome_dialog_get_type (), &type_info); - } - - return type; -} - -static void -mail_search_dialogue_class_init (MailSearchDialogueClass *class) -{ - GtkObjectClass *object_class; - - object_class = (GtkObjectClass *)class; - parent_class = gtk_type_class (gnome_dialog_get_type ()); - - object_class->finalize = mail_search_dialogue_finalise; - /* override methods */ - -} - -static void -mail_search_dialogue_construct (MailSearchDialogue *o, FilterRule *rule) -{ - FilterPart *part; - GnomeDialog *dialogue = GNOME_DIALOG (o); - - gtk_window_set_policy (GTK_WINDOW (dialogue), FALSE, TRUE, FALSE); - gtk_window_set_default_size (GTK_WINDOW (dialogue), 500, 400); - - o->context = rule_context_new (); - rule_context_add_part_set (o->context, "partset", filter_part_get_type (), - rule_context_add_part, rule_context_next_part); - rule_context_load (o->context, EVOLUTION_DATADIR "/evolution/vfoldertypes.xml", ""); - if (rule) { - o->rule = rule; - o->guts = filter_rule_get_widget (o->rule, o->context); - } else { - o->rule = filter_rule_new (); - part = rule_context_next_part (o->context, NULL); - if (part == NULL) { - g_warning ("Problem loading search: no parts to load"); - o->guts = gtk_entry_new (); - } else { - filter_rule_add_part (o->rule, filter_part_clone (part)); - o->guts = filter_rule_get_widget (o->rule, o->context); - } - } - - gtk_widget_show (o->guts); - gtk_box_pack_start (GTK_BOX (dialogue->vbox), o->guts, TRUE, TRUE, 0); -} - -static void -mail_search_dialogue_init (MailSearchDialogue *o) -{ - GnomeDialog *dialogue = GNOME_DIALOG (o); - - gnome_dialog_append_buttons (dialogue, - GNOME_STOCK_BUTTON_OK, - _("_Search"), - GNOME_STOCK_BUTTON_CANCEL, - NULL); - gnome_dialog_set_default (dialogue, 0); -} - - -static void -mail_search_dialogue_finalise (GtkObject *obj) -{ - MailSearchDialogue *o = (MailSearchDialogue *)obj; - - if (o->context) - gtk_object_unref (GTK_OBJECT (o->context)); - if (o->rule) - gtk_object_unref (GTK_OBJECT (o->rule)); - - ((GtkObjectClass *)(parent_class))->finalize(obj); -} - -/** - * mail_search_dialogue_new: - * - * Create a new MailSearchDialogue object. - * - * Return value: A new #MailSearchDialogue object. - **/ -MailSearchDialogue * -mail_search_dialogue_new () -{ - MailSearchDialogue *o = (MailSearchDialogue *)gtk_type_new (mail_search_dialogue_get_type ()); - mail_search_dialogue_construct (o, NULL); - return o; -} - -MailSearchDialogue * -mail_search_dialogue_new_with_rule (FilterRule *rule) -{ - MailSearchDialogue *o = (MailSearchDialogue *)gtk_type_new (mail_search_dialogue_get_type ()); - if (rule) - gtk_object_ref (GTK_OBJECT (rule)); - mail_search_dialogue_construct (o, rule); - return o; -} - -/** - * mail_search_dialogue_get_query: - * @msd: - * - * Get the query string represting the current search criterea. - * - * Return value: - **/ -char * -mail_search_dialogue_get_query (MailSearchDialogue *msd) -{ - GString *out = g_string_new (""); - char *ret; - - filter_rule_build_code (msd->rule, out); - ret = out->str; - g_string_free (out, FALSE); - return ret; -} diff --git a/mail/mail-search-dialogue.h b/mail/mail-search-dialogue.h deleted file mode 100644 index 9e87928e10..0000000000 --- a/mail/mail-search-dialogue.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2000 Ximian Inc. - * - * Authors: Not Zed - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef _MAIL_SEARCH_DIALOGUE_H -#define _MAIL_SEARCH_DIALOGUE_H - -#include -#include - -#include "filter/rule-context.h" -#include "filter/filter-rule.h" - -#define MAIL_SEARCH_DIALOGUE(obj) GTK_CHECK_CAST (obj, mail_search_dialogue_get_type (), MailSearchDialogue) -#define MAIL_SEARCH_DIALOGUE_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, mail_search_dialogue_get_type (), MailSearchDialogueClass) -#define IS_MAIL_SEARCH_DIALOGUE(obj) GTK_CHECK_TYPE (obj, mail_search_dialogue_get_type ()) - -typedef struct _MailSearchDialogue MailSearchDialogue; -typedef struct _MailSearchDialogueClass MailSearchDialogueClass; - -struct _MailSearchDialogue { - GnomeDialog parent; - - RuleContext *context; - FilterRule *rule; - GtkWidget *guts; -}; - -struct _MailSearchDialogueClass { - GnomeDialogClass parent_class; - - /* virtual methods */ - - /* signals */ -}; - -guint mail_search_dialogue_get_type (void); -MailSearchDialogue *mail_search_dialogue_new (void); -MailSearchDialogue *mail_search_dialogue_new_with_rule(FilterRule *rule); - -/* methods */ -char *mail_search_dialogue_get_query(MailSearchDialogue *msd); - -#endif /* ! _MAIL_SEARCH_DIALOGUE_H */ - diff --git a/mail/mail-search.c b/mail/mail-search.c deleted file mode 100644 index 2513804348..0000000000 --- a/mail/mail-search.c +++ /dev/null @@ -1,423 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * mail-search.c - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge - */ - -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "mail-search.h" -#include "e-searching-tokenizer.h" -#include -#include -#include -#include - -static GtkObjectClass *parent_class; - -static void -mail_search_destroy (GtkObject *obj) -{ - MailSearch *ms = MAIL_SEARCH (obj); - - gtk_signal_disconnect (GTK_OBJECT (ms->mail->html->engine->ht), - ms->match_handler); - gtk_signal_disconnect (GTK_OBJECT (ms->mail->html->engine->ht), - ms->begin_handler); - - g_free (ms->last_search); - gtk_object_unref (GTK_OBJECT (ms->mail)); -} - -static void -mail_search_class_init (MailSearchClass *klass) -{ - GtkObjectClass *object_class = (GtkObjectClass *) klass; - parent_class = GTK_OBJECT_CLASS (gtk_type_class (gnome_dialog_get_type ())); - - object_class->destroy = mail_search_destroy; -} - -static void -mail_search_init (MailSearch *ms) -{ - -} - -GtkType -mail_search_get_type (void) -{ - static GtkType mail_search_type = 0; - - if (! mail_search_type) { - GtkTypeInfo mail_search_info = { - "MailSearch", - sizeof (MailSearch), - sizeof (MailSearchClass), - (GtkClassInitFunc) mail_search_class_init, - (GtkObjectInitFunc) mail_search_init, - NULL, NULL, /* mysteriously reserved */ - (GtkClassInitFunc) NULL - }; - - mail_search_type = gtk_type_unique (gnome_dialog_get_type (), &mail_search_info); - } - - return mail_search_type; -} - -/* - * Convenience - */ - -static ESearchingTokenizer * -mail_search_tokenizer (MailSearch *ms) -{ - return E_SEARCHING_TOKENIZER (ms->mail->html->engine->ht); -} - -static void -mail_search_redisplay_message (MailSearch *ms) -{ - mail_display_redisplay (ms->mail, FALSE); -} - -static void -mail_search_set_subject (MailSearch *ms, const gchar *subject) -{ - gchar *utf8_subject = NULL; - gchar *gtk_subject = NULL; - - if (subject && *subject) { - - utf8_subject = g_strdup (subject); - - if (g_utf8_validate (utf8_subject, -1, NULL)) { - - const gint ARBITRARY_CUTOFF = 40; - - if (g_utf8_strlen (utf8_subject, -1) > ARBITRARY_CUTOFF) { - gchar *p = g_utf8_offset_to_pointer (utf8_subject, ARBITRARY_CUTOFF); - strcpy (p, "..."); - } - - } else { - /* If the subject contains bad utf8, don't show anything in the frame label. */ - g_free (utf8_subject); - utf8_subject = NULL; - } - - if (utf8_subject) - gtk_subject = e_utf8_to_gtk_string (GTK_WIDGET (ms->msg_frame), utf8_subject); - - } else { - - gtk_subject = g_strdup (_("(Untitled Message)")); - - } - - gtk_frame_set_label (GTK_FRAME (ms->msg_frame), gtk_subject); - - g_free (gtk_subject); - g_free (utf8_subject); -} - -/* - * Construct Objects - */ - -static void -toggled_case_cb (GtkToggleButton *b, MailSearch *ms) -{ - ms->case_sensitive = gtk_toggle_button_get_active (b); - - e_searching_tokenizer_set_primary_case_sensitivity (mail_search_tokenizer (ms), - ms->case_sensitive); - mail_search_redisplay_message (ms); - -} - -#if 0 -static void -toggled_fwd_cb (GtkToggleButton *b, MailSearch *ms) -{ - ms->search_forward = gtk_toggle_button_get_active (b); - gtk_html_engine_search_set_forward (ms->mail->html, ms->search_forward); -} -#endif - -static void -dialog_destroy_cb (GtkWidget *w, MailSearch *ms) -{ - ESearchingTokenizer *st = mail_search_tokenizer (ms); - - e_searching_tokenizer_set_primary_search_string (st, NULL); - mail_search_redisplay_message (ms); -} - -static void -dialog_clicked_cb (GtkWidget *w, gint button_number, MailSearch *ms) -{ - ESearchingTokenizer *st = mail_search_tokenizer (ms); - - if (button_number == 0) { /* "Search" */ - - char *search_text, *tmp; - - tmp = gtk_editable_get_chars (GTK_EDITABLE (ms->entry), 0, -1); - - g_strstrip (tmp); - search_text = e_utf8_from_gtk_string ((GtkWidget *) ms->entry, tmp); - g_free (tmp); - - if (search_text && *search_text) { - - if (ms->last_search && !strcmp (ms->last_search, search_text)) { - - if (! gtk_html_engine_search_next (ms->mail->html)) { - g_free (ms->last_search); - ms->last_search = NULL; - } - - } else { - - g_free (ms->last_search); - ms->last_search = NULL; - - e_searching_tokenizer_set_primary_search_string (st, search_text); - e_searching_tokenizer_set_primary_case_sensitivity (st, ms->case_sensitive); - - mail_search_redisplay_message (ms); - - if (gtk_html_engine_search (ms->mail->html, search_text, - ms->case_sensitive, ms->search_forward, - FALSE)) { - ms->last_search = g_strdup (search_text); - } - } - } - - - g_free (search_text); - - } else if (button_number == 1) { /* "Close" */ - gtk_widget_destroy (w); - } -} - -static void -begin_cb (ESearchingTokenizer *st, gchar *foo, MailSearch *ms) -{ - const gchar *subject; - - if (ms && ms->mail && ms->mail->current_message) { - - subject = ms->mail->current_message->subject; - - if (subject == NULL) - subject = _("Untitled Message"); - - } else { - - subject = _("Empty Message"); - - } - - gtk_label_set_text (GTK_LABEL (ms->count_label), "0"); - mail_search_set_subject (ms, subject); -} - -static void -match_cb (ESearchingTokenizer *st, MailSearch *ms) -{ - gchar buf[16]; - g_snprintf (buf, 16, "%d", e_searching_tokenizer_match_count (st)); - gtk_label_set_text (GTK_LABEL (ms->count_label), buf); -} - -void -mail_search_construct (MailSearch *ms, MailDisplay *mail) -{ - const gchar *buttons[] = { _("Search"), - GNOME_STOCK_BUTTON_CLOSE, - NULL }; - gchar *title = NULL; - - GtkWidget *find_hbox; - GtkWidget *matches_hbox; - GtkWidget *toggles_hbox; - GtkWidget *frame_vbox; - - GtkWidget *entry; - GtkWidget *count_label; - GtkWidget *case_check; -#if 0 - GtkWidget *fwd_check; -#endif - - GtkWidget *msg_hbox; - GtkWidget *msg_frame; - - g_return_if_fail (ms != NULL && IS_MAIL_SEARCH (ms)); - g_return_if_fail (mail != NULL && IS_MAIL_DISPLAY (mail)); - - /* Basic set-up */ - - ms->mail = mail; - gtk_object_ref (GTK_OBJECT (mail)); - - title = g_strdup (_("Find in Message")); - - gnome_dialog_constructv (GNOME_DIALOG (ms), title, buttons); - g_free (title); - - ms->search_forward = TRUE; - ms->case_sensitive = FALSE; - - ms->begin_handler = gtk_signal_connect (GTK_OBJECT (ms->mail->html->engine->ht), - "begin", - GTK_SIGNAL_FUNC (begin_cb), - ms); - ms->match_handler = gtk_signal_connect (GTK_OBJECT (ms->mail->html->engine->ht), - "match", - GTK_SIGNAL_FUNC (match_cb), - ms); - - /* Construct the dialog contents. */ - - msg_hbox = gtk_hbox_new (FALSE, 0); - find_hbox = gtk_hbox_new (FALSE, 0); - matches_hbox = gtk_hbox_new (FALSE, 0); - toggles_hbox = gtk_hbox_new (FALSE, 0); - frame_vbox = gtk_vbox_new (FALSE, 0); - - entry = gtk_entry_new (); - count_label = gtk_label_new ("0"); - - msg_frame = gtk_frame_new (NULL); - - case_check = gtk_check_button_new_with_label (_("Case Sensitive")); -#if 0 - fwd_check = gtk_check_button_new_with_label (_("Search Forward")); -#endif - - ms->entry = entry; - ms->count_label = count_label; - - ms->msg_frame = msg_frame; - - if (mail->current_message->subject && *mail->current_message->subject) - mail_search_set_subject (ms, mail->current_message->subject); - else - mail_search_set_subject (ms, NULL); - -#if 0 - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (fwd_check), ms->search_forward); -#endif - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (case_check), ms->case_sensitive); - - gtk_box_pack_start (GTK_BOX (msg_hbox), GTK_WIDGET (msg_frame), FALSE, FALSE, 3); - - gtk_box_pack_start (GTK_BOX (find_hbox), gtk_label_new (_("Find:")), FALSE, FALSE, 3); - gtk_box_pack_start (GTK_BOX (find_hbox), entry, TRUE, TRUE, 3); - gtk_box_pack_start (GTK_BOX (matches_hbox), gtk_hbox_new (FALSE, 0), TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (matches_hbox), gtk_label_new (_("Matches:")), FALSE, FALSE, 3); - gtk_box_pack_start (GTK_BOX (matches_hbox), count_label, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (matches_hbox), gtk_hbox_new (FALSE, 0), TRUE, TRUE, 0); - - gtk_box_pack_start (GTK_BOX (toggles_hbox), case_check, FALSE, FALSE, 4); - - /* - * Disabling the forward/backward search button because there are problems with it - * (related to how gtkhtml handles searches), the GUI freeze is upon us, and I - * don't know if they'll get resolved for 1.0. Hopefully getting this fixed can - * be a 1.1 item. - */ - -#if 0 - gtk_box_pack_start (GTK_BOX (toggles_hbox), fwd_check, FALSE, FALSE, 4); -#endif - - gtk_box_pack_start (GTK_BOX (frame_vbox), find_hbox, TRUE, TRUE, 8); - gtk_box_pack_start (GTK_BOX (frame_vbox), matches_hbox, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (frame_vbox), toggles_hbox, TRUE, TRUE, 0); - - gtk_container_add (GTK_CONTAINER (GTK_FRAME (msg_frame)), GTK_WIDGET (frame_vbox)); - - gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (ms)->vbox), msg_hbox, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (ms)->vbox), GTK_WIDGET (GTK_FRAME (msg_frame)), TRUE, TRUE, 0); - - gtk_widget_grab_focus (entry); /* Give focus to entry by default */ - gnome_dialog_set_default (GNOME_DIALOG (ms), 0); - gnome_dialog_editable_enters (GNOME_DIALOG (ms), GTK_EDITABLE(entry)); /* Make run the search */ - gnome_window_icon_set_from_file (GTK_WINDOW (GNOME_DIALOG (ms)), EVOLUTION_ICONSDIR "/find-message.xpm"); - - gtk_widget_show_all (msg_hbox); - gtk_widget_show_all (find_hbox); - gtk_widget_show_all (matches_hbox); - gtk_widget_show_all (toggles_hbox); - - /* Hook up signals */ - - gtk_signal_connect (GTK_OBJECT (case_check), - "toggled", - GTK_SIGNAL_FUNC (toggled_case_cb), - ms); -#if 0 - gtk_signal_connect (GTK_OBJECT (fwd_check), - "toggled", - GTK_SIGNAL_FUNC (toggled_fwd_cb), - ms); -#endif - gtk_signal_connect (GTK_OBJECT (ms), - "clicked", - GTK_SIGNAL_FUNC (dialog_clicked_cb), - ms); - - gtk_signal_connect_object (GTK_OBJECT (ms), - "destroy", - GTK_SIGNAL_FUNC (dialog_destroy_cb), - ms); - - gtk_signal_connect_object (GTK_OBJECT (ms->mail), - "destroy", - GTK_SIGNAL_FUNC (gtk_widget_destroy), - GTK_OBJECT (ms)); -} - -GtkWidget * -mail_search_new (MailDisplay *mail) -{ - gpointer ptr; - - g_return_val_if_fail (mail && IS_MAIL_DISPLAY (mail), NULL); - - ptr = gtk_type_new (mail_search_get_type ()); - mail_search_construct (MAIL_SEARCH (ptr), mail); - - return GTK_WIDGET (ptr); -} - diff --git a/mail/mail-search.h b/mail/mail-search.h deleted file mode 100644 index 8c7797b83a..0000000000 --- a/mail/mail-search.h +++ /dev/null @@ -1,80 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * mail-search.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge - */ - -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#ifndef _MAIL_SEARCH_H_ -#define _MAIL_SEARCH_H_ - -#ifdef _cplusplus -extern "C" { -#pragma } -#endif /* _cplusplus */ - -#include -#include "mail-display.h" - -#define MAIL_SEARCH_TYPE (mail_search_get_type ()) -#define MAIL_SEARCH(o) (GTK_CHECK_CAST ((o), MAIL_SEARCH_TYPE, MailSearch)) -#define MAIL_SEARCH_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), MAIL_SEARCH_TYPE, MailSearch)) -#define IS_MAIL_SEARCH(o) (GTK_CHECK_TYPE ((o), MAIL_SEARCH_TYPE)) -#define IS_MAIL_SEARCH_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), MAIL_SEARCH_TYPE)) - -typedef struct _MailSearch MailSearch; -typedef struct _MailSearchClass MailSearchClass; - -struct _MailSearch { - GnomeDialog parent; - - MailDisplay *mail; - - GtkWidget *entry; - GtkWidget *msg_frame; - GtkWidget *count_label; - - gboolean search_forward, case_sensitive; - gchar *last_search; - - guint begin_handler; - guint match_handler; -}; - -struct _MailSearchClass { - GnomeDialogClass parent_class; - -}; - -GtkType mail_search_get_type (void); - -void mail_search_construct (MailSearch *, MailDisplay *); -GtkWidget *mail_search_new (MailDisplay *); - - -#ifdef _cplusplus -} -#endif /* _cplusplus */ - -#endif /* _MAIL_SEARCH_H_ */ - diff --git a/mail/mail-send-recv.c b/mail/mail-send-recv.c deleted file mode 100644 index 1baa28a866..0000000000 --- a/mail/mail-send-recv.c +++ /dev/null @@ -1,836 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: Michael Zucchi - * - * Copyright 2001 Ximian, Inc. (www.ximian.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include - -/* for the dialogue stuff */ -#include -#include -#include -#include -#include - -#include "filter/filter-filter.h" -#include "camel/camel-filter-driver.h" -#include "camel/camel-folder.h" -#include "camel/camel-operation.h" - -#include "evolution-storage.h" - -#include "mail.h" -#include "mail-mt.h" -#include "mail-config.h" -#include "mail-session.h" -#include "mail-tools.h" -#include "mail-ops.h" -#include "mail-send-recv.h" - -#define d(x) - -/* ms between status updates to the gui */ -#define STATUS_TIMEOUT (250) - -/* send/receive email */ - -/* ********************************************************************** */ -/* This stuff below is independent of the stuff above */ - -/* this stuff is used to keep track of which folders filters have accessed, and - what not. the thaw/refreeze thing doesn't really seem to work though */ -struct _folder_info { - char *uri; - CamelFolder *folder; - time_t update; - int count; /* how many times updated, to slow it down as we go, if we have lots */ -}; - -struct _send_data { - GList *infos; - - GnomeDialog *gd; - int cancelled; - - CamelFolder *inbox; /* since we're never asked to update this one, do it ourselves */ - time_t inbox_update; - - GMutex *lock; - GHashTable *folders; - - GHashTable *active; /* send_info's by uri */ -}; - -typedef enum { - SEND_RECEIVE, /* receiver */ - SEND_SEND, /* sender */ - SEND_UPDATE, /* imap-like 'just update folder info' */ -} send_info_t ; - -typedef enum { - SEND_ACTIVE, - SEND_CANCELLED, - SEND_COMPLETE -} send_state_t; - -struct _send_info { - send_info_t type; /* 0 = fetch, 1 = send */ - CamelOperation *cancel; - char *uri; - int keep; - send_state_t state; - GtkProgressBar *bar; - GtkButton *stop; - GtkLabel *status; - - int timeout_id; - char *what; - int pc; - - /*time_t update;*/ - struct _send_data *data; -}; - -static struct _send_data *send_data = NULL; - -static struct _send_data *setup_send_data(void) -{ - struct _send_data *data; - - if (send_data == NULL) { - send_data = data = g_malloc0(sizeof(*data)); - data->lock = g_mutex_new(); - data->folders = g_hash_table_new(g_str_hash, g_str_equal); - data->inbox = mail_tool_get_local_inbox(NULL); - data->active = g_hash_table_new(g_str_hash, g_str_equal); - } - return send_data; -} - -static void -receive_cancel(GtkButton *button, struct _send_info *info) -{ - if (info->state == SEND_ACTIVE) { - camel_operation_cancel(info->cancel); - if (info->status) - gtk_label_set_text(info->status, _("Cancelling...")); - info->state = SEND_CANCELLED; - } - if (info->stop) - gtk_widget_set_sensitive((GtkWidget *)info->stop, FALSE); -} - -static void -free_folder_info(void *key, struct _folder_info *info, void *data) -{ - /*camel_folder_thaw (info->folder); */ - mail_sync_folder(info->folder, NULL, NULL); - camel_object_unref((CamelObject *)info->folder); - g_free(info->uri); -} - -static void free_send_info(void *key, struct _send_info *info, void *data) -{ - d(printf("Freeing send info %p\n", info)); - g_free(info->uri); - camel_operation_unref(info->cancel); - if (info->timeout_id != 0) - gtk_timeout_remove(info->timeout_id); - g_free(info->what); - g_free(info); -} - -static void -free_send_data(void) -{ - struct _send_data *data = send_data; - - g_assert(g_hash_table_size(data->active) == 0); - - if (data->inbox) { - mail_sync_folder(data->inbox, NULL, NULL); - /*camel_folder_thaw (data->inbox); */ - camel_object_unref((CamelObject *)data->inbox); - } - g_list_free(data->infos); - g_hash_table_foreach(data->active, (GHFunc)free_send_info, NULL); - g_hash_table_destroy(data->active); - g_hash_table_foreach(data->folders, (GHFunc)free_folder_info, NULL); - g_hash_table_destroy(data->folders); - g_mutex_free(data->lock); - g_free(data); - send_data = NULL; -} - -static void cancel_send_info(void *key, struct _send_info *info, void *data) -{ - receive_cancel(info->stop, info); -} - -static void hide_send_info(void *key, struct _send_info *info, void *data) -{ - info->stop = NULL; - info->bar = NULL; - info->status = NULL; - - if (info->timeout_id != 0) { - gtk_timeout_remove (info->timeout_id); - info->timeout_id = 0; - } -} - -static void -dialog_destroy (GtkProgressBar *bar, struct _send_data *data) -{ - g_hash_table_foreach (data->active, (GHFunc) hide_send_info, NULL); - data->gd = NULL; -} - -static void -dialogue_clicked(GnomeDialog *gd, int button, struct _send_data *data) -{ - switch(button) { - case 0: - d(printf("cancelled whole thing\n")); - if (!data->cancelled) { - data->cancelled = TRUE; - g_hash_table_foreach(data->active, (GHFunc)cancel_send_info, NULL); - } - gnome_dialog_set_sensitive(gd, 0, FALSE); - break; - case -1: /* dialogue vanished, so make out its just hidden */ - d(printf("hiding dialogue\n")); - g_hash_table_foreach(data->active, (GHFunc)hide_send_info, NULL); - data->gd = NULL; - break; - } -} - -static void operation_status(CamelOperation *op, const char *what, int pc, void *data); -static int operation_status_timeout(void *data); - -static char * -format_url(const char *internal_url) -{ - CamelURL *url; - char *pretty_url; - - url = camel_url_new(internal_url, NULL); - if (url->host) - pretty_url = g_strdup_printf(_("Server: %s, Type: %s"), url->host, url->protocol); - else if (url->path) - pretty_url = g_strdup_printf(_("Path: %s, Type: %s"), url->path, url->protocol); - else - pretty_url = g_strdup_printf(_("Type: %s"), url->protocol); - - camel_url_free(url); - - return pretty_url; -} - -static struct _send_data * -build_dialogue (GSList *sources, CamelFolder *outbox, const char *destination) -{ - GnomeDialog *gd; - GtkTable *table; - int row; - GList *list = NULL; - struct _send_data *data; - GtkWidget *send_icon, *recv_icon; - GtkLabel *label, *status_label; - GtkProgressBar *bar; - GtkButton *stop; - GtkHSeparator *line; - struct _send_info *info; - char *pretty_url; - - data = setup_send_data (); - - gd = (GnomeDialog *)gnome_dialog_new (_("Send & Receive Mail"), NULL); - gnome_dialog_append_button_with_pixmap (gd, _("Cancel All"), GNOME_STOCK_BUTTON_CANCEL); - - gtk_window_set_policy (GTK_WINDOW (gd), FALSE, FALSE, FALSE); - gnome_window_icon_set_from_file (GTK_WINDOW (gd), EVOLUTION_ICONSDIR "/send-receive.xpm"); - - table = (GtkTable *)gtk_table_new (g_slist_length (sources), 4, FALSE); - gtk_box_pack_start (GTK_BOX (gd->vbox), GTK_WIDGET (table), TRUE, TRUE, 0); - - row = 0; - while (sources) { - MailConfigService *source = sources->data; - - if (!source->url || !source->enabled) { - sources = sources->next; - continue; - } - - /* see if we have an outstanding download active */ - info = g_hash_table_lookup (data->active, source->url); - if (info == NULL) { - info = g_malloc0 (sizeof (*info)); - /* imap and spool are handled differently */ - if (!strncmp (source->url, "imap:", 5) || !strncmp (source->url, "spool:", 6)) - info->type = SEND_UPDATE; - else - info->type = SEND_RECEIVE; - d(printf("adding source %s\n", source->url)); - - info->uri = g_strdup (source->url); - info->keep = source->keep_on_server; - info->cancel = camel_operation_new (operation_status, info); - info->state = SEND_ACTIVE; - info->timeout_id = gtk_timeout_add (STATUS_TIMEOUT, operation_status_timeout, info); - - g_hash_table_insert (data->active, info->uri, info); - list = g_list_prepend (list, info); - } else if (info->bar != NULL) { - /* incase we get the same source pop up again */ - sources = sources->next; - continue; - } else if (info->timeout_id == 0) - info->timeout_id = gtk_timeout_add (STATUS_TIMEOUT, operation_status_timeout, info); - - recv_icon = gnome_pixmap_new_from_file (EVOLUTION_BUTTONSDIR "/receive-24.png"); - - pretty_url = format_url (source->url); - label = (GtkLabel *)gtk_label_new (pretty_url); - g_free (pretty_url); - - bar = (GtkProgressBar *)gtk_progress_bar_new (); - gtk_progress_set_show_text (GTK_PROGRESS (bar), FALSE); - - stop = (GtkButton *)gnome_stock_button (GNOME_STOCK_BUTTON_CANCEL); - status_label = (GtkLabel *)gtk_label_new ((info->type == SEND_UPDATE) ? _("Updating...") : - _("Waiting...")); - - /* gtk_object_set (data->label, "bold", TRUE, NULL); */ - gtk_misc_set_alignment (GTK_MISC (label), 0, .5); - gtk_misc_set_alignment (GTK_MISC (status_label), 0, .5); - - gtk_table_attach (table, (GtkWidget *)recv_icon, 0, 1, row, row+2, GTK_EXPAND | GTK_FILL, 0, 3, 1); - gtk_table_attach (table, (GtkWidget *)label, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 3, 1); - gtk_table_attach (table, (GtkWidget *)bar, 2, 3, row, row+2, GTK_EXPAND | GTK_FILL, 0, 3, 1); - gtk_table_attach (table, (GtkWidget *)stop, 3, 4, row, row+2, GTK_EXPAND | GTK_FILL, 0, 3, 1); - gtk_table_attach (table, (GtkWidget *)status_label, 1, 2, row+1, row+2, GTK_EXPAND | GTK_FILL, 0, 3, 1); - - info->bar = bar; - info->status = status_label; - info->stop = stop; - info->data = data; - - gtk_signal_connect (GTK_OBJECT (stop), "clicked", receive_cancel, info); - sources = sources->next; - row = row + 2; - } - - line = (GtkHSeparator *)gtk_hseparator_new (); - gtk_table_attach (table, GTK_WIDGET (line), 0, 4, row, row+1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 3, 3); - row++; - gtk_widget_show_all (GTK_WIDGET (table)); - - if (outbox) { - info = g_hash_table_lookup (data->active, destination); - if (info == NULL) { - info = g_malloc0 (sizeof (*info)); - info->type = SEND_SEND; - d(printf("adding dest %s\n", destination)); - - info->uri = g_strdup (destination); - info->keep = FALSE; - info->cancel = camel_operation_new (operation_status, info); - info->state = SEND_ACTIVE; - info->timeout_id = gtk_timeout_add (STATUS_TIMEOUT, operation_status_timeout, info); - - g_hash_table_insert (data->active, info->uri, info); - list = g_list_prepend (list, info); - } else if (info->timeout_id == 0) - info->timeout_id = gtk_timeout_add (STATUS_TIMEOUT, operation_status_timeout, info); - - send_icon = gnome_pixmap_new_from_file (EVOLUTION_BUTTONSDIR "/send-24.png"); - - pretty_url = format_url (destination); - label = (GtkLabel *)gtk_label_new (pretty_url); - g_free (pretty_url); - - bar = (GtkProgressBar *)gtk_progress_bar_new (); - stop = (GtkButton *)gnome_stock_button (GNOME_STOCK_BUTTON_CANCEL); - status_label = (GtkLabel *)gtk_label_new (_("Waiting...")); - - gtk_misc_set_alignment (GTK_MISC (label), 0, .5); - gtk_misc_set_alignment (GTK_MISC (status_label), 0, .5); - gtk_progress_set_show_text (GTK_PROGRESS (bar), FALSE); - - gtk_table_attach (table, GTK_WIDGET (send_icon), 0, 1, row, row+2, GTK_EXPAND | GTK_FILL, 0, 3, 1); - gtk_table_attach (table, GTK_WIDGET (label), 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 3, 1); - gtk_table_attach (table, GTK_WIDGET (bar), 2, 3, row, row+2, GTK_EXPAND | GTK_FILL, 0, 3, 1); - gtk_table_attach (table, GTK_WIDGET (stop), 3, 4, row, row+2, GTK_EXPAND | GTK_FILL, 0, 3, 1); - gtk_table_attach (table, GTK_WIDGET (status_label), 1, 2, row+1, row+2, GTK_EXPAND | GTK_FILL, 0, 3, 1); - - info->bar = bar; - info->stop = stop; - info->data = data; - info->status = status_label; - - gtk_signal_connect (GTK_OBJECT (stop), "clicked", receive_cancel, info); - gtk_widget_show_all (GTK_WIDGET (table)); - } - - gtk_widget_show (GTK_WIDGET (gd)); - - gtk_signal_connect (GTK_OBJECT (gd), "clicked", dialogue_clicked, data); - gtk_signal_connect (GTK_OBJECT (gd), "destroy", dialog_destroy, data); - - data->infos = list; - data->gd = gd; - - return data; -} - -static void -update_folders(char *uri, struct _folder_info *info, void *data) -{ - time_t now = *((time_t *)data); - - d(printf("checking update for folder: %s\n", info->uri)); - - /* let it flow through to the folders every 10 seconds */ - /* we back off slowly as we progress */ - if (now > info->update+10+info->count*5) { - d(printf("upating a folder: %s\n", info->uri)); - /*camel_folder_thaw(info->folder); - camel_folder_freeze(info->folder);*/ - info->update = now; - info->count++; - } -} - -static void set_send_status(struct _send_info *info, const char *desc, int pc) -{ - /* FIXME: LOCK */ - g_free(info->what); - info->what = g_strdup(desc); - info->pc = pc; -} - -static void -receive_status (CamelFilterDriver *driver, enum camel_filter_status_t status, int pc, const char *desc, void *data) -{ - struct _send_info *info = data; - time_t now = time(0); - - /* let it flow through to the folder, every now and then too? */ - g_hash_table_foreach(info->data->folders, (GHFunc)update_folders, &now); - - if (info->data->inbox && now > info->data->inbox_update+20) { - d(printf("updating inbox too\n")); - /* this doesn't seem to work right :( */ - /*camel_folder_thaw(info->data->inbox); - camel_folder_freeze(info->data->inbox);*/ - info->data->inbox_update = now; - } - - /* we just pile them onto the port, assuming it can handle it. - We could also have a receiver port and see if they've been processed - yet, so if this is necessary its not too hard to add */ - /* the mail_gui_port receiver will free everything for us */ - switch (status) { - case CAMEL_FILTER_STATUS_START: - case CAMEL_FILTER_STATUS_END: - set_send_status(info, desc, pc); - break; - default: - break; - } -} - -static int operation_status_timeout(void *data) -{ - struct _send_info *info = data; - - if (info->bar) { - gtk_progress_set_percentage((GtkProgress *)info->bar, (gfloat)(info->pc/100.0)); - gtk_label_set_text(info->status, info->what); - return TRUE; - } - - return FALSE; -} - -/* for camel operation status */ -static void operation_status(CamelOperation *op, const char *what, int pc, void *data) -{ - struct _send_info *info = data; - - /*printf("Operation '%s', percent %d\n");*/ - switch (pc) { - case CAMEL_OPERATION_START: - pc = 0; - break; - case CAMEL_OPERATION_END: - pc = 100; - break; - } - - set_send_status(info, what, pc); -} - -/* when receive/send is complete */ -static void -receive_done (char *uri, void *data) -{ - struct _send_info *info = data; - - if (info->bar) { - gtk_progress_set_percentage((GtkProgress *)info->bar, (gfloat)1.0); - - switch(info->state) { - case SEND_CANCELLED: - gtk_label_set_text(info->status, _("Cancelled.")); - break; - default: - info->state = SEND_COMPLETE; - gtk_label_set_text(info->status, _("Complete.")); - } - } - - if (info->stop) - gtk_widget_set_sensitive((GtkWidget *)info->stop, FALSE); - - /* remove/free this active download */ - d(printf("%s: freeing info %p\n", __FUNCTION__, info)); - g_hash_table_remove(info->data->active, info->uri); - info->data->infos = g_list_remove(info->data->infos, info); - - if (g_hash_table_size(info->data->active) == 0) { - if (info->data->gd) - gnome_dialog_close(info->data->gd); - free_send_data(); - } - - free_send_info(NULL, info, NULL); -} - -/* same for updating */ -static void -receive_update_done(CamelStore *store, void *data) -{ - receive_done("", data); -} - -/* although we dont do anythign smart here yet, there is no need for this interface to - be available to anyone else. - This can also be used to hook into which folders are being updated, and occasionally - let them refresh */ -static CamelFolder * -receive_get_folder(CamelFilterDriver *d, const char *uri, void *data, CamelException *ex) -{ - struct _send_info *info = data; - CamelFolder *folder; - struct _folder_info *oldinfo; - char *oldkey; - - g_mutex_lock(info->data->lock); - oldinfo = g_hash_table_lookup(info->data->folders, uri); - g_mutex_unlock(info->data->lock); - if (oldinfo) { - camel_object_ref((CamelObject *)oldinfo->folder); - return oldinfo->folder; - } - folder = mail_tool_uri_to_folder(uri, ex); - if (!folder) - return NULL; - - /* we recheck that the folder hasn't snuck in while we were loading it... */ - /* and we assume the newer one is the same, but unref the old one anyway */ - g_mutex_lock(info->data->lock); - - if (g_hash_table_lookup_extended(info->data->folders, uri, (void **)&oldkey, (void **)&oldinfo)) { - camel_object_unref((CamelObject *)oldinfo->folder); - oldinfo->folder = folder; - } else { - /*camel_folder_freeze (folder); */ - oldinfo = g_malloc0(sizeof(*oldinfo)); - oldinfo->folder = folder; - oldinfo->uri = g_strdup(uri); - g_hash_table_insert(info->data->folders, oldinfo->uri, oldinfo); - } - - camel_object_ref (CAMEL_OBJECT (folder)); - - g_mutex_unlock(info->data->lock); - - return folder; -} - -static void -receive_update_got_store (char *uri, CamelStore *store, void *data) -{ - struct _send_info *info = data; - - if (store) { - EvolutionStorage *storage = mail_lookup_storage (store); - - if (storage) { - if (!gtk_object_get_data (GTK_OBJECT (storage), "connected")) - mail_scan_subfolders (store, storage); - - mail_update_subfolders (store, storage, receive_update_done, info); - bonobo_object_unref (BONOBO_OBJECT (storage)); - } else { - receive_done ("", info); - } - } else { - receive_done ("", info); - } -} - -void mail_send_receive (void) -{ - GSList *sources; - GList *scan; - static GtkWidget *gd = NULL; - struct _send_data *data; - extern CamelFolder *outbox_folder; - const MailConfigAccount *account; - - if (gd != NULL) { - g_assert(GTK_WIDGET_REALIZED(gd)); - gdk_window_show(gd->window); - gdk_window_raise(gd->window); - return; - } - - sources = mail_config_get_sources(); - if (!sources) - return; - account = mail_config_get_default_account(); - if (!account || !account->transport) - return; - - /* what to do about pop before smtp ? - Well, probably hook into receive_done or receive_status on - the right pop account, and when it is, then kick off the - smtp one. */ - data = build_dialogue(sources, outbox_folder, account->transport->url); - scan = data->infos; - gd = GTK_WIDGET(data->gd); - gtk_signal_connect((GtkObject *)gd, "destroy", gtk_widget_destroyed, &gd); - while (scan) { - struct _send_info *info = scan->data; - - switch(info->type) { - case SEND_RECEIVE: - mail_fetch_mail(info->uri, info->keep, - FILTER_SOURCE_INCOMING, - info->cancel, - receive_get_folder, info, - receive_status, info, - receive_done, info); - break; - case SEND_SEND: - /* todo, store the folder in info? */ - mail_send_queue(outbox_folder, info->uri, - FILTER_SOURCE_OUTGOING, - info->cancel, - receive_get_folder, info, - receive_status, info, - receive_done, info); - break; - case SEND_UPDATE: - /* FIXME: error reporting? */ - mail_get_store(info->uri, receive_update_got_store, info); - break; - } - scan = scan->next; - } -} - -struct _auto_data { - char *uri; - int keep; /* keep on server flag */ - int period; /* in seconds */ - int timeout_id; -}; - -static GHashTable *auto_active; - -static gboolean -auto_timeout(void *data) -{ - struct _auto_data *info = data; - - if (camel_session_is_online(session)) - mail_receive_uri(info->uri, info->keep); - - return TRUE; -} - -static void auto_setup_set(void *key, struct _auto_data *info, GHashTable *set) -{ - g_hash_table_insert(set, info->uri, info); -} - -static void auto_clean_set(void *key, struct _auto_data *info, GHashTable *set) -{ - d(printf("removing auto-check for %s %p\n", info->uri, info)); - g_hash_table_remove(set, info->uri); - gtk_timeout_remove(info->timeout_id); - g_free(info->uri); - g_free(info); -} - -/* call to setup initial, and after changes are made to the config */ -/* FIXME: Need a cleanup funciton for when object is deactivated */ -static void -autoreceive_setup_list(GSList *sources, gboolean clear_absent) -{ - GHashTable *set_hash; - - if (!sources) - return; - - if (auto_active == NULL) - auto_active = g_hash_table_new(g_str_hash, g_str_equal); - - set_hash = g_hash_table_new(g_str_hash, g_str_equal); - g_hash_table_foreach(auto_active, (GHFunc)auto_setup_set, set_hash); - - while (sources) { - MailConfigService *source = sources->data; - if (source->url && source->auto_check && source->enabled) { - struct _auto_data *info; - - d(printf("setting up auto-receive mail for : %s\n", source->url)); - - g_hash_table_remove(set_hash, source->url); - info = g_hash_table_lookup(auto_active, source->url); - if (info) { - info->keep = source->keep_on_server; - if (info->period != source->auto_check_time*60) { - info->period = source->auto_check_time*60; - gtk_timeout_remove(info->timeout_id); - info->timeout_id = gtk_timeout_add(info->period*1000, auto_timeout, info); - } - } else { - info = g_malloc0(sizeof(*info)); - info->uri = g_strdup(source->url); - info->keep = source->keep_on_server; - info->period = source->auto_check_time*60; - info->timeout_id = gtk_timeout_add(info->period*1000, auto_timeout, info); - g_hash_table_insert(auto_active, info->uri, info); - /* If we do this at startup, it can cause the logon dialogue to be hidden, - so lets not */ - /*mail_receive_uri(source->url, source->keep_on_server);*/ - } - } - - sources = sources->next; - } - - if (clear_absent) - g_hash_table_foreach(set_hash, (GHFunc)auto_clean_set, auto_active); - g_hash_table_destroy(set_hash); -} - -void -mail_autoreceive_setup (void) -{ - autoreceive_setup_list (mail_config_get_sources(), TRUE); -} - -void -mail_autoreceive_setup_account (MailConfigService *service) -{ - GSList list; - - list.data = service; - list.next = NULL; - - autoreceive_setup_list (&list, FALSE); -} - -/* we setup the download info's in a hashtable, if we later need to build the gui, we insert - them in to add them. */ -void -mail_receive_uri (const char *uri, int keep) -{ - struct _send_info *info; - struct _send_data *data; - extern CamelFolder *outbox_folder; - - data = setup_send_data(); - info = g_hash_table_lookup(data->active, uri); - if (info != NULL) { - d(printf("download of %s still in progress\n", uri)); - return; - } - - d(printf("starting non-interactive download of '%s'\n", uri)); - - info = g_malloc0 (sizeof (*info)); - /* imap is handled differently */ - if (!strncmp (uri, "imap:", 5)) - info->type = SEND_UPDATE; - else - info->type = SEND_RECEIVE; - - info->bar = NULL; - info->status = NULL; - info->uri = g_strdup (uri); - info->keep = keep; - info->cancel = camel_operation_new (operation_status, info); - info->stop = NULL; - info->data = data; - info->state = SEND_ACTIVE; - info->timeout_id = 0; - - d(printf("Adding new info %p\n", info)); - - g_hash_table_insert (data->active, info->uri, info); - - switch (info->type) { - case SEND_RECEIVE: - mail_fetch_mail (info->uri, info->keep, - FILTER_SOURCE_INCOMING, - info->cancel, - receive_get_folder, info, - receive_status, info, - receive_done, info); - break; - case SEND_SEND: - /* todo, store the folder in info? */ - mail_send_queue (outbox_folder, info->uri, - FILTER_SOURCE_OUTGOING, - info->cancel, - receive_get_folder, info, - receive_status, info, - receive_done, info); - break; - case SEND_UPDATE: - /* FIXME: error reporting? */ - mail_get_store (info->uri, receive_update_got_store, info); - break; - } -} diff --git a/mail/mail-send-recv.h b/mail/mail-send-recv.h deleted file mode 100644 index 8cfea07f60..0000000000 --- a/mail/mail-send-recv.h +++ /dev/null @@ -1,45 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: Michael Zucchi - * - * Copyright 2001 Ximian, Inc. (www.ximian.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - -#ifndef MAIL_SEND_RECV_H -#define MAIL_SEND_RECV_H - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - -#include "mail-config.h" - -/* send/receive all uri's */ -void mail_send_receive(void); -/* receive a single uri */ -void mail_receive_uri(const char *uri, int keep); -/* setup auto receive stuff */ -void mail_autoreceive_setup(void); -void mail_autoreceive_setup_account(MailConfigService *source); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* ! MAIL_SEND_RECV_H */ diff --git a/mail/mail-session.c b/mail/mail-session.c deleted file mode 100644 index 25490b5984..0000000000 --- a/mail/mail-session.c +++ /dev/null @@ -1,507 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* mail-session.c: handles the session information and resource manipulation */ -/* - * Copyright 2001 Ximian, Inc. (www.ximian.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include "camel/camel-filter-driver.h" -#include "filter/filter-context.h" -#include "filter/filter-filter.h" -#include "mail.h" -#include "mail-session.h" -#include "mail-tools.h" -#include "mail-mt.h" - -CamelSession *session; - - -#define MAIL_SESSION_TYPE (mail_session_get_type ()) -#define MAIL_SESSION(obj) (CAMEL_CHECK_CAST((obj), MAIL_SESSION_TYPE, MailSession)) -#define MAIL_SESSION_CLASS(k) (CAMEL_CHECK_CLASS_CAST ((k), MAIL_SESSION_TYPE, MailSessionClass)) -#define MAIL_IS_SESSION(o) (CAMEL_CHECK_TYPE((o), MAIL_SESSION_TYPE)) - - -typedef struct _MailSession { - CamelSession parent_object; - - GHashTable *passwords; - gboolean interaction_enabled; - FILE *filter_logfile; -} MailSession; - -typedef struct _MailSessionClass { - CamelSessionClass parent_class; - -} MailSessionClass; - - -static char *get_password (CamelSession *session, const char *prompt, - gboolean secret, CamelService *service, - const char *item, CamelException *ex); -static void forget_password (CamelSession *session, CamelService *service, - const char *item, CamelException *ex); -static gboolean alert_user (CamelSession *session, CamelSessionAlertType type, - const char *prompt, gboolean cancel); -static guint register_timeout (CamelSession *session, guint32 interval, - CamelTimeoutCallback cb, gpointer camel_data); -static gboolean remove_timeout (CamelSession *session, guint handle); -static CamelFilterDriver *get_filter_driver (CamelSession *session, - const char *type, - CamelException *ex); - - -static char *decode_base64 (char *base64); - -static void -init (MailSession *session) -{ - char *key, *value; - void *iter; - - session->passwords = g_hash_table_new (g_str_hash, g_str_equal); - - iter = gnome_config_private_init_iterator ("/Evolution/Passwords"); - if (iter) { - while (gnome_config_iterator_next (iter, &key, &value)) { - g_hash_table_insert (session->passwords, - decode_base64 (key), - decode_base64 (value)); - g_free (key); - g_free (value); - } - } -} - -static void -class_init (MailSessionClass *mail_session_class) -{ - CamelSessionClass *camel_session_class = - CAMEL_SESSION_CLASS (mail_session_class); - - /* virtual method override */ - camel_session_class->get_password = get_password; - camel_session_class->forget_password = forget_password; - camel_session_class->alert_user = alert_user; - camel_session_class->register_timeout = register_timeout; - camel_session_class->remove_timeout = remove_timeout; - camel_session_class->get_filter_driver = get_filter_driver; -} - -static CamelType -mail_session_get_type (void) -{ - static CamelType mail_session_type = CAMEL_INVALID_TYPE; - - if (mail_session_type == CAMEL_INVALID_TYPE) { - mail_session_type = camel_type_register ( - camel_session_get_type (), - "MailSession", - sizeof (MailSession), - sizeof (MailSessionClass), - (CamelObjectClassInitFunc) class_init, - NULL, - (CamelObjectInitFunc) init, - NULL); - } - - return mail_session_type; -} - - -static char * -make_key (CamelService *service, const char *item) -{ - char *key; - - if (service) - key = camel_url_to_string (service->url, CAMEL_URL_HIDE_PASSWORD | CAMEL_URL_HIDE_PARAMS); - else - key = g_strdup (item); - - return key; -} - -static char * -get_password (CamelSession *session, const char *prompt, gboolean secret, - CamelService *service, const char *item, CamelException *ex) -{ - MailSession *mail_session = MAIL_SESSION (session); - char *key, *ans; - - if (!strcmp(item, "popb4smtp_uri")) { - char *url = camel_url_to_string(service->url, 0); - const MailConfigAccount *account = mail_config_get_account_by_transport_url(url); - - g_free(url); - if (account == NULL) - return NULL; - - return g_strdup(account->source->url); - } - - key = make_key (service, item); - if (!key) - return NULL; - - ans = g_hash_table_lookup (mail_session->passwords, key); - if (ans) { - g_free (key); - return g_strdup (ans); - } - - if (!mail_session->interaction_enabled || - !(ans = mail_get_password (service, prompt, secret))) { - g_free (key); - camel_exception_set (ex, CAMEL_EXCEPTION_USER_CANCEL, - _("User canceled operation.")); - return NULL; - } - - g_hash_table_insert (mail_session->passwords, key, g_strdup (ans)); - return ans; -} - -static void -forget_password (CamelSession *session, CamelService *service, - const char *item, CamelException *ex) -{ - MailSession *mail_session = MAIL_SESSION (session); - char *key = make_key (service, item); - gpointer old_key, old_data; - - if (!g_hash_table_lookup_extended (mail_session->passwords, key, - &old_key, &old_data)) - return; - - g_hash_table_remove (mail_session->passwords, key); - memset (old_data, 0, strlen (old_data)); - g_free (old_data); - g_free (old_key); -} - -static gboolean -alert_user (CamelSession *session, CamelSessionAlertType type, - const char *prompt, gboolean cancel) -{ - MailSession *mail_session = MAIL_SESSION (session); - const char *message_type = NULL; - - if (!mail_session->interaction_enabled) - return FALSE; - - switch (type) { - case CAMEL_SESSION_ALERT_INFO: - message_type = GNOME_MESSAGE_BOX_INFO; - break; - case CAMEL_SESSION_ALERT_WARNING: - message_type = GNOME_MESSAGE_BOX_WARNING; - break; - case CAMEL_SESSION_ALERT_ERROR: - message_type = GNOME_MESSAGE_BOX_ERROR; - break; - } - return mail_user_message (message_type, prompt, cancel); -} - -/* ******************** */ - -struct _timeout_data { - CamelTimeoutCallback cb; - guint32 interval; - void *camel_data; - int result; -}; - -struct _timeout_msg { - struct _mail_msg msg; - - CamelTimeoutCallback cb; - gpointer camel_data; -}; - -static void -timeout_timeout (struct _mail_msg *mm) -{ - struct _timeout_msg *m = (struct _timeout_msg *)mm; - - /* we ignore the callback result, do we care?? no. */ - m->cb (m->camel_data); -} - -static struct _mail_msg_op timeout_op = { - NULL, - timeout_timeout, - NULL, - NULL, -}; - -static gboolean -camel_timeout (gpointer data) -{ - struct _timeout_data *td = data; - struct _timeout_msg *m; - - m = mail_msg_new (&timeout_op, NULL, sizeof (*m)); - - m->cb = td->cb; - m->camel_data = td->camel_data; - - e_thread_put (mail_thread_queued, (EMsg *)m); - - return TRUE; -} - -static void -do_register_timeout(CamelObject *o, void *edata, void *data) -{ - struct _timeout_data *td = (struct _timeout_data *)edata; - - td->result = gtk_timeout_add_full(td->interval, camel_timeout, NULL, td, g_free); -} - -static void -do_remove_timeout(CamelObject *o, void *edata, void *data) -{ - gtk_timeout_remove(*((int *)edata)); -} - -static guint -register_timeout (CamelSession *session, guint32 interval, CamelTimeoutCallback cb, gpointer camel_data) -{ - struct _timeout_data *td; - - /* We do this because otherwise the timeout can get called - * more often than the dispatch thread can get rid of it, - * leading to timeout calls piling up, and we don't have a - * good way to watch the return values. It's not cool. - */ - if (interval < 1000) { - g_warning("Timeout %u too small, increased to 1000", interval); - interval = 1000; - } - - /* This is extremely messy, we need to proxy to gtk thread for this */ - td = g_malloc (sizeof (*td)); - td->interval = interval; - td->result = 0; - td->cb = cb; - td->camel_data = camel_data; - - mail_msg_wait(mail_proxy_event(do_register_timeout, (CamelObject *)session, td, NULL)); - - if (td->result == 0) { - g_free(td); - return 0; - } - - return td->result; -} - -static gboolean -remove_timeout (CamelSession *session, guint handle) -{ - mail_msg_wait(mail_proxy_event(do_remove_timeout, (CamelObject *)session, &handle, NULL)); - - return TRUE; -} - -static CamelFolder * -get_folder (CamelFilterDriver *d, const char *uri, void *data, CamelException *ex) -{ - return mail_tool_uri_to_folder(uri, ex); -} - -static CamelFilterDriver * -get_filter_driver (CamelSession *session, const char *type, CamelException *ex) -{ - CamelFilterDriver *driver; - RuleContext *fc; - GString *fsearch, *faction; - FilterRule *rule = NULL; - char *user, *system; - - user = g_strdup_printf ("%s/filters.xml", evolution_dir); - system = EVOLUTION_DATADIR "/evolution/filtertypes.xml"; - fc = (RuleContext *)filter_context_new (); - rule_context_load (fc, system, user); - g_free (user); - - driver = camel_filter_driver_new (); - camel_filter_driver_set_folder_func (driver, get_folder, NULL); - - if (mail_config_get_filter_log ()) { - MailSession *ms = (MailSession *)session; - - if (ms->filter_logfile == NULL) { - const char *filename; - - filename = mail_config_get_filter_log_path (); - if (filename) - ms->filter_logfile = fopen (filename, "a+"); - } - if (ms->filter_logfile) - camel_filter_driver_set_logfile (driver, ms->filter_logfile); - } - - fsearch = g_string_new (""); - faction = g_string_new (""); - - while ((rule = rule_context_next_rule (fc, rule, type))) { - g_string_truncate (fsearch, 0); - g_string_truncate (faction, 0); - - filter_rule_build_code (rule, fsearch); - filter_filter_build_action ((FilterFilter *)rule, faction); - - camel_filter_driver_add_rule (driver, rule->name, - fsearch->str, faction->str); - } - - g_string_free (fsearch, TRUE); - g_string_free (faction, TRUE); - - gtk_object_unref (GTK_OBJECT (fc)); - return driver; -} - - -static char * -decode_base64 (char *base64) -{ - char *plain, *pad = "=="; - int len, out, state, save; - - len = strlen (base64); - plain = g_malloc0 (len); - state = save = 0; - out = base64_decode_step (base64, len, plain, &state, &save); - if (len % 4) { - base64_decode_step (pad, 4 - len % 4, plain + out, - &state, &save); - } - - return plain; -} - -static void -maybe_remember_password (gpointer key, gpointer password, gpointer url) -{ - char *path, *key64, *pass64; - int len, state, save; - - len = strlen (url); - if (strncmp (key, url, len) != 0) - return; - - len = strlen (key); - key64 = g_malloc0 ((len + 2) * 4 / 3 + 1); - state = save = 0; - base64_encode_close (key, len, FALSE, key64, &state, &save); - path = g_strdup_printf ("/Evolution/Passwords/%s", key64); - g_free (key64); - - len = strlen (password); - pass64 = g_malloc0 ((len + 2) * 4 / 3 + 1); - state = save = 0; - base64_encode_close (password, len, FALSE, pass64, &state, &save); - - gnome_config_private_set_string (path, pass64); - g_free (path); - g_free (pass64); -} - -void -mail_session_remember_password (const char *url_string) -{ - GHashTable *passwords = MAIL_SESSION (session)->passwords; - CamelURL *url; - char *simple_url; - - url = camel_url_new (url_string, NULL); - simple_url = camel_url_to_string (url, CAMEL_URL_HIDE_PASSWORD | CAMEL_URL_HIDE_PARAMS); - camel_url_free (url); - - g_hash_table_foreach (passwords, maybe_remember_password, simple_url); - g_free (simple_url); -} - -void -mail_session_forget_password (const char *key) -{ - GHashTable *passwords = MAIL_SESSION (session)->passwords; - gpointer okey, value; - - if (g_hash_table_lookup_extended (passwords, key, &okey, &value)) { - g_hash_table_remove (passwords, key); - memset (value, 0, strlen (value)); - g_free (okey); - g_free (value); - } -} - -void -mail_session_init (void) -{ - char *camel_dir; - - if (camel_init (evolution_dir, TRUE) != 0) - exit (0); - - session = CAMEL_SESSION (camel_object_new (MAIL_SESSION_TYPE)); - - camel_dir = g_strdup_printf ("%s/mail", evolution_dir); - camel_session_construct (session, camel_dir); - g_free (camel_dir); -} - -void -mail_session_enable_interaction (gboolean enable) -{ - MAIL_SESSION (session)->interaction_enabled = enable; -} - -static gboolean -free_entry (gpointer key, gpointer value, gpointer user_data) -{ - g_free (key); - memset (value, 0, strlen (value)); - g_free (value); - return TRUE; -} - -void -mail_session_forget_passwords (BonoboUIComponent *uih, void *user_data, - const char *path) -{ - GHashTable *passwords = MAIL_SESSION (session)->passwords; - - g_hash_table_foreach_remove (passwords, free_entry, NULL); - gnome_config_private_clean_section ("/Evolution/Passwords"); - gnome_config_sync (); -} diff --git a/mail/mail-session.h b/mail/mail-session.h deleted file mode 100644 index d23c4eaaf3..0000000000 --- a/mail/mail-session.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: Jeffrey Stedfast - * - * Copyright 2000 Ximian, Inc. (www.ximian.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - -#ifndef MAIL_SESSION_H -#define MAIL_SESSION_H - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -void mail_session_init (void); -void mail_session_enable_interaction (gboolean enable); -char *mail_session_request_dialog (const char *prompt, gboolean secret, - const char *key, gboolean async); -gboolean mail_session_accept_dialog (const char *prompt, const char *key, - gboolean async); -void mail_session_forget_passwords (BonoboUIComponent *uih, void *user_data, - const char *path); -void mail_session_remember_password (const char *url); - -void mail_session_forget_password (const char *key); - -extern CamelSession *session; - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* ! MAIL_SESSION_H */ diff --git a/mail/mail-summary.c b/mail/mail-summary.c deleted file mode 100644 index 0b8e64a592..0000000000 --- a/mail/mail-summary.c +++ /dev/null @@ -1,523 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* mail-summary.c - * - * Authors: Iain Holmes - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include - -#include "camel.h" -#include "mail.h" -#include "mail-tools.h" -#include "mail-ops.h" -#include "mail-vfolder.h" -#include "mail-summary.h" - -#include "Evolution.h" -#include "evolution-storage.h" -#include "evolution-storage-listener.h" - -#include "filter/vfolder-context.h" - -#include -#include -#include - -typedef struct { - CamelFolder *folder; - - char *name; - char *uri; - int total, unread; -} FolderSummary; - -typedef struct { - BonoboObject *component; - BonoboObject *view; - EvolutionStorageListener *listener; - - GHashTable *folder_to_summary; - FolderSummary **folders; - int numfolders; - - char *title; - char *icon; - - guint idle; - gboolean in_summary; -} MailSummary; - -#define SUMMARY_IN() g_print ("IN: %s: %d\n", __FUNCTION__, __LINE__); -#define SUMMARY_OUT() g_print ("OUT: %s: %d\n", __FUNCTION__, __LINE__); - -static int queue_len = 0; - -extern char *evolution_dir; -extern EvolutionStorage *vfolder_storage; - -#define MAIN_READER main_compipe[0] -#define MAIN_WRITER main_compipe[1] -#define DISPATCH_READER dispatch_compipe[0] -#define DISPATCH_WRITER dispatch_compipe[1] - -static int main_compipe[2] = {-1, -1}; -static int dispatch_compipe[2] = {-1, -1}; - -GIOChannel *summary_chan_reader = NULL; - -static gboolean do_changed (MailSummary *summary); - -enum { - PROPERTY_TITLE, - PROPERTY_ICON -}; - -/* Read a message from the pipe */ -static gboolean -read_msg (GIOChannel *source, - GIOCondition condition, - gpointer user_data) -{ - MailSummary *summary; - int size; - - summary = g_new0 (MailSummary, 1); - g_io_channel_read (source, (gchar *) summary, - sizeof (MailSummary) / sizeof (gchar), &size); - - if (size != sizeof (MailSummary)) { - g_warning (_("Incomplete message written on pipe!")); - return TRUE; - } - - do_changed (summary); - g_free (summary); - - return TRUE; -} - -/* check_compipes: */ -static void -check_compipes (void) -{ - if (MAIN_READER < 0) { - if (pipe (main_compipe) < 0) { - g_warning ("Call to pipe failed"); - return; - } - - summary_chan_reader = g_io_channel_unix_new (MAIN_READER); - g_io_add_watch (summary_chan_reader, G_IO_IN, read_msg, NULL); - } - - if (DISPATCH_READER < 0) { - if (pipe (dispatch_compipe) < 0) { - g_warning ("Call to pipe failed"); - return; - } - } -} - -static void -folder_free (FolderSummary *folder) -{ - g_free (folder->name); - g_free (folder->uri); -} - -static void -summary_free (MailSummary *summary) -{ - int i; - - for (i = 0; i < summary->numfolders; i++){ - folder_free (summary->folders[i]); - } - - g_free (summary->folders); - g_free (summary->title); - g_free (summary->icon); - - g_hash_table_destroy (summary->folder_to_summary); -} - -static void -view_destroy_cb (GtkObject *object, - MailSummary *summary) -{ - summary_free (summary); - g_free (summary); -} - -static char * -generate_html_summary (MailSummary *summary) -{ - char *ret_html = NULL, *tmp; - FolderSummary *fs; - int i; - - summary->in_summary = TRUE; - /* Inbox first */ - fs = summary->folders[0]; - - g_print ("%p: %p\n", fs, fs->name); - g_print ("unread: %d\n", fs->unread); - g_print ("total: %d\n", fs->total); - - tmp = g_strdup_printf ("", - fs->name, fs->unread, fs->total); - - ret_html = g_strdup (tmp); - for (i = 1; i < summary->numfolders; i++) { - char *tmp2; - - fs = summary->folders[i]; - tmp2 = g_strdup_printf ("" - "", - fs->uri, fs->name, fs->unread, fs->total); - - tmp = ret_html; - ret_html = g_strconcat (ret_html, tmp2, NULL); - g_free (tmp); - g_free (tmp2); - } - - tmp = ret_html; - ret_html = g_strconcat (ret_html, "
    %s:" - "%d/%d
    %s:%d/%d
    ", NULL); - g_free (tmp); - - summary->in_summary = FALSE; - return ret_html; -} - -static gboolean -do_changed (MailSummary *summary) -{ - char *ret_html; - - ret_html = generate_html_summary (summary); - executive_summary_html_view_set_html(EXECUTIVE_SUMMARY_HTML_VIEW(summary->view), (const char *) ret_html); - g_free (ret_html); - - summary->idle = 0; - return TRUE; -} - -/* These two callbacks are called from the Camel thread, - which can't make any CORBA calls, or else ORBit locks up, - and likewise the thread that can call ORBit, cannot call - camel. - - So, when the callbacks are triggered, they generate a MailSummary - structure and write this onto a pipe. The ORBit calling thread - detects when something is written to the pipe and creates its own - MailSummary structure, and calls the appropriate CORBA calls. - - Same theory as mail-threads.c, but a lot less complicated - as there is only one way communication, and only one type of message -*/ -static void -folder_changed_cb (CamelObject *folder, - gpointer event_data, - gpointer user_data) -{ - MailSummary *summary; - FolderSummary *fs; - - summary = (MailSummary *) user_data; - fs = g_hash_table_lookup (summary->folder_to_summary, folder); - if (fs == NULL) { - g_warning ("%s: Unknown folder", __FUNCTION__); - return; - } - - fs->total = camel_folder_get_message_count (fs->folder); - fs->unread = camel_folder_get_unread_message_count (fs->folder); - - write (MAIN_WRITER, summary, sizeof (MailSummary)); - queue_len++; - - return; -} - -static void -message_changed_cb (CamelObject *folder, - gpointer event_data, - gpointer user_data) -{ - MailSummary *summary; - FolderSummary *fs; - - summary = (MailSummary *)user_data; - fs = g_hash_table_lookup (summary->folder_to_summary, folder); - if (fs == NULL) { - g_warning ("%s: Unknown folder.", __FUNCTION__); - return; - } - - fs->unread = camel_folder_get_unread_message_count (fs->folder); - fs->total = camel_folder_get_message_count (fs->folder); - - write (MAIN_WRITER, summary, sizeof (MailSummary)); - queue_len++; - - return; -} - -static void -generate_folder_summaries (MailSummary *summary) -{ - int numfolders = 1; /* Always at least the Inbox */ - char *user, *system; - FilterRule *rule; - VfolderContext *context; - FolderSummary *fs; - CamelException *ex; - int i; - - user = g_strdup_printf ("%s/vfolders.xml", evolution_dir); - system = EVOLUTION_DATADIR "/evolution/vfoldertypes.xml"; - - context = vfolder_context_new (); - rule_context_load ((RuleContext *)context, system, user); - g_free (user); - - rule = NULL; - while ((rule = rule_context_next_rule ((RuleContext *)context, rule, NULL))){ - g_print ("rule->name: %s\n", rule->name); - numfolders++; - } - - if (summary->folders != NULL) { - int i; - - for (i = 0; i < summary->numfolders; i++){ - folder_free (summary->folders[i]); - } - - g_free (summary->folders); - } - - summary->folders = g_new (FolderSummary *, numfolders); - - /* Inbox */ - fs = summary->folders[0] = g_new (FolderSummary, 1); - fs->name = g_strdup ("Inbox"); - g_print ("%p: %s(%p)\n", fs, fs->name, fs->name); - fs->uri = NULL; - ex = camel_exception_new (); - fs->folder = mail_tool_get_local_inbox (ex); - - fs->total = camel_folder_get_message_count (fs->folder); - fs->unread = camel_folder_get_unread_message_count (fs->folder); - camel_exception_free (ex); - camel_object_hook_event (CAMEL_OBJECT (fs->folder), "folder_changed", - (CamelObjectEventHookFunc) folder_changed_cb, - summary); - camel_object_hook_event (CAMEL_OBJECT (fs->folder), "message_changed", - (CamelObjectEventHookFunc) message_changed_cb, - summary); - g_hash_table_insert (summary->folder_to_summary, fs->folder, fs); - - - summary->numfolders = 1; - - for (i = 1, rule = NULL; i < numfolders; i++) { - char *uri; - - ex = camel_exception_new (); - fs = summary->folders[i] = g_new (FolderSummary, 1); - rule = rule_context_next_rule ((RuleContext *)context, rule, NULL); - fs->name = g_strdup (rule->name); - - uri = g_strconcat ("vfolder:", rule->name, NULL); - fs->folder = vfolder_uri_to_folder (uri, ex); - fs->uri = g_strconcat ("evolution:/VFolders/", rule->name, NULL); - g_free (uri); - - fs->total = camel_folder_get_message_count (fs->folder); - fs->unread = camel_folder_get_unread_message_count (fs->folder); - - /* Connect to each folder */ - camel_object_hook_event (CAMEL_OBJECT (fs->folder), - "folder_changed", - (CamelObjectEventHookFunc) folder_changed_cb, - summary); - camel_object_hook_event (CAMEL_OBJECT (fs->folder), - "message_changed", - (CamelObjectEventHookFunc) message_changed_cb, - summary); - g_hash_table_insert (summary->folder_to_summary, fs->folder, fs); - summary->numfolders++; - - camel_exception_free (ex); - } - - gtk_object_destroy (GTK_OBJECT (context)); -} - -static void -get_property (BonoboPropertyBag *bag, - BonoboArg *arg, - guint arg_id, - CORBA_Environment *ev, - gpointer user_data) -{ - MailSummary *summary = (MailSummary *) user_data; - - switch (arg_id) { - case PROPERTY_TITLE: - BONOBO_ARG_SET_STRING (arg, summary->title); - break; - - case PROPERTY_ICON: - BONOBO_ARG_SET_STRING (arg, summary->icon); - break; - - default: - break; - } -} - -/* This code may play with the threads wrongly... - if the mail component locks when you use the summary - remove this define */ -#define DETECT_NEW_VFOLDERS -#ifdef DETECT_NEW_VFOLDERS - -/* Check that we can generate a new summary - and keep coming back until we can. */ -static gboolean -idle_check (gpointer data) -{ - MailSummary *summary = (MailSummary *) data; - - if (summary->in_summary == TRUE) - return TRUE; - - generate_folder_summaries (summary); - write (MAIN_WRITER, summary, sizeof (MailSummary)); - queue_len++; - summary->idle = 0; - - return FALSE; -} - -static void -new_folder_cb (EvolutionStorageListener *listener, - const char *path, - const GNOME_Evolution_Folder *folder, - MailSummary *summary) -{ - g_print ("New folder: %s\n", path); - - if (summary->idle == 0) - summary->idle = g_idle_add ((GSourceFunc) idle_check, summary); -} - -static void -removed_folder_cb (EvolutionStorageListener *listener, - const char *path, - MailSummary *summary) -{ - g_print ("Removed folder: %s\n", path); - - if (summary->idle == 0) - summary->idle = g_idle_add ((GSourceFunc) idle_check, summary); -} -#endif - -BonoboObject * -create_summary_view (ExecutiveSummaryComponentFactory *_factory, - void *closure) -{ - GNOME_Evolution_Storage corba_local_objref; - GNOME_Evolution_StorageListener corba_object; - CORBA_Environment ev; - BonoboObject *component, *view; - BonoboPropertyBag *bag; - BonoboEventSource *event_source; - MailSummary *summary; - - summary = g_new (MailSummary, 1); - summary->folders = 0; - summary->in_summary = FALSE; - summary->folder_to_summary = g_hash_table_new (NULL, NULL); - summary->title = e_utf8_from_locale_string (_("Mail Summary")); - summary->icon = g_strdup ("envelope.png"); - summary->idle = 0; - - check_compipes (); - - component = executive_summary_component_new (); - summary->component = component; - - event_source = bonobo_event_source_new (); - - view = executive_summary_html_view_new_full (event_source); - bonobo_object_add_interface (component, view); - summary->view = view; - gtk_signal_connect (GTK_OBJECT (view), "destroy", - GTK_SIGNAL_FUNC (view_destroy_cb), summary); - - bag = bonobo_property_bag_new_full (get_property, NULL, - event_source, summary); - bonobo_property_bag_add (bag, - "window_title", PROPERTY_TITLE, - BONOBO_ARG_STRING, NULL, - "The title of this component's window", - BONOBO_PROPERTY_READABLE); - bonobo_property_bag_add (bag, - "window_icon", PROPERTY_ICON, - BONOBO_ARG_STRING, NULL, - "The icon for this component's window", - BONOBO_PROPERTY_READABLE); - bonobo_object_add_interface (component, BONOBO_OBJECT(bag)); - -#ifdef DETECT_NEW_VFOLDERS - summary->listener = evolution_storage_listener_new (); - gtk_signal_connect (GTK_OBJECT (summary->listener), "new_folder", - GTK_SIGNAL_FUNC (new_folder_cb), summary); - gtk_signal_connect (GTK_OBJECT (summary->listener), "removed_folder", - GTK_SIGNAL_FUNC (removed_folder_cb), summary); - - corba_object = evolution_storage_listener_corba_objref (summary->listener); - - CORBA_exception_init (&ev); - corba_local_objref = bonobo_object_corba_objref (BONOBO_OBJECT (vfolder_storage)); - - GNOME_Evolution_Storage_addListener (corba_local_objref, - corba_object, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("Cannot add a listener to the vfolder storage."); - } - CORBA_exception_free (&ev); -#endif - - if (summary->idle == 0) - summary->idle = g_idle_add ((GSourceFunc) idle_check, summary); - - return component; -} diff --git a/mail/mail-summary.h b/mail/mail-summary.h deleted file mode 100644 index d9f098303f..0000000000 --- a/mail/mail-summary.h +++ /dev/null @@ -1,32 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* mail-summary.h - * - * Authors: Iain Holmes - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __MAIL_SUMMARY_H__ -#define __MAIL_SUMMARY_H__ - -#include - -BonoboObject *create_summary_view (ExecutiveSummaryComponentFactory *factory, - void *closure); - -#endif diff --git a/mail/mail-tools.c b/mail/mail-tools.c deleted file mode 100644 index 1cbf3163a2..0000000000 --- a/mail/mail-tools.c +++ /dev/null @@ -1,446 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: - * Dan Winship - * Peter Williams - * Jeffrey Stedfast - * - * Copyright 2000 Ximian, Inc. (www.ximian.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include -#include -#include "camel/camel.h" -#include "camel/camel-vee-folder.h" -#include "mail-vfolder.h" -#include "filter/vfolder-rule.h" -#include "filter/vfolder-context.h" -#include "filter/filter-option.h" -#include "filter/filter-input.h" -#include "mail.h" /*session*/ -#include "mail-tools.h" -#include "mail-local.h" -#include "mail-mt.h" -#include "mail-folder-cache.h" -#include "e-util/e-html-utils.h" - -/* **************************************** */ - -CamelFolder * -mail_tool_get_folder_from_urlname (const gchar *url, const gchar *name, - guint32 flags, CamelException *ex) -{ - CamelStore *store; - CamelFolder *folder; - - store = camel_session_get_store (session, url, ex); - if (!store) - return NULL; - - folder = camel_store_get_folder (store, name, flags, ex); - camel_object_unref (CAMEL_OBJECT (store)); - - return folder; -} - -char * -mail_tool_get_folder_name (CamelFolder *folder) -{ - const char *name = camel_folder_get_full_name (folder); - char *path, *pend; - - /* This is a kludge. */ - if (strcmp (name, "mbox") && strcmp (name, "mh") && strcmp (name, "maildir")) - return g_strdup (name); - - /* For mbox/mh, return the parent store's final path component. */ - path = g_strdup (CAMEL_SERVICE (folder->parent_store)->url->path); - pend = path + strlen (path) - 1; - if (*pend == '/') - *pend = '\0'; - - pend = path; - path = g_strdup (g_basename (path)); - g_free (pend); - - return path; -} - -gchar * -mail_tool_get_local_movemail_path (void) -{ - static gint count = 0; - static pthread_mutex_t movemail_path_lock = PTHREAD_MUTEX_INITIALIZER; - gint my_count; - - /* Ah, the joys of being multi-threaded... */ - pthread_mutex_lock (&movemail_path_lock); - my_count = count; - ++count; - pthread_mutex_unlock (&movemail_path_lock); - - return g_strdup_printf ("%s/local/Inbox/movemail.%d", evolution_dir, my_count); -} - -CamelFolder * -mail_tool_get_local_inbox (CamelException *ex) -{ - gchar *url; - CamelFolder *folder; - - url = g_strdup_printf("file://%s/local/Inbox", evolution_dir); - folder = mail_tool_uri_to_folder (url, ex); - g_free (url); - return folder; -} - -CamelFolder * -mail_tool_get_inbox (const gchar *url, CamelException *ex) -{ - CamelStore *store; - CamelFolder *folder; - - store = camel_session_get_store (session, url, ex); - if (!store) - return NULL; - - folder = camel_store_get_inbox (store, ex); - camel_object_unref (CAMEL_OBJECT (store)); - - return folder; -} - -CamelFolder * -mail_tool_get_trash (const gchar *url, CamelException *ex) -{ - CamelStore *store; - CamelFolder *trash; - - store = camel_session_get_store (session, url, ex); - if (!store) - return NULL; - - trash = camel_store_get_trash (store, ex); - camel_object_unref (CAMEL_OBJECT (store)); - - return trash; -} - -/* why is this function so stupidly complex when allthe work is done elsehwere? */ -char * -mail_tool_do_movemail (const gchar *source_url, CamelException *ex) -{ - gchar *dest_path; - const gchar *source; - struct stat sb; -#ifndef MOVEMAIL_PATH - int tmpfd; -#endif - g_return_val_if_fail (strncmp (source_url, "mbox:", 5) == 0, NULL); - - /* Set up our destination. */ - dest_path = mail_tool_get_local_movemail_path(); - - /* Create a new movemail mailbox file of 0 size */ - -#ifndef MOVEMAIL_PATH - tmpfd = open (dest_path, O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR); - - if (tmpfd == -1) { - camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM, - _("Couldn't create temporary mbox `%s': %s"), - dest_path, g_strerror (errno)); - g_free (dest_path); - return NULL; - } - - close (tmpfd); -#endif - - /* Skip over "mbox:" plus host part (if any) of url. */ - source = source_url + 5; - if (!strncmp (source, "//", 2)) - source = strchr (source + 2, '/'); - - /* Movemail from source (source_url) to dest_path */ - camel_movemail (source, dest_path, ex); - - if (stat (dest_path, &sb) < 0 || sb.st_size == 0) { - unlink (dest_path); /* Clean up the movemail.foo file. */ - g_free (dest_path); - return NULL; - } - - if (camel_exception_is_set (ex)) { - g_free (dest_path); - return NULL; - } - - return dest_path; -} - -char * -mail_tool_generate_forward_subject (CamelMimeMessage *msg) -{ - const char *subject; - char *fwd_subj; - - subject = camel_mime_message_get_subject(msg); - - if (subject && *subject) { - fwd_subj = g_strdup_printf ("[Fwd: %s]", subject); - } else { - const CamelInternetAddress *from; - char *fromstr; - - from = camel_mime_message_get_from (msg); - if (from) { - fromstr = camel_address_format (CAMEL_ADDRESS (from)); - fwd_subj = g_strdup_printf ("[Fwd: %s]", fromstr); - g_free (fromstr); - } else - fwd_subj = g_strdup ("[Fwd: No Subject]"); - } - - return fwd_subj; -} - -XEvolution * -mail_tool_remove_xevolution_headers (CamelMimeMessage *message) -{ - XEvolution *xev; - - xev = g_new (XEvolution, 1); - xev->flags = g_strdup (camel_medium_get_header (CAMEL_MEDIUM (message), "X-Evolution")); - xev->source = g_strdup (camel_medium_get_header (CAMEL_MEDIUM (message), "X-Evolution-Source")); - xev->transport = g_strdup (camel_medium_get_header (CAMEL_MEDIUM (message), "X-Evolution-Transport")); - xev->account = g_strdup (camel_medium_get_header (CAMEL_MEDIUM (message), "X-Evolution-Account")); - xev->fcc = g_strdup (camel_medium_get_header (CAMEL_MEDIUM (message), "X-Evolution-Fcc")); - - /* rip off the X-Evolution* headers */ - camel_medium_remove_header (CAMEL_MEDIUM (message), "X-Evolution"); - camel_medium_remove_header (CAMEL_MEDIUM (message), "X-Evolution-Source"); - camel_medium_remove_header (CAMEL_MEDIUM (message), "X-Evolution-Transport"); - camel_medium_remove_header (CAMEL_MEDIUM (message), "X-Evolution-Account"); - camel_medium_remove_header (CAMEL_MEDIUM (message), "X-Evolution-Fcc"); - - return xev; -} - -void -mail_tool_restore_xevolution_headers (CamelMimeMessage *message, XEvolution *xev) -{ - if (xev->flags) - camel_medium_set_header (CAMEL_MEDIUM (message), "X-Evolution", xev->flags); - if (xev->source) - camel_medium_set_header (CAMEL_MEDIUM (message), "X-Evolution-Source", xev->source); - if (xev->transport) - camel_medium_set_header (CAMEL_MEDIUM (message), "X-Evolution-Transport", xev->transport); - if (xev->account) - camel_medium_set_header (CAMEL_MEDIUM (message), "X-Evolution-Account", xev->account); - if (xev->fcc) - camel_medium_set_header (CAMEL_MEDIUM (message), "X-Evolution-Fcc", xev->fcc); -} - -void -mail_tool_destroy_xevolution (XEvolution *xev) -{ - g_free (xev->flags); - g_free (xev->source); - g_free (xev->transport); - g_free (xev->account); - g_free (xev->fcc); - g_free (xev); -} - -CamelMimePart * -mail_tool_make_message_attachment (CamelMimeMessage *message) -{ - CamelMimePart *part; - const char *subject; - XEvolution *xev; - char *desc; - - subject = camel_mime_message_get_subject (message); - if (subject) { - char *fmt; - - fmt = e_utf8_from_locale_string (_("Forwarded message - %s")); - desc = g_strdup_printf (fmt, subject); - g_free (fmt); - } else { - desc = e_utf8_from_locale_string (_("Forwarded message")); - } - - /* rip off the X-Evolution headers */ - xev = mail_tool_remove_xevolution_headers (message); - mail_tool_destroy_xevolution (xev); - - part = camel_mime_part_new (); - camel_mime_part_set_disposition (part, "inline"); - camel_mime_part_set_description (part, desc); - camel_medium_set_content_object (CAMEL_MEDIUM (part), - CAMEL_DATA_WRAPPER (message)); - camel_mime_part_set_content_type (part, "message/rfc822"); - g_free (desc); - - return part; -} - -CamelFolder * -mail_tool_uri_to_folder (const char *uri, CamelException *ex) -{ - CamelURL *url; - CamelStore *store = NULL; - CamelFolder *folder = NULL; - int offset = 0; - - g_return_val_if_fail (uri != NULL, NULL); - - folder = mail_folder_cache_try_folder (uri); - if (folder) { - camel_object_ref (CAMEL_OBJECT (folder)); - return folder; - } - - /* This hack is still needed for file:/ since it's its own EvolutionStorage type */ - if (!strncmp (uri, "vtrash:", 7)) - offset = 7; - - url = camel_url_new (uri + offset, ex); - if (!url) { - return NULL; - } - - store = camel_session_get_store (session, uri + offset, ex); - if (store) { - const char *name; - - /* if we have a fragment, then the path is actually used by the store, - so the fragment is the path to the folder instead */ - if (url->fragment) { - name = url->fragment; - } else { - if (url->path && *url->path) - name = url->path + 1; - else - name = ""; - } - - printf("opening folder '%s' on store (%p) '%s'\n", name, store, uri); - - if (offset) - folder = camel_store_get_trash (store, ex); - else - folder = camel_store_get_folder (store, name, - CAMEL_STORE_FOLDER_CREATE, ex); - camel_object_unref (CAMEL_OBJECT (store)); - } - - if (camel_exception_is_set (ex)) { - if (folder) { - camel_object_unref (CAMEL_OBJECT (folder)); - folder = NULL; - } - } else - mail_folder_cache_note_folder (uri, folder); - - camel_url_free (url); - - return folder; -} - -/** - * mail_tool_quote_message: - * @message: mime message to quote - * @fmt: credits format - example: "On %s, %s wrote:\n" - * @Varargs: arguments - * - * Returns an allocated buffer containing the quoted message. - */ -gchar * -mail_tool_quote_message (CamelMimeMessage *message, const char *fmt, ...) -{ - CamelDataWrapper *contents; - gboolean want_plain; - gchar *text; - - want_plain = !mail_config_get_send_html (); - contents = camel_medium_get_content_object (CAMEL_MEDIUM (message)); - /* We pass "want_plain" for "cite", since if it's HTML, we'll - * do the citing ourself below. - */ - text = mail_get_message_body (contents, want_plain, want_plain); - - /* Set the quoted reply text. */ - if (text) { - gchar *ret_text, *credits = NULL; - - /* create credits */ - if (fmt) { - va_list ap; - - va_start (ap, fmt); - credits = g_strdup_vprintf (fmt, ap); - va_end (ap); - } - - ret_text = g_strdup_printf ("%s" - "\n%s%s%s" - "", - credits ? credits : "", - mail_config_get_citation_color (), - want_plain ? "" : "
    ", - text, - want_plain ? "" : "
    "); - g_free (text); - g_free (credits); - return ret_text; - } - - return NULL; -} - -/** - * mail_tool_forward_message: - * @message: mime message to forward - * @quoted: whether to forwarded it quoted (%TRUE) or inline (%FALSE) - * - * Returns an allocated buffer containing the forwarded message. - */ -gchar * -mail_tool_forward_message (CamelMimeMessage *message, gboolean quoted) -{ - gchar *title, *body, *ret; - - body = mail_get_message_body (CAMEL_DATA_WRAPPER (message), - !mail_config_get_send_html (), - quoted); - title = e_utf8_from_locale_string (_("Forwarded Message")); - ret = g_strdup_printf ("-----%s-----
    %s", title, body ? body : ""); - g_free (title); - g_free (body); - return ret; -} diff --git a/mail/mail-tools.h b/mail/mail-tools.h deleted file mode 100644 index bcae822001..0000000000 --- a/mail/mail-tools.h +++ /dev/null @@ -1,92 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * Author : - * Peter Williams - * - * Copyright 2000 Ximian, Inc. (www.ximian.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef MAIL_TOOLS_H -#define MAIL_TOOLS_H - -#include -#include /*eek*/ - -typedef struct xevolution { - char *flags; - char *source; - char *transport; - char *account; - char *fcc; -} XEvolution; - -/* Get a CamelFolder from a root url and a foldername (uses the global session)*/ -CamelFolder * -mail_tool_get_folder_from_urlname (const gchar *url, const gchar *name, - guint32 flags, CamelException *ex); - -/* Get a useful name for a given CamelFolder (ie, not "mbox") */ -char *mail_tool_get_folder_name (CamelFolder *folder); - -/* Get the filename for our movemail folder or storage */ -gchar *mail_tool_get_local_movemail_path (void); - -/* Get the CamelFolder for the local inbox */ -CamelFolder *mail_tool_get_local_inbox (CamelException *ex); - -/* Get the "inbox" for a url (uses global session) */ -CamelFolder *mail_tool_get_inbox (const gchar *url, CamelException *ex); - -/* Get the "trash" for a url (uses global session) */ -CamelFolder *mail_tool_get_trash (const gchar *url, CamelException *ex); - -/* Does a camel_movemail into the local movemail folder - * and returns the path to the new movemail folder that was created. which shoudl be freed later */ -char * -mail_tool_do_movemail (const gchar *source_url, CamelException *ex); - -/* Transfers all the messages from source into dest; - * source is emptied and synced. */ -void -mail_tool_move_folder_contents (CamelFolder *source, CamelFolder *dest, gboolean use_cache, CamelException *ex); - -XEvolution *mail_tool_remove_xevolution_headers (CamelMimeMessage *message); -void mail_tool_restore_xevolution_headers (CamelMimeMessage *message, XEvolution *xev); -void mail_tool_destroy_xevolution (XEvolution *xev); - -/* Generates the subject for a message forwarding @msg */ -gchar * -mail_tool_generate_forward_subject (CamelMimeMessage *msg); - -/* Make a message into an attachment */ -CamelMimePart * -mail_tool_make_message_attachment (CamelMimeMessage *message); - -/* Parse the ui into a real CamelFolder any way we know how. */ -CamelFolder * -mail_tool_uri_to_folder (const char *uri, CamelException *ex); - -GHashTable * -mail_lookup_url_table (CamelMimeMessage *mime_message); - -gchar *mail_tool_quote_message (CamelMimeMessage *message, const char *fmt, ...); - -gchar *mail_tool_forward_message (CamelMimeMessage *message, gboolean quoted); - -#endif diff --git a/mail/mail-types.h b/mail/mail-types.h deleted file mode 100644 index 6bcd77df5b..0000000000 --- a/mail/mail-types.h +++ /dev/null @@ -1,41 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * Copyright 2000 Ximian, Inc. (www.ximian.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef MAIL_TYPES_H -#define MAIL_TYPES_H 1 - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus }*/ - - -typedef struct _FolderBrowser FolderBrowser; -typedef struct _MessageBrowser MessageBrowser; -typedef struct _SubscribeDialog SubscribeDialog; -typedef struct _MessageList MessageList; -typedef struct _MailDisplay MailDisplay; - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* MAIL_TYPES_H */ diff --git a/mail/mail-vfolder.c b/mail/mail-vfolder.c deleted file mode 100644 index 0f4c271255..0000000000 --- a/mail/mail-vfolder.c +++ /dev/null @@ -1,565 +0,0 @@ -/* - Copyright 2000, 2001 Ximian Inc. - - Author: Michael Zucchi - - code for managing vfolders - - NOTE: dont run this through fucking indent. -*/ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include - -#include "Evolution.h" -#include "evolution-storage.h" - -#include "evolution-shell-component.h" -#include "folder-browser.h" -#include "mail-vfolder.h" -#include "mail-tools.h" -#include "mail-autofilter.h" -#include "mail-folder-cache.h" -#include "mail.h" -#include "mail-ops.h" -#include "mail-mt.h" - -#include "camel/camel.h" -#include "camel/camel-remote-store.h" -#include "camel/camel-vee-folder.h" - -#include "filter/vfolder-context.h" -#include "filter/vfolder-editor.h" - -#include "e-util/e-unicode-i18n.h" - -#define d(x) x - -struct _vfolder_info { - char *name; - char *query; - FilterRule *rule; - CamelVeeFolder *folder; -}; - -/* list of vfolders available */ -static VfolderContext *context; -static CamelStore *vfolder_store; -static GList *source_folders; /* list of source folders */ - -static GHashTable *vfolder_hash; - -/* Ditto below */ -EvolutionStorage *vfolder_storage; - -extern EvolutionShellClient *global_shell_client; - -/* more globals ... */ -extern char *evolution_dir; -extern CamelSession *session; - -/* ********************************************************************** */ - -/* return true if this folder should be added to this rule */ -static int -check_source(FilterRule *rule, CamelFolder *folder) -{ - if (rule->source) { - int remote = (((CamelService *)folder->parent_store)->provider->flags & CAMEL_PROVIDER_IS_REMOTE) != 0; - - if (!strcmp(rule->source, "local")) { - if (!remote) { - return TRUE; - } - } else if (!strcmp(rule->source, "remote_active")) { - if (remote) { - return TRUE; - } - } else if (!strcmp(rule->source, "local_remote_active")) { - return TRUE; - } - } - - return FALSE; -} - -static void -register_source(char *key, CamelVeeFolder *vfolder, CamelFolder *folder) -{ - FilterRule *rule; - - rule = rule_context_find_rule((RuleContext *)context, key, NULL); - if (rule && check_source(rule, folder)) - camel_vee_folder_add_folder(vfolder, folder); -} - -/* the source will never be finalised while a vfolder has it */ -static void -source_finalise(CamelFolder *folder, void *event_data, void *data) -{ - source_folders = g_list_remove(source_folders, folder); -} - -/* for registering potential vfolder sources */ -void -vfolder_register_source (CamelFolder *folder) -{ - GList *l; - - if (CAMEL_IS_VEE_FOLDER(folder)) - return; - - if (g_list_find(source_folders, folder)) - return; - - /* note that once we register a source, it will be ref'd - by our vfolder ... and wont go away with this, but we - do this so our source_folders list doesn't get stale */ - camel_object_hook_event((CamelObject *)folder, "finalize", (CamelObjectEventHookFunc)source_finalise, folder); - - source_folders = g_list_append(source_folders, folder); - g_hash_table_foreach(vfolder_hash, (GHFunc)register_source, folder); -} - -/* ********************************************************************** */ - -struct _setup_msg { - struct _mail_msg msg; - - CamelFolder *folder; - char *query; - GList *sources_uri; - GList *sources_folder; -}; - -static void -vfolder_setup_do(struct _mail_msg *mm) -{ - struct _setup_msg *m = (struct _setup_msg *)mm; - GList *l, *list = NULL; - CamelFolder *folder; - - camel_vee_folder_set_expression((CamelVeeFolder *)m->folder, m->query); - - l = m->sources_uri; - while (l) { - folder = mail_tool_uri_to_folder(l->data, &mm->ex); - if (folder) { - list = g_list_append(list, folder); - } else { - g_warning("Could not open vfolder source: %s", (char *)l->data); - camel_exception_clear(&mm->ex); - } - l = l->next; - } - - l = m->sources_folder; - while (l) { - camel_object_ref((CamelObject *)l->data); - list = g_list_append(list, l->data); - l = l->next; - } - - camel_vee_folder_set_folders((CamelVeeFolder *)m->folder, list); - - l = list; - while (l) { - camel_object_unref((CamelObject *)l->data); - l = l->next; - } - g_list_free(list); -} - -static void -vfolder_setup_done(struct _mail_msg *mm) -{ - struct _setup_msg *m = (struct _setup_msg *)mm; - - m = m; -} - -static void -vfolder_setup_free (struct _mail_msg *mm) -{ - struct _setup_msg *m = (struct _setup_msg *)mm; - GList *l; - - camel_object_unref((CamelObject *)m->folder); - g_free(m->query); - - l = m->sources_uri; - while (l) { - g_free(l->data); - l = l->next; - } - g_list_free(m->sources_uri); - - l = m->sources_folder; - while (l) { - camel_object_unref(l->data); - l = l->next; - } - g_list_free(m->sources_folder); -} - -static struct _mail_msg_op vfolder_setup_op = { - NULL, - vfolder_setup_do, - vfolder_setup_done, - vfolder_setup_free, -}; - -static int -vfolder_setup(CamelFolder *folder, const char *query, GList *sources_uri, GList *sources_folder) -{ - struct _setup_msg *m; - int id; - - m = mail_msg_new(&vfolder_setup_op, NULL, sizeof (*m)); - m->folder = folder; - camel_object_ref((CamelObject *)folder); - m->query = g_strdup(query); - m->sources_uri = sources_uri; - m->sources_folder = sources_folder; - - id = m->msg.seq; - e_thread_put(mail_thread_queued, (EMsg *)m); - - return id; -} - -/* ********************************************************************** */ - -static void context_rule_added(RuleContext *ctx, FilterRule *rule); - -static void -rule_changed(FilterRule *rule, CamelFolder *folder) -{ - const char *sourceuri; - GList *l; - GList *sources_uri = NULL, *sources_folder = NULL; - GString *query; - - /* if the folder has changed name, then add it, then remove the old manually */ - if (strcmp(folder->full_name, rule->name) != 0) { - char *uri, *path, *key; - CamelFolder *old; - - gtk_signal_disconnect_by_func((GtkObject *)rule, rule_changed, folder); - - context_rule_added((RuleContext *)context, rule); - - uri = g_strdup_printf("vfolder:%s/vfolder#%s", evolution_dir, folder->full_name); - mail_folder_cache_remove_folder(uri); - g_free(uri); - - path = g_strdup_printf("/%s", folder->full_name); - evolution_storage_removed_folder(mail_lookup_storage(vfolder_store), path); - g_free(path); - - if (g_hash_table_lookup_extended(vfolder_hash, folder->full_name, (void **)&key, (void **)&old)) { - g_hash_table_remove(vfolder_hash, key); - g_free(key); - camel_object_unref((CamelObject *)folder); - } else { - g_warning("couldn't find a vfolder rule in our table? %s", folder->full_name); - } - - return; - } - - printf("Filter rule changed? for folder '%s'!!\n", folder->name); - - /* work out the work to do, then do it in another thread */ - sourceuri = NULL; - while ( (sourceuri = vfolder_rule_next_source((VfolderRule *)rule, sourceuri)) ) { - sources_uri = g_list_append(sources_uri, g_strdup(sourceuri)); - } - - l = source_folders; - while (l) { - if (check_source(rule, l->data)) { - camel_object_ref(l->data); - sources_folder = g_list_append(sources_folder, l->data); - } - l = l->next; - } - - query = g_string_new(""); - filter_rule_build_code(rule, query); - - vfolder_setup(folder, query->str, sources_uri, sources_folder); - - g_string_free(query, TRUE); -} - -static void context_rule_added(RuleContext *ctx, FilterRule *rule) -{ - CamelFolder *folder; - char *uri, *path; - - printf("rule added: %s\n", rule->name); - - /* this always runs quickly */ - folder = camel_store_get_folder(vfolder_store, rule->name, 0, NULL); - if (folder) { - gtk_signal_connect((GtkObject *)rule, "changed", rule_changed, folder); - - g_hash_table_insert(vfolder_hash, g_strdup(rule->name), folder); - - /* Ok, so the mail_folder_cache api is a complete fuckup, - I think this mess probably does what it is supposed to do */ - uri = g_strdup_printf("vfolder:%s/vfolder#%s", evolution_dir, rule->name); - printf("Noting folder '%s', storage = %p\n", uri, mail_lookup_storage(vfolder_store)); - path = g_strdup_printf("/%s", rule->name); - evolution_storage_new_folder(mail_lookup_storage(vfolder_store), - path, rule->name, - "mail", uri, - rule->name, - FALSE); - - mail_folder_cache_note_folder(uri, folder); - mail_folder_cache_set_update_estorage(uri, mail_lookup_storage(vfolder_store)); - g_free(uri); - g_free(path); - - rule_changed(rule, folder); - } -} - -static void context_rule_removed(RuleContext *ctx, FilterRule *rule) -{ - char *uri, *key, *path; - CamelFolder *folder; - - printf("rule removed; %s\n", rule->name); - - /* have to remove this first before unrefing the folder, otherwise it gets itself lost */ - uri = g_strdup_printf("vfolder:%s/vfolder#%s", evolution_dir, rule->name); - mail_folder_cache_remove_folder(uri); - g_free(uri); - - path = g_strdup_printf("/%s", rule->name); - evolution_storage_removed_folder(mail_lookup_storage(vfolder_store), path); - g_free(path); - - if (g_hash_table_lookup_extended(vfolder_hash, rule->name, (void **)&key, (void **)&folder)) { - g_hash_table_remove(vfolder_hash, key); - g_free(key); - camel_object_unref((CamelObject *)folder); - } - - camel_store_delete_folder(vfolder_store, rule->name, NULL); -} - -static void -store_folder_created(CamelObject *o, void *event_data, void *data) -{ - CamelStore *store = (CamelStore *)o; - CamelFolderInfo *info = event_data; - - store = store; - info = info; -} - -static void -store_folder_deleted(CamelObject *o, void *event_data, void *data) -{ - CamelStore *store = (CamelStore *)o; - CamelFolderInfo *info = event_data; - FilterRule *rule; - char *user; - - printf("Folder deleted: %s\n", info->name); - store = store; - - /* delete it from our list */ - rule = rule_context_find_rule((RuleContext *)context, info->name, NULL); - if (rule) { - /* We need to stop listening to removed events, otherwise we'll try and remove it again */ - gtk_signal_disconnect_by_func((GtkObject *)context, context_rule_removed, context); - rule_context_remove_rule((RuleContext *)context, rule); - gtk_object_unref((GtkObject *)rule); - gtk_signal_connect((GtkObject *)context, "rule_removed", context_rule_removed, context); - - user = g_strdup_printf("%s/vfolders.xml", evolution_dir); - rule_context_save((RuleContext *)context, user); - g_free(rule); - } else { - g_warning("Cannot find rule for deleted vfolder '%s'", info->name); - } -} - -void -vfolder_load_storage(GNOME_Evolution_Shell shell) -{ - char *user, *storeuri; - FilterRule *rule; - - vfolder_hash = g_hash_table_new(g_str_hash, g_str_equal); - - /* first, create the vfolder store, and set it up */ - storeuri = g_strdup_printf("vfolder:%s/vfolder", evolution_dir); - vfolder_store = camel_session_get_store(session, storeuri, NULL); - if (vfolder_store == NULL) { - g_warning("Cannot open vfolder store - no vfolders available"); - return; - } - - camel_object_hook_event((CamelObject *)vfolder_store, "folder_created", - (CamelObjectEventHookFunc)store_folder_created, NULL); - camel_object_hook_event((CamelObject *)vfolder_store, "folder_deleted", - (CamelObjectEventHookFunc)store_folder_deleted, NULL); - - printf("got store '%s' = %p\n", storeuri, vfolder_store); - mail_load_storage_by_uri(shell, storeuri, U_("VFolders")); - - /* load our rules */ - user = g_strdup_printf ("%s/vfolders.xml", evolution_dir); - context = vfolder_context_new (); - if (rule_context_load ((RuleContext *)context, EVOLUTION_DATADIR "/evolution/vfoldertypes.xml", user) != 0) { - g_warning("cannot load vfolders: %s\n", ((RuleContext *)context)->error); - } - g_free (user); - - gtk_signal_connect((GtkObject *)context, "rule_added", context_rule_added, context); - gtk_signal_connect((GtkObject *)context, "rule_removed", context_rule_removed, context); - - /* and setup the rules we have */ - rule = NULL; - while ( (rule = rule_context_next_rule((RuleContext *)context, rule, NULL)) ) { - context_rule_added((RuleContext *)context, rule); - } - - g_free(storeuri); -} - -static GtkWidget *vfolder_editor = NULL; - -static void -vfolder_editor_destroy (GtkWidget *widget, gpointer user_data) -{ - vfolder_editor = NULL; -} - -static void -vfolder_editor_clicked (GtkWidget *dialog, int button, void *data) -{ - if (button == 0) { - char *user; - - user = g_strdup_printf ("%s/vfolders.xml", evolution_dir); - rule_context_save ((RuleContext *)context, user); - g_free (user); - } - if (button != -1) { - gnome_dialog_close (GNOME_DIALOG (dialog)); - } -} - -void -vfolder_edit (void) -{ - if (vfolder_editor) { - gdk_window_raise (GTK_WIDGET (vfolder_editor)->window); - return; - } - - vfolder_editor = GTK_WIDGET (vfolder_editor_new (context)); - gtk_signal_connect (GTK_OBJECT (vfolder_editor), "clicked", vfolder_editor_clicked, NULL); - gtk_signal_connect (GTK_OBJECT (vfolder_editor), "destroy", vfolder_editor_destroy, NULL); - gtk_widget_show (vfolder_editor); -} - -static void -new_rule_clicked(GtkWidget *w, int button, void *data) -{ - if (button == 0) { - char *user; - FilterRule *rule = gtk_object_get_data((GtkObject *)w, "rule"); - - gtk_object_ref((GtkObject *)rule); - rule_context_add_rule((RuleContext *)context, rule); - user = g_strdup_printf("%s/vfolders.xml", evolution_dir); - rule_context_save((RuleContext *)context, user); - g_free(user); - } - if (button != -1) { - gnome_dialog_close((GnomeDialog *)w); - } -} - -FilterPart * -vfolder_create_part(const char *name) -{ - return rule_context_create_part((RuleContext *)context, name); -} - -/* clones a filter/search rule into a matching vfolder rule (assuming the same system definitions) */ -FilterRule * -vfolder_clone_rule(FilterRule *in) -{ - FilterRule *rule = (FilterRule *)vfolder_rule_new(); - xmlNodePtr xml; - - xml = filter_rule_xml_encode(in); - filter_rule_xml_decode(rule, xml, (RuleContext *)context); - xmlFreeNodeList(xml); - - return rule; -} - -/* adds a rule with a gui */ -void -vfolder_gui_add_rule(VfolderRule *rule) -{ - GtkWidget *w; - GnomeDialog *gd; - - w = filter_rule_get_widget((FilterRule *)rule, (RuleContext *)context); - - gd = (GnomeDialog *)gnome_dialog_new(_("New VFolder"), - GNOME_STOCK_BUTTON_OK, - GNOME_STOCK_BUTTON_CANCEL, - NULL); - gnome_dialog_set_default (gd, 0); - - gtk_window_set_policy(GTK_WINDOW(gd), FALSE, TRUE, FALSE); - gtk_window_set_default_size (GTK_WINDOW (gd), 500, 500); - gtk_box_pack_start((GtkBox *)gd->vbox, w, TRUE, TRUE, 0); - gtk_widget_show((GtkWidget *)gd); - gtk_object_set_data_full((GtkObject *)gd, "rule", rule, (GtkDestroyNotify)gtk_object_unref); - gtk_signal_connect((GtkObject *)gd, "clicked", new_rule_clicked, NULL); - gtk_widget_show((GtkWidget *)gd); -} - -void -vfolder_gui_add_from_message(CamelMimeMessage *msg, int flags, const char *source) -{ - VfolderRule *rule; - - g_return_if_fail (msg != NULL); - - rule = (VfolderRule*)vfolder_rule_from_message(context, msg, flags, source); - vfolder_gui_add_rule(rule); -} - -void -vfolder_gui_add_from_mlist(CamelMimeMessage *msg, const char *mlist, const char *source) -{ - VfolderRule *rule; - - g_return_if_fail (msg != NULL); - - rule = (VfolderRule*)vfolder_rule_from_mlist(context, mlist, source); - vfolder_gui_add_rule(rule); -} - -EvolutionStorage * -mail_vfolder_get_vfolder_storage (void) -{ - return mail_lookup_storage(vfolder_store); -} diff --git a/mail/mail-vfolder.h b/mail/mail-vfolder.h deleted file mode 100644 index 1245a4cd77..0000000000 --- a/mail/mail-vfolder.h +++ /dev/null @@ -1,29 +0,0 @@ - -#ifndef _MAIL_VFOLDER_H -#define _MAIL_VFOLDER_H - -#include "Evolution.h" -#include "evolution-storage.h" -#include "evolution-shell-component.h" - -#include "camel/camel-folder.h" -#include "camel/camel-mime-message.h" -#include "filter/vfolder-rule.h" -#include "filter/filter-part.h" - -void vfolder_load_storage(GNOME_Evolution_Shell shell); - -CamelFolder *vfolder_uri_to_folder (const char *uri, CamelException *ex); -void vfolder_edit (void); -FilterPart *vfolder_create_part (const char *name); -FilterRule *vfolder_clone_rule (FilterRule *in); -void vfolder_gui_add_rule (VfolderRule *rule); -void vfolder_gui_add_from_message (CamelMimeMessage *msg, int flags, const char *source); -void vfolder_gui_add_from_mlist (CamelMimeMessage *msg, const char *mlist, const char *source); - -/* for registering all open folders as potential vfolder sources */ -void vfolder_register_source (CamelFolder *folder); - -EvolutionStorage *mail_vfolder_get_vfolder_storage (void); - -#endif diff --git a/mail/mail.h b/mail/mail.h deleted file mode 100644 index 6e13d84f66..0000000000 --- a/mail/mail.h +++ /dev/null @@ -1,83 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Copyright 2000, Ximian, Inc. (www.ximian.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - */ - -/* This file is a F*CKING MESS. Shame to us! */ - -#include -#include -#include -#include -#include -#include "mail-accounts.h" -#include "mail-account-editor.h" -#include "mail-callbacks.h" -#include "mail-config.h" -#include "mail-config-druid.h" -/*#include "folder-browser.h"*/ -#include "mail-session.h" -#include "mail-types.h" - -extern char *evolution_dir; - -/* mail-format */ -void mail_format_mime_message (CamelMimeMessage *mime_message, - MailDisplay *md); -void mail_format_raw_message (CamelMimeMessage *mime_message, - MailDisplay *md); -gboolean mail_content_loaded (CamelDataWrapper *wrapper, - MailDisplay *display, - gboolean redisplay, - const gchar *url, - GtkHTMLStream *handle); - -typedef gboolean (*MailMimeHandlerFn) (CamelMimePart *part, - const char *mime_type, - MailDisplay *md); -typedef struct { - gboolean generic; - OAF_ServerInfo *component; - GList *applications; - MailMimeHandlerFn builtin; -} MailMimeHandler; -MailMimeHandler *mail_lookup_handler (const char *mime_type); - -gboolean mail_part_is_inline (CamelMimePart *part); -gboolean mail_part_is_displayed_inline (CamelMimePart *part, MailDisplay *md); -void mail_part_toggle_displayed (CamelMimePart *part, MailDisplay *md); - -char *mail_get_message_body (CamelDataWrapper *data, gboolean want_plain, gboolean cite); - -/* mail-identify */ -char *mail_identify_mime_part (CamelMimePart *part, MailDisplay *md); - -/* component factory for lack of a better place */ -void mail_load_storage_by_uri (GNOME_Evolution_Shell shell, const char *uri, const char *name); -/*takes a GSList of MailConfigServices */ -void mail_load_storages (GNOME_Evolution_Shell shell, const GSList *sources, gboolean is_account_data); - -void mail_hash_storage (CamelService *store, EvolutionStorage *storage); -EvolutionStorage *mail_lookup_storage (CamelStore *store); -void mail_remove_storage_by_uri (const char *uri); -void mail_remove_storage (CamelStore *store); -void mail_storages_foreach (GHFunc func, gpointer data); -int mail_storages_count (void); - - -void evolution_folder_info_factory_init (void); - diff --git a/mail/main.c b/mail/main.c deleted file mode 100644 index 41a9482167..0000000000 --- a/mail/main.c +++ /dev/null @@ -1,147 +0,0 @@ -/* - * main.c: The core of the mail component - * - * Author: - * Miguel de Icaza (miguel@ximian.com) - * - * (C) 2000 Ximian, Inc. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include - -#include -#include -#include -#include -#include -#include -#include - -#ifdef GTKHTML_HAVE_GCONF -#include -#endif - -#include -#include -#include - -#include "component-factory.h" -#include "composer/evolution-composer.h" -#include "mail.h" -#include "mail-mt.h" - -/*#define DO_MCHECK*/ - -#ifdef DO_MCHECK -static int blowup(int status) -{ - switch(status) { - case 1: - printf("Double free failure\n"); - break; - case 2: - printf("Memory clobbered before block\n"); - break; - case 3: - printf("Memory clobbered after block\n"); - break; - } - abort(); - return status; -} -#endif - -/* The GNOME SEGV handler will lose if it's not run from the main Gtk - * thread. So if we crash in another thread, redirect the signal. - */ -static void (*gnome_segv_handler) (int); - -static void -segv_redirect (int sig) -{ - if (pthread_self () == mail_gui_thread) - gnome_segv_handler (sig); - else { - pthread_kill (mail_gui_thread, sig); - pthread_exit (NULL); - } -} - -int -main (int argc, char *argv []) -{ - CORBA_ORB orb; - struct sigaction sa, osa; - -#ifdef DO_MCHECK - /* used to make elfence work */ -#if 0 - free (malloc (10)); -#else - /*mtrace();*/ - mcheck(blowup); -#endif -#endif - bindtextdomain (PACKAGE, EVOLUTION_LOCALEDIR); - textdomain (PACKAGE); - - g_thread_init (NULL); - - gnome_init_with_popt_table ("evolution-mail-component", VERSION, - argc, argv, oaf_popt_options, 0, NULL); - - sigaction (SIGSEGV, NULL, &osa); - if (osa.sa_handler != SIG_DFL) { - sa.sa_flags = 0; - sigemptyset (&sa.sa_mask); - sa.sa_handler = segv_redirect; - sigaction (SIGSEGV, &sa, NULL); - sigaction (SIGBUS, &sa, NULL); - sigaction (SIGFPE, &sa, NULL); - gnome_segv_handler = osa.sa_handler; - } - - orb = oaf_init (argc, argv); - - if (bonobo_init (orb, CORBA_OBJECT_NIL, - CORBA_OBJECT_NIL) == FALSE) { - g_error ("Mail component could not initialize Bonobo.\n" - "If there was a warning message about the " - "RootPOA, it probably means\nyou compiled " - "Bonobo against GOAD instead of OAF."); - } - -#ifdef GTKHTML_HAVE_GCONF - gconf_init (argc, argv, NULL); -#endif - - glade_gnome_init (); - - gnome_vfs_init (); - - e_cursors_init (); - - mail_config_init (); - mail_msg_init (); - - component_factory_init (); - evolution_composer_factory_init (composer_send_cb, - composer_postpone_cb); - - if (gdk_threads_mutex) { - g_mutex_free (gdk_threads_mutex); - gdk_threads_mutex = NULL; - } - - GDK_THREADS_ENTER (); - bonobo_main (); - GDK_THREADS_LEAVE (); - - mail_config_write_on_exit (); - - return 0; -} diff --git a/mail/message-browser.c b/mail/message-browser.c deleted file mode 100644 index 87255efefe..0000000000 --- a/mail/message-browser.c +++ /dev/null @@ -1,264 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: Jeffrey Stedfast - * - * Copyright 2001 Ximian, Inc. (www.ximian.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include - -#include -#include -#include -#include - -#include "message-browser.h" - -#include "mail.h" -#include "mail-callbacks.h" -#include "mail-tools.h" -#include "message-list.h" -#include "mail-ops.h" -#include "mail-vfolder.h" -#include "mail-autofilter.h" -#include "mail-mt.h" - -#include "mail-local.h" -#include "mail-config.h" - -#include "folder-browser-ui.h" - -#define d(x) x - -#define MINIMUM_WIDTH 600 -#define MINIMUM_HEIGHT 400 - -#define PARENT_TYPE BONOBO_TYPE_WINDOW - -/* Size of the window last time it was changed. */ -static GtkAllocation last_allocation = { 0, 0 }; - -static BonoboWindowClass *message_browser_parent_class; - -static void -message_browser_destroy (GtkObject *object) -{ - MessageBrowser *message_browser; - - message_browser = MESSAGE_BROWSER (object); - - gtk_object_unref (GTK_OBJECT (message_browser->fb)); - - if (GTK_OBJECT_CLASS (message_browser_parent_class)->destroy) - (GTK_OBJECT_CLASS (message_browser_parent_class)->destroy) (object); -} - -static void -message_browser_class_init (GtkObjectClass *object_class) -{ - object_class->destroy = message_browser_destroy; - - message_browser_parent_class = gtk_type_class (PARENT_TYPE); -} - -static void -message_browser_init (GtkObject *object) -{ - -} - -/* UI callbacks */ - -static void -message_browser_close (BonoboUIComponent *uih, void *user_data, const char *path) -{ - gtk_widget_destroy (GTK_WIDGET (user_data)); -} - -static BonoboUIVerb -browser_verbs [] = { - BONOBO_UI_UNSAFE_VERB ("MessageBrowserClose", message_browser_close), - BONOBO_UI_VERB_END -}; - -/* FB message loading hookups */ - -static void -message_browser_message_loaded (FolderBrowser *fb, const char *uid, MessageBrowser *mb) -{ - CamelMimeMessage *message; - char *subject = NULL; - char *title; - - message = fb->mail_display->current_message; - - if (message) - subject = (char *) camel_mime_message_get_subject (message); - - if (subject != NULL) - subject = e_utf8_to_gtk_string (GTK_WIDGET (mb), subject); - else - subject = g_strdup (_("(No subject)")); - - title = g_strdup_printf (_("%s - Message"), subject); - g_free (subject); - - gtk_window_set_title (GTK_WINDOW (mb), title); - - g_free (title); -} - -static void -message_browser_message_list_built (MessageList *ml, MessageBrowser *mb) -{ - const char *uid = gtk_object_get_data (GTK_OBJECT (mb), "uid"); - - message_list_select_uid (ml, uid); -} - -static void -message_browser_folder_loaded (FolderBrowser *fb, const char *uri, MessageBrowser *mb) -{ - gtk_signal_connect (GTK_OBJECT (fb->message_list), "message_list_built", - message_browser_message_list_built, mb); -} - -static void -message_browser_size_allocate_cb (GtkWidget *widget, - GtkAllocation *allocation) -{ - last_allocation = *allocation; - -} - -/* Construction */ - -static void -set_default_size (GtkWidget *widget) -{ - int width, height; - - width = MAX (MINIMUM_WIDTH, last_allocation.width); - height = MAX (MINIMUM_HEIGHT, last_allocation.height); - - gtk_window_set_default_size (GTK_WINDOW (widget), width, height); -} - -static void -set_bonobo_ui (GtkWidget *widget, FolderBrowser *fb) -{ - BonoboUIContainer *uicont; - BonoboUIComponent *uic; - CORBA_Environment ev; - - uicont = bonobo_ui_container_new (); - bonobo_ui_container_set_win (uicont, BONOBO_WINDOW (widget)); - - uic = bonobo_ui_component_new_default (); - bonobo_ui_component_set_container (uic, BONOBO_OBJREF (uicont)); - folder_browser_set_ui_component (fb, uic); - - /* Load our UI */ - - bonobo_ui_component_freeze (uic, NULL); - bonobo_ui_util_set_ui (uic, EVOLUTION_DATADIR, "evolution-mail-messagedisplay.xml", "evolution-mail"); - - /* Load the appropriate UI stuff from the folder browser */ - - folder_browser_ui_add_message (fb); - - /* We just opened the message! We don't need to open it again. */ - - CORBA_exception_init (&ev); - bonobo_ui_component_rm (uic, "/menu/File/FileOps/MessageOpen", &ev); - if (BONOBO_EX (&ev)) - g_warning ("Couldn't remove message open item. Weird. Error: %s", - bonobo_exception_get_text (&ev)); - CORBA_exception_free (&ev); - - /* Add the Close item */ - - bonobo_ui_component_add_verb_list_with_data (uic, browser_verbs, widget); - - /* Done */ - - bonobo_ui_component_thaw (uic, NULL); - -} - -GtkWidget * -message_browser_new (const GNOME_Evolution_Shell shell, const char *uri, const char *uid) -{ - GtkWidget *vbox; - MessageBrowser *new; - FolderBrowser *fb; - - new = gtk_type_new (MESSAGE_BROWSER_TYPE); - new = (MessageBrowser *) bonobo_window_construct (BONOBO_WINDOW (new), "Ximian Evolution", ""); - if (!new) { - g_warning ("Failed to construct Bonobo window!"); - return NULL; - } - - gtk_object_set_data_full (GTK_OBJECT (new), "uid", g_strdup (uid), g_free); - - fb = FOLDER_BROWSER (folder_browser_new (shell)); - new->fb = fb; - - set_bonobo_ui (GTK_WIDGET (new), fb); - - /* some evil hackery action... */ - vbox = gtk_vbox_new (TRUE, 0); - gtk_widget_ref (GTK_WIDGET (fb->mail_display)); - gtk_widget_reparent (GTK_WIDGET (fb->mail_display), vbox); - /* Note: normally we'd unref the fb->mail_display now, except - that if we do then our refcounts will not be in - harmony... both the fb *and* the message-browser need to - own a ref on the mail_display. */ - gtk_widget_show (GTK_WIDGET (fb->mail_display)); - gtk_widget_show (vbox); - - gtk_signal_connect (GTK_OBJECT (new), "size_allocate", - GTK_SIGNAL_FUNC (message_browser_size_allocate_cb), NULL); - - bonobo_window_set_contents (BONOBO_WINDOW (new), vbox); - gtk_widget_grab_focus (GTK_WIDGET (MAIL_DISPLAY (fb->mail_display)->html)); - - set_default_size (GTK_WIDGET (new)); - - /* more evil hackery... */ - gtk_signal_connect (GTK_OBJECT (fb), "folder_loaded", - message_browser_folder_loaded, new); - - gtk_signal_connect (GTK_OBJECT (fb), "message_loaded", - message_browser_message_loaded, new); - - folder_browser_set_uri (fb, uri); - - return GTK_WIDGET (new); -} - -/* Fin */ - -E_MAKE_TYPE (message_browser, "MessageBrowser", MessageBrowser, message_browser_class_init, - message_browser_init, PARENT_TYPE); diff --git a/mail/message-browser.h b/mail/message-browser.h deleted file mode 100644 index 208396bff4..0000000000 --- a/mail/message-browser.h +++ /dev/null @@ -1,61 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: Jeffrey Stedfast - * - * Copyright 2001 Ximian, Inc. (www.ximian.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - -#ifndef _MESSAGE_BROWSER_H_ -#define _MESSAGE_BROWSER_H_ - -#include -#include - -#include -#include "folder-browser.h" -#include "mail-display.h" -#include "mail-types.h" - -#define MESSAGE_BROWSER_TYPE (message_browser_get_type ()) -#define MESSAGE_BROWSER(o) (GTK_CHECK_CAST ((o), MESSAGE_BROWSER_TYPE, MessageBrowser)) -#define MESSAGE_BROWSER_CLASS(k) (GTK_CHECK_CLASS_CAST((k), MESSAGE_BROWSER_TYPE, MessageBrowserClass)) -#define IS_MESSAGE_BROWSER(o) (GTK_CHECK_TYPE ((o), MESSAGE_BROWSER_TYPE)) -#define IS_MESSAGE_BROWSER_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), MESSAGE_BROWSER_TYPE)) - -struct _MessageBrowser { - BonoboWindow parent; - - /* - * The current URI being displayed by the MessageBrowser - */ - FolderBrowser *fb; -}; - - -typedef struct { - BonoboWindowClass parent_class; - -} MessageBrowserClass; - -GtkType message_browser_get_type (void); - -GtkWidget *message_browser_new (const GNOME_Evolution_Shell shell, - const char *uri, const char *uid); - -#endif /* _MESSAGE_BROWSER_H_ */ - diff --git a/mail/message-list.c b/mail/message-list.c deleted file mode 100644 index f91f5ce5ac..0000000000 --- a/mail/message-list.c +++ /dev/null @@ -1,2522 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * message-list.c: Displays the messages. - * Implements CORBA's Evolution::MessageList - * - * Author: - * Miguel de Icaza (miguel@ximian.com) - * Bertrand Guiheneuf (bg@aful.org) - * And just about everyone else in evolution ... - * - * (C) 2000 Ximian, Inc. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "mail-config.h" -#include "message-list.h" -#include "mail-mt.h" -#include "mail-tools.h" -#include "mail-ops.h" -#include "Mail.h" - -#include "art/mail-new.xpm" -#include "art/mail-read.xpm" -#include "art/mail-replied.xpm" -#include "art/attachment.xpm" -#include "art/priority-high.xpm" -#include "art/empty.xpm" -#include "art/score-lowest.xpm" -#include "art/score-lower.xpm" -#include "art/score-low.xpm" -#include "art/score-normal.xpm" -#include "art/score-high.xpm" -#include "art/score-higher.xpm" -#include "art/score-highest.xpm" - -/*#define TIMEIT */ - -#ifdef TIMEIT -#include -#include -#endif - -#define d(x) -#define t(x) - -/* - * Default sizes for the ETable display - * - */ -#define N_CHARS(x) (CHAR_WIDTH * (x)) - -#define COL_ICON_WIDTH (16) -#define COL_ATTACH_WIDTH (16) -#define COL_CHECK_BOX_WIDTH (16) -#define COL_FROM_EXPANSION (24.0) -#define COL_FROM_WIDTH_MIN (32) -#define COL_SUBJECT_EXPANSION (30.0) -#define COL_SUBJECT_WIDTH_MIN (32) -#define COL_SENT_EXPANSION (24.0) -#define COL_SENT_WIDTH_MIN (32) -#define COL_RECEIVED_EXPANSION (20.0) -#define COL_RECEIVED_WIDTH_MIN (32) -#define COL_TO_EXPANSION (24.0) -#define COL_TO_WIDTH_MIN (32) -#define COL_SIZE_EXPANSION (6.0) -#define COL_SIZE_WIDTH_MIN (32) - -#define PARENT_TYPE (e_tree_scrolled_get_type ()) - -/* #define SMART_ADDRESS_COMPARE */ - -#ifdef SMART_ADDRESS_COMPARE -struct _EMailAddress { - ENameWestern *wname; - gchar *address; -}; - -typedef struct _EMailAddress EMailAddress; -#endif /* SMART_ADDRESS_COMPARE */ - -static ETreeScrolledClass *message_list_parent_class; - -static void on_cursor_activated_cmd (ETree *tree, int row, ETreePath path, gpointer user_data); -static gint on_click (ETree *tree, gint row, ETreePath path, gint col, GdkEvent *event, MessageList *list); -static char *filter_date (time_t date); -static char *filter_size (int size); - -static void folder_changed (CamelObject *o, gpointer event_data, gpointer user_data); -static void message_changed (CamelObject *o, gpointer event_data, gpointer user_data); - -static void hide_save_state(MessageList *ml); -static void hide_load_state(MessageList *ml); - -/* note: @changes is owned/freed by the caller */ -/*static void mail_do_regenerate_messagelist (MessageList *list, const char *search, const char *hideexpr, CamelFolderChangeInfo *changes);*/ -static void mail_regen_list(MessageList *ml, const char *search, const char *hideexpr, CamelFolderChangeInfo *changes); - -static void clear_info(char *key, ETreePath *node, MessageList *ml); - -enum { - MESSAGE_SELECTED, - MESSAGE_LIST_BUILT, - LAST_SIGNAL -}; - -static guint message_list_signals [LAST_SIGNAL] = {0, }; - -static struct { - char **image_base; - GdkPixbuf *pixbuf; -} states_pixmaps [] = { - { mail_new_xpm, NULL }, - { mail_read_xpm, NULL }, - { mail_replied_xpm, NULL }, -/* FIXME: Replace these with pixmaps for multiple_read and multiple_unread */ - { mail_new_xpm, NULL }, - { mail_read_xpm, NULL }, - { empty_xpm, NULL }, - { attachment_xpm, NULL }, - { priority_high_xpm, NULL }, - { score_lowest_xpm, NULL }, - { score_lower_xpm, NULL }, - { score_low_xpm, NULL }, - { score_normal_xpm, NULL }, - { score_high_xpm, NULL }, - { score_higher_xpm, NULL }, - { score_highest_xpm, NULL }, - { NULL, NULL } -}; - -#ifdef SMART_ADDRESS_COMPARE -static EMailAddress * -e_mail_address_new (const char *address) -{ - CamelInternetAddress *cia; - EMailAddress *new; - const char *name = NULL, *addr = NULL; - - cia = camel_internet_address_new (); - if (camel_address_unformat (CAMEL_ADDRESS (cia), address) == -1) { - camel_object_unref (CAMEL_OBJECT (cia)); - return NULL; - } - camel_internet_address_get (cia, 0, &name, &addr); - - new = g_new (EMailAddress, 1); - new->address = g_strdup (addr); - if (name && *name) { - new->wname = e_name_western_parse (name); - } else { - new->wname = NULL; - } - - camel_object_unref (CAMEL_OBJECT (cia)); - - return new; -} - -static void -e_mail_address_free (EMailAddress *addr) -{ - g_return_if_fail (addr != NULL); - - g_free (addr->address); - if (addr->wname) - e_name_western_free (addr->wname); - g_free (addr); -} - -static gint -e_mail_address_compare (gconstpointer address1, gconstpointer address2) -{ - const EMailAddress *addr1 = address1; - const EMailAddress *addr2 = address2; - gint retval; - - g_return_val_if_fail (addr1 != NULL, 1); - g_return_val_if_fail (addr2 != NULL, -1); - - if (!addr1->wname && !addr2->wname) { - /* have to compare addresses, one or both don't have names */ - g_return_val_if_fail (addr1->address != NULL, 1); - g_return_val_if_fail (addr2->address != NULL, -1); - - return g_strcasecmp (addr1->address, addr2->address); - } - - if (!addr1->wname) - return -1; - if (!addr2->wname) - return 1; - - if (!addr1->wname->last && !addr2->wname->last) { - /* neither has a last name - default to address? */ - /* FIXME: what do we compare next? */ - g_return_val_if_fail (addr1->address != NULL, 1); - g_return_val_if_fail (addr2->address != NULL, -1); - - return g_strcasecmp (addr1->address, addr2->address); - } - - if (!addr1->wname->last) - return -1; - if (!addr2->wname->last) - return 1; - - retval = g_utf8_collate (addr1->wname->last, addr2->wname->last); - if (retval) - return retval; - - /* last names are identical - compare first names */ - - if (!addr1->wname->first && !addr2->wname->first) - return g_strcasecmp (addr1->address, addr2->address); - - if (!addr1->wname->first) - return -1; - if (!addr2->wname->first) - return 1; - - retval = g_utf8_collate (addr1->wname->first, addr2->wname->first); - if (retval) - return retval; - - return g_strcasecmp (addr1->address, addr2->address); -} -#endif /* SMART_ADDRESS_COMPARE */ - -static gint -address_compare (gconstpointer address1, gconstpointer address2) -{ -#ifdef SMART_ADDRESS_COMPARE - EMailAddress *addr1, *addr2; -#endif /* SMART_ADDRESS_COMPARE */ - gint retval; - - g_return_val_if_fail (address1 != NULL, 1); - g_return_val_if_fail (address2 != NULL, -1); - -#ifdef SMART_ADDRESS_COMPARE - addr1 = e_mail_address_new (address1); - addr2 = e_mail_address_new (address2); - retval = e_mail_address_compare (addr1, addr2); - e_mail_address_free (addr1); - e_mail_address_free (addr2); -#else - retval = g_utf8_collate ((const char *) address1, (const char *) address2); -#endif /* SMART_ADDRESS_COMPARE */ - - return retval; -} - -static gint -subject_compare (gconstpointer subject1, gconstpointer subject2) -{ - char *sub1; - char *sub2; - - g_return_val_if_fail (subject1 != NULL, 1); - g_return_val_if_fail (subject2 != NULL, -1); - - /* trim off any "Re:"'s at the beginning of subject1 */ - sub1 = (char *) subject1; - while (!g_strncasecmp (sub1, "Re:", 3)) { - sub1 += 3; - /* jump over any spaces */ - while (*sub1 && g_unichar_isspace (g_utf8_get_char (sub1))) - sub1 = g_utf8_next_char (sub1); - } - - /* trim off any "Re:"'s at the beginning of subject2 */ - sub2 = (char *) subject2; - while (!g_strncasecmp (sub2, "Re:", 3)) { - sub2 += 3; - while (*sub2 && g_unichar_isspace (g_utf8_get_char (sub2))) - sub2 = g_utf8_next_char (sub2); - } - - /* jump over any spaces */ - while (*sub1 && g_unichar_isspace (g_utf8_get_char (sub1))) - sub1 = g_utf8_next_char (sub1); - while (*sub2 && g_unichar_isspace (g_utf8_get_char (sub2))) - sub2 = g_utf8_next_char (sub2); - - return g_utf8_collate (sub1, sub2); -} - -static gchar * -filter_size (gint size) -{ - gfloat fsize; - - if (size < 1024) { - return g_strdup_printf ("%d", size); - } else { - fsize = ((gfloat) size) / 1024.0; - if (fsize < 1024.0) { - return g_strdup_printf ("%.2f K", fsize); - } else { - fsize /= 1024.0; - return g_strdup_printf ("%.2f M", fsize); - } - } -} - -/* Gets the uid of the message displayed at a given view row */ -static const char * -get_message_uid (MessageList *message_list, ETreePath node) -{ - CamelMessageInfo *info; - - g_assert (node != NULL); - info = e_tree_memory_node_get_data (E_TREE_MEMORY (message_list->model), node); - /* correct me if I'm wrong, but this should never be NULL, should it? */ - g_assert (info != NULL); - - return camel_message_info_uid (info); -} - -/* Gets the CamelMessageInfo for the message displayed at the given - * view row. - */ -static CamelMessageInfo * -get_message_info (MessageList *message_list, ETreePath node) -{ - CamelMessageInfo *info; - - g_assert (node != NULL); - info = e_tree_memory_node_get_data (E_TREE_MEMORY (message_list->model), node); - g_assert (info != NULL); - - return info; -} - -/** - * message_list_select: - * @message_list: a MessageList - * @base_row: the (model) row to start from - * @direction: the direction to search in - * @flags: a set of flag values - * @mask: a mask for comparing against @flags - * @wraparound: if %TRUE, go back to the beginning for - * the next match if necessary. - * - * This moves the message list selection to a suitable row. @base_row - * lists the first (model) row to try, but as a special case, model - * row -1 is mapped to the last row. @flags and @mask combine to specify - * what constitutes a suitable row. @direction is - * %MESSAGE_LIST_SELECT_NEXT if it should find the next matching - * message, or %MESSAGE_LIST_SELECT_PREVIOUS if it should find the - * previous. If no suitable row is found, the selection will be - * unchanged. - **/ -void -message_list_select (MessageList *message_list, - int base_row, - MessageListSelectDirection direction, - guint32 flags, - guint32 mask, - gboolean wraparound) -{ - CamelMessageInfo *info; - int vrow, last; - ETree *et = message_list->tree; - - if (!GTK_WIDGET_HAS_FOCUS (message_list)) - gtk_widget_grab_focus (GTK_WIDGET (message_list)); - - switch (direction) { - case MESSAGE_LIST_SELECT_PREVIOUS: - last = -1; - break; - case MESSAGE_LIST_SELECT_NEXT: - last = e_tree_row_count (message_list->tree); - if (last <= base_row) - return; - break; - default: - g_warning("Invalid argument to message_list_select"); - return; - } - - /* If it's -1, we want the last view row, not the last model row. */ - /* model_to_view_row etc simply dont work for sorted views. Sigh. */ - if (base_row == -1) - vrow = e_tree_row_count(message_list->tree) - 1; - else - vrow = e_tree_model_to_view_row (et, base_row); - - if (base_row <= -1) - return; - /* This means that we'll move at least one message in 'direction'. */ - if (vrow != last) - vrow += direction; - - /* We don't know whether to use < or > due to "direction" */ - while (vrow != last) { - ETreePath node = e_tree_node_at_row (et, vrow); - - info = get_message_info (message_list, node); - - if (info && (info->flags & mask) == flags) { - e_tree_set_cursor (et, node); - - gtk_signal_emit (GTK_OBJECT (message_list), message_list_signals[MESSAGE_SELECTED], - camel_message_info_uid (info)); - return; - } - vrow += direction; - } - - if (wraparound) { - if (direction > 0) - message_list_select (message_list, 0, - direction, flags, mask, FALSE); - else - message_list_select (message_list, e_tree_row_count (et), - direction, flags, mask, FALSE); - } -} - - -/** - * message_list_select_uid: - * @message_list: - * @uid: - * - * Selects the message with the given UID. - **/ -void -message_list_select_uid (MessageList *message_list, const char *uid) -{ - ETreePath node; - - node = g_hash_table_lookup (message_list->uid_nodemap, uid); - if (node) { - CamelMessageInfo *info; - - info = get_message_info (message_list, node); - e_tree_set_cursor (message_list->tree, node); - - g_free (message_list->cursor_uid); - message_list->cursor_uid = g_strdup (camel_message_info_uid (info)); - - gtk_signal_emit (GTK_OBJECT (message_list), message_list_signals[MESSAGE_SELECTED], - camel_message_info_uid (info)); - } else { - g_free (message_list->cursor_uid); - message_list->cursor_uid = NULL; - gtk_signal_emit (GTK_OBJECT (message_list), message_list_signals[MESSAGE_SELECTED], NULL); - } -} - -/* - * SimpleTableModel::col_count - */ -static int -ml_column_count (ETreeModel *etm, void *data) -{ - return COL_LAST; -} - -/* - * SimpleTableModel::has_save_id - */ -static gboolean -ml_has_save_id (ETreeModel *etm, void *data) -{ - return TRUE; -} - -/* - * SimpleTableModel::get_save_id - */ -static char * -ml_get_save_id (ETreeModel *etm, ETreePath path, void *data) -{ - CamelMessageInfo *info; - - info = e_tree_memory_node_get_data (E_TREE_MEMORY(etm), path); - if (info == NULL) - return g_strdup("root"); - return g_strdup (camel_message_info_uid(info)); -} - -/* - * SimpleTableModel::has_save_id - */ -static gboolean -ml_has_get_node_by_id (ETreeModel *etm, void *data) -{ - return TRUE; -} - -/* - * SimpleTableModel::get_save_id - */ -static ETreePath -ml_get_node_by_id (ETreeModel *etm, const char *save_id, void *data) -{ - MessageList *ml; - - ml = data; - - if (!strcmp (save_id, "root")) - return e_tree_model_get_root (etm); - - return g_hash_table_lookup(ml->uid_nodemap, save_id); -} - -static void * -ml_duplicate_value (ETreeModel *etm, int col, const void *value, void *data) -{ - switch (col){ - case COL_MESSAGE_STATUS: - case COL_FLAGGED: - case COL_SCORE: - case COL_ATTACHMENT: - case COL_DELETED: - case COL_UNREAD: - case COL_SENT: - case COL_RECEIVED: - case COL_SIZE: - return (void *) value; - - case COL_FROM: - case COL_SUBJECT: - case COL_TO: - return g_strdup (value); - - default: - g_assert_not_reached (); - } - return NULL; -} - -static void -ml_free_value (ETreeModel *etm, int col, void *value, void *data) -{ - switch (col){ - case COL_MESSAGE_STATUS: - case COL_FLAGGED: - case COL_SCORE: - case COL_ATTACHMENT: - case COL_DELETED: - case COL_UNREAD: - case COL_SENT: - case COL_RECEIVED: - case COL_SIZE: - break; - - case COL_FROM: - case COL_SUBJECT: - case COL_TO: - g_free (value); - break; - default: - g_assert_not_reached (); - } -} - -static void * -ml_initialize_value (ETreeModel *etm, int col, void *data) -{ - switch (col){ - case COL_MESSAGE_STATUS: - case COL_FLAGGED: - case COL_SCORE: - case COL_ATTACHMENT: - case COL_DELETED: - case COL_UNREAD: - case COL_SENT: - case COL_RECEIVED: - case COL_SIZE: - return NULL; - - case COL_FROM: - case COL_SUBJECT: - case COL_TO: - return g_strdup(""); - default: - g_assert_not_reached (); - } - - return NULL; -} - -static gboolean -ml_value_is_empty (ETreeModel *etm, int col, const void *value, void *data) -{ - switch (col){ - case COL_MESSAGE_STATUS: - case COL_FLAGGED: - case COL_SCORE: - case COL_ATTACHMENT: - case COL_DELETED: - case COL_UNREAD: - case COL_SENT: - case COL_RECEIVED: - case COL_SIZE: - return value == NULL; - - case COL_FROM: - case COL_SUBJECT: - case COL_TO: - return !(value && *(char *)value); - default: - g_assert_not_reached (); - return FALSE; - } -} - -static const char *status_map[] = { - N_("Unseen"), - N_("Seen"), - N_("Answered"), - N_("Multiple Unseen Messages"), - N_("Multiple Messages"), -}; - -static const char *score_map[] = { - N_("Lowest"), - N_("Lower"), - N_("Low"), - N_("Normal"), - N_("High"), - N_("Higher"), - N_("Highest"), -}; - -static char * -ml_value_to_string (ETreeModel *etm, int col, const void *value, void *data) -{ - unsigned int i; - - switch (col){ - case COL_MESSAGE_STATUS: - i = (unsigned int)value; - if (i > 4) - return g_strdup(""); - return g_strdup(_(status_map[i])); - - case COL_SCORE: - i = (unsigned int)value + 3; - if (i > 6) - i = 3; - return g_strdup(_(score_map[i])); - - case COL_ATTACHMENT: - case COL_FLAGGED: - case COL_DELETED: - case COL_UNREAD: - return g_strdup_printf("%d", (int) value); - - case COL_SENT: - case COL_RECEIVED: - return filter_date (GPOINTER_TO_INT(value)); - - case COL_SIZE: - return filter_size (GPOINTER_TO_INT(value)); - - case COL_FROM: - case COL_SUBJECT: - case COL_TO: - return g_strdup (value); - default: - g_assert_not_reached (); - return NULL; - } -} - -static GdkPixbuf * -ml_tree_icon_at (ETreeModel *etm, ETreePath path, void *model_data) -{ - /* we dont really need an icon ... */ - return NULL; -} - -/* return true if there are any unread messages in the subtree */ -static int -subtree_unread(MessageList *ml, ETreePath node) -{ - CamelMessageInfo *info; - ETreePath child; - - while (node) { - info = e_tree_memory_node_get_data((ETreeMemory *)ml->model, node); - g_assert(info); - - if (!(info->flags & CAMEL_MESSAGE_SEEN)) - return TRUE; - - if ((child = e_tree_model_node_get_first_child (E_TREE_MODEL (ml->model), node))) - if (subtree_unread(ml, child)) - return TRUE; - node = e_tree_model_node_get_next (ml->model, node); - } - return FALSE; -} - -static int -subtree_size(MessageList *ml, ETreePath node) -{ - CamelMessageInfo *info; - int size = 0; - ETreePath child; - - while (node) { - info = e_tree_memory_node_get_data((ETreeMemory *)ml->model, node); - g_assert(info); - - size += info->size; - if ((child = e_tree_model_node_get_first_child (E_TREE_MODEL (ml->model), node))) - size += subtree_size(ml, child); - - node = e_tree_model_node_get_next (ml->model, node); - } - return size; -} - -static time_t -subtree_earliest(MessageList *ml, ETreePath node, int sent) -{ - CamelMessageInfo *info; - time_t earliest = 0, date; - ETreePath *child; - - while (node) { - info = e_tree_memory_node_get_data((ETreeMemory *)ml->model, node); - g_assert(info); - - if (sent) - date = info->date_sent; - else - date = info->date_received; - - if (earliest == 0 || date < earliest) - earliest = date; - - if ((child = e_tree_model_node_get_first_child (ml->model, node))) { - date = subtree_earliest(ml, child, sent); - if (earliest == 0 || (date != 0 && date < earliest)) - earliest = date; - } - - node = e_tree_model_node_get_next (ml->model, node); - } - - return earliest; -} - -static void * -ml_tree_value_at (ETreeModel *etm, ETreePath path, int col, void *model_data) -{ - MessageList *message_list = model_data; - CamelMessageInfo *msg_info; - - /* retrieve the message information array */ - msg_info = e_tree_memory_node_get_data (E_TREE_MEMORY(etm), path); - g_assert(msg_info); - - switch (col){ - case COL_MESSAGE_STATUS: { - ETreePath child; - - /* if a tree is collapsed, then scan its insides for details */ - child = e_tree_model_node_get_first_child(etm, path); - if (child && !e_tree_node_is_expanded(message_list->tree, path)) { - if (subtree_unread(message_list, child)) - return (void *)3; - else - return (void *)4; - } - - if (msg_info->flags & CAMEL_MESSAGE_ANSWERED) - return GINT_TO_POINTER (2); - else if (msg_info->flags & CAMEL_MESSAGE_SEEN) - return GINT_TO_POINTER (1); - else - return GINT_TO_POINTER (0); - break; - } - case COL_FLAGGED: - return GINT_TO_POINTER ((msg_info->flags & CAMEL_MESSAGE_FLAGGED) != 0); - case COL_SCORE: { - const char *tag; - int score = 0; - - tag = camel_tag_get ((CamelTag **) &msg_info->user_tags, "score"); - if (tag) - score = atoi (tag); - - return GINT_TO_POINTER (score); - } - case COL_ATTACHMENT: - return GINT_TO_POINTER ((msg_info->flags & CAMEL_MESSAGE_ATTACHMENTS) != 0); - case COL_FROM: - return (void *)camel_message_info_from(msg_info); - case COL_SUBJECT: - return (void *)camel_message_info_subject(msg_info); - case COL_SENT: - return GINT_TO_POINTER (msg_info->date_sent); - case COL_RECEIVED: - return GINT_TO_POINTER (msg_info->date_received); - case COL_TO: - return (void *)camel_message_info_to(msg_info); - case COL_SIZE: - return GINT_TO_POINTER (msg_info->size); - case COL_DELETED: - return GINT_TO_POINTER ((msg_info->flags & CAMEL_MESSAGE_DELETED) != 0); - case COL_UNREAD: { - ETreePath child; - - child = e_tree_model_node_get_first_child(etm, path); - if (child && !e_tree_node_is_expanded(message_list->tree, path) - && (msg_info->flags & CAMEL_MESSAGE_SEEN)) { - return (void *)subtree_unread(message_list, child); - } - - return GINT_TO_POINTER (!(msg_info->flags & CAMEL_MESSAGE_SEEN)); - } - case COL_COLOUR: { - const char *colour; - - colour = camel_tag_get ((CamelTag **) &msg_info->user_tags, "colour"); - if (colour == NULL && msg_info->flags & CAMEL_MESSAGE_FLAGGED) - /* FIXME: extract from the xpm somehow. */ - colour = "#A7453E"; - return (void *)colour; - } - } - - g_assert_not_reached (); - - return NULL; -} - -static void -ml_tree_set_value_at (ETreeModel *etm, ETreePath path, int col, - const void *val, void *model_data) -{ - g_assert_not_reached (); -} - -static gboolean -ml_tree_is_cell_editable (ETreeModel *etm, ETreePath path, int col, void *model_data) -{ - return FALSE; -} - -static void -message_list_init_images (void) -{ - int i; - - /* - * Only load once, and share - */ - if (states_pixmaps [0].pixbuf) - return; - - for (i = 0; states_pixmaps [i].image_base; i++){ - states_pixmaps [i].pixbuf = gdk_pixbuf_new_from_xpm_data ( - (const char **) states_pixmaps [i].image_base); - } -} - -static char * -filter_date (time_t date) -{ - time_t nowdate = time(NULL); - time_t yesdate; - struct tm then, now, yesterday; - char buf[26]; - gboolean done = FALSE; - - if (date == 0) - return g_strdup (_("?")); - - localtime_r (&date, &then); - localtime_r (&nowdate, &now); - if (then.tm_mday == now.tm_mday && - then.tm_mon == now.tm_mon && - then.tm_year == now.tm_year) { - strftime (buf, 26, _("Today %l:%M %p"), &then); - done = TRUE; - } - if (!done) { - yesdate = nowdate - 60 * 60 * 24; - localtime_r (&yesdate, &yesterday); - if (then.tm_mday == yesterday.tm_mday && - then.tm_mon == yesterday.tm_mon && - then.tm_year == yesterday.tm_year) { - strftime (buf, 26, _("Yesterday %l:%M %p"), &then); - done = TRUE; - } - } - if (!done) { - int i; - for (i = 2; i < 7; i++) { - yesdate = nowdate - 60 * 60 * 24 * i; - localtime_r (&yesdate, &yesterday); - if (then.tm_mday == yesterday.tm_mday && - then.tm_mon == yesterday.tm_mon && - then.tm_year == yesterday.tm_year) { - strftime (buf, 26, _("%a %l:%M %p"), &then); - done = TRUE; - break; - } - } - } - if (!done) { - if (then.tm_year == now.tm_year) { - strftime (buf, 26, _("%b %d %l:%M %p"), &then); - } else { - strftime (buf, 26, _("%b %d %Y"), &then); - } - } -#if 0 -#ifdef CTIME_R_THREE_ARGS - ctime_r (&date, buf, 26); -#else - ctime_r (&date, buf); -#endif -#endif - - return g_strdup (buf); -} - -static ETableExtras * -message_list_create_extras (void) -{ - int i; - GdkPixbuf *images [7]; - ETableExtras *extras; - ECell *cell; - - extras = e_table_extras_new(); - e_table_extras_add_pixbuf(extras, "status", states_pixmaps [0].pixbuf); - e_table_extras_add_pixbuf(extras, "score", states_pixmaps [13].pixbuf); - e_table_extras_add_pixbuf(extras, "attachment", states_pixmaps [6].pixbuf); - e_table_extras_add_pixbuf(extras, "flagged", states_pixmaps [7].pixbuf); - - e_table_extras_add_compare(extras, "address_compare", address_compare); - e_table_extras_add_compare(extras, "subject_compare", subject_compare); - - for (i = 0; i < 5; i++) - images [i] = states_pixmaps [i].pixbuf; - - e_table_extras_add_cell(extras, "render_message_status", e_cell_toggle_new (0, 5, images)); - - for (i = 0; i < 2; i++) - images [i] = states_pixmaps [i + 5].pixbuf; - - e_table_extras_add_cell(extras, "render_attachment", e_cell_toggle_new (0, 2, images)); - - images [1] = states_pixmaps [7].pixbuf; - e_table_extras_add_cell(extras, "render_flagged", e_cell_toggle_new (0, 2, images)); - - for (i = 0; i < 7; i++) - images[i] = states_pixmaps [i + 7].pixbuf; - - e_table_extras_add_cell(extras, "render_score", e_cell_toggle_new (0, 7, images)); - - /* date cell */ - cell = e_cell_date_new (NULL, GTK_JUSTIFY_LEFT); - gtk_object_set (GTK_OBJECT (cell), - "bold_column", COL_UNREAD, - "color_column", COL_COLOUR, - NULL); - e_table_extras_add_cell(extras, "render_date", cell); - - /* text cell */ - cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT); - gtk_object_set (GTK_OBJECT (cell), - "bold_column", COL_UNREAD, - "color_column", COL_COLOUR, - NULL); - e_table_extras_add_cell(extras, "render_text", cell); - - e_table_extras_add_cell(extras, "render_tree", - e_cell_tree_new (NULL, NULL, /* let the tree renderer default the pixmaps */ - TRUE, cell)); - - /* size cell */ - cell = e_cell_size_new (NULL, GTK_JUSTIFY_RIGHT); - gtk_object_set (GTK_OBJECT (cell), - "bold_column", COL_UNREAD, - "color_column", COL_COLOUR, - NULL); - e_table_extras_add_cell(extras, "render_size", cell); - - return extras; -} - -static void -save_tree_state(MessageList *ml) -{ - char *filename; - - if (ml->folder == NULL || ml->tree == NULL) - return; - - filename = mail_config_folder_to_cachename(ml->folder, "et-header-"); - e_tree_save_state(ml->tree, filename); - g_free(filename); - - filename = mail_config_folder_to_cachename(ml->folder, "et-expanded-"); - e_tree_save_expanded_state(ml->tree, filename); - g_free(filename); -} - -static void -sort_info_changed (GtkWidget *widget, MessageList *ml) -{ - save_tree_state(ml); -} - -static void -message_list_setup_etree (MessageList *message_list, gboolean outgoing) -{ - ETableState *etstate; - - /* build the spec based on the folder, and possibly from a saved file */ - /* otherwise, leave default */ - if (message_list->folder) { - char *path; - char *name; - struct stat st; - - name = camel_service_get_name (CAMEL_SERVICE (message_list->folder->parent_store), TRUE); - d(printf ("folder name is '%s'\n", name)); - - path = mail_config_folder_to_cachename (message_list->folder, "et-header-"); - if (path && stat (path, &st) == 0 && st.st_size > 0 && S_ISREG (st.st_mode)) { - /* build based on saved file */ - e_tree_load_state (message_list->tree, path); - } else if (outgoing) { - /* Swap From/To for Drafts, Sent, Outbox */ - char *state = "" - " " - " " - " "; - - e_tree_set_state (message_list->tree, state); - } - g_free (path); - - path = mail_config_folder_to_cachename (message_list->folder, "et-expanded-"); - if (path && stat (path, &st) == 0 && st.st_size > 0 && S_ISREG (st.st_mode)) { - /* build based on saved file */ - e_tree_load_expanded_state (message_list->tree, path); - } - g_free (path); - - g_free (name); - - etstate = e_tree_get_state_object (message_list->tree); - gtk_signal_connect (GTK_OBJECT (etstate->sort_info), - "sort_info_changed", - GTK_SIGNAL_FUNC (sort_info_changed), - message_list); - gtk_signal_connect (GTK_OBJECT (etstate->sort_info), - "group_info_changed", - GTK_SIGNAL_FUNC (sort_info_changed), - message_list); - - gtk_object_unref (GTK_OBJECT (etstate)); - } -} - -/* - * GtkObject::init - */ -static void -message_list_init (GtkObject *object) -{ - MessageList *message_list = MESSAGE_LIST (object); - - e_scroll_frame_set_policy (E_SCROLL_FRAME (message_list), - GTK_POLICY_NEVER, - GTK_POLICY_ALWAYS); - - message_list->hidden = NULL; - message_list->hidden_pool = NULL; - message_list->hide_before = ML_HIDE_NONE_START; - message_list->hide_after = ML_HIDE_NONE_END; - - message_list->search = NULL; - - message_list->hide_lock = g_mutex_new(); - - message_list->uid_nodemap = g_hash_table_new (g_str_hash, g_str_equal); -} - -static void -message_list_destroy (GtkObject *object) -{ - MessageList *message_list = MESSAGE_LIST (object); - - if (message_list->folder) { - save_tree_state(message_list); - hide_save_state(message_list); - - camel_object_unhook_event((CamelObject *)message_list->folder, "folder_changed", - folder_changed, message_list); - camel_object_unhook_event((CamelObject *)message_list->folder, "message_changed", - message_changed, message_list); - camel_object_unref (CAMEL_OBJECT (message_list->folder)); - } - - gtk_object_unref (GTK_OBJECT (message_list->extras)); - gtk_object_unref (GTK_OBJECT (message_list->model)); - - if (message_list->idle_id != 0) - g_source_remove (message_list->idle_id); - - if (message_list->seen_id) - gtk_timeout_remove (message_list->seen_id); - - if (message_list->hidden) { - g_hash_table_destroy(message_list->hidden); - e_mempool_destroy(message_list->hidden_pool); - message_list->hidden = NULL; - message_list->hidden_pool = NULL; - } - - if (message_list->uid_nodemap) { - g_hash_table_foreach(message_list->uid_nodemap, (GHFunc)clear_info, message_list); - g_hash_table_destroy (message_list->uid_nodemap); - } - - g_free(message_list->cursor_uid); - - g_mutex_free(message_list->hide_lock); - - GTK_OBJECT_CLASS (message_list_parent_class)->destroy (object); -} - -/* - * GtkObjectClass::init - */ -static void -message_list_class_init (GtkObjectClass *object_class) -{ - message_list_parent_class = gtk_type_class (PARENT_TYPE); - - object_class->destroy = message_list_destroy; - - message_list_signals[MESSAGE_SELECTED] = - gtk_signal_new ("message_selected", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (MessageListClass, message_selected), - gtk_marshal_NONE__STRING, - GTK_TYPE_NONE, 1, GTK_TYPE_STRING); - - message_list_signals[MESSAGE_LIST_BUILT] = - gtk_signal_new ("message_list_built", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (MessageListClass, message_list_built), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - gtk_object_class_add_signals(object_class, message_list_signals, LAST_SIGNAL); - - message_list_init_images (); -} - -static void -message_list_construct (MessageList *message_list) -{ - message_list->model = - e_tree_memory_callbacks_new (ml_tree_icon_at, - - ml_column_count, - - ml_has_save_id, - ml_get_save_id, - - ml_has_get_node_by_id, - ml_get_node_by_id, - - ml_tree_value_at, - ml_tree_set_value_at, - ml_tree_is_cell_editable, - - ml_duplicate_value, - ml_free_value, - ml_initialize_value, - ml_value_is_empty, - ml_value_to_string, - - message_list); - gtk_object_ref (GTK_OBJECT (message_list->model)); - gtk_object_sink (GTK_OBJECT (message_list->model)); - - e_tree_memory_set_expanded_default(E_TREE_MEMORY(message_list->model), TRUE); - - /* - * The etree - */ - message_list->extras = message_list_create_extras (); - e_tree_scrolled_construct_from_spec_file (E_TREE_SCROLLED (message_list), - message_list->model, - message_list->extras, - EVOLUTION_ETSPECDIR "/message-list.etspec", - NULL); - - message_list->tree = e_tree_scrolled_get_tree(E_TREE_SCROLLED (message_list)); - e_tree_root_node_set_visible (message_list->tree, FALSE); - - gtk_signal_connect (GTK_OBJECT (message_list->tree), "cursor_activated", - GTK_SIGNAL_FUNC (on_cursor_activated_cmd), - message_list); - - gtk_signal_connect (GTK_OBJECT (message_list->tree), "click", - GTK_SIGNAL_FUNC (on_click), message_list); -} - -GtkWidget * -message_list_new (void) -{ - MessageList *message_list; - - message_list = MESSAGE_LIST (gtk_widget_new (message_list_get_type (), - "hadjustment", NULL, - "vadjustment", NULL, - NULL)); - message_list_construct (message_list); - - return GTK_WIDGET (message_list); -} - -static void -clear_info(char *key, ETreePath *node, MessageList *ml) -{ - CamelMessageInfo *info; - - info = e_tree_memory_node_get_data((ETreeMemory *)ml->model, node); - camel_folder_free_message_info(ml->folder, info); -} - -static void -clear_tree (MessageList *ml) -{ - ETreeModel *etm = ml->model; - -#ifdef TIMEIT - struct timeval start, end; - unsigned long diff; - - printf("Clearing tree\n"); - gettimeofday(&start, NULL); -#endif - - /* we also reset the uid_rowmap since it is no longer useful/valid anyway */ - if (ml->folder) - g_hash_table_foreach (ml->uid_nodemap, (GHFunc)clear_info, ml); - g_hash_table_destroy (ml->uid_nodemap); - ml->uid_nodemap = g_hash_table_new (g_str_hash, g_str_equal); - - if (ml->tree_root) { - /* we should be frozen already */ - e_tree_memory_node_remove (E_TREE_MEMORY(etm), ml->tree_root); - } - - ml->tree_root = e_tree_memory_node_insert (E_TREE_MEMORY(etm), NULL, 0, NULL); - -#ifdef TIMEIT - gettimeofday(&end, NULL); - diff = end.tv_sec * 1000 + end.tv_usec/1000; - diff -= start.tv_sec * 1000 + start.tv_usec/1000; - printf("Clearing tree took %ld.%03ld seconds\n", diff / 1000, diff % 1000); -#endif - -} - -/* we try and find something that isn't deleted in our tree - there is actually no assurance that we'll find somethign that will - still be there next time, but its probably going to work most of the time */ -static char * -find_next_undeleted (MessageList *ml) -{ - ETreePath node; - int last; - int vrow; - ETree *et = ml->tree; - CamelMessageInfo *info; - - node = g_hash_table_lookup (ml->uid_nodemap, ml->cursor_uid); - if (node == NULL) - return NULL; - - info = get_message_info (ml, node); - if (info && (info->flags & CAMEL_MESSAGE_DELETED) == 0) { - return NULL; - } - - last = e_tree_row_count (ml->tree); - - /* model_to_view_row etc simply dont work for sorted views. Sigh. */ - vrow = e_tree_row_of_node (et, node); - - /* We already checked this node. */ - vrow ++; - - while (vrow < last) { - CamelMessageInfo *info; - - node = e_tree_node_at_row (et, vrow); - info = get_message_info (ml, node); - if (info && (info->flags & CAMEL_MESSAGE_DELETED) == 0) { - return g_strdup (camel_message_info_uid (info)); - } - vrow ++; - } - - return NULL; -} - -/* only call if we have a tree model */ -/* builds the tree structure */ -static void build_subtree (MessageList *ml, ETreePath parent, CamelFolderThreadNode *c, int *row); - -static void build_subtree_diff (MessageList *ml, ETreePath parent, ETreePath path, CamelFolderThreadNode *c, int *row); - -static void -build_tree (MessageList *ml, CamelFolderThread *thread, CamelFolderChangeInfo *changes) -{ - int row = 0; - ETreeModel *etm = ml->model; - ETreePath *top; - char *saveuid = NULL; - -#ifdef TIMEIT - struct timeval start, end; - unsigned long diff; - - printf("Building tree\n"); - gettimeofday(&start, NULL); -#endif - -#ifdef TIMEIT - gettimeofday(&end, NULL); - diff = end.tv_sec * 1000 + end.tv_usec/1000; - diff -= start.tv_sec * 1000 + start.tv_usec/1000; - printf("Loading tree state took %ld.%03ld seconds\n", diff / 1000, diff % 1000); -#endif - - if (ml->tree_root == NULL) { - ml->tree_root = e_tree_memory_node_insert(E_TREE_MEMORY(etm), NULL, 0, NULL); - } - - if (ml->cursor_uid) { - if (ml->hidedeleted) { - saveuid = find_next_undeleted(ml); - } - } - -#define BROKEN_ETREE /* avoid some broken code in etree(?) by not using the incremental update */ - - top = e_tree_model_node_get_first_child(etm, ml->tree_root); -#ifndef BROKEN_ETREE - if (top == NULL || changes == NULL) { -#endif - e_tree_memory_freeze(E_TREE_MEMORY(etm)); - clear_tree (ml); - - build_subtree(ml, ml->tree_root, thread->tree, &row); - - e_tree_memory_thaw(E_TREE_MEMORY(etm)); -#ifndef BROKEN_ETREE - } else { - static int tree_equal(ETreeModel *etm, ETreePath ap, CamelFolderThreadNode *bp); - - build_subtree_diff(ml, ml->tree_root, top, thread->tree, &row); - top = e_tree_model_node_get_first_child(etm, ml->tree_root); - tree_equal(ml->model, top, thread->tree); - } -#endif - - if (saveuid) { - ETreePath *node = g_hash_table_lookup(ml->uid_nodemap, saveuid); - if (node == NULL) { - g_free(ml->cursor_uid); - ml->cursor_uid = NULL; - gtk_signal_emit((GtkObject *)ml, message_list_signals[MESSAGE_SELECTED], NULL); - } else { - e_tree_set_cursor(ml->tree, node); - } - g_free(saveuid); - } else if (ml->cursor_uid && !g_hash_table_lookup(ml->uid_nodemap, ml->cursor_uid)) { - g_free(ml->cursor_uid); - ml->cursor_uid = NULL; - gtk_signal_emit((GtkObject *)ml, message_list_signals[MESSAGE_SELECTED], NULL); - } - -#ifdef TIMEIT - gettimeofday(&end, NULL); - diff = end.tv_sec * 1000 + end.tv_usec/1000; - diff -= start.tv_sec * 1000 + start.tv_usec/1000; - printf("Building tree took %ld.%03ld seconds\n", diff / 1000, diff % 1000); -#endif - -} - -/* this is about 20% faster than build_subtree_diff, - entirely because e_tree_model_node_insert(xx, -1 xx) - is faster than inserting to the right row :( */ -/* Otherwise, this code would probably go as it does the same thing essentially */ -static void -build_subtree (MessageList *ml, ETreePath parent, CamelFolderThreadNode *c, int *row) -{ - ETreeModel *tree = ml->model; - ETreePath node; - - while (c) { - /* phantom nodes no longer allowed */ - g_assert(c->message); - - node = e_tree_memory_node_insert(E_TREE_MEMORY(tree), parent, -1, (void *)c->message); - g_hash_table_insert(ml->uid_nodemap, (void *)camel_message_info_uid(c->message), node); - camel_folder_ref_message_info(ml->folder, (CamelMessageInfo *)c->message); - - if (c->child) { - build_subtree(ml, node, c->child, row); - } - c = c->next; - } -} - -/* compares a thread tree node with the etable tree node to see if they point to - the same object */ -static int -node_equal(ETreeModel *etm, ETreePath ap, CamelFolderThreadNode *bp) -{ - CamelMessageInfo *info; - - info = e_tree_memory_node_get_data(E_TREE_MEMORY(etm), ap); - - if (bp->message && strcmp(camel_message_info_uid(info), camel_message_info_uid(bp->message))==0) - return 1; - - return 0; -} - -#ifndef BROKEN_ETREE -/* debug function - compare the two trees to see if they are the same */ -static int -tree_equal(ETreeModel *etm, ETreePath ap, CamelFolderThreadNode *bp) -{ - CamelMessageInfo *info; - - while (ap && bp) { - if (!node_equal(etm, ap, bp)) { - g_warning("Nodes in tree differ"); - info = e_tree_memory_node_get_data(E_TREE_MEMORY(etm), ap); - printf("table uid = %s\n", camel_message_info_uid(info)); - printf("camel uid = %s\n", camel_message_info_uid(bp->message)); - return FALSE; - } else { - if (!tree_equal(etm, e_tree_model_node_get_first_child(etm, ap), bp->child)) - return FALSE; - } - bp = bp->next; - ap = e_tree_model_node_get_next(etm, ap); - } - - if (ap || bp) { - g_warning("Tree differs, out of nodes in one branch"); - if (ap) { - info = e_tree_memory_node_get_data(E_TREE_MEMORY(etm), ap); - if (info) - printf("table uid = %s\n", camel_message_info_uid(info)); - else - printf("info is empty?\n"); - } - if (bp) { - printf("camel uid = %s\n", camel_message_info_uid(bp->message)); - return FALSE; - } - return FALSE; - } - return TRUE; -} -#endif - -/* adds a single node, retains save state, and handles adding children if required */ -static void -add_node_diff(MessageList *ml, ETreePath parent, ETreePath path, CamelFolderThreadNode *c, int *row, int myrow) -{ - ETreeModel *etm = ml->model; - ETreePath node; - - g_assert(c->message); - - /* we just update the hashtable key, umm, does this leak the info on the message node? */ - g_hash_table_remove(ml->uid_nodemap, camel_message_info_uid(c->message)); - node = e_tree_memory_node_insert(E_TREE_MEMORY(etm), parent, myrow, (void *)c->message); - g_hash_table_insert(ml->uid_nodemap, (void *)camel_message_info_uid(c->message), node); - camel_folder_ref_message_info(ml->folder, (CamelMessageInfo *)c->message); - (*row)++; - - if (c->child) { - build_subtree_diff(ml, node, NULL, c->child, row); - } -} - -/* removes node, children recursively and all associated data */ -static void -remove_node_diff(MessageList *ml, ETreePath node, int depth) -{ - ETreeModel *etm = ml->model; - ETreePath cp, cn; - CamelMessageInfo *info; - - t(printf("Removing node: %s\n", (char *)e_tree_memory_node_get_data(etm, node))); - - /* we depth-first remove all node data's ... */ - cp = e_tree_model_node_get_first_child(etm, node); - while (cp) { - cn = e_tree_model_node_get_next(etm, cp); - remove_node_diff(ml, cp, depth+1); - cp = cn; - } - - /* and the rowid entry - if and only if it is referencing this node */ - info = e_tree_memory_node_get_data(E_TREE_MEMORY (etm), node); - - /* and only at the toplevel, remove the node (etree should optimise this remove somewhat) */ - if (depth == 0) - e_tree_memory_node_remove(E_TREE_MEMORY(etm), node); - - g_assert(info); - g_hash_table_remove(ml->uid_nodemap, camel_message_info_uid(info)); - camel_folder_free_message_info(ml->folder, info); -} - -/* applies a new tree structure to an existing tree, but only by changing things - that have changed */ -static void -build_subtree_diff(MessageList *ml, ETreePath parent, ETreePath path, CamelFolderThreadNode *c, int *row) -{ - ETreeModel *etm = ml->model; - ETreePath ap, *ai, *at, *tmp; - CamelFolderThreadNode *bp, *bi, *bt; - int i, j, myrow = 0; - - ap = path; - bp = c; - - while (ap || bp) { - t(printf("Processing row: %d (subtree row %d)\n", *row, myrow)); - if (ap == NULL) { - t(printf("out of old nodes\n")); - /* ran out of old nodes - remaining nodes are added */ - add_node_diff(ml, parent, ap, bp, row, myrow); - myrow++; - bp = bp->next; - } else if (bp == NULL) { - t(printf("out of new nodes\n")); - /* ran out of new nodes - remaining nodes are removed */ - tmp = e_tree_model_node_get_next(etm, ap); - remove_node_diff(ml, ap, 0); - ap = tmp; - } else if (node_equal(etm, ap, bp)) { - /*t(printf("nodes match, verify\n"));*/ - /* matching nodes, verify details/children */ -#if 0 - if (bp->message) { - char *olduid; - int oldrow; - /* if this is a message row, check/update the row id map */ - if (g_hash_table_lookup_extended(ml->uid_rowmap, camel_message_info_uid(bp->message), (void *)&olduid, (void *)&oldrow)) { - if (oldrow != (*row)) { - g_hash_table_insert(ml->uid_rowmap, olduid, (void *)(*row)); - } - } else { - g_warning("Cannot find uid %s in table?", camel_message_info_uid(bp->message)); - /*g_assert_not_reached();*/ - } - } -#endif - *row = (*row)+1; - myrow++; - tmp = e_tree_model_node_get_first_child(etm, ap); - /* make child lists match (if either has one) */ - if (bp->child || tmp) { - build_subtree_diff(ml, ap, tmp, bp->child, row); - } - ap = e_tree_model_node_get_next(etm, ap); - bp = bp->next; - } else { - t(printf("searching for matches\n")); - /* we have to scan each side for a match */ - bi = bp->next; - ai = e_tree_model_node_get_next(etm, ap); - for (i=1;bi!=NULL;i++,bi=bi->next) { - if (node_equal(etm, ap, bi)) - break; - } - for (j=1;ai!=NULL;j++,ai=e_tree_model_node_get_next(etm, ai)) { - if (node_equal(etm, ai, bp)) - break; - } - if (inext; - } - bp = bi; - } else { - t(printf("adding new node 1\n")); - /* no match in new nodes, add one, try next */ - add_node_diff(ml, parent, NULL, bp, row, myrow); - myrow++; - bp = bp->next; - } - } else { - /* bigger run of old nodes - must be nodes to remove */ - if (ai) { - at = ap; - while (at != ai) { - t(printf("removing old node 0\n")); - tmp = e_tree_model_node_get_next(etm, at); - remove_node_diff(ml, at, 0); - at = tmp; - } - ap = ai; - } else { - t(printf("adding new node 2\n")); - /* didn't find match in old nodes, must be new node? */ - add_node_diff(ml, parent, NULL, bp, row, myrow); - myrow++; - bp = bp->next; -#if 0 - tmp = e_tree_model_node_get_next(etm, ap); - remove_node_diff(etm, ap, 0); - ap = tmp; -#endif - } - } - } - } -} - -#ifndef BROKEN_ETREE -static void build_flat_diff(MessageList *ml, CamelFolderChangeInfo *changes); -#endif - -static void -build_flat (MessageList *ml, GPtrArray *summary, CamelFolderChangeInfo *changes) -{ - ETreeModel *etm = ml->model; - ETreePath node; - char *saveuid = NULL; - int i; - -#ifdef TIMEIT - struct timeval start, end; - unsigned long diff; - - printf("Building flat\n"); - gettimeofday(&start, NULL); -#endif - - if (ml->cursor_uid) { - if (ml->hidedeleted) { - saveuid = find_next_undeleted(ml); - } - } - -#ifndef BROKEN_ETREE - if (changes) { - build_flat_diff(ml, changes); - } else { -#endif - e_tree_memory_freeze(E_TREE_MEMORY(etm)); - clear_tree (ml); - for (i = 0; i < summary->len; i++) { - CamelMessageInfo *info = summary->pdata[i]; - - node = e_tree_memory_node_insert(E_TREE_MEMORY(etm), ml->tree_root, -1, info); - g_hash_table_insert(ml->uid_nodemap, (void *)camel_message_info_uid(info), node); - camel_folder_ref_message_info(ml->folder, info); - } - e_tree_memory_thaw(E_TREE_MEMORY(etm)); - -#ifndef BROKEN_ETREE - } -#endif - - if (saveuid) { - ETreePath *node = g_hash_table_lookup(ml->uid_nodemap, saveuid); - if (node == NULL) { - g_free(ml->cursor_uid); - ml->cursor_uid = NULL; - gtk_signal_emit((GtkObject *)ml, message_list_signals[MESSAGE_SELECTED], NULL); - } else { - e_tree_set_cursor(ml->tree, node); - } - g_free(saveuid); - } - -#ifdef TIMEIT - gettimeofday(&end, NULL); - diff = end.tv_sec * 1000 + end.tv_usec/1000; - diff -= start.tv_sec * 1000 + start.tv_usec/1000; - printf("Building flat took %ld.%03ld seconds\n", diff / 1000, diff % 1000); -#endif - -} - -#ifndef BROKEN_ETREE - -static void -build_flat_diff(MessageList *ml, CamelFolderChangeInfo *changes) -{ - int i; - ETreePath node; - CamelMessageInfo *info; - -#ifdef TIMEIT - struct timeval start, end; - unsigned long diff; - - gettimeofday(&start, NULL); -#endif - - printf("updating changes to display\n"); - - /* remove individual nodes? */ - d(printf("Removing messages from view:\n")); - for (i=0;iuid_removed->len;i++) { - node = g_hash_table_lookup(ml->uid_nodemap, changes->uid_removed->pdata[i]); - if (node) { - info = e_tree_memory_node_get_data(E_TREE_MEMORY(ml->model), node); - e_tree_memory_node_remove(E_TREE_MEMORY(ml->model), node); - camel_folder_free_message_info(ml->folder, info); - g_hash_table_remove(ml->uid_nodemap, changes->uid_removed->pdata[i]); - } - } - - /* add new nodes? - just append to the end */ - d(printf("Adding messages to view:\n")); - for (i=0;iuid_added->len;i++) { - info = camel_folder_get_message_info (ml->folder, changes->uid_added->pdata[i]); - if (info) { - d(printf(" %s\n", (char *)changes->uid_added->pdata[i])); - node = e_tree_memory_node_insert (E_TREE_MEMORY (ml->model), ml->tree_root, -1, info); - g_hash_table_insert (ml->uid_nodemap, (void *)camel_message_info_uid (info), node); - } - } - - /* and update changes too */ - d(printf("Changing messages to view:\n")); - for (i = 0; i < changes->uid_changed->len; i++) { - ETreePath *node = g_hash_table_lookup (ml->uid_nodemap, changes->uid_changed->pdata[i]); - if (node) - e_tree_model_node_data_changed (ml->model, node); - } - -#ifdef TIMEIT - gettimeofday(&end, NULL); - diff = end.tv_sec * 1000 + end.tv_usec/1000; - diff -= start.tv_sec * 1000 + start.tv_usec/1000; - printf("Inserting changes took %ld.%03ld seconds\n", diff / 1000, diff % 1000); -#endif - -} -#endif /* ! BROKEN_ETREE */ - -static void -main_folder_changed (CamelObject *o, gpointer event_data, gpointer user_data) -{ - MessageList *ml = MESSAGE_LIST (user_data); - CamelFolderChangeInfo *changes = (CamelFolderChangeInfo *)event_data, *newchanges; - CamelMessageInfo *info; - CamelFolder *folder = (CamelFolder *)o; - int i; - - printf("folder changed event, changes = %p\n", changes); - if (changes) { - printf("changed = %d added = %d removed = %d\n", - changes->uid_changed->len, changes->uid_added->len, changes->uid_removed->len); - - /* check if the hidden state has changed, if so modify accordingly, then regenerate */ - if (ml->hidedeleted) { - newchanges = camel_folder_change_info_new (); - - for (i = 0; i < changes->uid_changed->len; i++) { - ETreePath node = g_hash_table_lookup (ml->uid_nodemap, changes->uid_changed->pdata[i]); - - info = camel_folder_get_message_info (folder, changes->uid_changed->pdata[i]); - if (node != NULL && info != NULL && (info->flags & CAMEL_MESSAGE_DELETED) != 0) { - camel_folder_change_info_remove_uid (newchanges, changes->uid_changed->pdata[i]); - } else if (node == NULL && info != NULL && (info->flags & CAMEL_MESSAGE_DELETED) == 0) { - camel_folder_change_info_add_uid (newchanges, changes->uid_changed->pdata[i]); - } else { - camel_folder_change_info_change_uid (newchanges, changes->uid_changed->pdata[i]); - } - camel_folder_free_message_info (folder, info); - } - - if (newchanges->uid_added->len > 0 || newchanges->uid_removed->len > 0) { - for (i = 0; i < changes->uid_added->len; i++) - camel_folder_change_info_add_uid (newchanges, changes->uid_added->pdata[i]); - for (i = 0; i < changes->uid_removed->len; i++) - camel_folder_change_info_remove_uid (newchanges, changes->uid_removed->pdata[i]); - camel_folder_change_info_free (changes); - changes = newchanges; - } else { - camel_folder_change_info_free (newchanges); - } - } - - if (changes->uid_added->len == 0 && changes->uid_removed->len == 0 && changes->uid_changed->len < 100) { - for (i = 0; i < changes->uid_changed->len; i++) { - ETreePath node = g_hash_table_lookup (ml->uid_nodemap, changes->uid_changed->pdata[i]); - if (node) - e_tree_model_node_data_changed (ml->model, node); - } - - camel_folder_change_info_free (changes); - return; - } - } - - mail_regen_list (ml, ml->search, NULL, changes); -} - -static void -folder_changed (CamelObject *o, gpointer event_data, gpointer user_data) -{ - /* similarly to message_changed, copy the change list and propagate it to - the main thread and free it */ - CamelFolderChangeInfo *changes; - - if (event_data) { - changes = camel_folder_change_info_new(); - camel_folder_change_info_cat(changes, (CamelFolderChangeInfo *)event_data); - } else { - changes = NULL; - } - mail_proxy_event (main_folder_changed, o, changes, user_data); -} - -static void -main_message_changed (CamelObject *o, gpointer uid, gpointer user_data) -{ - MessageList *ml = MESSAGE_LIST (user_data); - CamelFolderChangeInfo *changes; - - changes = camel_folder_change_info_new(); - camel_folder_change_info_change_uid(changes, uid); - main_folder_changed(o, changes, ml); - g_free(uid); -} - -static void -message_changed (CamelObject *o, gpointer event_data, gpointer user_data) -{ - /* Here we copy the data because our thread may free the copy that we would reference. - * The other thread would be passed a uid parameter that pointed to freed data. - * We copy it and free it in the handler. - */ - mail_proxy_event (main_message_changed, o, g_strdup ((gchar *)event_data), user_data); -} - -void -message_list_set_folder (MessageList *message_list, CamelFolder *camel_folder, gboolean outgoing) -{ - CamelException ex; - - g_return_if_fail (message_list != NULL); - g_return_if_fail (IS_MESSAGE_LIST (message_list)); - - if (message_list->folder == camel_folder) - return; - - camel_exception_init (&ex); - - clear_tree(message_list); - - if (message_list->folder) { - hide_save_state(message_list); - camel_object_unhook_event((CamelObject *)message_list->folder, "folder_changed", - folder_changed, message_list); - camel_object_unhook_event((CamelObject *)message_list->folder, "message_changed", - message_changed, message_list); - camel_object_unref (CAMEL_OBJECT (message_list->folder)); - } - - message_list->folder = camel_folder; - - if (message_list->cursor_uid) { - g_free(message_list->cursor_uid); - message_list->cursor_uid = NULL; - gtk_signal_emit((GtkObject *)message_list, message_list_signals[MESSAGE_SELECTED], NULL); - } - - if (camel_folder) { - /* Setup the strikeout effect for non-vtrash folders */ - if (!CAMEL_IS_VTRASH_FOLDER (camel_folder)) { - ECell *cell; - - cell = e_table_extras_get_cell (message_list->extras, "render_date"); - gtk_object_set (GTK_OBJECT (cell), - "strikeout_column", COL_DELETED, - NULL); - - cell = e_table_extras_get_cell (message_list->extras, "render_text"); - gtk_object_set (GTK_OBJECT (cell), - "strikeout_column", COL_DELETED, - NULL); - - cell = e_table_extras_get_cell (message_list->extras, "render_size"); - gtk_object_set (GTK_OBJECT (cell), - "strikeout_column", COL_DELETED, - NULL); - } - - /* Build the etree suitable for this folder */ - message_list_setup_etree (message_list, outgoing); - - camel_object_hook_event (CAMEL_OBJECT (camel_folder), "folder_changed", - folder_changed, message_list); - camel_object_hook_event (CAMEL_OBJECT (camel_folder), "message_changed", - message_changed, message_list); - - camel_object_ref (CAMEL_OBJECT (camel_folder)); - - message_list->hidedeleted = mail_config_get_hide_deleted () && - !(CAMEL_IS_VTRASH_FOLDER (camel_folder)); - - hide_load_state (message_list); - mail_regen_list (message_list, message_list->search, NULL, NULL); - } -} - -E_MAKE_TYPE (message_list, "MessageList", MessageList, message_list_class_init, message_list_init, PARENT_TYPE); - -static gboolean -on_cursor_activated_idle (gpointer data) -{ - MessageList *message_list = data; - ESelectionModel *esm = e_tree_get_selection_model (message_list->tree); - gint selected = e_selection_model_selected_count (esm); - - if (selected == 1) { - printf ("emitting cursor changed signal, for uid %s\n", message_list->cursor_uid); - gtk_signal_emit (GTK_OBJECT (message_list), - message_list_signals[MESSAGE_SELECTED], message_list->cursor_uid); - } - - message_list->idle_id = 0; - return FALSE; -} - -static void -on_cursor_activated_cmd (ETree *tree, int row, ETreePath path, gpointer user_data) -{ - MessageList *message_list = MESSAGE_LIST (user_data); - const char *new_uid; - - if (path == NULL) - new_uid = NULL; - else - new_uid = get_message_uid (message_list, path); - - if (message_list->cursor_uid != NULL && new_uid != NULL && !strcmp (message_list->cursor_uid, new_uid)) - return; - - message_list->cursor_row = row; - g_free (message_list->cursor_uid); - message_list->cursor_uid = g_strdup (new_uid); - - if (!message_list->idle_id) { - message_list->idle_id = - g_idle_add_full (G_PRIORITY_LOW, on_cursor_activated_idle, - message_list, NULL); - } -} - -static gint -on_click (ETree *tree, gint row, ETreePath path, gint col, GdkEvent *event, MessageList *list) -{ - int flag; - CamelMessageInfo *info; - - if (col == COL_MESSAGE_STATUS) - flag = CAMEL_MESSAGE_SEEN; - else if (col == COL_FLAGGED) - flag = CAMEL_MESSAGE_FLAGGED; - else - return FALSE; - - info = get_message_info (list, path); - if (info == NULL) { - return FALSE; - } - - /* If a message was marked as deleted and the user flags it as important, undelete it */ - if (col == COL_FLAGGED && (info->flags & CAMEL_MESSAGE_DELETED)) - flag |= CAMEL_MESSAGE_DELETED; - - camel_folder_set_message_flags (list->folder, camel_message_info_uid (info), flag, ~info->flags); - - if (flag == CAMEL_MESSAGE_SEEN && list->seen_id) { - gtk_timeout_remove (list->seen_id); - list->seen_id = 0; - } - - return TRUE; -} - -struct message_list_foreach_data { - MessageList *message_list; - MessageListForeachFunc callback; - gpointer user_data; -}; - -static void -mlfe_callback (int row, gpointer user_data) -{ - struct message_list_foreach_data *mlfe_data = user_data; - const char *uid; - - uid = get_message_uid (mlfe_data->message_list, - e_tree_node_at_row (mlfe_data->message_list->tree, row)); - if (uid) { - mlfe_data->callback (mlfe_data->message_list, uid, - mlfe_data->user_data); - } else { - /* FIXME: could this the cause of bug #6637 and friends? */ - g_warning ("I wonder if this could be the cause of bug #6637 and friends?"); - g_assert_not_reached (); - } -} - -void -message_list_foreach (MessageList *message_list, - MessageListForeachFunc callback, - gpointer user_data) -{ - struct message_list_foreach_data mlfe_data; - - mlfe_data.message_list = message_list; - mlfe_data.callback = callback; - mlfe_data.user_data = user_data; - e_tree_selected_row_foreach (message_list->tree, - mlfe_callback, &mlfe_data); -} - -/* set whether we are in threaded view or flat view */ -void -message_list_set_threaded (MessageList *ml, gboolean threaded) -{ - if (ml->threaded != threaded) { - ml->threaded = threaded; - - mail_regen_list (ml, ml->search, NULL, NULL); - } -} - -void -message_list_set_hidedeleted (MessageList *ml, gboolean hidedeleted) -{ - if (ml->folder && CAMEL_IS_VTRASH_FOLDER (ml->folder)) - hidedeleted = FALSE; - - if (ml->hidedeleted != hidedeleted) { - ml->hidedeleted = hidedeleted; - - mail_regen_list (ml, ml->search, NULL, NULL); - } -} - -void -message_list_set_search (MessageList *ml, const char *search) -{ - if (search == NULL || search[0] == '\0') - if (ml->search == NULL || ml->search[0] == '\0') - return; - - if (search != NULL && ml->search != NULL && strcmp (search, ml->search) == 0) - return; - - mail_regen_list (ml, search, NULL, NULL); -} - -/* returns the number of messages displayable *after* expression hiding has taken place */ -unsigned int -message_list_length (MessageList *ml) -{ - return ml->hide_unhidden; -} - -/* add a new expression to hide, or set the range. - @expr: A new search expression - all matching messages will be hidden. May be %NULL. - @lower: Use ML_HIDE_NONE_START to specify no messages hidden from the start of the list. - @upper: Use ML_HIDE_NONE_END to specify no message hidden from the end of the list. - - For either @upper or @lower, use ML_HIDE_SAME, to keep the previously set hide range. - If either range is negative, then the range is taken from the end of the available list - of messages, once other hiding has been performed. Use message_list_length() to find out - how many messages are available for hiding. - - Example: hide_add(ml, NULL, -100, ML_HIDE_NONE_END) -> hide all but the last (most recent) - 100 messages. -*/ -void -message_list_hide_add (MessageList *ml, const char *expr, unsigned int lower, unsigned int upper) -{ - MESSAGE_LIST_LOCK (ml, hide_lock); - - if (lower != ML_HIDE_SAME) - ml->hide_before = lower; - if (upper != ML_HIDE_SAME) - ml->hide_after = upper; - - MESSAGE_LIST_UNLOCK (ml, hide_lock); - - mail_regen_list (ml, ml->search, expr, NULL); -} - -/* hide specific uid's */ -void -message_list_hide_uids (MessageList *ml, GPtrArray *uids) -{ - int i; - char *uid; - - /* first see if we need to do any work, if so, then do it all at once */ - for (i = 0; i < uids->len; i++) { - if (g_hash_table_lookup (ml->uid_nodemap, uids->pdata[i])) { - MESSAGE_LIST_LOCK (ml, hide_lock); - if (ml->hidden == NULL) { - ml->hidden = g_hash_table_new (g_str_hash, g_str_equal); - ml->hidden_pool = e_mempool_new (512, 256, E_MEMPOOL_ALIGN_BYTE); - } - - uid = e_mempool_strdup (ml->hidden_pool, uids->pdata[i]); - g_hash_table_insert (ml->hidden, uid, uid); - for ( ; i < uids->len; i++) { - if (g_hash_table_lookup (ml->uid_nodemap, uids->pdata[i])) { - uid = e_mempool_strdup (ml->hidden_pool, uids->pdata[i]); - g_hash_table_insert (ml->hidden, uid, uid); - } - } - MESSAGE_LIST_UNLOCK (ml, hide_lock); - mail_regen_list (ml, ml->search, NULL, NULL); - break; - } - } -} - -/* no longer hide any messages */ -void -message_list_hide_clear (MessageList *ml) -{ - MESSAGE_LIST_LOCK (ml, hide_lock); - if (ml->hidden) { - g_hash_table_destroy (ml->hidden); - e_mempool_destroy (ml->hidden_pool); - ml->hidden = NULL; - ml->hidden_pool = NULL; - } - ml->hide_before = ML_HIDE_NONE_START; - ml->hide_after = ML_HIDE_NONE_END; - MESSAGE_LIST_UNLOCK (ml, hide_lock); - - mail_regen_list (ml, ml->search, NULL, NULL); -} - -#define HIDE_STATE_VERSION (1) - -/* version 1 file is: - uintf 1 - uintf hide_before - uintf hide_after - string* uids -*/ - -static void -hide_load_state (MessageList *ml) -{ - char *filename; - FILE *in; - guint32 version, lower, upper; - - filename = mail_config_folder_to_cachename(ml->folder, "hidestate-"); - in = fopen(filename, "r"); - if (in) { - camel_file_util_decode_fixed_int32 (in, &version); - if (version == HIDE_STATE_VERSION) { - MESSAGE_LIST_LOCK(ml, hide_lock); - if (ml->hidden == NULL) { - ml->hidden = g_hash_table_new(g_str_hash, g_str_equal); - ml->hidden_pool = e_mempool_new(512, 256, E_MEMPOOL_ALIGN_BYTE); - } - camel_file_util_decode_fixed_int32 (in, &lower); - ml->hide_before = lower; - camel_file_util_decode_fixed_int32 (in, &upper); - ml->hide_after = upper; - while (!feof(in)) { - char *olduid, *uid; - - if (camel_file_util_decode_string (in, &olduid) != -1) { - uid = e_mempool_strdup(ml->hidden_pool, olduid); - g_free (olduid); - g_hash_table_insert(ml->hidden, uid, uid); - } - } - MESSAGE_LIST_UNLOCK(ml, hide_lock); - } - fclose(in); - } - g_free(filename); -} - -static void -hide_save_1 (char *uid, char *keydata, FILE *out) -{ - camel_file_util_encode_string (out, uid); -} - -/* save the hide state. Note that messages are hidden by uid, if the uid's change, then - this will become invalid, but is easy to reset in the ui */ -static void -hide_save_state (MessageList *ml) -{ - char *filename; - FILE *out; - - MESSAGE_LIST_LOCK(ml, hide_lock); - - filename = mail_config_folder_to_cachename(ml->folder, "hidestate-"); - if (ml->hidden == NULL && ml->hide_before == ML_HIDE_NONE_START && ml->hide_after == ML_HIDE_NONE_END) { - unlink(filename); - } else if ((out = fopen (filename, "w"))) { - camel_file_util_encode_fixed_int32 (out, HIDE_STATE_VERSION); - camel_file_util_encode_fixed_int32 (out, ml->hide_before); - camel_file_util_encode_fixed_int32 (out, ml->hide_after); - if (ml->hidden) - g_hash_table_foreach(ml->hidden, (GHFunc)hide_save_1, out); - fclose(out); - } - g_free (filename); - - MESSAGE_LIST_UNLOCK(ml, hide_lock); -} - -/* ** REGENERATE MESSAGELIST ********************************************** */ -struct _regen_list_msg { - struct _mail_msg msg; - - MessageList *ml; - char *search; - char *hideexpr; - CamelFolderChangeInfo *changes; - gboolean dotree; /* we are building a tree */ - gboolean hidedel; /* we want to/dont want to show deleted messages */ - CamelFolderThread *tree; - - CamelFolder *folder; - GPtrArray *summary; -}; - -/* - maintain copy of summary - - any new messages added - any removed removed, etc. - - use vfolder to implement searches ??? - - */ - -static char * -regen_list_describe (struct _mail_msg *mm, gint complete) -{ - return g_strdup (_("Generating message list")); -} - -static void -regen_list_regen (struct _mail_msg *mm) -{ - struct _regen_list_msg *m = (struct _regen_list_msg *)mm; - GPtrArray *uids, *uidnew, *showuids; - CamelMessageInfo *info; - int i; - - if (m->search) - uids = camel_folder_search_by_expression (m->folder, m->search, &mm->ex); - else - uids = camel_folder_get_uids (m->folder); - - if (camel_exception_is_set (&mm->ex)) - return; - - /* perform hiding */ - if (m->hideexpr) { - uidnew = camel_folder_search_by_expression (m->ml->folder, m->hideexpr, &mm->ex); - /* well, lets not abort just because this faileld ... */ - camel_exception_clear (&mm->ex); - - if (uidnew) { - MESSAGE_LIST_LOCK(m->ml, hide_lock); - - if (m->ml->hidden == NULL) { - m->ml->hidden = g_hash_table_new (g_str_hash, g_str_equal); - m->ml->hidden_pool = e_mempool_new (512, 256, E_MEMPOOL_ALIGN_BYTE); - } - - for (i = 0; i < uidnew->len; i++) { - if (g_hash_table_lookup (m->ml->hidden, uidnew->pdata[i]) == 0) { - char *uid = e_mempool_strdup (m->ml->hidden_pool, uidnew->pdata[i]); - g_hash_table_insert (m->ml->hidden, uid, uid); - } - } - - MESSAGE_LIST_UNLOCK(m->ml, hide_lock); - - camel_folder_search_free (m->ml->folder, uidnew); - } - } - - MESSAGE_LIST_LOCK(m->ml, hide_lock); - - m->ml->hide_unhidden = uids->len; - - /* what semantics do we want from hide_before, hide_after? - probably <0 means measure from the end of the list */ - - /* perform uid hiding */ - if (m->ml->hidden || m->ml->hide_before != ML_HIDE_NONE_START || m->ml->hide_after != ML_HIDE_NONE_END) { - int start, end; - uidnew = g_ptr_array_new (); - - /* first, hide matches */ - if (m->ml->hidden) { - for (i = 0; i < uids->len; i++) { - if (g_hash_table_lookup (m->ml->hidden, uids->pdata[i]) == 0) - g_ptr_array_add (uidnew, uids->pdata[i]); - } - } - - /* then calculate the subrange visible and chop it out */ - m->ml->hide_unhidden = uidnew->len; - - if (m->ml->hide_before != ML_HIDE_NONE_START || m->ml->hide_after != ML_HIDE_NONE_END) { - GPtrArray *uid2 = g_ptr_array_new (); - - start = m->ml->hide_before; - if (start < 0) - start += m->ml->hide_unhidden; - end = m->ml->hide_after; - if (end < 0) - end += m->ml->hide_unhidden; - - start = MAX(start, 0); - end = MIN(end, uidnew->len); - for (i = start; i < end; i++) { - g_ptr_array_add (uid2, uidnew->pdata[i]); - } - - g_ptr_array_free (uidnew, TRUE); - uidnew = uid2; - } - showuids = uidnew; - } else { - uidnew = NULL; - showuids = uids; - } - - MESSAGE_LIST_UNLOCK(m->ml, hide_lock); - - m->summary = g_ptr_array_new (); - for (i = 0; i < showuids->len; i++) { - info = camel_folder_get_message_info (m->folder, showuids->pdata[i]); - if (info) { - /* FIXME: should this be taken account of in above processing? */ - if (m->hidedel && (info->flags & CAMEL_MESSAGE_DELETED) != 0) - camel_folder_free_message_info (m->folder, info); - else - g_ptr_array_add (m->summary, info); - } - } - - if (uidnew) - g_ptr_array_free (uidnew, TRUE); - - if (m->search) - camel_folder_search_free (m->folder, uids); - else - camel_folder_free_uids (m->folder, uids); - - if (m->dotree) - m->tree = camel_folder_thread_messages_new_summary (m->summary); - else - m->tree = NULL; -} - -static void -regen_list_regened (struct _mail_msg *mm) -{ - struct _regen_list_msg *m = (struct _regen_list_msg *)mm; - - if (m->summary == NULL) - return; - - if (m->dotree) - build_tree (m->ml, m->tree, m->changes); - else - build_flat (m->ml, m->summary, m->changes); - - gtk_signal_emit (GTK_OBJECT (m->ml), message_list_signals[MESSAGE_LIST_BUILT]); -} - -static void -regen_list_free (struct _mail_msg *mm) -{ - struct _regen_list_msg *m = (struct _regen_list_msg *)mm; - int i; - - if (m->summary) { - for (i = 0; i < m->summary->len; i++) - camel_folder_free_message_info (m->folder, m->summary->pdata[i]); - g_ptr_array_free (m->summary, TRUE); - } - - if (m->tree) - camel_folder_thread_messages_destroy (m->tree); - - if (m->ml->search && m->ml->search != m->search) - g_free (m->ml->search); - m->ml->search = m->search; - - g_free (m->hideexpr); - - camel_object_unref (CAMEL_OBJECT (m->folder)); - - if (m->changes) - camel_folder_change_info_free (m->changes); - - gtk_object_unref (GTK_OBJECT (m->ml)); -} - -static struct _mail_msg_op regen_list_op = { - regen_list_describe, - regen_list_regen, - regen_list_regened, - regen_list_free, -}; - -static void -mail_regen_list (MessageList *ml, const char *search, const char *hideexpr, CamelFolderChangeInfo *changes) -{ - struct _regen_list_msg *m; - - if (ml->folder == NULL) - return; - -#ifndef BROKEN_ETREE - /* this can sometimes crash,so ... */ - - /* see if we need to goto the child thread at all anyway */ - /* currently the only case is the flat view with updates and no search */ - if (hideexpr == NULL && search == NULL && changes != NULL && !ml->threaded) { - build_flat_diff(ml, changes); - camel_folder_change_info_free(changes); - return; - } -#endif - - m = mail_msg_new (®en_list_op, NULL, sizeof (*m)); - m->ml = ml; - m->search = g_strdup (search); - m->hideexpr = g_strdup (hideexpr); - m->changes = changes; - m->dotree = ml->threaded; - m->hidedel = ml->hidedeleted; - gtk_object_ref (GTK_OBJECT (ml)); - m->folder = ml->folder; - camel_object_ref (CAMEL_OBJECT (m->folder)); - - e_thread_put (mail_thread_new, (EMsg *)m); -} diff --git a/mail/message-list.etspec b/mail/message-list.etspec deleted file mode 100644 index 5f80afcbb1..0000000000 --- a/mail/message-list.etspec +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/mail/message-list.h b/mail/message-list.h deleted file mode 100644 index 26a6512d0d..0000000000 --- a/mail/message-list.h +++ /dev/null @@ -1,138 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -#ifndef _MESSAGE_LIST_H_ -#define _MESSAGE_LIST_H_ - -#include -#include - -#include -#include -#include "mail-types.h" - -#define MESSAGE_LIST_TYPE (message_list_get_type ()) -#define MESSAGE_LIST(o) (GTK_CHECK_CAST ((o), MESSAGE_LIST_TYPE, MessageList)) -#define MESSAGE_LIST_CLASS(k) (GTK_CHECK_CLASS_CAST((k), MESSAGE_LIST_TYPE, MessageListClass)) -#define IS_MESSAGE_LIST(o) (GTK_CHECK_TYPE ((o), MESSAGE_LIST_TYPE)) -#define IS_MESSAGE_LIST_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), MESSAGE_LIST_TYPE)) - -enum { - COL_MESSAGE_STATUS, - COL_FLAGGED, - COL_SCORE, - COL_ATTACHMENT, - COL_FROM, - COL_SUBJECT, - COL_SENT, - COL_RECEIVED, - COL_TO, - COL_SIZE, - - COL_LAST, - - /* Invisible columns */ - COL_DELETED, - COL_UNREAD, - COL_COLOUR, -}; - -#define MESSAGE_LIST_COLUMN_IS_ACTIVE(col) (col == COL_MESSAGE_STATUS || \ - col == COL_FLAGGED) - -#define ML_HIDE_NONE_START (0) -#define ML_HIDE_NONE_END (2147483647) -/* dont change */ -#define ML_HIDE_SAME (2147483646) - -struct _MessageList { - ETreeScrolled parent; - - /* The table */ - ETreeModel *model; - ETree *tree; - ETreePath tree_root; - ETableExtras *extras; - - /* The folder */ - CamelFolder *folder; - - GHashTable *uid_nodemap; /* uid (from info) -> tree node mapping */ - - /* UID's to hide. Keys in the mempool */ - /* IMPORTANT: You MUST have obtained the hide lock, to operate on this data */ - GHashTable *hidden; - struct _EMemPool *hidden_pool; - int hide_unhidden, /* total length, before hiding */ - hide_before, hide_after; /* hide ranges of messages */ - - /* Current search string, or %NULL */ - char *search; - - /* Are we displaying threaded view? */ - gboolean threaded; - /* do we automatically hide deleted messages? */ - gboolean hidedeleted; - - /* Where the ETree cursor is. */ - int cursor_row; - char *cursor_uid; - - /* Row-selection and seen-marking timers */ - guint idle_id, seen_id; - - /* locks */ - GMutex *hide_lock; /* for any 'hide' info above */ -}; - -typedef struct { - ETreeScrolledClass parent_class; - - /* signals - select a message */ - void (*message_selected) (MessageList *ml, const char *uid); - void (*message_list_built) (MessageList *ml); -} MessageListClass; - -typedef void (*MessageListForeachFunc) (MessageList *message_list, - const char *uid, - gpointer user_data); - -typedef enum { - MESSAGE_LIST_SELECT_NEXT = 1, - MESSAGE_LIST_SELECT_PREVIOUS = -1 -} MessageListSelectDirection; - -GtkType message_list_get_type (void); -GtkWidget *message_list_new (void); -void message_list_set_folder (MessageList *message_list, - CamelFolder *camel_folder, - gboolean outgoing); - -void message_list_foreach (MessageList *message_list, - MessageListForeachFunc callback, - gpointer user_data); - -void message_list_select (MessageList *message_list, - int base_row, - MessageListSelectDirection direction, - guint32 flags, - guint32 mask, - gboolean wraparound); - -void message_list_select_uid (MessageList *message_list, - const char *uid); - -/* info */ -unsigned int message_list_length(MessageList *ml); - -/* hide specific messages */ -void message_list_hide_add(MessageList *ml, const char *expr, unsigned int lower, unsigned int upper); -void message_list_hide_uids(MessageList *ml, GPtrArray *uids); -void message_list_hide_clear(MessageList *ml); - -void message_list_set_threaded(MessageList *ml, gboolean threaded); -void message_list_set_hidedeleted(MessageList *ml, gboolean hidedeleted); -void message_list_set_search(MessageList *ml, const char *search); - -#define MESSAGE_LIST_LOCK(m, l) g_mutex_lock(((MessageList *)m)->l) -#define MESSAGE_LIST_UNLOCK(m, l) g_mutex_unlock(((MessageList *)m)->l) - -#endif /* _MESSAGE_LIST_H_ */ diff --git a/mail/subscribe-dialog.c b/mail/subscribe-dialog.c deleted file mode 100644 index 81792f000a..0000000000 --- a/mail/subscribe-dialog.c +++ /dev/null @@ -1,1657 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* subscribe-dialog.c: Subscribe dialog */ -/* - * Authors: Chris Toshok - * Peter Williams - * - * Copyright 2000 Ximian, Inc. (www.ximian.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include - -#include -#include -#include - -#include -#include -#include - -#include - -#include "evolution-shell-component-utils.h" -#include "mail.h" -#include "mail-tools.h" -#include "mail-ops.h" -#include "mail-mt.h" -#include "mail-folder-cache.h" -#include "camel/camel-exception.h" -#include "camel/camel-store.h" -#include "camel/camel-session.h" -#include "subscribe-dialog.h" - -#include "art/empty.xpm" -#include "art/mark.xpm" - -#define d(x) x - -/* Things to test. - * - Feature - * + How to check that it works. - * - * - Proper stores displayed - * + Skip stores that don't support subscriptions - * + Skip disabled stores - * - Changing subscription status - * + Select single folder, double-click row -> toggled - * + Select multiple folders, press subscribe -> all selected folders end up subscribed - * - (un)Subscribing from/to already (un)subscribed folder - * + Check that no IMAP command is sent - * - Switching views between stores - * + Proper tree shown - * - No crashes when buttons are pressed with "No store" screen - * + obvious - * - Restoring filter settings when view switched - * + Enter search, change view, change back -> filter checked and search entry set - * + Clear search, change view, change back -> "all" checked - * - Cancelling in middle of get_store - * + Enter invalid hostname, open dialog, click Close - * - Cancelling in middle if listing - * + Open large directory, click Close - * - Cancelling in middle of subscription op - * + How to test? - * - Test with both IMAP and NNTP - * + obvious - * - Verify that refresh view works - * + obvious - * - No unnecessary tree rebuilds - * + Show All folders, change filter with empty search -> no tree rebuild - * + Converse - * - No out of date tree - * + Show All Folders, change to filter with a search -> tree rebuild - * - Tree construction logic (mostly IMAP-specific terminology) - * + Tree is created progressively - * + No wasted LIST responses - * + No extraneous LIST commands - * + Specifying "folder names begin with" works - * + Always show folders below IMAP namespace (no escaping the namespace) - * + Don't allow subscription to NoSelect folders - * + IMAP accounts always show INBOX - * - Shell interactions - * + Folders are properly created / delete from folder tree when subscribed / unsubscribed - * + Folders with spaces in names / 8bit chars - * + Toplevel as well as subfolders - * + Mail Folder Cache doesn't complain - * - No ETable wackiness - * + Verify columns cannot be DnD'd - * + Alphabetical order always - * - UI cleanliness - * + Keybindings work - * + Some widget has focus by default - * + Escape / enter work - * + Close button works - */ - -/* FIXME: we should disable/enable the subscribe/unsubscribe buttons as - * appropriate when only a single message is selected. We need a - * mechanism to learn when the selected folder's subscription status - * changes, so when the user double-clicks it (eg) the buttons can - * (de)sensitize appropriately. See Ximian bug #7673. - */ - -/*#define NEED_TOGGLE_SELECTION*/ - -typedef struct _FolderETree FolderETree; -typedef struct _FolderETreeClass FolderETreeClass; - -struct _FolderETree { - ETreeMemory parent; - ETreePath root; - - GHashTable *scan_ops; - GHashTable *subscribe_ops; - - CamelStore *store; - EvolutionStorage *e_storage; - char *service_name; - char *search; -}; - -struct _FolderETreeClass { - ETreeMemoryClass parent; -}; - -static GtkObjectClass *folder_etree_parent_class = NULL; - -typedef struct _FolderETreeExtras FolderETreeExtras; -typedef struct _FolderETreeExtrasClass FolderETreeExtrasClass; - -enum { - FOLDER_COL_SUBSCRIBED, - FOLDER_COL_NAME, - FOLDER_COL_LAST -}; - -struct _FolderETreeExtras { - ETableExtras parent; - GdkPixbuf *toggles[2]; -}; - -struct _FolderETreeExtrasClass { - ETableExtrasClass parent; -}; - -static GtkObjectClass *ftree_extras_parent_class = NULL; - -/* util */ - -static void -recursive_add_folder (EvolutionStorage *storage, const char *path, const char *name, const char *url) -{ - char *parent, *pname, *p; - - p = strrchr (path, '/'); - if (p && p != path) { - parent = g_strndup (path, p - path); - if (!evolution_storage_folder_exists (storage, parent)) { - p = strrchr (parent, '/'); - if (p) - pname = g_strdup (p + 1); - else - pname = g_strdup (""); - recursive_add_folder (storage, parent, pname, ""); - g_free (pname); - } - g_free (parent); - } - - evolution_storage_new_folder (storage, path, name, "mail", url, name, FALSE); - mail_folder_cache_set_update_estorage (url, storage); - mail_folder_cache_note_name (url, name); -} - -/* ** Get one level of folderinfo ****************************************** */ - -typedef void (*SubscribeShortFolderinfoFunc) (CamelStore *store, char *prefix, CamelFolderInfo *info, gpointer data); - -int subscribe_get_short_folderinfo (FolderETree *ftree, const char *prefix, - SubscribeShortFolderinfoFunc func, gpointer user_data); - -struct _get_short_folderinfo_msg { - struct _mail_msg msg; - - char *prefix; - - FolderETree *ftree; - CamelFolderInfo *info; - - SubscribeShortFolderinfoFunc func; - gpointer user_data; -}; - -static char * -get_short_folderinfo_desc (struct _mail_msg *mm, int done) -{ - struct _get_short_folderinfo_msg *m = (struct _get_short_folderinfo_msg *) mm; - char *ret, *name; - - name = camel_service_get_name (CAMEL_SERVICE (m->ftree->store), TRUE); - - if (m->prefix) - ret = g_strdup_printf (_("Scanning folders under %s on \"%s\""), m->prefix, name); - else - ret = g_strdup_printf (_("Scanning root-level folders on \"%s\""), name); - - g_free (name); - return ret; -} - -static void -get_short_folderinfo_get (struct _mail_msg *mm) -{ - struct _get_short_folderinfo_msg *m = (struct _get_short_folderinfo_msg *) mm; - - camel_operation_register (mm->cancel); - m->info = camel_store_get_folder_info (m->ftree->store, m->prefix, CAMEL_STORE_FOLDER_INFO_FAST, &mm->ex); - camel_operation_unregister (mm->cancel); -} - -static void -get_short_folderinfo_got (struct _mail_msg *mm) -{ - struct _get_short_folderinfo_msg *m = (struct _get_short_folderinfo_msg *) mm; - - if (camel_exception_is_set (&mm->ex)) - g_warning ("Error getting folder info from store at %s: %s", - camel_service_get_url (CAMEL_SERVICE (m->ftree->store)), - camel_exception_get_description (&mm->ex)); - - /* 'done' is probably guaranteed to fail, but... */ - - if (m->func) - m->func (m->ftree->store, m->prefix, m->info, m->user_data); -} - -static void -get_short_folderinfo_free (struct _mail_msg *mm) -{ - struct _get_short_folderinfo_msg *m = (struct _get_short_folderinfo_msg *) mm; - - camel_store_free_folder_info (m->ftree->store, m->info); - gtk_object_unref (GTK_OBJECT (m->ftree)); - - g_free (m->prefix); /* may be NULL but that's ok */ -} - -static struct _mail_msg_op get_short_folderinfo_op = { - get_short_folderinfo_desc, - get_short_folderinfo_get, - get_short_folderinfo_got, - get_short_folderinfo_free, -}; - -int -subscribe_get_short_folderinfo (FolderETree *ftree, - const char *prefix, - SubscribeShortFolderinfoFunc func, - gpointer user_data) -{ - struct _get_short_folderinfo_msg *m; - int id; - - m = mail_msg_new (&get_short_folderinfo_op, NULL, sizeof(*m)); - - m->ftree = ftree; - gtk_object_ref (GTK_OBJECT (ftree)); - - if (prefix) - m->prefix = g_strdup (prefix); - else - m->prefix = NULL; - - m->func = func; - m->user_data = user_data; - - id = m->msg.seq; - e_thread_put (mail_thread_queued, (EMsg *)m); - return id; -} - -/* ** Subscribe folder operation **************************************** */ - -typedef void (*SubscribeFolderCallback) (const char *, const char *, gboolean, gboolean, gpointer); - -struct _subscribe_msg { - struct _mail_msg msg; - - CamelStore *store; - gboolean subscribe; - char *full_name; - char *name; - - SubscribeFolderCallback cb; - gpointer cb_data; -}; - -static char * -subscribe_folder_desc (struct _mail_msg *mm, int done) -{ - struct _subscribe_msg *m = (struct _subscribe_msg *) mm; - - if (m->subscribe) - return g_strdup_printf (_("Subscribing to folder \"%s\""), m->name); - else - return g_strdup_printf (_("Unsubscribing to folder \"%s\""), m->name); -} - -static void -subscribe_folder_subscribe (struct _mail_msg *mm) -{ - struct _subscribe_msg *m = (struct _subscribe_msg *) mm; - - if (m->subscribe) - camel_store_subscribe_folder (m->store, m->full_name, &mm->ex); - else - camel_store_unsubscribe_folder (m->store, m->full_name, &mm->ex); -} - -static void -subscribe_folder_subscribed (struct _mail_msg *mm) -{ - struct _subscribe_msg *m = (struct _subscribe_msg *) mm; - - if (m->cb) - (m->cb) (m->full_name, m->name, m->subscribe, - !camel_exception_is_set (&mm->ex), m->cb_data); -} - -static void -subscribe_folder_free (struct _mail_msg *mm) -{ - struct _subscribe_msg *m = (struct _subscribe_msg *) mm; - - g_free (m->name); - g_free (m->full_name); - - camel_object_unref (CAMEL_OBJECT (m->store)); -} - -static struct _mail_msg_op subscribe_folder_op = { - subscribe_folder_desc, - subscribe_folder_subscribe, - subscribe_folder_subscribed, - subscribe_folder_free, -}; - -static int -subscribe_do_subscribe_folder (CamelStore *store, const char *full_name, const char *name, - gboolean subscribe, SubscribeFolderCallback cb, gpointer cb_data) -{ - struct _subscribe_msg *m; - int id; - - g_return_val_if_fail (CAMEL_IS_STORE (store), 0); - g_return_val_if_fail (full_name, 0); - - m = mail_msg_new (&subscribe_folder_op, NULL, sizeof(*m)); - m->store = store; - m->subscribe = subscribe; - m->name = g_strdup (name); - m->full_name = g_strdup (full_name); - m->cb = cb; - m->cb_data = cb_data; - - camel_object_ref (CAMEL_OBJECT (store)); - - id = m->msg.seq; - e_thread_put (mail_thread_queued, (EMsg *)m); - return id; -} - -/* ** FolderETree Extras *************************************************** */ - -static void -fete_destroy (GtkObject *object) -{ - FolderETreeExtras *extras = (FolderETreeExtras *) object; - - gdk_pixbuf_unref (extras->toggles[0]); - gdk_pixbuf_unref (extras->toggles[1]); - - ftree_extras_parent_class->destroy (object); -} - -static void -fete_class_init (GtkObjectClass *object_class) -{ - object_class->destroy = fete_destroy; - - ftree_extras_parent_class = gtk_type_class (E_TABLE_EXTRAS_TYPE); -} - -static void -fete_init (GtkObject *object) -{ - FolderETreeExtras *extras = (FolderETreeExtras *) object; - ECell *cell; - ECell *text_cell; - - /* text column */ - - cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT); - text_cell = cell; - gtk_object_set (GTK_OBJECT (cell), - "bold_column", FOLDER_COL_SUBSCRIBED, - NULL); - e_table_extras_add_cell (E_TABLE_EXTRAS (extras), "cell_text", cell); - - /* toggle column */ - - extras->toggles[0] = gdk_pixbuf_new_from_xpm_data ((const char **)empty_xpm); - extras->toggles[1] = gdk_pixbuf_new_from_xpm_data ((const char **)mark_xpm); - cell = e_cell_toggle_new (0, 2, extras->toggles); - e_table_extras_add_cell (E_TABLE_EXTRAS (extras), "cell_toggle", cell); - - /* tree cell */ - - cell = e_cell_tree_new (NULL, NULL, TRUE, text_cell); - e_table_extras_add_cell (E_TABLE_EXTRAS (extras), "cell_tree", cell); - - /* misc */ - - e_table_extras_add_pixbuf (E_TABLE_EXTRAS (extras), "subscribed-image", extras->toggles[1]); -} - -/* naughty! */ -static -E_MAKE_TYPE (fete, "FolderETreeExtras", FolderETreeExtras, fete_class_init, fete_init, E_TABLE_EXTRAS_TYPE); - -/* ** Global Extras ******************************************************** */ - -static FolderETreeExtras *global_extras = NULL; - -static void -global_extras_destroyed (GtkObject *obj, gpointer user_data) -{ - global_extras = NULL; -} - -static ETableExtras * -subscribe_get_global_extras (void) -{ - if (global_extras == NULL) { - global_extras = gtk_type_new (fete_get_type()); - gtk_object_ref (GTK_OBJECT (global_extras)); - gtk_object_sink (GTK_OBJECT (global_extras)); - gtk_signal_connect (GTK_OBJECT (global_extras), "destroy", - global_extras_destroyed, NULL); - } - - gtk_object_ref (GTK_OBJECT (global_extras)); - return E_TABLE_EXTRAS (global_extras); -} - -/* ** Folder Tree Node ***************************************************** */ - -typedef struct _ftree_node ftree_node; - -struct _ftree_node { - guint8 flags; - char *cache; - int uri_offset; - int full_name_offset; - - /* format: {name}{\0}{uri}{\0}{full_name}{\0} - * (No braces). */ - char data[1]; -}; - -#define FTREE_NODE_GOT_CHILDREN (1 << 0) -#define FTREE_NODE_SUBSCRIBABLE (1 << 1) -#define FTREE_NODE_SUBSCRIBED (1 << 2) -#define FTREE_NODE_ROOT (1 << 3) - -static ftree_node * -ftree_node_new_root (const char *prefix) -{ - ftree_node *node; - size_t size; - - if (prefix == NULL) - prefix = ""; - - size = sizeof (ftree_node) + strlen (prefix) + 1; - - node = g_malloc (size); - node->flags = FTREE_NODE_ROOT; - node->uri_offset = 0; - node->full_name_offset = 1; - node->data[0] = '\0'; - strcpy (node->data + 1, prefix); - - return node; -} - -static ftree_node * -ftree_node_new (CamelStore *store, CamelFolderInfo *fi) -{ - ftree_node *node; - int uri_offset, full_name_offset; - size_t size; - CamelURL *url; - - uri_offset = strlen (fi->name) + 1; - full_name_offset = uri_offset + strlen (fi->url) + 1; - size = full_name_offset + strlen (fi->full_name); - - /* - 1 for sizeof(node.data) but +1 for terminating \0 */ - node = g_malloc (sizeof (*node) + size); - - node->cache = NULL; - - /* Noselect? */ - - url = camel_url_new (fi->url, NULL); - if (camel_url_get_param (url, "noselect")) - node->flags = 0; - else - node->flags = FTREE_NODE_SUBSCRIBABLE; - camel_url_free (url); - - /* subscribed? */ - - if (camel_store_folder_subscribed (store, fi->full_name)) - node->flags |= FTREE_NODE_SUBSCRIBED; - - /* Copy strings */ - - node->uri_offset = uri_offset; - node->full_name_offset = full_name_offset; - - strcpy (node->data, fi->name); - strcpy (node->data + uri_offset, fi->url); - strcpy (node->data + full_name_offset, fi->full_name); - - /* Done */ - - return node; -} - -#define ftree_node_subscribable(node) ( ((ftree_node *) (node))->flags & FTREE_NODE_SUBSCRIBABLE ) -#define ftree_node_subscribed(node) ( ((ftree_node *) (node))->flags & FTREE_NODE_SUBSCRIBED ) -#define ftree_node_get_name(node) ( ((ftree_node *) (node))->data ) -#define ftree_node_get_full_name(node) ( ((ftree_node *) (node))->data + ((ftree_node *) (node))->full_name_offset ) -#define ftree_node_get_uri(node) ( ((ftree_node *) (node))->data + ((ftree_node *) (node))->uri_offset ) - -/* ** Folder Tree Model **************************************************** */ - -/* A subscribe or scan operation */ - -typedef struct _ftree_op_data ftree_op_data; - -struct _ftree_op_data { - FolderETree *ftree; - ETreePath path; - ftree_node *data; - int handle; -}; - - -/* ETreeModel functions */ - -static int -fe_column_count (ETreeModel *etm) -{ - return FOLDER_COL_LAST; -} - -static void * -fe_duplicate_value (ETreeModel *etm, int col, const void *val) -{ - return g_strdup (val); -} - -static void -fe_free_value (ETreeModel *etm, int col, void *val) -{ - g_free (val); -} - -static void* -fe_init_value (ETreeModel *etm, int col) -{ - return g_strdup (""); -} - -static gboolean -fe_value_is_empty (ETreeModel *etm, int col, const void *val) -{ - return !(val && *(char *)val); -} - -static char * -fe_value_to_string (ETreeModel *etm, int col, const void *val) -{ - return g_strdup (val); -} - -static GdkPixbuf * -fe_icon_at (ETreeModel *etree, ETreePath path) -{ - return NULL; /* XXX no icons for now */ -} - -static gpointer -fe_root_value_at (FolderETree *ftree, int col) -{ - switch (col) { - case FOLDER_COL_NAME: - return ftree->service_name; - case FOLDER_COL_SUBSCRIBED: - return GINT_TO_POINTER (0); - default: - printf ("Oh no, unimplemented column %d in subscribe dialog\n", col); - } - - return NULL; -} - -static gpointer -fe_real_value_at (FolderETree *ftree, int col, gpointer data) -{ - switch (col) { - case FOLDER_COL_NAME: - return ftree_node_get_name (data); - case FOLDER_COL_SUBSCRIBED: - if (ftree_node_subscribed (data)) - return GINT_TO_POINTER (1); - return GINT_TO_POINTER (0); - default: - printf ("Oh no, unimplemented column %d in subscribe dialog\n", col); - } - - return NULL; -} - -static void * -fe_value_at (ETreeModel *etree, ETreePath path, int col) -{ - FolderETree *ftree = (FolderETree *) etree; - gpointer node_data; - - if (path == ftree->root) - return fe_root_value_at (ftree, col); - - node_data = e_tree_memory_node_get_data (E_TREE_MEMORY (etree), path); - return fe_real_value_at (ftree, col, node_data); -} - -static void -fe_set_value_at (ETreeModel *etree, ETreePath path, int col, const void *val) -{ - /* nothing */ -} - -static gboolean -fe_return_false (void) -{ - return FALSE; -} - -static gint -fe_sort_folder (ETreeMemory *etmm, ETreePath left, ETreePath right, gpointer user_data) -{ - ftree_node *n_left, *n_right; - - n_left = e_tree_memory_node_get_data (etmm, left); - n_right = e_tree_memory_node_get_data (etmm, right); - - return g_strcasecmp (ftree_node_get_name (n_left), ftree_node_get_name (n_right)); -} - -/* scanning */ - -static void -fe_got_children (CamelStore *store, char *prefix, CamelFolderInfo *info, gpointer data) -{ - ftree_op_data *closure = (ftree_op_data *) data; - - if (!info) /* cancelled */ - return; - - if (!prefix) - prefix = ""; - - for ( ; info; info = info->sibling) { - ETreePath child_path; - ftree_node *node; - - if (strcmp (info->full_name, prefix) == 0) - continue; - - node = ftree_node_new (store, info); - child_path = e_tree_memory_node_insert (E_TREE_MEMORY (closure->ftree), - closure->path, - 0, - node); - e_tree_memory_sort_node (E_TREE_MEMORY (closure->ftree), - closure->path, - fe_sort_folder, - NULL); - } - - if (closure->data) - closure->data->flags |= FTREE_NODE_GOT_CHILDREN; - - g_hash_table_remove (closure->ftree->scan_ops, closure->path); - g_free (closure); -} - -static void -fe_check_for_children (FolderETree *ftree, ETreePath path) -{ - ftree_op_data *closure; - ftree_node *node; - char *prefix; - - node = e_tree_memory_node_get_data (E_TREE_MEMORY (ftree), path); - - /* have we already gotten these children? */ - if (node->flags & FTREE_NODE_GOT_CHILDREN) - return; - - /* or we're loading them right now? */ - if (g_hash_table_lookup (ftree->scan_ops, path)) - return; - - /* figure out our search prefix */ - if (path == ftree->root) - prefix = ftree->search; - else - prefix = ftree_node_get_full_name (node); - - closure = g_new (ftree_op_data, 1); - closure->ftree = ftree; - closure->path = path; - closure->data = node; - closure->handle = -1; - - g_hash_table_insert (ftree->scan_ops, path, closure); - - /* FIXME. Tiny race possiblity I guess. */ - - closure->handle = subscribe_get_short_folderinfo (ftree, prefix, fe_got_children, closure); -} - -static void -fe_create_root_node (FolderETree *ftree) -{ - ftree_node *node; - - node = ftree_node_new_root (ftree->search); - ftree->root = e_tree_memory_node_insert (E_TREE_MEMORY(ftree), NULL, 0, node); - fe_check_for_children (ftree, ftree->root); -} - -static ETreePath -fe_get_first_child (ETreeModel *model, ETreePath path) -{ - ETreePath child_path; - - child_path = E_TREE_MODEL_CLASS (folder_etree_parent_class)->get_first_child (model, path); - if (child_path) - fe_check_for_children ((FolderETree *) model, child_path); - else - fe_check_for_children ((FolderETree *) model, path); - return child_path; -} - -/* subscribing */ - -static char * -fe_node_to_shell_path (ftree_node *node) -{ - char *path = NULL; - int name_len, full_name_len; - - name_len = strlen (ftree_node_get_name (node)); - full_name_len = strlen (ftree_node_get_full_name (node)); - - if (name_len != full_name_len) { - char *full_name; - char *iter; - char sep; - - /* so, we don't know the heirarchy separator. But - * full_name = blahXblahXname, where X = separator - * and name = .... name. So we can determine it. - * (imap_store->dir_sep isn't really private, I guess, - * so we could use that if we had the store. But also - * we don't "know" that it is an IMAP store anyway.) - */ - - full_name = ftree_node_get_full_name (node); - sep = full_name[full_name_len - (name_len + 1)]; - - if (sep != '/') { - path = g_malloc (full_name_len + 2); - path[0] = '/'; - strcpy (path + 1, full_name); - while ((iter = strchr (path, sep)) != NULL) - *iter = '/'; - } - } - - if (!path) - path = g_strdup_printf ("/%s", ftree_node_get_full_name (node)); - - return path; -} - -static void -fe_done_subscribing (const char *full_name, const char *name, gboolean subscribe, gboolean success, gpointer user_data) -{ - ftree_op_data *closure = (ftree_op_data *) user_data; - - if (success) { - char *path; - - path = fe_node_to_shell_path (closure->data); - - if (subscribe) { - closure->data->flags |= FTREE_NODE_SUBSCRIBED; - recursive_add_folder (closure->ftree->e_storage, - path, name, - ftree_node_get_uri (closure->data)); - } else { - closure->data->flags &= ~FTREE_NODE_SUBSCRIBED; - - /* FIXME: recursively remove folder as well? Possible? */ - evolution_storage_removed_folder (closure->ftree->e_storage, path); - } - - g_free (path); - e_tree_model_node_data_changed (E_TREE_MODEL (closure->ftree), closure->path); - } - - g_hash_table_remove (closure->ftree->subscribe_ops, closure->path); - g_free (closure); -} - -/* cleanup */ - -static gboolean -fe_cancel_op_foreach (gpointer key, gpointer value, gpointer user_data) -{ - /*FolderETree *ftree = (FolderETree *) user_data;*/ - ftree_op_data *closure = (ftree_op_data *) value; - - if (closure->handle != -1) - mail_msg_cancel (closure->handle); - else - printf ("aaagh, annoying race condition in fe_cancel_op_foreach.\n"); - - g_free (value); - return TRUE; -} - -static void -fe_kill_current_tree (FolderETree *ftree) -{ - g_hash_table_foreach_remove (ftree->scan_ops, fe_cancel_op_foreach, ftree); - g_assert (g_hash_table_size (ftree->scan_ops) == 0); -} - -static void -fe_destroy (GtkObject *obj) -{ - FolderETree *ftree = (FolderETree *) (obj); - - fe_kill_current_tree (ftree); - - g_hash_table_foreach_remove (ftree->subscribe_ops, fe_cancel_op_foreach, ftree); - - g_hash_table_destroy (ftree->scan_ops); - g_hash_table_destroy (ftree->subscribe_ops); - - camel_object_unref (CAMEL_OBJECT (ftree->store)); - bonobo_object_unref (BONOBO_OBJECT (ftree->e_storage)); - - g_free (ftree->search); - g_free (ftree->service_name); -} - -typedef gboolean (*bool_func_1) (ETreeModel *, ETreePath, int); -typedef gboolean (*bool_func_2) (ETreeModel *); - -static void -folder_etree_class_init (GtkObjectClass *klass) -{ - ETreeModelClass *etree_model_class = E_TREE_MODEL_CLASS (klass); - - folder_etree_parent_class = gtk_type_class (E_TREE_MEMORY_TYPE); - - klass->destroy = fe_destroy; - - etree_model_class->value_at = fe_value_at; - etree_model_class->set_value_at = fe_set_value_at; - etree_model_class->column_count = fe_column_count; - etree_model_class->duplicate_value = fe_duplicate_value; - etree_model_class->free_value = fe_free_value; - etree_model_class->initialize_value = fe_init_value; - etree_model_class->value_is_empty = fe_value_is_empty; - etree_model_class->value_to_string = fe_value_to_string; - etree_model_class->icon_at = fe_icon_at; - etree_model_class->is_editable = (bool_func_1) fe_return_false; - etree_model_class->has_save_id = (bool_func_2) fe_return_false; - etree_model_class->has_get_node_by_id = (bool_func_2) fe_return_false; - etree_model_class->get_first_child = fe_get_first_child; -} - -static void -folder_etree_init (GtkObject *object) -{ - FolderETree *ftree = (FolderETree *) object; - - e_tree_memory_set_node_destroy_func (E_TREE_MEMORY (ftree), (GFunc) g_free, ftree); - - ftree->scan_ops = g_hash_table_new (g_direct_hash, g_direct_equal); - ftree->subscribe_ops = g_hash_table_new (g_direct_hash, g_direct_equal); - - ftree->search = g_strdup (""); -} - -static FolderETree * -folder_etree_construct (FolderETree *ftree, - CamelStore *store) -{ - e_tree_memory_construct (E_TREE_MEMORY (ftree)); - - ftree->store = store; - camel_object_ref (CAMEL_OBJECT (store)); - - ftree->service_name = camel_service_get_name (CAMEL_SERVICE (store), FALSE); - - ftree->e_storage = mail_lookup_storage (store); /* this gives us a ref */ - - fe_create_root_node (ftree); - - return ftree; -} - -static -E_MAKE_TYPE (folder_etree, "FolderETree", FolderETree, folder_etree_class_init, folder_etree_init, E_TREE_MEMORY_TYPE); - -/* public */ - -static FolderETree * -folder_etree_new (CamelStore *store) -{ - FolderETree *ftree; - - ftree = gtk_type_new (folder_etree_get_type()); - ftree = folder_etree_construct (ftree, store); - return ftree; -} - -static void -folder_etree_clear_tree (FolderETree *ftree) -{ - e_tree_memory_freeze (E_TREE_MEMORY (ftree)); - e_tree_memory_node_remove (E_TREE_MEMORY (ftree), ftree->root); - fe_create_root_node (ftree); - e_tree_memory_thaw (E_TREE_MEMORY (ftree)); -} - -static void -folder_etree_set_search (FolderETree *ftree, const char *search) -{ - if (!strcmp (search, ftree->search)) - return; - - g_free (ftree->search); - ftree->search = g_strdup (search); - - folder_etree_clear_tree (ftree); -} - - -static int -folder_etree_path_set_subscription (FolderETree *ftree, ETreePath path, gboolean subscribe) -{ - ftree_op_data *closure; - ftree_node *node; - - /* already in progress? */ - - if (g_hash_table_lookup (ftree->subscribe_ops, path)) - return 0; - - /* noselect? */ - - node = e_tree_memory_node_get_data (E_TREE_MEMORY (ftree), path); - - if (!ftree_node_subscribable (node)) - return -1; - - /* noop? */ - - /* uh, this should be a not XOR or something */ - if ((ftree_node_subscribed (node) && subscribe) || - (!ftree_node_subscribed (node) && !subscribe)) - return 0; - - closure = g_new (ftree_op_data, 1); - closure->ftree = ftree; - closure->path = path; - closure->data = node; - closure->handle = -1; - - g_hash_table_insert (ftree->subscribe_ops, path, closure); - - closure->handle = subscribe_do_subscribe_folder (ftree->store, - ftree_node_get_full_name (node), - ftree_node_get_name (node), - subscribe, - fe_done_subscribing, - closure); - return 0; -} - -static int -folder_etree_path_toggle_subscription (FolderETree *ftree, ETreePath path) -{ - ftree_node *node = e_tree_memory_node_get_data (E_TREE_MEMORY (ftree), path); - - if (ftree_node_subscribed (node)) - return folder_etree_path_set_subscription (ftree, path, FALSE); - else - return folder_etree_path_set_subscription (ftree, path, TRUE); -} - -/* ** StoreData ************************************************************ */ - -typedef struct _StoreData StoreData; - -typedef void (*StoreDataStoreFunc) (StoreData *, CamelStore *, gpointer); - -struct _StoreData { - int refcount; - char *uri; - - FolderETree *ftree; - CamelStore *store; - - int request_id; - - GtkWidget *widget; - StoreDataStoreFunc store_func; - gpointer store_data; -}; - -static StoreData * -store_data_new (const char *uri) -{ - StoreData *sd; - - sd = g_new0 (StoreData, 1); - sd->refcount = 1; - sd->uri = g_strdup (uri); - - return sd; -} - -static void -store_data_free (StoreData *sd) -{ - if (sd->request_id) - mail_msg_cancel (sd->request_id); - - if (sd->widget) - gtk_object_unref (GTK_OBJECT (sd->widget)); - - if (sd->ftree) - gtk_object_unref (GTK_OBJECT (sd->ftree)); - - if (sd->store) - camel_object_unref (CAMEL_OBJECT (sd->store)); - - g_free (sd->uri); - g_free (sd); -} - -static void -store_data_ref (StoreData *sd) -{ - sd->refcount++; -} - -static void -store_data_unref (StoreData *sd) -{ - if (sd->refcount <= 1) { - store_data_free (sd); - } else { - sd->refcount--; - } -} - -static void -sd_got_store (char *uri, CamelStore *store, gpointer user_data) -{ - StoreData *sd = (StoreData *) user_data; - - sd->store = store; - - if (store) /* we can have exceptions getting the store... server is down, eg */ - camel_object_ref (CAMEL_OBJECT (sd->store)); - - /* uh, so we might have a problem if this operation is cancelled. Unsure. */ - sd->request_id = 0; - - if (sd->store_func) - (sd->store_func) (sd, sd->store, sd->store_data); - - store_data_unref (sd); -} - -static void -store_data_async_get_store (StoreData *sd, StoreDataStoreFunc func, gpointer user_data) -{ - if (sd->request_id) { - printf ("Already loading store, nooping\n"); - return; - } - - if (sd->store) { - /* um, is this the best behavior? */ - func (sd, sd->store, user_data); - return; - } - - sd->store_func = func; - sd->store_data = user_data; - store_data_ref (sd); - sd->request_id = mail_get_store (sd->uri, sd_got_store, sd); -} - -static void -store_data_cancel_get_store (StoreData *sd) -{ - g_return_if_fail (sd->request_id); - - mail_msg_cancel (sd->request_id); - sd->request_id = 0; -} - -static void -sd_toggle_cb (ETree *tree, int row, ETreePath path, int col, GdkEvent *event, gpointer user_data) -{ - StoreData *sd = (StoreData *) user_data; - - folder_etree_path_toggle_subscription (sd->ftree, path); -} - -static GtkWidget * -store_data_get_widget (StoreData *sd) -{ - GtkWidget *tree; - - if (!sd->store) { - d(printf ("store data can't get widget before getting store.\n")); - return NULL; - } - - if (sd->widget) - return sd->widget; - - sd->ftree = folder_etree_new (sd->store); - - /* You annoy me, etree! */ - tree = gtk_widget_new (E_TREE_SCROLLED_TYPE, - "hadjustment", NULL, - "vadjustment", NULL, - NULL); - - tree = (GtkWidget *) e_tree_scrolled_construct_from_spec_file (E_TREE_SCROLLED (tree), - E_TREE_MODEL (sd->ftree), - subscribe_get_global_extras (), - EVOLUTION_ETSPECDIR "/subscribe-dialog.etspec", - NULL); - e_tree_root_node_set_visible (e_tree_scrolled_get_tree(E_TREE_SCROLLED(tree)), TRUE); - gtk_signal_connect (GTK_OBJECT (e_tree_scrolled_get_tree(E_TREE_SCROLLED (tree))), - "double_click", GTK_SIGNAL_FUNC (sd_toggle_cb), sd); - - gtk_object_unref (GTK_OBJECT (global_extras)); - - sd->widget = tree; - gtk_object_ref (GTK_OBJECT (sd->widget)); - - return sd->widget; -} - -typedef struct _selection_closure { - StoreData *sd; - enum { SET, CLEAR, TOGGLE } mode; -} selection_closure; - -static void -sd_subscribe_folder_foreach (int model_row, gpointer closure) -{ - selection_closure *sc = (selection_closure *) closure; - StoreData *sd = sc->sd; - ETree *tree = e_tree_scrolled_get_tree(E_TREE_SCROLLED(sd->widget)); - ETreePath path = e_tree_node_at_row (tree, model_row); - - /* ignore results */ - switch (sc->mode) { - case SET: - folder_etree_path_set_subscription (sd->ftree, path, TRUE); - break; - case CLEAR: - folder_etree_path_set_subscription (sd->ftree, path, FALSE); - break; - case TOGGLE: - folder_etree_path_toggle_subscription (sd->ftree, path); - break; - } -} - -static void -store_data_selection_set_subscription (StoreData *sd, gboolean subscribe) -{ - selection_closure sc; - ETree *tree; - - sc.sd = sd; - if (subscribe) - sc.mode = SET; - else - sc.mode = CLEAR; - - tree = e_tree_scrolled_get_tree (E_TREE_SCROLLED (sd->widget)); - e_tree_selected_row_foreach (tree, sd_subscribe_folder_foreach, &sc); -} - -#ifdef NEED_TOGGLE_SELECTION -static void -store_data_selection_toggle_subscription (StoreData *sd) -{ - selection_closure sc; - ETree *tree; - - sc.sd = sd; - sc.mode = TOGGLE; - - tree = e_tree_scrolled_get_tree (E_TREE_SCROLLED (sd->widget)); - e_tree_selected_row_foreach (tree, sd_subscribe_folder_foreach, &sc); -} -#endif - -static gboolean -store_data_mid_request (StoreData *sd) -{ - return (gboolean) sd->request_id; -} - -/* ** yaay, SubscribeDialog ******************************************************* */ - -#define PARENT_TYPE (gtk_object_get_type ()) - -#ifdef JUST_FOR_TRANSLATORS -static char *str = N_("Folder"); -#endif - -#define STORE_DATA_KEY "store-data" - -struct _SubscribeDialogPrivate { - GladeXML *xml; - GList *store_list; - - StoreData *current_store; - GtkWidget *current_widget; - - GtkWidget *default_widget; - GtkWidget *none_item; - GtkWidget *search_entry; - GtkWidget *hbox; - GtkWidget *filter_radio, *all_radio; - GtkWidget *sub_button, *unsub_button, *refresh_button; -}; - -static GtkObjectClass *subscribe_dialog_parent_class; - -static void -sc_refresh_pressed (GtkWidget *widget, gpointer user_data) -{ - SubscribeDialog *sc = SUBSCRIBE_DIALOG (user_data); - - if (sc->priv->current_store) - folder_etree_clear_tree (sc->priv->current_store->ftree); -} - -static void -sc_search_activated (GtkWidget *widget, gpointer user_data) -{ - SubscribeDialog *sc = SUBSCRIBE_DIALOG (user_data); - StoreData *store = sc->priv->current_store; - char *search; - - if (!store) - return; - - search = e_utf8_gtk_entry_get_text (GTK_ENTRY (widget)); - folder_etree_set_search (store->ftree, search); -} - -static void -sc_subscribe_pressed (GtkWidget *widget, gpointer user_data) -{ - SubscribeDialog *sc = SUBSCRIBE_DIALOG (user_data); - StoreData *store = sc->priv->current_store; - - if (!store) - return; - - store_data_selection_set_subscription (store, TRUE); -} - -static void -sc_unsubscribe_pressed (GtkWidget *widget, gpointer user_data) -{ - SubscribeDialog *sc = SUBSCRIBE_DIALOG (user_data); - StoreData *store = sc->priv->current_store; - - if (!store) - return; - - store_data_selection_set_subscription (store, FALSE); -} - -static void -sc_all_toggled (GtkWidget *widget, gpointer user_data) -{ - SubscribeDialog *sc = SUBSCRIBE_DIALOG (user_data); - StoreData *store = sc->priv->current_store; - - if (!store) - return; - - if (GTK_TOGGLE_BUTTON (widget)->active) { - gtk_widget_set_sensitive (sc->priv->search_entry, FALSE); - folder_etree_set_search (store->ftree, ""); - } -} - -static void -sc_filter_toggled (GtkWidget *widget, gpointer user_data) -{ - SubscribeDialog *sc = SUBSCRIBE_DIALOG (user_data); - StoreData *store = sc->priv->current_store; - - if (!store) - return; - - if (GTK_TOGGLE_BUTTON (widget)->active) { - gtk_widget_set_sensitive (sc->priv->search_entry, TRUE); - sc_search_activated (sc->priv->search_entry, sc); - } -} - -static void -populate_store_foreach (MailConfigService *service, SubscribeDialog *sc) -{ - StoreData *sd; - - if (service->url == NULL || service->enabled == FALSE) - return; - - sd = store_data_new (service->url); - sc->priv->store_list = g_list_prepend (sc->priv->store_list, sd); -} - -static void -kill_default_view (SubscribeDialog *sc) -{ - gtk_widget_hide (sc->priv->none_item); - - /* the entry will be set sensitive when one of the - * radio buttons is activated, if necessary. */ - - gtk_widget_set_sensitive (sc->priv->all_radio, TRUE); - gtk_widget_set_sensitive (sc->priv->filter_radio, TRUE); - gtk_widget_set_sensitive (sc->priv->sub_button, TRUE); - gtk_widget_set_sensitive (sc->priv->unsub_button, TRUE); - gtk_widget_set_sensitive (sc->priv->refresh_button, TRUE); -} - -static void -sc_selection_changed (GtkObject *obj, gpointer user_data) -{ - SubscribeDialog *sc = SUBSCRIBE_DIALOG (user_data); - gboolean sensitive; - - if (e_selection_model_selected_count (E_SELECTION_MODEL (obj))) - sensitive = TRUE; - else - sensitive = FALSE; - - gtk_widget_set_sensitive (sc->priv->sub_button, sensitive); - gtk_widget_set_sensitive (sc->priv->unsub_button, sensitive); -} - -static void -menu_item_selected (GtkMenuItem *item, gpointer user_data) -{ - SubscribeDialog *sc = SUBSCRIBE_DIALOG (user_data); - StoreData *sd = gtk_object_get_data (GTK_OBJECT (item), STORE_DATA_KEY); - - g_return_if_fail (sd); - - if (sd->widget == NULL) { - GtkWidget *widget; - ESelectionModel *esm; - ETree *tree; - - widget = store_data_get_widget (sd); - gtk_box_pack_start (GTK_BOX (sc->priv->hbox), widget, TRUE, TRUE, 0); - - tree = e_tree_scrolled_get_tree (E_TREE_SCROLLED (widget)); - esm = e_tree_get_selection_model (tree); - gtk_signal_connect (GTK_OBJECT (esm), "selection_changed", sc_selection_changed, sc); - sc_selection_changed ((GtkObject *)esm, sc); - } - - if (sc->priv->current_widget == sc->priv->default_widget) - kill_default_view (sc); - - gtk_widget_hide (sc->priv->current_widget); - gtk_widget_show (sd->widget); - sc->priv->current_widget = sd->widget; - sc->priv->current_store = sd; - - if (*sd->ftree->search) { - e_utf8_gtk_entry_set_text (GTK_ENTRY (sc->priv->search_entry), sd->ftree->search); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sc->priv->filter_radio), TRUE); - } else { - e_utf8_gtk_entry_set_text (GTK_ENTRY (sc->priv->search_entry), ""); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sc->priv->all_radio), TRUE); - } -} - -static void -dummy_item_selected (GtkMenuItem *item, gpointer user_data) -{ - SubscribeDialog *sc = SUBSCRIBE_DIALOG (user_data); - - gtk_widget_hide (sc->priv->current_widget); - gtk_widget_show (sc->priv->default_widget); - sc->priv->current_widget = sc->priv->default_widget; - sc->priv->current_store = NULL; - - e_utf8_gtk_entry_set_text (GTK_ENTRY (sc->priv->search_entry), ""); -} - -/* wonderful */ - -static void -got_sd_store (StoreData *sd, CamelStore *store, gpointer data) -{ - if (store && camel_store_supports_subscriptions (store)) - gtk_widget_show (GTK_WIDGET (data)); -} - -/* FIXME: if there aren't any stores that are subscribable, the option - * menu will only have the "No server selected" item and the user will - * be confused. */ - -static void -populate_store_list (SubscribeDialog *sc) -{ - const GSList *news; - GSList *sources; - GList *iter; - GtkWidget *menu; - GtkWidget *omenu; - - sources = mail_config_get_sources (); - g_slist_foreach (sources, (GFunc) populate_store_foreach, sc); - g_slist_free (sources); - - news = mail_config_get_news (); - g_slist_foreach ((GSList *) news, (GFunc) populate_store_foreach, sc); - - menu = gtk_menu_new (); - - for (iter = sc->priv->store_list; iter; iter = iter->next) { - GtkWidget *item; - CamelURL *url; - char *string; - - url = camel_url_new (((StoreData *) iter->data)->uri, NULL); - string = camel_url_to_string (url, CAMEL_URL_HIDE_ALL); - camel_url_free (url); - item = gtk_menu_item_new_with_label (string); - store_data_async_get_store (iter->data, got_sd_store, item); - gtk_object_set_data (GTK_OBJECT (item), STORE_DATA_KEY, iter->data); - gtk_signal_connect (GTK_OBJECT (item), "activate", menu_item_selected, sc); - g_free (string); - - gtk_menu_prepend (GTK_MENU (menu), item); - } - - sc->priv->none_item = gtk_menu_item_new_with_label (_("No server has been selected")); - gtk_signal_connect (GTK_OBJECT (sc->priv->none_item), "activate", dummy_item_selected, sc); - gtk_widget_show (sc->priv->none_item); - gtk_menu_prepend (GTK_MENU (menu), sc->priv->none_item); - - gtk_widget_show (menu); - - omenu = glade_xml_get_widget (sc->priv->xml, "store_menu"); - gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu); -} - -static void -subscribe_dialog_destroy (GtkObject *object) -{ - SubscribeDialog *sc; - GList *iter; - - sc = SUBSCRIBE_DIALOG (object); - - for (iter = sc->priv->store_list; iter; iter = iter->next) { - StoreData *data = iter->data; - - if (store_data_mid_request (data)) - store_data_cancel_get_store (data); - - data->store_func = NULL; - - store_data_unref (data); - } - - g_list_free (sc->priv->store_list); - - gtk_object_unref (GTK_OBJECT (sc->priv->xml)); - - g_free (sc->priv); - - subscribe_dialog_parent_class->destroy (object); -} - -static void -subscribe_dialog_class_init (GtkObjectClass *object_class) -{ - object_class->destroy = subscribe_dialog_destroy; - - subscribe_dialog_parent_class = gtk_type_class (PARENT_TYPE); -} - -static void -subscribe_dialog_init (GtkObject *object) -{ - SubscribeDialog *sc = SUBSCRIBE_DIALOG (object); - - sc->priv = g_new0 (SubscribeDialogPrivate, 1); -} - -static GtkWidget * -sc_create_default_widget (void) -{ - GtkWidget *label; - GtkWidget *viewport; - - label = gtk_label_new (_("Please select a server.")); - gtk_widget_show (label); - - viewport = gtk_viewport_new (NULL, NULL); - gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport), GTK_SHADOW_IN); - gtk_container_add (GTK_CONTAINER (viewport), label); - - return viewport; -} - -static void -subscribe_dialog_construct (GtkObject *object) -{ - SubscribeDialog *sc = SUBSCRIBE_DIALOG (object); - - /* Load the XML */ - - sc->priv->xml = glade_xml_new (EVOLUTION_GLADEDIR "/subscribe-dialog.glade", NULL); - - sc->app = glade_xml_get_widget (sc->priv->xml, "Manage Subscriptions"); - sc->priv->hbox = glade_xml_get_widget (sc->priv->xml, "tree_box"); - sc->priv->search_entry = glade_xml_get_widget (sc->priv->xml, "search_entry"); - sc->priv->filter_radio = glade_xml_get_widget (sc->priv->xml, "filter_radio"); - sc->priv->all_radio = glade_xml_get_widget (sc->priv->xml, "all_radio"); - sc->priv->sub_button = glade_xml_get_widget (sc->priv->xml, "subscribe_button"); - sc->priv->unsub_button = glade_xml_get_widget (sc->priv->xml, "unsubscribe_button"); - sc->priv->refresh_button = glade_xml_get_widget (sc->priv->xml, "refresh_button"); - - /* create default view */ - - sc->priv->default_widget = sc_create_default_widget(); - sc->priv->current_widget = sc->priv->default_widget; - gtk_box_pack_start (GTK_BOX (sc->priv->hbox), sc->priv->default_widget, TRUE, TRUE, 0); - gtk_widget_show (sc->priv->default_widget); - - gtk_widget_set_sensitive (sc->priv->all_radio, FALSE); - gtk_widget_set_sensitive (sc->priv->filter_radio, FALSE); - gtk_widget_set_sensitive (sc->priv->search_entry, FALSE); - gtk_widget_set_sensitive (sc->priv->sub_button, FALSE); - gtk_widget_set_sensitive (sc->priv->unsub_button, FALSE); - gtk_widget_set_sensitive (sc->priv->refresh_button, FALSE); - - /* hook up some signals */ - - gtk_signal_connect (GTK_OBJECT (sc->priv->search_entry), "activate", sc_search_activated, sc); - gtk_signal_connect (GTK_OBJECT (sc->priv->sub_button), "clicked", sc_subscribe_pressed, sc); - gtk_signal_connect (GTK_OBJECT (sc->priv->unsub_button), "clicked", sc_unsubscribe_pressed, sc); - gtk_signal_connect (GTK_OBJECT (sc->priv->refresh_button), "clicked", sc_refresh_pressed, sc); - gtk_signal_connect (GTK_OBJECT (sc->priv->all_radio), "toggled", sc_all_toggled, sc); - gtk_signal_connect (GTK_OBJECT (sc->priv->filter_radio), "toggled", sc_filter_toggled, sc); - - /* Get the list of stores */ - - populate_store_list (sc); -} - -GtkObject * -subscribe_dialog_new (void) -{ - SubscribeDialog *subscribe_dialog; - - subscribe_dialog = gtk_type_new (SUBSCRIBE_DIALOG_TYPE); - subscribe_dialog_construct (GTK_OBJECT (subscribe_dialog)); - - return GTK_OBJECT (subscribe_dialog); -} - -E_MAKE_TYPE (subscribe_dialog, "SubscribeDialog", SubscribeDialog, subscribe_dialog_class_init, subscribe_dialog_init, PARENT_TYPE); - -void -subscribe_dialog_run_and_close (SubscribeDialog *dialog) -{ - gnome_dialog_run_and_close (GNOME_DIALOG (dialog->app)); -} diff --git a/mail/subscribe-dialog.etspec b/mail/subscribe-dialog.etspec deleted file mode 100644 index 1f5decbb36..0000000000 --- a/mail/subscribe-dialog.etspec +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/mail/subscribe-dialog.glade b/mail/subscribe-dialog.glade deleted file mode 100644 index 472491b3e8..0000000000 --- a/mail/subscribe-dialog.glade +++ /dev/null @@ -1,326 +0,0 @@ - - - - - Evolution - evolution - - src - pixmaps - C - True - True - subscribe-dialog.glade.h - - - - GnomeDialog - Manage Subscriptions - Manage Subscriptions - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - 484 - 423 - False - True - False - False - False - - - GtkVBox - GnomeDialog:vbox - dialog-vbox2 - False - 8 - - 4 - True - True - - - - GtkHButtonBox - GnomeDialog:action_area - dialog-action_area2 - GTK_BUTTONBOX_END - 8 - 85 - 27 - 7 - 0 - - 0 - False - True - GTK_PACK_END - - - - GtkButton - button9 - True - True - GNOME_STOCK_BUTTON_CLOSE - - - - - GtkVBox - vbox2 - 3 - False - 3 - - 0 - True - True - - - - GtkHBox - hbox1 - False - 0 - - 0 - False - True - - - - GtkLabel - label1 - - GTK_JUSTIFY_CENTER - False - 0.5 - 0.5 - 0 - 0 - store_menu - - 0 - False - False - - - - - GtkOptionMenu - store_menu - True - - 0 - - 0 - False - False - - - - - - GtkHBox - tree_box - False - 0 - - 0 - True - True - - - - Placeholder - - - - GtkVBox - vbox3 - 3 - False - 3 - - 0 - False - False - GTK_PACK_END - - - - GtkLabel - label2 - - GTK_JUSTIFY_CENTER - False - 0.5 - 0.5 - 0 - 0 - - 0 - False - False - - - - - GtkVButtonBox - vbuttonbox2 - GTK_BUTTONBOX_SPREAD - 0 - 85 - 27 - 7 - 0 - - 0 - False - False - - - - GtkButton - subscribe_button - True - True - - GTK_RELIEF_NORMAL - - - - GtkButton - unsubscribe_button - True - True - - GTK_RELIEF_NORMAL - - - - - GtkHSeparator - hseparator1 - - 14 - False - False - - - - - GtkVButtonBox - vbuttonbox3 - GTK_BUTTONBOX_START - 10 - 85 - 27 - 7 - 0 - - 0 - False - False - - - - GtkButton - refresh_button - True - True - - GTK_RELIEF_NORMAL - - - - - - - GtkFrame - frame1 - - 0 - GTK_SHADOW_ETCHED_IN - - 0 - False - True - - - - GtkHBox - hbox3 - 3 - False - 3 - - - GtkRadioButton - all_radio - True - - False - True - view_type - - 0 - False - False - - - - - GtkRadioButton - filter_radio - True - - False - True - view_type - - 0 - False - False - - - - - GtkEntry - search_entry - True - True - True - 0 - - - 0 - True - True - - - - - GtkHButtonBox - hbuttonbox1 - GTK_BUTTONBOX_DEFAULT_STYLE - 30 - 85 - 27 - 7 - 0 - - 0 - False - False - - - - - - - - - diff --git a/mail/subscribe-dialog.h b/mail/subscribe-dialog.h deleted file mode 100644 index 10fa5d9f44..0000000000 --- a/mail/subscribe-dialog.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: Chris Toshok - * Peter Williams - * - * Copyright 2000 Ximian, Inc. (www.ximian.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - - -#ifndef _SUBSCRIBE_DIALOG_H_ -#define _SUBSCRIBE_DIALOG_H_ - -#include -#include -#include -#include -#include -#include "shell/evolution-storage.h" -#include "mail-types.h" -#include "camel/camel-store.h" - -#define SUBSCRIBE_DIALOG_TYPE (subscribe_dialog_get_type ()) -#define SUBSCRIBE_DIALOG(o) (GTK_CHECK_CAST ((o), SUBSCRIBE_DIALOG_TYPE, SubscribeDialog)) -#define SUBSCRIBE_DIALOG_CLASS(k) (GTK_CHECK_CLASS_CAST((k), SUBSCRIBE_DIALOG_TYPE, SubscribeDialogClass)) -#define IS_SUBSCRIBE_DIALOG(o) (GTK_CHECK_TYPE ((o), SUBSCRIBE_DIALOG_TYPE)) -#define IS_SUBSCRIBE_DIALOG_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), SUBSCRIBE_DIALOG_TYPE)) - -typedef struct _SubscribeDialogPrivate SubscribeDialogPrivate; -struct _SubscribeDialog { - GtkObject parent; - - GtkWidget *app; - SubscribeDialogPrivate *priv; -}; - - -typedef struct { - GtkObjectClass parent_class; -} SubscribeDialogClass; - -GtkType subscribe_dialog_get_type (void); -GtkObject *subscribe_dialog_new (void); -void subscribe_dialog_run_and_close (SubscribeDialog *dialog); - -#endif /* _SUBSCRIBE_DIALOG_H_ */ -- cgit v1.2.3