diff options
author | Not Zed <NotZed@Ximian.com> | 2004-02-06 14:35:50 +0800 |
---|---|---|
committer | Michael Zucci <zucchi@src.gnome.org> | 2004-02-06 14:35:50 +0800 |
commit | 2f07bc4e16c3bc41c75a8ddb17d29a902e0f3b1b (patch) | |
tree | 4173cb4ea18780cbe613995f89c7b50d39ac1399 | |
parent | 734a27187b7c4495f377c8533f9affdcf860dbbc (diff) | |
download | gsoc2013-evolution-2f07bc4e16c3bc41c75a8ddb17d29a902e0f3b1b.tar.gz gsoc2013-evolution-2f07bc4e16c3bc41c75a8ddb17d29a902e0f3b1b.tar.zst gsoc2013-evolution-2f07bc4e16c3bc41c75a8ddb17d29a902e0f3b1b.zip |
** See bug #53258.
2004-02-06 Not Zed <NotZed@Ximian.com>
** See bug #53258.
* em-format-html-display.c (efhd_find_handler): force any bonobo
handler types to always be inline, even attachments.
* em-format.c (em_format_is_inline): use handler flags for special
cases, removing all hard-coded types.
* em-format.h (EMFormatHandler): add a flags field, so far a flag
to set default inline viewing of the content.
2004-02-06 Not Zed <NotZed@Ximian.com>
* em-folder-properties.c: include string.h to kill warning.
** See bug #53627.
* em-folder-view.c (emfv_popup_mark_junk): changed to work like
delete does, jumping to the next message if required, and marking
things immediately, then queuing up the junk marking job if
required.
* mail-ops.c (mail_mark_junk): ugh, this stuff totally can't go
accessing messagelist from another thread!!!! Changed so this
code only does the junk reporting, not setting flags. UGH! It
should be doing this implictly on the folder when you set the
flags, or at least when you sync the folder!!! Changed ot use the
queued thread.
* message-list.c (find_next_undeleted): changed to find
next-unhidden, i.e. junk as well as deleted, if we're in
hide-deleted mode.
(build_tree): always call find_next_undeleted if we have a cursor.
(build_flat): same.
svn path=/trunk/; revision=24644
-rw-r--r-- | mail/ChangeLog | 37 | ||||
-rw-r--r-- | mail/em-folder-properties.c | 4 | ||||
-rw-r--r-- | mail/em-folder-view.c | 46 | ||||
-rw-r--r-- | mail/em-format-html-display.c | 4 | ||||
-rw-r--r-- | mail/em-format-html.c | 2 | ||||
-rw-r--r-- | mail/em-format.c | 35 | ||||
-rw-r--r-- | mail/em-format.h | 8 | ||||
-rw-r--r-- | mail/mail-ops.c | 59 | ||||
-rw-r--r-- | mail/mail-ops.h | 4 | ||||
-rw-r--r-- | mail/message-list.c | 27 |
10 files changed, 145 insertions, 81 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index 8a0ba470ef..637faa5f30 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,40 @@ +2004-02-06 Not Zed <NotZed@Ximian.com> + + ** See bug #53258. + + * em-format-html-display.c (efhd_find_handler): force any bonobo + handler types to always be inline, even attachments. + + * em-format.c (em_format_is_inline): use handler flags for special + cases, removing all hard-coded types. + + * em-format.h (EMFormatHandler): add a flags field, so far a flag + to set default inline viewing of the content. + +2004-02-06 Not Zed <NotZed@Ximian.com> + + * em-folder-properties.c: include string.h to kill warning. + + ** See bug #53627. + + * em-folder-view.c (emfv_popup_mark_junk): changed to work like + delete does, jumping to the next message if required, and marking + things immediately, then queuing up the junk marking job if + required. + + * mail-ops.c (mail_mark_junk): ugh, this stuff totally can't go + accessing messagelist from another thread!!!! Changed so this + code only does the junk reporting, not setting flags. UGH! It + should be doing this implictly on the folder when you set the + flags, or at least when you sync the folder!!! Changed ot use the + queued thread. + + * message-list.c (find_next_undeleted): changed to find + next-unhidden, i.e. junk as well as deleted, if we're in + hide-deleted mode. + (build_tree): always call find_next_undeleted if we have a cursor. + (build_flat): same. + 2004-02-05 Rodney Dawes <dobey@ximian.com> * em-message-browser.c (emmb_list_message_selected): Grab focus on diff --git a/mail/em-folder-properties.c b/mail/em-folder-properties.c index 005b153ef3..cd4e169976 100644 --- a/mail/em-folder-properties.c +++ b/mail/em-folder-properties.c @@ -23,6 +23,8 @@ #include <config.h> #endif +#include <string.h> + #include <gtk/gtkbox.h> #include <gtk/gtkcheckbutton.h> #include <gtk/gtkdialog.h> @@ -260,7 +262,7 @@ em_folder_properties_show(GtkWindow *parent, CamelFolder *folder, const char *ur if (!strncmp(uri, "vfolder:", 8)) vfolder_edit_rule(uri); else if (folder == NULL) - mail_get_folder (uri, 0, emfp_dialog_got_folder, NULL, mail_thread_new); + mail_get_folder(uri, 0, emfp_dialog_got_folder, NULL, mail_thread_new); else emfp_dialog_got_folder((char *)uri, folder, NULL); } diff --git a/mail/em-folder-view.c b/mail/em-folder-view.c index 562a859662..1125f9629c 100644 --- a/mail/em-folder-view.c +++ b/mail/em-folder-view.c @@ -558,13 +558,47 @@ emfv_popup_mark_unimportant(GtkWidget *w, EMFolderView *emfv) static void emfv_popup_mark_junk (GtkWidget *w, EMFolderView *emfv) { - mail_mark_junk (emfv->folder, emfv->list, TRUE); + GPtrArray *uids, *uidsjunk; + int i; + + if (emfv->folder == NULL) + return; + + uidsjunk = g_ptr_array_new(); + uids = message_list_get_selected(emfv->list); + camel_folder_freeze(emfv->folder); + + for (i=0; i<uids->len; i++) { + char *uid = uids->pdata[i]; + + if (camel_folder_set_message_flags(emfv->folder, uid, + CAMEL_MESSAGE_DELETED|CAMEL_MESSAGE_JUNK, + CAMEL_MESSAGE_JUNK)) { + g_ptr_array_add(uidsjunk, g_strdup(uid)); + } + } + + camel_folder_thaw(emfv->folder); + + if (uids->len == 1) + message_list_select(emfv->list, MESSAGE_LIST_SELECT_NEXT, 0, 0, FALSE); + + message_list_free_uids(emfv->list, uids); + + if (uidsjunk->len) + mail_mark_junk(emfv->folder, uidsjunk, TRUE); + else + em_utils_uids_free(uidsjunk); } static void emfv_popup_mark_nojunk (GtkWidget *w, EMFolderView *emfv) { - mail_mark_junk (emfv->folder, emfv->list, FALSE); + GPtrArray *uids; + + uids = message_list_get_selected(emfv->list); + em_folder_view_mark_selected(emfv, CAMEL_MESSAGE_JUNK, 0); + mail_mark_junk(emfv->folder, uids, FALSE); } static void @@ -572,13 +606,13 @@ emfv_popup_delete(GtkWidget *w, EMFolderView *emfv) { GPtrArray *uids; - uids = message_list_get_selected (emfv->list); - em_folder_view_mark_selected (emfv, CAMEL_MESSAGE_SEEN|CAMEL_MESSAGE_DELETED, CAMEL_MESSAGE_SEEN|CAMEL_MESSAGE_DELETED); + uids = message_list_get_selected(emfv->list); + em_folder_view_mark_selected(emfv, CAMEL_MESSAGE_SEEN|CAMEL_MESSAGE_DELETED, CAMEL_MESSAGE_SEEN|CAMEL_MESSAGE_DELETED); if (uids->len == 1) - message_list_select (emfv->list, MESSAGE_LIST_SELECT_NEXT, 0, 0, FALSE); + message_list_select(emfv->list, MESSAGE_LIST_SELECT_NEXT, 0, 0, FALSE); - em_utils_uids_free (uids); + em_utils_uids_free(uids); } static void diff --git a/mail/em-format-html-display.c b/mail/em-format-html-display.c index 04a741fc79..e00ed9161a 100644 --- a/mail/em-format-html-display.c +++ b/mail/em-format-html-display.c @@ -20,7 +20,6 @@ * */ - #ifdef HAVE_CONFIG_H #include <config.h> #endif @@ -912,6 +911,7 @@ static const EMFormatHandler *efhd_find_handler(EMFormat *emf, const char *mime_ h->mime_type = g_strdup(mime_type); h->handler = efhd_bonobo_unknown; + h->flags = EM_FORMAT_HANDLER_INLINE_DISPOSITION; g_hash_table_insert(efhd_bonobo_handlers, h->mime_type, h); handle = h; @@ -1461,7 +1461,7 @@ efhd_format_attachment(EMFormat *emf, CamelStream *stream, CamelMimePart *part, info = (struct _attach_puri *)em_format_add_puri(emf, sizeof(*info), classid, part, efhd_attachment_frame); em_format_html_add_pobject((EMFormatHTML *)emf, sizeof(EMFormatHTMLPObject), classid, part, efhd_attachment_button); info->handle = handle; - info->shown = em_format_is_inline(emf, info->puri.part) && handle != NULL; + info->shown = em_format_is_inline(emf, info->puri.part, handle); info->snoop_mime_type = emf->snoop_mime_type; camel_stream_write_string(stream, diff --git a/mail/em-format-html.c b/mail/em-format-html.c index 2a99a7085b..75adb279e2 100644 --- a/mail/em-format-html.c +++ b/mail/em-format-html.c @@ -1658,7 +1658,7 @@ efh_format_attachment(EMFormat *emf, CamelStream *stream, CamelMimePart *part, c camel_stream_write_string(stream, "</font></td></tr><tr></table>"); - if (handle && em_format_is_inline(emf, part)) + if (handle && em_format_is_inline(emf, part, handle)) handle->handler(emf, stream, part, handle); } diff --git a/mail/em-format.c b/mail/em-format.c index d0b5786492..816b2f7c25 100644 --- a/mail/em-format.c +++ b/mail/em-format.c @@ -821,39 +821,38 @@ int em_format_is_attachment(EMFormat *emf, CamelMimePart *part) * em_format_is_inline: * @emf: * @part: + * @handle: handler for this part * * Returns true if the part should be displayed inline. Any part with - * a Content-Disposition of inline, or any message type is displayed - * inline. + * a Content-Disposition of inline, or if the @handle has a default + * inline set, will be shown inline. * - * ::set_inline() called on the same part will override any calculated + * :set_inline() called on the same part will override any calculated * value. * * Return value: **/ -int em_format_is_inline(EMFormat *emf, CamelMimePart *part) +int em_format_is_inline(EMFormat *emf, CamelMimePart *part, const EMFormatHandler *handle) { void *dummy, *override; const char *tmp; - CamelContentType *ct; + + if (handle == NULL) + return FALSE; if (g_hash_table_lookup_extended(emf->inline_table, part, &dummy, &override)) return GPOINTER_TO_INT(override); - ct = camel_mime_part_get_content_type(part); - - /* TODO: make this depend on libnss supported */ - /* For some reason rfc2633 says we always add this as an attachment, which - stuffs us up since we don't want to treat it that way at all ... */ - if (camel_content_type_is(ct, "application", "x-pkcs7-mime")) + /* some types need to override the disposition, e.g. application/x-pkcs7-mime */ + if (handle->flags & EM_FORMAT_HANDLER_INLINE_DISPOSITION) return TRUE; tmp = camel_mime_part_get_disposition(part); if (tmp) return g_ascii_strcasecmp(tmp, "inline") == 0; - /* messages are always inline? */ - return camel_content_type_is (ct, "message", "*"); + /* otherwise, use the default for this handler type */ + return (handle->flags & EM_FORMAT_HANDLER_INLINE) != 0; } /** @@ -1348,7 +1347,7 @@ emf_message_rfc822(EMFormat *emf, CamelStream *stream, CamelMimePart *part, cons static EMFormatHandler type_builtin_table[] = { #ifdef HAVE_NSS - { "application/x-pkcs7-mime", (EMFormatFunc)emf_application_xpkcs7mime }, + { "application/x-pkcs7-mime", (EMFormatFunc)emf_application_xpkcs7mime, EM_FORMAT_HANDLER_INLINE_DISPOSITION }, #endif { "multipart/alternative", emf_multipart_alternative }, { "multipart/appledouble", emf_multipart_appledouble }, @@ -1357,13 +1356,13 @@ static EMFormatHandler type_builtin_table[] = { { "multipart/signed", emf_multipart_signed }, { "multipart/related", emf_multipart_related }, { "multipart/*", emf_multipart_mixed }, - { "message/rfc822", emf_message_rfc822 }, - { "message/news", emf_message_rfc822 }, - { "message/*", emf_message_rfc822 }, + { "message/rfc822", emf_message_rfc822, EM_FORMAT_HANDLER_INLINE }, + { "message/news", emf_message_rfc822, EM_FORMAT_HANDLER_INLINE }, + { "message/*", emf_message_rfc822, EM_FORMAT_HANDLER_INLINE }, /* Insert brokenly-named parts here */ #ifdef HAVE_NSS - { "application/pkcs7-mime", (EMFormatFunc)emf_application_xpkcs7mime }, + { "application/pkcs7-mime", (EMFormatFunc)emf_application_xpkcs7mime, EM_FORMAT_HANDLER_INLINE_DISPOSITION }, #endif }; diff --git a/mail/em-format.h b/mail/em-format.h index 323c28865a..4b3956f4c0 100644 --- a/mail/em-format.h +++ b/mail/em-format.h @@ -57,9 +57,15 @@ typedef enum _em_format_mode_t { struct _EMFormatHandler { char *mime_type; EMFormatFunc handler; + guint32 flags; GList *applications; /* gnome vfs short-list of applications, do we care? */ }; +/* inline by default */ +#define EM_FORMAT_HANDLER_INLINE (1<<0) +/* inline by default, and override content-disposition always */ +#define EM_FORMAT_HANDLER_INLINE_DISPOSITION (1<<1) + typedef struct _EMFormatPURI EMFormatPURI; typedef void (*EMFormatPURIFunc)(EMFormat *md, struct _CamelStream *stream, EMFormatPURI *puri); @@ -184,7 +190,7 @@ void em_format_add_header(EMFormat *emf, const char *name, guint32 flags); Or maybe it should live with sub-classes? */ int em_format_is_attachment(EMFormat *emf, struct _CamelMimePart *part); -int em_format_is_inline(EMFormat *emf, struct _CamelMimePart *part); +int em_format_is_inline(EMFormat *emf, struct _CamelMimePart *part, const EMFormatHandler *handle); /* FIXME: not sure about this api */ void em_format_set_inline(EMFormat *emf, struct _CamelMimePart *part, int state); char *em_format_describe_part(struct _CamelMimePart *part, const char *mimetype); diff --git a/mail/mail-ops.c b/mail/mail-ops.c index 26dde00460..9d7a273772 100644 --- a/mail/mail-ops.c +++ b/mail/mail-ops.c @@ -2406,7 +2406,7 @@ struct _mark_junk_mail_msg { struct _mail_msg msg; CamelFolder *folder; - MessageList *list; + GPtrArray *uids; gboolean junk; }; @@ -2420,45 +2420,34 @@ static void mark_junk_mark (struct _mail_msg *mm) { struct _mark_junk_mail_msg *m = (struct _mark_junk_mail_msg *) mm; - CamelJunkPlugin *csp = NULL; - GPtrArray *uids; + CamelJunkPlugin *csp = ((CamelService *)m->folder->parent_store)->session->junk_plugin; gboolean commit_reports = FALSE; + void (*report)(CamelJunkPlugin *, CamelMimeMessage *); int i; - if (m->folder == NULL) + if (csp == NULL) return; - - uids = message_list_get_selected (m->list); - camel_folder_freeze (m->folder); - for (i=0; i<uids->len; i++) { - guint32 flags; + /* FIXME: This should probably be implictly handled by the + folder when you apply the junk bit, e.g. at sync time. */ - flags = camel_folder_get_message_flags (m->folder, uids->pdata[i]); - if (((flags & CAMEL_MESSAGE_JUNK) == CAMEL_MESSAGE_JUNK) != m->junk) { - CamelMimeMessage *msg = camel_folder_get_message (m->folder, uids->pdata[i], NULL); + if (m->junk) + report = camel_junk_plugin_report_junk; + else + report = camel_junk_plugin_report_notjunk; - if (msg) { - csp = CAMEL_SERVICE (m->folder->parent_store)->session->junk_plugin; - if (m->junk) - camel_junk_plugin_report_junk (csp, msg); - else - camel_junk_plugin_report_notjunk (csp, msg); + for (i=0; i<m->uids->len; i++) { + CamelMimeMessage *msg = camel_folder_get_message(m->folder, m->uids->pdata[i], NULL); - commit_reports = TRUE; - camel_object_unref (msg); - } + if (msg) { + report(csp, msg); + commit_reports = TRUE; + camel_object_unref(msg); } - camel_folder_set_message_flags(m->folder, uids->pdata[i], - CAMEL_MESSAGE_JUNK | (m->junk ? CAMEL_MESSAGE_DELETED : 0), - m->junk ? CAMEL_MESSAGE_JUNK : 0); } if (commit_reports) - camel_junk_plugin_commit_reports (csp); - - message_list_free_uids(m->list, uids); - camel_folder_thaw(m->folder); + camel_junk_plugin_commit_reports(csp); } static void @@ -2471,8 +2460,8 @@ mark_junk_free (struct _mail_msg *mm) { struct _mark_junk_mail_msg *m = (struct _mark_junk_mail_msg *)mm; - if (m->folder) - camel_object_unref (m->folder); + camel_object_unref(m->folder); + em_utils_uids_free(m->uids); } static struct _mail_msg_op mark_junk_op = { @@ -2483,15 +2472,15 @@ static struct _mail_msg_op mark_junk_op = { }; void -mail_mark_junk (CamelFolder *folder, MessageList *list, gboolean junk) +mail_mark_junk(CamelFolder *folder, GPtrArray *uids, gboolean junk) { struct _mark_junk_mail_msg *m; - m = mail_msg_new (&mark_junk_op, NULL, sizeof (*m)); + m = mail_msg_new(&mark_junk_op, NULL, sizeof (*m)); m->folder = folder; - camel_object_ref (folder); - m->list = list; + camel_object_ref(folder); + m->uids = uids; m->junk = junk; - e_thread_put (mail_thread_new, (EMsg *) m); + e_thread_put(mail_thread_queued, (EMsg *) m); } diff --git a/mail/mail-ops.h b/mail/mail-ops.h index a2863df424..8c1c3aa4d5 100644 --- a/mail/mail-ops.h +++ b/mail/mail-ops.h @@ -36,8 +36,6 @@ extern "C" { #include "camel/camel-mime-message.h" #include "camel/camel-operation.h" -#include "message-list.h" - #include "e-util/e-msgport.h" #include "e-util/e-account.h" @@ -160,7 +158,7 @@ int mail_store_set_offline(CamelStore *store, gboolean offline, /* filter driver execute shell command async callback */ void mail_execute_shell_command (CamelFilterDriver *driver, int argc, char **argv, void *data); -void mail_mark_junk (CamelFolder *folder, MessageList *list, gboolean junk); +void mail_mark_junk(CamelFolder *folder, GPtrArray *uids, int junk); #ifdef __cplusplus } diff --git a/mail/message-list.c b/mail/message-list.c index 17364a43a6..10274044a7 100644 --- a/mail/message-list.c +++ b/mail/message-list.c @@ -1892,13 +1892,18 @@ find_next_undeleted (MessageList *ml) int vrow; ETree *et = ml->tree; CamelMessageInfo *info; - + guint32 check; + node = g_hash_table_lookup (ml->uid_nodemap, ml->cursor_uid); if (node == NULL) return NULL; - + + check = CAMEL_MESSAGE_JUNK; + if (ml->hidedeleted) + check |= CAMEL_MESSAGE_DELETED; + info = get_message_info (ml, node); - if (info && (info->flags & CAMEL_MESSAGE_DELETED) == 0) { + if (info && (info->flags & check) == 0) { return NULL; } @@ -1915,7 +1920,7 @@ find_next_undeleted (MessageList *ml) node = e_tree_node_at_row (et, vrow); info = get_message_info (ml, node); - if (info && (info->flags & CAMEL_MESSAGE_DELETED) == 0) { + if (info && (info->flags & check) == 0) { return g_strdup (camel_message_info_uid (info)); } vrow ++; @@ -1957,11 +1962,8 @@ build_tree (MessageList *ml, CamelFolderThread *thread, CamelFolderChangeInfo *c 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); - } - } + if (ml->cursor_uid) + saveuid = find_next_undeleted(ml); #define BROKEN_ETREE /* avoid some broken code in etree(?) by not using the incremental update */ @@ -2274,11 +2276,8 @@ build_flat (MessageList *ml, GPtrArray *summary, CamelFolderChangeInfo *changes) gettimeofday(&start, NULL); #endif - if (ml->cursor_uid) { - if (ml->hidedeleted) { - saveuid = find_next_undeleted(ml); - } - } + if (ml->cursor_uid) + saveuid = find_next_undeleted(ml); #ifndef BROKEN_ETREE if (changes) { |