Initial Commit
[packages] / xemacs-packages / vm / lisp / vm-message.el
1 ;;; vm-message.el --- Macros and functions dealing with accessing VM message struct fields
2 ;;
3 ;; Copyright (C) 1989-1997 Kyle E. Jones
4 ;; Copyright (C) 2003-2006 Robert Widhopf-Fenk
5 ;;
6 ;; This program is free software; you can redistribute it and/or modify
7 ;; it under the terms of the GNU General Public License as published by
8 ;; the Free Software Foundation; either version 2 of the License, or
9 ;; (at your option) any later version.
10 ;;
11 ;; This program is distributed in the hope that it will be useful,
12 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 ;; GNU General Public License for more details.
15 ;;
16 ;; You should have received a copy of the GNU General Public License along
17 ;; with this program; if not, write to the Free Software Foundation, Inc.,
18 ;; 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20 ;;; Code:
21
22 ;; data that is always shared with virtual folders
23 (defsubst vm-location-data-of (message)
24   (aref message 0))
25 ;; where message begins starting at the message separator in the folder
26 (defsubst vm-start-of (message)
27   (aref (aref message 0) 0))
28 ;; where headers start (From_ line)
29 (defsubst vm-headers-of (message)
30   (aref (aref message 0) 1))
31 ;; where visible headers start
32 (defsubst vm-vheaders-of (message)
33   (or (aref (aref message 0) 2)
34       (progn (vm-reorder-message-headers message nil nil)
35              (aref (aref message 0) 2))))
36 ;; where text section starts
37 (defsubst vm-text-of (message)
38   (or (aref (aref message 0) 3) (progn (vm-find-and-set-text-of message)
39                                        (aref (aref message 0) 3))))
40 ;; where text portion of message ends
41 (defsubst vm-text-end-of (message)
42   (aref (aref message 0) 4))
43 ;; where message ends
44 (defsubst vm-end-of (message)
45   (aref (aref message 0) 5))
46 ;; soft data vector
47 (defsubst vm-softdata-of (message)
48   (aref message 1))
49 (defsubst vm-number-of (message)
50   (aref (aref message 1) 0))
51 (defsubst vm-padded-number-of (message)
52   (aref (aref message 1) 1))
53 (defsubst vm-mark-of (message)
54   (aref (aref message 1) 2))
55 ;; start of summary line
56 (defsubst vm-su-start-of (message)
57   (aref (aref message 1) 3))
58 ;; end of summary line
59 (defsubst vm-su-end-of (message)
60   (aref (aref message 1) 4))
61 ;; symbol whose value is the real message.
62 (defsubst vm-real-message-sym-of (message)
63   (aref (aref message 1) 5))
64 ;; real message
65 (defsubst vm-real-message-of (message)
66   (symbol-value (aref (aref message 1) 5)))
67 ;; link to previous message in the message list
68 (defsubst vm-reverse-link-of (message)
69   (symbol-value (aref (aref message 1) 6)))
70 ;; message type
71 (defsubst vm-message-type-of (message)
72   (aref (aref message 1) 7))
73 ;; number that uniquely identifies each message
74 ;; this is for the set handling stuff
75 (defsubst vm-message-id-number-of (message)
76   (aref (aref message 1) 8))
77 ;; folder buffer of this message
78 (defsubst vm-buffer-of (message)
79   (aref (aref message 1) 9))
80 ;; cache thread indentation value
81 (defsubst vm-thread-indentation-of (message)
82   (aref (aref message 1) 10))
83 ;; list of symbols from vm-thread-obarray that give this message's lineage
84 (defsubst vm-thread-list-of (message)
85   (aref (aref message 1) 11))
86 ;; babyl header frob flag (0 or 1 at beginning of message)
87 (defsubst vm-babyl-frob-flag-of (message)
88   (aref (aref message 1) 12))
89 ;; saved attributes, if message was switched from unmirrored to mirrored
90 (defsubst vm-saved-virtual-attributes-of (message)
91   (aref (aref message 1) 13))
92 ;; saved mirror data, if message was switched from unmirrored to mirrored
93 (defsubst vm-saved-virtual-mirror-data-of (message)
94   (aref (aref message 1) 14))
95 ;; summary for unmirrored virtual message
96 (defsubst vm-virtual-summary-of (message)
97   (aref (aref message 1) 15))
98 ;; MIME layout information; types, ids, positions, etc. of all MIME entities
99 (defsubst vm-mime-layout-of (message)
100   (aref (aref message 1) 16))
101 (defsubst vm-mime-encoded-header-flag-of (message)
102   (aref (aref message 1) 17))
103 (defsubst vm-su-summary-mouse-track-overlay-of (message)
104   (aref (aref message 1) 18))
105 (defsubst vm-message-access-method-of (message)
106   (aref (aref message 1) 19))
107 ;; message attribute vector
108 (defsubst vm-attributes-of (message) (aref message 2))
109 (defsubst vm-new-flag (message) (aref (aref message 2) 0))
110 (defsubst vm-unread-flag (message) (aref (aref message 2) 1))
111 (defsubst vm-deleted-flag (message) (aref (aref message 2) 2))
112 (defsubst vm-filed-flag (message) (aref (aref message 2) 3))
113 (defsubst vm-replied-flag (message) (aref (aref message 2) 4))
114 (defsubst vm-written-flag (message) (aref (aref message 2) 5))
115 (defsubst vm-forwarded-flag (message) (aref (aref message 2) 6))
116 (defsubst vm-edited-flag (message) (aref (aref message 2) 7))
117 (defsubst vm-redistributed-flag (message) (aref (aref message 2) 8))
118 ;; message cached data
119 (defsubst vm-cache-of (message) (aref message 3))
120 ;; message size in bytes (as a string)
121 (defsubst vm-byte-count-of (message) (aref (aref message 3) 0))
122 ;; weekday sent
123 (defsubst vm-weekday-of (message) (aref (aref message 3) 1))
124 ;; month day
125 (defsubst vm-monthday-of (message) (aref (aref message 3) 2))
126 ;; month sent
127 (defsubst vm-month-of (message) (aref (aref message 3) 3))
128 ;; year sent
129 (defsubst vm-year-of (message) (aref (aref message 3) 4))
130 ;; hour sent
131 (defsubst vm-hour-of (message) (aref (aref message 3) 5))
132 ;; timezone
133 (defsubst vm-zone-of (message) (aref (aref message 3) 6))
134 ;; message author's full name (Full-Name: or gouged from From:)
135 (defsubst vm-full-name-of (message) (aref (aref message 3) 7))
136 ;; message author address (gouged from From:)
137 (defsubst vm-from-of (message) (aref (aref message 3) 8))
138 ;; message ID (Message-Id:)
139 (defsubst vm-message-id-of (message) (aref (aref message 3) 9))
140 ;; number of lines in message (as a string)
141 (defsubst vm-line-count-of (message) (aref (aref message 3) 10))
142 ;; message subject (Subject:)
143 (defsubst vm-subject-of (message) (aref (aref message 3) 11))
144 ;; Regexp that can be used to find the start of the already ordered headers.
145 (defsubst vm-vheaders-regexp-of (message)
146   (aref (aref message 3) 12))
147 ;; Addresses of recipients in a comma separated list
148 (defsubst vm-to-of (message) (aref (aref message 3) 13))
149 ;; Full names of recipients in a comma separated list.  Addresses if
150 ;; full names not available.
151 (defsubst vm-to-names-of (message) (aref (aref message 3) 14))
152 ;; numeric month sent
153 (defsubst vm-month-number-of (message) (aref (aref message 3) 15))
154 ;; sortable date string (used for easy sorting, naturally)
155 (defsubst vm-sortable-datestring-of (message)
156   (aref (aref message 3) 16))
157 ;; sortable subject, re: garbage removed
158 (defsubst vm-sortable-subject-of (message)
159   (aref (aref message 3) 17))
160 ;; tokenized summary entry
161 (defsubst vm-summary-of (message)
162   (aref (aref message 3) 18))
163 ;; parent of this message, as determined by threading
164 (defsubst vm-parent-of (message)
165   (aref (aref message 3) 19))
166 ;; message IDs parsed from References header
167 (defsubst vm-references-of (message)
168   (aref (aref message 3) 20))
169 ;; have we retrieved the headers of this message?
170 ;; only valid for remote folder access methods
171 (defsubst vm-retrieved-headers-of (message)
172   (aref (aref message 3) 21))
173 ;; have we retrieved the body of this message?
174 ;; only valid for remote folder access methods
175 (defsubst vm-retrieved-body-of (message)
176   (aref (aref message 3) 22))
177 ;; pop UIDL value for message
178 (defsubst vm-pop-uidl-of (message)
179   (aref (aref message 3) 23))
180 ;; imap UID value for message (shares same slot as pop-uidl-of)
181 (defsubst vm-imap-uid-of (message)
182   (aref (aref message 3) 23))
183 (defsubst vm-imap-uid-validity-of (message)
184   (aref (aref message 3) 24))
185 (defsubst vm-spam-score-of (message)
186   (aref (aref message 3) 25))
187 ;; extra data shared by virtual messages if vm-virtual-mirror is non-nil
188 (defsubst vm-mirror-data-of (message) (aref message 4))
189 ;; if message is being edited, this is the buffer being used.
190 (defsubst vm-edit-buffer-of (message) (aref (aref message 4) 0))
191 ;; list of virtual messages mirroring the underlying real message
192 (defsubst vm-virtual-messages-of (message)
193   (symbol-value (aref (aref message 4) 1)))
194 ;; nil if all attribute changes have been stuffed into the folder buffer
195 (defsubst vm-stuff-flag-of (message) (aref (aref message 4) 2))
196 ;; list of labels attached to this message
197 (defsubst vm-labels-of (message) (aref (aref message 4) 3))
198 ;; comma list of labels
199 (defsubst vm-label-string-of (message) (aref (aref message 4) 4))
200 ;; attribute modification flag for this message
201 ;; non-nil if attributes need to be saved
202 (defsubst vm-attribute-modflag-of (message) (aref (aref message 4) 5))
203
204 (defsubst vm-set-location-data-of (message vdata) (aset message 0 vdata))
205 (defsubst vm-set-start-of (message start)
206   (aset (aref message 0) 0 start))
207 (defsubst vm-set-headers-of (message h)
208   (aset (aref message 0) 1 h))
209 (defsubst vm-set-vheaders-of (message vh)
210   (aset (aref message 0) 2 vh))
211 (defsubst vm-set-text-of (message text)
212   (aset (aref message 0) 3 text))
213 (defsubst vm-set-text-end-of (message text)
214   (aset (aref message 0) 4 text))
215 (defsubst vm-set-end-of (message end)
216   (aset (aref message 0) 5 end))
217 (defsubst vm-set-softdata-of (message data)
218   (aset message 1 data))
219 (defsubst vm-set-number-of (message n)
220   (aset (aref message 1) 0 n))
221 (defsubst vm-set-padded-number-of (message n)
222   (aset (aref message 1) 1 n))
223 (defsubst vm-set-mark-of (message val)
224   (aset (aref message 1) 2 val))
225 (defsubst vm-set-su-start-of (message pos)
226   (aset (aref message 1) 3 pos))
227 (defsubst vm-set-su-end-of (message pos)
228   (aset (aref message 1) 4 pos))
229 (defsubst vm-set-real-message-sym-of (message sym)
230   (aset (aref message 1) 5 sym))
231 (defsubst vm-set-reverse-link-of (message link)
232   (set (aref (aref message 1) 6) link))
233 (defsubst vm-set-reverse-link-sym-of (message sym)
234   (aset (aref message 1) 6 sym))
235 (defsubst vm-set-message-type-of (message type)
236   (aset (aref message 1) 7 type))
237 (defsubst vm-set-message-id-number-of (message number)
238   (aset (aref message 1) 8 number))
239 (defsubst vm-set-buffer-of (message buffer)
240   (aset (aref message 1) 9 buffer))
241 (defsubst vm-set-thread-indentation-of (message val)
242   (aset (aref message 1) 10 val))
243 (defsubst vm-set-thread-list-of (message list)
244   (aset (aref message 1) 11 list))
245 (defsubst vm-set-babyl-frob-flag-of (message flag)
246   (aset (aref message 1) 12 flag))
247 (defsubst vm-set-saved-virtual-attributes-of (message attrs)
248   (aset (aref message 1) 13 attrs))
249 (defsubst vm-set-saved-virtual-mirror-data-of (message data)
250   (aset (aref message 1) 14 data))
251 (defsubst vm-set-virtual-summary-of (message summ)
252   (aset (aref message 1) 15 summ))
253 (defsubst vm-set-mime-layout-of (message layout)
254   (aset (aref message 1) 16 layout))
255 (defsubst vm-set-mime-encoded-header-flag-of (message flag)
256   (aset (aref message 1) 17 flag))
257 (defsubst vm-set-su-summary-mouse-track-overlay-of (message overlay)
258   (aset (aref message 1) 18 overlay))
259 (defsubst vm-set-message-access-method-of (message method)
260   (aset (aref message 1) 19 method))
261 (defsubst vm-set-attributes-of (message attrs) (aset message 2 attrs))
262 ;; The other routines in attributes group are part of the undo system.
263 (defun vm-set-edited-flag-of (message flag)
264   (aset (aref message 2) 7 flag)
265   (vm-mark-for-summary-update message)
266   (if (eq vm-flush-interval t)
267       (vm-stuff-virtual-attributes message)
268     (vm-set-stuff-flag-of message t))
269   (and (not (buffer-modified-p)) (vm-set-buffer-modified-p t))
270   (vm-clear-modification-flag-undos))
271 (defsubst vm-set-cache-of (message cache) (aset message 3 cache))
272 (defsubst vm-set-byte-count-of (message count)
273   (aset (aref message 3) 0 count))
274 (defsubst vm-set-weekday-of (message val)
275   (aset (aref message 3) 1 val))
276 (defsubst vm-set-monthday-of (message val)
277   (aset (aref message 3) 2 val))
278 (defsubst vm-set-month-of (message val)
279   (aset (aref message 3) 3 val))
280 (defsubst vm-set-year-of (message val)
281   (aset (aref message 3) 4 val))
282 (defsubst vm-set-hour-of (message val)
283   (aset (aref message 3) 5 val))
284 (defsubst vm-set-zone-of (message val)
285   (aset (aref message 3) 6 val))
286 (defsubst vm-set-full-name-of (message author)
287   (aset (aref message 3) 7 author))
288 (defsubst vm-set-from-of (message author)
289   (aset (aref message 3) 8 author))
290 (defsubst vm-set-message-id-of (message id)
291   (aset (aref message 3) 9 id))
292 (defsubst vm-set-line-count-of (message count)
293   (aset (aref message 3) 10 count))
294 (defsubst vm-set-subject-of (message subject)
295   (aset (aref message 3) 11 subject))
296 (defsubst vm-set-vheaders-regexp-of (message regexp)
297   (aset (aref message 3) 12 regexp))
298 (defsubst vm-set-to-of (message recips)
299   (aset (aref message 3) 13 recips))
300 (defsubst vm-set-to-names-of (message recips)
301   (aset (aref message 3) 14 recips))
302 (defsubst vm-set-month-number-of (message val)
303   (aset (aref message 3) 15 val))
304 (defsubst vm-set-sortable-datestring-of (message val)
305   (aset (aref message 3) 16 val))
306 (defsubst vm-set-sortable-subject-of (message val)
307   (aset (aref message 3) 17 val))
308 (defsubst vm-set-summary-of (message val)
309   (aset (aref message 3) 18 val))
310 (defsubst vm-set-parent-of (message val)
311   (aset (aref message 3) 19 val))
312 (defsubst vm-set-references-of (message val)
313   (aset (aref message 3) 20 val))
314 (defsubst vm-set-retrieved-header-of (message val)
315   (aset (aref message 3) 21 val))
316 (defsubst vm-set-retrieved-body-of (message val)
317   (aset (aref message 3) 22 val))
318 (defsubst vm-set-pop-uidl-of (message val)
319   (aset (aref message 3) 23 val))
320 (defsubst vm-set-imap-uid-of (message val)
321   (aset (aref message 3) 23 val))
322 (defsubst vm-set-imap-uid-validity-of (message val)
323   (aset (aref message 3) 24 val))
324 (defsubst vm-set-spam-score-of (message val)
325   (aset (aref message 3) 25 val))
326 (defsubst vm-set-mirror-data-of (message data)
327   (aset message 4 data))
328 (defsubst vm-set-edit-buffer-of (message buf)
329   (aset (aref message 4) 0 buf))
330 (defsubst vm-set-virtual-messages-of (message list)
331   (set (aref (aref message 4) 1) list))
332 (defsubst vm-set-virtual-messages-sym-of (message sym)
333   (aset (aref message 4) 1 sym))
334 (defsubst vm-set-stuff-flag-of (message val)
335   (aset (aref message 4) 2 val))
336 (defsubst vm-set-labels-of (message labels)
337   (aset (aref message 4) 3 labels))
338 (defsubst vm-set-label-string-of (message string)
339   (aset (aref message 4) 4 string))
340 (defsubst vm-set-attribute-modflag-of (message flag)
341   (aset (aref message 4) 5 flag))
342
343 (defun vm-make-message ()
344   (let ((v (make-vector 5 nil)) sym)
345     (vm-set-softdata-of v (make-vector vm-softdata-vector-length nil))
346     (vm-set-location-data-of
347      v (make-vector vm-location-data-vector-length nil))
348     (vm-set-mirror-data-of v (make-vector vm-mirror-data-vector-length nil))
349     (vm-set-message-id-number-of v (int-to-string vm-message-id-number))
350     (vm-increment vm-message-id-number)
351     (vm-set-buffer-of v (current-buffer))
352     ;; We use an uninterned symbol here as a level of indirection
353     ;; from a purely self-referential structure.  This is
354     ;; necessary so that Emacs debugger can be used on this
355     ;; program.
356     (setq sym (make-symbol "<<>>"))
357     (set sym v)
358     (vm-set-real-message-sym-of v sym)
359     ;; Another uninterned symbol for the virtual messages list.
360     (setq sym (make-symbol "<v>"))
361     (set sym nil)
362     (vm-set-virtual-messages-sym-of v sym)
363     ;; Another uninterned symbol for the reverse link
364     ;; into the message list.
365     (setq sym (make-symbol "<--"))
366     (vm-set-reverse-link-sym-of v sym)
367     v ))
368
369 (defun vm-find-and-set-text-of (m)
370   (save-excursion
371     (set-buffer (vm-buffer-of m))
372     (save-restriction
373       (widen)
374       (goto-char (vm-headers-of m))
375       (search-forward "\n\n" (vm-text-end-of m) 0)
376       (vm-set-text-of m (point-marker)))))
377
378 (defun vm-virtual-message-p (m)
379   (not (eq m (vm-real-message-of m))))
380
381 (provide 'vm-message)
382
383 ;;; vm-message.el ends here