Mercurial > hg > xemacs-beta
diff lisp/vm/vm-message.el @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | 859a2309aef8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/vm/vm-message.el Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,307 @@ +;;; Macros and functions dealing with accessing VM message struct fields +;;; Copyright (C) 1989, 1990, 1991, 1993, 1994, 1995 Kyle E. Jones +;;; +;;; 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 1, 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +(provide 'vm-message) + +;; data that is always shared with virtual folders +(defmacro vm-location-data-of (message) (list 'aref message 0)) +;; where message begins starting at the message separator in the folder +(defmacro vm-start-of (message) (list 'aref (list 'aref message 0) 0)) +;; where headers start (From_ line) +(defmacro vm-headers-of (message) (list 'aref (list '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 nil nil) + (aref (aref message 0) 2)))) +;; where text section starts +(defun 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 +(defmacro vm-text-end-of (message) (list 'aref (list 'aref message 0) 4)) +;; where message ends +(defmacro vm-end-of (message) (list 'aref (list 'aref message 0) 5)) +;; soft data vector +(defmacro vm-softdata-of (message) (list 'aref message 1)) +(defmacro vm-number-of (message) (list 'aref (list 'aref message 1) 0)) +(defmacro vm-padded-number-of (message) (list 'aref (list 'aref message 1) 1)) +(defmacro vm-mark-of (message) (list 'aref (list 'aref message 1) 2)) +;; start of summary line +(defmacro vm-su-start-of (message) (list 'aref (list 'aref message 1) 3)) +;; end of summary line +(defmacro vm-su-end-of (message) (list 'aref (list 'aref message 1) 4)) +;; symbol whose value is the real message. +(defmacro vm-real-message-sym-of (message) + (list 'aref (list 'aref message 1) 5)) +;; real message +(defmacro vm-real-message-of (message) + (list 'symbol-value (list 'aref (list 'aref message 1) 5))) +;; link to previous message in the message list +(defmacro vm-reverse-link-of (message) + (list 'symbol-value (list 'aref (list 'aref message 1) 6))) +;; message type +(defmacro vm-message-type-of (message) (list 'aref (list 'aref message 1) 7)) +;; number that uniquely identifies each message +;; this is for the set handling stuff +(defmacro vm-message-id-number-of (message) + (list 'aref (list 'aref message 1) 8)) +;; folder buffer of this message +(defmacro vm-buffer-of (message) + (list 'aref (list 'aref message 1) 9)) +;; cache thread indentation value +(defmacro vm-thread-indentation-of (message) + (list 'aref (list 'aref message 1) 10)) +;; list of symbols from vm-thread-obarray that give this message's lineage +(defmacro vm-thread-list-of (message) + (list 'aref (list 'aref message 1) 11)) +;; babyl header frob flag (0 or 1 at beginning of message) +(defmacro vm-babyl-frob-flag-of (message) + (list 'aref (list 'aref message 1) 12)) +;; saved attributes, if message was switched from unmirrored to mirrored +(defmacro vm-saved-virtual-attributes-of (message) + (list 'aref (list 'aref message 1) 13)) +;; saved mirror data, if message was switched from unmirrored to mirrored +(defmacro vm-saved-virtual-mirror-data-of (message) + (list 'aref (list 'aref message 1) 14)) +;; summary for unmirrored virtual message +(defmacro vm-virtual-summary-of (message) + (list 'aref (list 'aref message 1) 15)) +;; message attribute vector +(defmacro vm-attributes-of (message) (list 'aref message 2)) +(defmacro vm-new-flag (message) (list 'aref (list 'aref message 2) 0)) +(defmacro vm-unread-flag (message) (list 'aref (list 'aref message 2) 1)) +(defmacro vm-deleted-flag (message) (list 'aref (list 'aref message 2) 2)) +(defmacro vm-filed-flag (message) (list 'aref (list 'aref message 2) 3)) +(defmacro vm-replied-flag (message) (list 'aref (list 'aref message 2) 4)) +(defmacro vm-written-flag (message) (list 'aref (list 'aref message 2) 5)) +(defmacro vm-forwarded-flag (message) (list 'aref (list 'aref message 2) 6)) +(defmacro vm-edited-flag (message) (list 'aref (list 'aref message 2) 7)) +(defmacro vm-redistributed-flag (message) (list 'aref (list 'aref message 2) 8)) +;; message cached data +(defmacro vm-cache-of (message) (list 'aref message 3)) +;; message size in bytes (as a string) +(defmacro vm-byte-count-of (message) (list 'aref (list 'aref message 3) 0)) +;; weekday sent +(defmacro vm-weekday-of (message) (list 'aref (list 'aref message 3) 1)) +;; month day +(defmacro vm-monthday-of (message) (list 'aref (list 'aref message 3) 2)) +;; month sent +(defmacro vm-month-of (message) (list 'aref (list 'aref message 3) 3)) +;; year sent +(defmacro vm-year-of (message) (list 'aref (list 'aref message 3) 4)) +;; hour sent +(defmacro vm-hour-of (message) (list 'aref (list 'aref message 3) 5)) +;; timezone +(defmacro vm-zone-of (message) (list 'aref (list 'aref message 3) 6)) +;; message author's full name (Full-Name: or gouged from From:) +(defmacro vm-full-name-of (message) (list 'aref (list 'aref message 3) 7)) +;; message author address (gouged from From:) +(defmacro vm-from-of (message) (list 'aref (list 'aref message 3) 8)) +;; message ID (Message-Id:) +(defmacro vm-message-id-of (message) (list 'aref (list 'aref message 3) 9)) +;; number of lines in message (as a string) +(defmacro vm-line-count-of (message) (list 'aref (list 'aref message 3) 10)) +;; message subject (Subject:) +(defmacro vm-subject-of (message) (list 'aref (list 'aref message 3) 11)) +;; Regexp that can be used to find the start of the already ordered headers. +(defmacro vm-vheaders-regexp-of (message) + (list 'aref (list 'aref message 3) 12)) +;; Addresses of recipients in a comma separated list +(defmacro vm-to-of (message) (list 'aref (list 'aref message 3) 13)) +;; Full names of recipients in a comma separated list. Addresses if +;; full names not available. +(defmacro vm-to-names-of (message) (list 'aref (list 'aref message 3) 14)) +;; numeric month sent +(defmacro vm-month-number-of (message) (list 'aref (list 'aref message 3) 15)) +;; sortable date string (used for easy sorting, naturally) +(defmacro vm-sortable-datestring-of (message) + (list 'aref (list 'aref message 3) 16)) +;; sortable subject, re: garbage removed +(defmacro vm-sortable-subject-of (message) + (list 'aref (list 'aref message 3) 17)) +(defmacro vm-summary-of (message) + (list 'aref (list 'aref message 3) 18)) +(defmacro vm-parent-of (message) + (list 'aref (list 'aref message 3) 19)) +;; extra data shared by virtual messages if vm-virtual-mirror is non-nil +(defmacro vm-mirror-data-of (message) (list 'aref message 4)) +;; if message is being edited, this is the buffer being used. +(defmacro vm-edit-buffer-of (message) (list 'aref (list 'aref message 4) 0)) +;; list of virtual messages mirroring the underlying real message +(defmacro vm-virtual-messages-of (message) + (list 'symbol-value (list 'aref (list 'aref message 4) 1))) +;; modification flag for this message +;; nil if all attribute changes have been stuffed into the folder buffer +(defmacro vm-modflag-of (message) (list 'aref (list 'aref message 4) 2)) +;; list of labels attached to this message +(defmacro vm-labels-of (message) (list 'aref (list 'aref message 4) 3)) +;; comma list of labels +(defmacro vm-label-string-of (message) (list 'aref (list 'aref message 4) 4)) + +(defmacro vm-set-location-data-of (message vdata) (list 'aset message 0 vdata)) +(defmacro vm-set-start-of (message start) + (list 'aset (list 'aref message 0) 0 start)) +(defmacro vm-set-headers-of (message h) + (list 'aset (list 'aref message 0) 1 h)) +(defmacro vm-set-vheaders-of (message vh) + (list 'aset (list 'aref message 0) 2 vh)) +(defmacro vm-set-text-of (message text) + (list 'aset (list 'aref message 0) 3 text)) +(defmacro vm-set-text-end-of (message text) + (list 'aset (list 'aref message 0) 4 text)) +(defmacro vm-set-end-of (message end) + (list 'aset (list 'aref message 0) 5 end)) +(defmacro vm-set-softdata-of (message data) + (list 'aset message 1 data)) +(defmacro vm-set-number-of (message n) + (list 'aset (list 'aref message 1) 0 n)) +(defmacro vm-set-padded-number-of (message n) + (list 'aset (list 'aref message 1) 1 n)) +(defmacro vm-set-mark-of (message val) + (list 'aset (list 'aref message 1) 2 val)) +(defmacro vm-set-su-start-of (message pos) + (list 'aset (list 'aref message 1) 3 pos)) +(defmacro vm-set-su-end-of (message pos) + (list 'aset (list 'aref message 1) 4 pos)) +(defmacro vm-set-real-message-sym-of (message sym) + (list 'aset (list 'aref message 1) 5 sym)) +(defmacro vm-set-reverse-link-of (message link) + (list 'set (list 'aref (list 'aref message 1) 6) link)) +(defmacro vm-set-reverse-link-sym-of (message sym) + (list 'aset (list 'aref message 1) 6 sym)) +(defmacro vm-set-message-type-of (message type) + (list 'aset (list 'aref message 1) 7 type)) +(defmacro vm-set-message-id-number-of (message number) + (list 'aset (list 'aref message 1) 8 number)) +(defmacro vm-set-buffer-of (message buffer) + (list 'aset (list 'aref message 1) 9 buffer)) +(defmacro vm-set-thread-indentation-of (message val) + (list 'aset (list 'aref message 1) 10 val)) +(defmacro vm-set-thread-list-of (message list) + (list 'aset (list 'aref message 1) 11 list)) +(defmacro vm-set-babyl-frob-flag-of (message flag) + (list 'aset (list 'aref message 1) 12 flag)) +(defmacro vm-set-saved-virtual-attributes-of (message attrs) + (list 'aset (list 'aref message 1) 13 attrs)) +(defmacro vm-set-saved-virtual-mirror-data-of (message data) + (list 'aset (list 'aref message 1) 14 data)) +(defmacro vm-set-virtual-summary-of (message summ) + (list 'aset (list 'aref message 1) 15 summ)) +(defmacro vm-set-attributes-of (message attrs) (list 'aset message 2 attrs)) +;; 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-attributes message) + (vm-set-modflag-of message t)) + (and (not (buffer-modified-p)) (vm-set-buffer-modified-p t)) + (vm-clear-modification-flag-undos)) +(defmacro vm-set-cache-of (message cache) (list 'aset message 3 cache)) +(defmacro vm-set-byte-count-of (message count) + (list 'aset (list 'aref message 3) 0 count)) +(defmacro vm-set-weekday-of (message val) + (list 'aset (list 'aref message 3) 1 val)) +(defmacro vm-set-monthday-of (message val) + (list 'aset (list 'aref message 3) 2 val)) +(defmacro vm-set-month-of (message val) + (list 'aset (list 'aref message 3) 3 val)) +(defmacro vm-set-year-of (message val) + (list 'aset (list 'aref message 3) 4 val)) +(defmacro vm-set-hour-of (message val) + (list 'aset (list 'aref message 3) 5 val)) +(defmacro vm-set-zone-of (message val) + (list 'aset (list 'aref message 3) 6 val)) +(defmacro vm-set-full-name-of (message author) + (list 'aset (list 'aref message 3) 7 author)) +(defmacro vm-set-from-of (message author) + (list 'aset (list 'aref message 3) 8 author)) +(defmacro vm-set-message-id-of (message id) + (list 'aset (list 'aref message 3) 9 id)) +(defmacro vm-set-line-count-of (message count) + (list 'aset (list 'aref message 3) 10 count)) +(defmacro vm-set-subject-of (message subject) + (list 'aset (list 'aref message 3) 11 subject)) +(defmacro vm-set-vheaders-regexp-of (message regexp) + (list 'aset (list 'aref message 3) 12 regexp)) +(defmacro vm-set-to-of (message recips) + (list 'aset (list 'aref message 3) 13 recips)) +(defmacro vm-set-to-names-of (message recips) + (list 'aset (list 'aref message 3) 14 recips)) +(defmacro vm-set-month-number-of (message val) + (list 'aset (list 'aref message 3) 15 val)) +(defmacro vm-set-sortable-datestring-of (message val) + (list 'aset (list 'aref message 3) 16 val)) +(defmacro vm-set-sortable-subject-of (message val) + (list 'aset (list 'aref message 3) 17 val)) +(defmacro vm-set-summary-of (message val) + (list 'aset (list 'aref message 3) 18 val)) +(defmacro vm-set-parent-of (message val) + (list 'aset (list 'aref message 3) 19 val)) +(defmacro vm-set-mirror-data-of (message data) + (list 'aset message 4 data)) +(defmacro vm-set-edit-buffer-of (message buf) + (list 'aset (list 'aref message 4) 0 buf)) +(defmacro vm-set-virtual-messages-of (message list) + (list 'set (list 'aref (list 'aref message 4) 1) list)) +(defmacro vm-set-virtual-messages-sym-of (message sym) + (list 'aset (list 'aref message 4) 1 sym)) +(defmacro vm-set-modflag-of (message val) + (list 'aset (list 'aref message 4) 2 val)) +(defmacro vm-set-labels-of (message labels) + (list 'aset (list 'aref message 4) 3 labels)) +(defmacro vm-set-label-string-of (message string) + (list 'aset (list 'aref message 4) 4 string)) + +(defun vm-make-message () + (let ((v (make-vector 5 nil)) sym) + (vm-set-softdata-of v (make-vector vm-softdata-vector-length nil)) + (vm-set-location-data-of + v (make-vector vm-location-data-vector-length nil)) + (vm-set-mirror-data-of v (make-vector vm-mirror-data-vector-length nil)) + (vm-set-message-id-number-of v (int-to-string vm-message-id-number)) + (vm-increment vm-message-id-number) + (vm-set-buffer-of v (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 v) + (vm-set-real-message-sym-of v sym) + ;; Another uninterned symbol for the virtual messages list. + (setq sym (make-symbol "<v>")) + (set sym nil) + (vm-set-virtual-messages-sym-of v sym) + ;; Another uninterned symbol for the reverse link + ;; into the message list. + (setq sym (make-symbol "<--")) + (vm-set-reverse-link-sym-of v sym) + v )) + +(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))))) + +(defun vm-virtual-message-p (m) + (not (eq m (vm-real-message-of m))))