diff options
Diffstat (limited to 'lisp/vm-message.el')
-rwxr-xr-x | lisp/vm-message.el | 613 |
1 files changed, 613 insertions, 0 deletions
diff --git a/lisp/vm-message.el b/lisp/vm-message.el new file mode 100755 index 0000000..143154d --- /dev/null +++ b/lisp/vm-message.el @@ -0,0 +1,613 @@ +;;; vm-message.el --- Macros and functions dealing with accessing VM +;; message struct fields +;; +;; This file is part of VM +;; +;; Copyright (C) 1989-1997 Kyle E. Jones +;; Copyright (C) 2003-2006 Robert Widhopf-Fenk +;; +;; 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., +;; 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +;;; Code: + +(provide 'vm-message) + +(declare-function vm-mime-encode-words-in-string "vm-mime" (string)) +(declare-function vm-reencode-mime-encoded-words-in-string + "vm-mime" (string)) +(declare-function vm-reencode-mime-encoded-words-in-tokenized-summary + "vm-mime" (summary)) +(declare-function vm-mark-for-summary-update + "vm-folder" (m &optional dont-kill-cache)) +(declare-function vm-stuff-virtual-message-data + "vm-folder" (message)) +(declare-function vm-reorder-message-headers + "vm-folder" (message &optional keep-list discard-regexp)) +(declare-function vm-mark-folder-modified-p + "vm-folder" (buffer)) +(declare-function vm-clear-modification-flag-undos + "vm-undo" ()) +(declare-function vm-build-threads + "vm-undo" (message-list)) +(declare-function vm-unthread-message + "vm-thread" (message &key message-changing)) +(declare-function vm-present-current-message + "vm-page" ()) +(declare-function vm-zip-vectors "vm-misc" (v1 v2)) +(declare-function vm-zip-lists "vm-misc.el" (list1 list2) t) + + +;; current message +(defsubst vm-current-message () + "Returns the currently selected message in the VM folder. It +works in all VM buffers." + (with-current-buffer (or vm-mail-buffer (current-buffer)) + (car vm-message-pointer))) + +;; message struct +(defconst vm-location-data-vector-length 6) +(defconst vm-message-fields + [:location-data :softdata :attributes :cached-data :mirror-data]) +(defsubst vm-location-data-of (message) (aref message 0)) +(defsubst vm-softdata-of (message) (aref message 1)) +(defsubst vm-attributes-of (message) (aref message 2)) +(defsubst vm-cached-data-of (message) (aref message 3)) +(defsubst vm-mirror-data-of (message) (aref message 4)) +(defsubst vm-set-location-data-of (message vdata) (aset message 0 vdata)) +(defsubst vm-set-softdata-of (message data) (aset message 1 data)) +(defsubst vm-set-attributes-of (message attrs) (aset message 2 attrs)) +(defsubst vm-set-cached-data-of (message cache) (aset message 3 cache)) +(defsubst vm-set-mirror-data-of (message data) (aset message 4 data)) + +;; data that is always shared with virtual folders +(defconst vm-location-data-fields + [:start :headers :vheaders :text :text-end :end]) +;; where message begins starting at the message separator in the folder +(defsubst vm-start-of (message) + (aref (aref message 0) 0)) +;; where headers start (From_ line) +(defsubst vm-headers-of (message) + (aref (aref message 0) 1)) +;; where visible headers start +(defun vm-vheaders-of (message) + (or (aref (aref message 0) 2) + (progn (vm-reorder-message-headers message) + (aref (aref message 0) 2)))) +;; where text section starts +(defsubst vm-text-of (message) + (or (aref (aref message 0) 3) + (progn (vm-find-and-set-text-of message) + (aref (aref message 0) 3)))) +;; where text portion of message ends +(defsubst vm-text-end-of (message) + (aref (aref message 0) 4)) +;; where message ends +(defsubst vm-end-of (message) + (aref (aref message 0) 5)) + +;; soft data vector +(defconst vm-softdata-vector-length 23) +(defconst vm-softdata-fields + [:number :padded-number :mark :su-start :su-end :real-message-sym + :reverse-link-sym :message-type :message-id-number :buffer + :thread-indentation :thread-list + :babyl-frob-flag :saved-virtual-attributes + :saved-virtual-mirror-data :virtual-summary + :mime-layout :mime-encoded-header-flag + :su-summary-mouse-track-overlay :message-access-method + :thread-subtree :mirrored-message-sym :thread-indentation-offset]) +(defsubst vm-number-of (message) + (aref (aref message 1) 0)) +(defsubst vm-padded-number-of (message) + (aref (aref message 1) 1)) +(defsubst vm-mark-of (message) + (aref (aref message 1) 2)) +;; start of summary line +(defsubst vm-su-start-of (message) + (aref (aref message 1) 3)) +;; end of summary line +(defsubst vm-su-end-of (message) + (aref (aref message 1) 4)) +;; symbol whose value is the real message. +(defsubst vm-real-message-sym-of (message) + (aref (aref message 1) 5)) +;; real message +(defsubst vm-real-message-of (message) + (symbol-value (aref (aref message 1) 5))) +;; link to previous message in the message list +(defsubst vm-reverse-link-of (message) + (symbol-value (aref (aref message 1) 6))) +;; message type +(defsubst vm-message-type-of (message) + (aref (aref message 1) 7)) +;; number that uniquely identifies each message +;; this is for the set handling stuff +(defsubst vm-message-id-number-of (message) + (aref (aref message 1) 8)) +;; folder buffer of this message +(defsubst vm-buffer-of (message) + (aref (aref message 1) 9)) +;; cache thread indentation value +(defsubst vm-thread-indentation-of (message) + (aref (aref message 1) 10)) +;; list of symbols from vm-thread-obarray that give this message's lineage +(defsubst vm-thread-list-of (message) + (aref (aref message 1) 11)) +;; babyl header frob flag (0 or 1 at beginning of message) +(defsubst vm-babyl-frob-flag-of (message) + (aref (aref message 1) 12)) +;; saved attributes, if message was switched from unmirrored to mirrored +(defsubst vm-saved-virtual-attributes-of (message) + (aref (aref message 1) 13)) +;; saved mirror data, if message was switched from unmirrored to mirrored +(defsubst vm-saved-virtual-mirror-data-of (message) + (aref (aref message 1) 14)) +;; summary for unmirrored virtual message +(defsubst vm-virtual-summary-of (message) + (aref (aref message 1) 15)) +;; MIME layout information; types, ids, positions, etc. of all MIME entities +(defsubst vm-mime-layout-of (message) + (aref (aref message 1) 16)) +(defsubst vm-mime-encoded-header-flag-of (message) + (aref (aref message 1) 17)) +(defsubst vm-su-summary-mouse-track-overlay-of (message) + (aref (aref message 1) 18)) +(defsubst vm-message-access-method-of (message) + (aref (aref message 1) 19)) +(defsubst vm-thread-subtree-of (message) + (aref (aref message 1) 20)) +(defsubst vm-mirrored-message-sym-of (message) + (aref (aref message 1) 21)) +(defsubst vm-mirrored-message-of (message) + (symbol-value (aref (aref message 1) 21))) +(defsubst vm-thread-indentation-offset-of (message) + (aref (aref message 1) 22)) + +;; message attribute vector +(defconst vm-attributes-vector-length 16) +(defconst vm-attributes-fields + [:new-flag :unread-flag :deleted-flag :filed-flag :replied-flag + :written-flag :forwarded-flag :edited-flag + :redistributed-flag + :flagged-flag :folded-flag :watched-flag :ignored-flag + :read-receipt-flag :read-receipt-sent-flag :attachments-flag]) +(defsubst vm-new-flag (message) (aref (aref message 2) 0)) +(defsubst vm-unread-flag (message) (aref (aref message 2) 1)) +(defsubst vm-deleted-flag (message) (aref (aref message 2) 2)) +(defsubst vm-filed-flag (message) (aref (aref message 2) 3)) +(defsubst vm-replied-flag (message) (aref (aref message 2) 4)) +(defsubst vm-written-flag (message) (aref (aref message 2) 5)) +(defsubst vm-forwarded-flag (message) (aref (aref message 2) 6)) +(defsubst vm-edited-flag (message) (aref (aref message 2) 7)) +(defsubst vm-redistributed-flag (message) (aref (aref message 2) 8)) +(defsubst vm-flagged-flag (message) (aref (aref message 2) 9)) +(defsubst vm-folded-flag (message) (aref (aref message 2) 10)) +(defsubst vm-watched-flag (message) (aref (aref message 2) 11)) +(defsubst vm-ignored-flag (message) (aref (aref message 2) 12)) +(defsubst vm-read-receipt-flag (message) (aref (aref message 2) 13)) +(defsubst vm-read-receipt-sent-flag (message) (aref (aref message 2) 14)) +(defsubst vm-attachments-flag (message) (aref (aref message 2) 15)) + +;; message cached data +(defconst vm-cached-data-vector-length 26) +(defconst vm-cached-data-fields + [:byte-count :weekday :monthday :month :year :hour :zone + :full-name :from :message-id :line-count :subject + :vheaders-regexp :to :to-names :month-number + :sortable-datestring :sortable-subject + :summary :parent :references + :body-to-be-discarded + :body-to-be-retrieved + :uid :imap-uid-validity :spam-score]) +;; message size in bytes (as a string) +(defsubst vm-byte-count-of (message) (aref (aref message 3) 0)) +;; weekday sent +(defsubst vm-weekday-of (message) (aref (aref message 3) 1)) +;; month day +(defsubst vm-monthday-of (message) (aref (aref message 3) 2)) +;; month sent +(defsubst vm-month-of (message) (aref (aref message 3) 3)) +;; year sent +(defsubst vm-year-of (message) (aref (aref message 3) 4)) +;; hour sent +(defsubst vm-hour-of (message) (aref (aref message 3) 5)) +;; timezone +(defsubst vm-zone-of (message) (aref (aref message 3) 6)) +;; message author's full name (Full-Name: or gouged from From:) +(defsubst vm-full-name-of (message) (aref (aref message 3) 7)) +;; message author address (gouged from From:) +(defsubst vm-from-of (message) (aref (aref message 3) 8)) +;; message ID (Message-Id:) +(defsubst vm-message-id-of (message) (aref (aref message 3) 9)) +;; number of lines in message (as a string) +(defsubst vm-line-count-of (message) (aref (aref message 3) 10)) +;; message subject (Subject:) +(defsubst vm-subject-of (message) (aref (aref message 3) 11)) +;; Regexp that can be used to find the start of the already ordered headers. +(defsubst vm-vheaders-regexp-of (message) + (aref (aref message 3) 12)) +;; Addresses of recipients in a comma separated list +(defsubst vm-to-of (message) (aref (aref message 3) 13)) +;; Full names of recipients in a comma separated list. Addresses if +;; full names not available. +(defsubst vm-to-names-of (message) (aref (aref message 3) 14)) +;; numeric month sent +(defsubst vm-month-number-of (message) (aref (aref message 3) 15)) +;; sortable date string (used for easy sorting, naturally) +(defsubst vm-sortable-datestring-of (message) + (aref (aref message 3) 16)) +;; sortable subject, re: garbage removed +(defsubst vm-sortable-subject-of (message) + (aref (aref message 3) 17)) +;; tokenized summary entry +(defsubst vm-summary-of (message) + (aref (aref message 3) 18)) +;; parent of this message, as determined by threading +(defsubst vm-parent-of (message) + (aref (aref message 3) 19)) +;; message IDs parsed from References header +(defsubst vm-references-of (message) + (aref (aref message 3) 20)) +;; have we retrieved the headers of this message? +;; only valid for remote folder access methods +;; USR: changed the name to vm-headers-to-be-retrieved-of because all the +;; VM folders in the world already have nil's written in this field. +;; USR: changed it again to vm-body-to-be-discarded-of to allow for +;; fetched messages to be discarded before save. 2010-06-08 +(defsubst vm-headers-to-be-retrieved-of (message) + nil) +(defsubst vm-body-to-be-discarded-of (message) + (aref (aref message 3) 21)) +;; have we retrieved the body of this message? +;; only valid for remote folder access methods +;; USR: changed the name to vm-body-to-be-retrieved-of because all the +;; VM folders in the world already have nil's written in this field. +(defsubst vm-body-to-be-retrieved-of (message) + (aref (aref message 3) 22)) +(defsubst vm-body-retrieved-of (message) + (null (aref (aref message 3) 22))) +;; pop UIDL value for message +(defsubst vm-pop-uidl-of (message) + (aref (aref message 3) 23)) +;; imap UID value for message (shares same slot as pop-uidl-of) +(defsubst vm-imap-uid-of (message) + (aref (aref message 3) 23)) +;; imap UIDVALIDITY value for message +(defsubst vm-imap-uid-validity-of (message) + (aref (aref message 3) 24)) +(defsubst vm-spam-score-of (message) + (aref (aref message 3) 25)) + +;; extra data shared by virtual messages if vm-virtual-mirror is non-nil +(defconst vm-mirror-data-vector-length 6) +(defconst vm-mirror-data-fields + [:edit-buffer :virtual-messages-sym :stuff-flag :labels + :label-string :attribute-modflag]) +;; if message is being edited, this is the buffer being used. +(defsubst vm-edit-buffer-of (message) (aref (aref message 4) 0)) +;; list of virtual messages mirroring the underlying real message +(defsubst vm-virtual-messages-of (message) + (symbol-value (aref (aref message 4) 1))) +;; nil if all attribute changes have been stuffed into the folder buffer +(defsubst vm-stuff-flag-of (message) (aref (aref message 4) 2)) +;; list of labels attached to this message +(defsubst vm-labels-of (message) (aref (aref message 4) 3)) +;; comma list of labels +(defsubst vm-label-string-of (message) (aref (aref message 4) 4)) +;; attribute modification flag for this message +;; non-nil if attributes need to be saved +(defsubst vm-attribute-modflag-of (message) (aref (aref message 4) 5)) + +(defsubst vm-set-start-of (message start) + (aset (aref message 0) 0 start)) +(defsubst vm-set-headers-of (message h) + (aset (aref message 0) 1 h)) +(defsubst vm-set-vheaders-of (message vh) + (aset (aref message 0) 2 vh)) +(defsubst vm-set-text-of (message text) + (aset (aref message 0) 3 text)) +(defsubst vm-set-text-end-of (message text) + (aset (aref message 0) 4 text)) +(defsubst vm-set-end-of (message end) + (aset (aref message 0) 5 end)) +(defsubst vm-set-number-of (message n) + (aset (aref message 1) 0 n)) +(defsubst vm-set-padded-number-of (message n) + (aset (aref message 1) 1 n)) +(defsubst vm-set-mark-of (message val) + (aset (aref message 1) 2 val)) +(defsubst vm-set-su-start-of (message pos) + (aset (aref message 1) 3 pos)) +(defsubst vm-set-su-end-of (message pos) + (aset (aref message 1) 4 pos)) +(defsubst vm-set-real-message-sym-of (message sym) + (aset (aref message 1) 5 sym)) +(defsubst vm-set-reverse-link-of (message link) + (set (aref (aref message 1) 6) link)) +(defsubst vm-set-reverse-link-sym-of (message sym) + (aset (aref message 1) 6 sym)) +(defsubst vm-set-message-type-of (message type) + (aset (aref message 1) 7 type)) +(defsubst vm-set-message-id-number-of (message number) + (aset (aref message 1) 8 number)) +(defsubst vm-set-buffer-of (message buffer) + (aset (aref message 1) 9 buffer)) +(defsubst vm-set-thread-indentation-of (message val) + (aset (aref message 1) 10 val)) +(defsubst vm-set-thread-list-of (message list) + (aset (aref message 1) 11 list)) +(defsubst vm-set-babyl-frob-flag-of (message flag) + (aset (aref message 1) 12 flag)) +(defsubst vm-set-saved-virtual-attributes-of (message attrs) + (aset (aref message 1) 13 attrs)) +(defsubst vm-set-saved-virtual-mirror-data-of (message data) + (aset (aref message 1) 14 data)) +(defsubst vm-set-virtual-summary-of (message summ) + (aset (aref message 1) 15 summ)) +(defsubst vm-set-mime-layout-of (message layout) + (aset (aref message 1) 16 layout)) +(defsubst vm-set-mime-encoded-header-flag-of (message flag) + (aset (aref message 1) 17 flag)) +(defsubst vm-set-su-summary-mouse-track-overlay-of (message overlay) + (aset (aref message 1) 18 overlay)) +(defsubst vm-set-message-access-method-of (message method) + (aset (aref message 1) 19 method)) +(defsubst vm-set-thread-subtree-of (message list) + (aset (aref message 1) 20 list)) +(defsubst vm-set-mirrored-message-sym-of (message sym) + (aset (aref message 1) 21 sym)) +(defsubst vm-set-thread-indentation-offset-of (message offset) + (aset (aref message 1) 22 offset)) + +;; The other routines in attributes group are part of the undo system. +(defun vm-set-edited-flag-of (message flag) + (aset (aref message 2) 7 flag) + (vm-mark-for-summary-update message) + (if (eq vm-flush-interval t) + (vm-stuff-virtual-message-data message) + (vm-set-stuff-flag-of message t)) + (unless (buffer-modified-p) + (vm-mark-folder-modified-p (current-buffer))) + (vm-clear-modification-flag-undos)) +(defsubst vm-set-byte-count-of (message count) + (aset (aref message 3) 0 count)) +(defsubst vm-set-weekday-of (message val) + (aset (aref message 3) 1 val)) +(defsubst vm-set-monthday-of (message val) + (aset (aref message 3) 2 val)) +(defsubst vm-set-month-of (message val) + (aset (aref message 3) 3 val)) +(defsubst vm-set-year-of (message val) + (aset (aref message 3) 4 val)) +(defsubst vm-set-hour-of (message val) + (aset (aref message 3) 5 val)) +(defsubst vm-set-zone-of (message val) + (aset (aref message 3) 6 val)) +(defsubst vm-set-full-name-of (message author) + (aset (aref message 3) 7 author)) +(defsubst vm-set-from-of (message author) + (aset (aref message 3) 8 author)) +(defsubst vm-set-message-id-of (message id) + (aset (aref message 3) 9 id)) +(defsubst vm-set-line-count-of (message count) + (aset (aref message 3) 10 count)) +(defsubst vm-set-subject-of (message subject) + (aset (aref message 3) 11 subject)) +(defsubst vm-set-vheaders-regexp-of (message regexp) + (aset (aref message 3) 12 regexp)) +(defsubst vm-set-to-of (message recips) + (aset (aref message 3) 13 recips)) +(defsubst vm-set-to-names-of (message recips) + (aset (aref message 3) 14 recips)) +(defsubst vm-set-month-number-of (message val) + (aset (aref message 3) 15 val)) +(defsubst vm-set-sortable-datestring-of (message val) + (aset (aref message 3) 16 val)) +(defsubst vm-set-sortable-subject-of (message val) + (aset (aref message 3) 17 val)) +(defsubst vm-set-summary-of (message val) + (aset (aref message 3) 18 val)) +(defsubst vm-set-parent-of (message val) + (aset (aref message 3) 19 val)) +(defsubst vm-set-references-of (message val) + (aset (aref message 3) 20 val)) +(defsubst vm-set-headers-to-be-retrieved-of (message val) + nil) +(defsubst vm-set-body-to-be-discarded-of (message val) + (aset (aref message 3) 21 val)) +(defsubst vm-set-body-to-be-retrieved-of (message val) + (aset (aref message 3) 22 val)) +(defsubst vm-set-pop-uidl-of (message val) + (aset (aref message 3) 23 val)) +(defsubst vm-set-imap-uid-of (message val) + (aset (aref message 3) 23 val)) +(defsubst vm-set-imap-uid-validity-of (message val) + (aset (aref message 3) 24 val)) +(defsubst vm-set-spam-score-of (message val) + (aset (aref message 3) 25 val)) +(defsubst vm-set-edit-buffer-of (message buf) + (aset (aref message 4) 0 buf)) +(defsubst vm-set-virtual-messages-of (message list) + (set (aref (aref message 4) 1) list)) +(defsubst vm-set-virtual-messages-sym-of (message sym) + (aset (aref message 4) 1 sym)) +(defsubst vm-set-stuff-flag-of (message val) + (aset (aref message 4) 2 val)) +(defsubst vm-set-labels-of (message labels) + (aset (aref message 4) 3 labels)) +(defsubst vm-set-label-string-of (message string) + (aset (aref message 4) 4 string)) +(defsubst vm-set-attribute-modflag-of (message flag) + (aset (aref message 4) 5 flag)) + +(defun vm-mime-encode-words-in-cache-vector (vector) + (let ((new-vector (make-vector vm-cached-data-vector-length nil))) + ;; Encode the fields of the original cache-vector as necessary. + ;; Some of the fields have been mime-decoded with text properties. + ;; And, some haven't. + ;; This is a mess. + ;; Others probably don't need any mime-encoding, but we encode + ;; them anyway for safety. + + ;; byte-count + (aset new-vector 0 (aref vector 0)) + ;; weekday + (aset new-vector 1 (vm-mime-encode-words-in-string (aref vector 1))) + ;; monthday + (aset new-vector 2 (vm-mime-encode-words-in-string (aref vector 2))) + ;; month + (aset new-vector 3 (vm-mime-encode-words-in-string (aref vector 3))) + ;; year + (aset new-vector 4 (vm-mime-encode-words-in-string (aref vector 4))) + ;; hour + (aset new-vector 5 (vm-mime-encode-words-in-string (aref vector 5))) + ;; zone + (aset new-vector 6 (vm-mime-encode-words-in-string (aref vector 6))) + ;; full-name + (aset new-vector 7 + (vm-reencode-mime-encoded-words-in-string (aref vector 7))) + ;; from + (aset new-vector 8 + (vm-reencode-mime-encoded-words-in-string (aref vector 8))) + ;; message-id + (aset new-vector 9 + (vm-reencode-mime-encoded-words-in-string (aref vector 9))) + ;; line-count + (aset new-vector 10 (vm-mime-encode-words-in-string (aref vector 10))) + ;; subject + (aset new-vector 11 + (vm-reencode-mime-encoded-words-in-string (aref vector 11))) + ;; vheaders-regexp + (aset new-vector 12 (vm-mime-encode-words-in-string (aref vector 12))) + ;; to + (aset new-vector 13 + (vm-reencode-mime-encoded-words-in-string (aref vector 13))) + ;; to-names + (aset new-vector 14 + (vm-reencode-mime-encoded-words-in-string (aref vector 14))) + ;; month-number + (aset new-vector 15 + (vm-mime-encode-words-in-string (aref vector 15))) + ;; sortable-date-string + (aset new-vector 16 + (vm-reencode-mime-encoded-words-in-string (aref vector 16))) + ;; sortable-subject + (aset new-vector 17 + (vm-reencode-mime-encoded-words-in-string (aref vector 17))) + ;; summary + (aset new-vector 18 + (vm-reencode-mime-encoded-words-in-tokenized-summary + (aref vector 18))) + ;; parent + (aset new-vector 19 + (vm-reencode-mime-encoded-words-in-string (aref vector 19))) + ;; references + (aset new-vector 20 + (mapcar (function vm-reencode-mime-encoded-words-in-string) + (aref vector 20))) + ;; body-to-be-discarded (formerly headers-to-be-retrieved) + (aset new-vector 21 (aref vector 21)) + ;; body-to-be-retrieved + (aset new-vector 22 (aref vector 22)) + ;; pop-uidl or imap-uid + (aset new-vector 23 (vm-mime-encode-words-in-string (aref vector 23))) + ;; imap-uid-validity + (aset new-vector 24 (vm-mime-encode-words-in-string (aref vector 24))) + ;; spam-score is a number. nothing to do + + new-vector)) + + +(defun vm-make-message () + "Create a new blank message struct." + (let ((mvec (make-vector 5 nil)) + sym) + (vm-set-softdata-of mvec (make-vector vm-softdata-vector-length nil)) + (vm-set-location-data-of + mvec (make-vector vm-location-data-vector-length nil)) + (vm-set-mirror-data-of + mvec (make-vector vm-mirror-data-vector-length nil)) + (vm-set-message-id-number-of mvec (int-to-string vm-message-id-number)) + (vm-increment vm-message-id-number) + (vm-set-buffer-of mvec (current-buffer)) + ;; We use an uninterned symbol here as a level of indirection + ;; from a purely self-referential structure. This is + ;; necessary so that Emacs debugger can be used on this + ;; program. + (setq sym (make-symbol "<<>>")) + (set sym mvec) + (vm-set-real-message-sym-of mvec sym) + (vm-set-mirrored-message-sym-of mvec sym) + ;; Another uninterned symbol for the virtual messages list. + (setq sym (make-symbol "<v>")) + (set sym nil) + (vm-set-virtual-messages-sym-of mvec sym) + ;; Another uninterned symbol for the reverse link + ;; into the message list. + (setq sym (make-symbol "<--")) + (vm-set-reverse-link-sym-of mvec sym) + mvec )) + +(defun vm-find-and-set-text-of (m) + (save-excursion + (set-buffer (vm-buffer-of m)) + (save-restriction + (widen) + (goto-char (vm-headers-of m)) + (search-forward "\n\n" (vm-text-end-of m) 0) + (vm-set-text-of m (point-marker))))) + +(defsubst vm-virtual-message-p (m) + (not (eq m (vm-real-message-of m)))) + +(defun* vm-update-virtual-messages (m &key message-changing) + "Update all the virtual messages of M to reflect the changes made to +the headers/body of M." + (save-excursion + (mapc (lambda (v-m) + (vm-set-mime-layout-of v-m nil) + (vm-set-mime-encoded-header-flag-of v-m nil) + (vm-set-line-count-of v-m nil) + (when (buffer-name (vm-buffer-of v-m)) + (set-buffer (vm-buffer-of v-m)) + (if (and vm-presentation-buffer + (eq (car vm-message-pointer) v-m)) + (save-excursion (vm-present-current-message))) + (when (vectorp vm-thread-obarray) + ;; this was changed from v-m to m in revision 1148, but it + ;; doesn't make sense. USR, 2011-04-28 + (vm-unthread-message v-m :message-changing message-changing) + (vm-build-threads (list v-m))) + ;; (if vm-summary-show-threads + ;; (intern (buffer-name) buffers-needing-thread-sort)) + )) + (vm-virtual-messages-of m)))) + +(defun vm-pp-message (m) + (pp + (vector + ':location-data + (vm-zip-vectors vm-location-data-fields (vm-location-data-of m)) + ':softdata + (vm-zip-vectors vm-softdata-fields (vm-softdata-of m)) + ':attributes + (vm-zip-vectors vm-attributes-fields (vm-attributes-of m)) + ':cached-data + (vm-zip-vectors vm-cached-data-fields (vm-cached-data-of m)) + ':mirror-data + (vm-zip-vectors vm-mirror-data-fields (vm-mirror-data-of m)))) + nil) + +;;; vm-message.el ends here |