home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / gnu / lucid / lemacs-19.6 / lisp / vm / vm-message.el < prev    next >
Encoding:
Text File  |  1992-06-29  |  9.2 KB  |  186 lines

  1. ;;; Macros and functions dealing with accessing VM message struct fields
  2. ;;; Copyright (C) 1989, 1990, 1991 Kyle E. Jones
  3. ;;;
  4. ;;; This program is free software; you can redistribute it and/or modify
  5. ;;; it under the terms of the GNU General Public License as published by
  6. ;;; the Free Software Foundation; either version 1, or (at your option)
  7. ;;; any later version.
  8. ;;;
  9. ;;; This program is distributed in the hope that it will be useful,
  10. ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ;;; GNU General Public License for more details.
  13. ;;;
  14. ;;; You should have received a copy of the GNU General Public License
  15. ;;; along with this program; if not, write to the Free Software
  16. ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  
  18. ;; data that is always shared with virtual folders
  19. (defmacro vm-virtual-data-of (message) (list 'aref message 0))
  20. ;; where message begins (From_ line)
  21. (defmacro vm-start-of (message) (list 'aref (list 'aref message 0) 0))
  22. ;; where visible headers start
  23. (defun vm-vheaders-of (message)
  24.   (or (aref (aref message 0) 1)
  25.       (progn (vm-reorder-message-headers message)
  26.          (aref (aref message 0) 1))))
  27. ;; where text section starts
  28. (defun vm-text-of (message)
  29.   (or (aref (aref message 0) 2) (progn (vm-find-and-set-text-of message)
  30.                        (aref (aref message 0) 2))))
  31. ;; where message ends
  32. (defmacro vm-end-of (message) (list 'aref (list 'aref message 0) 3))
  33. ;; if message is being edited, this is the buffer being used.
  34. (defmacro vm-edit-buffer-of (message) (list 'aref (list 'aref message 0) 4))
  35. ;; message type; if nil, then default to folder type
  36. (defmacro vm-message-type-of (message) (list 'aref (list 'aref message 0) 5))
  37. ;; link to real message
  38. (defmacro vm-real-message-of (message) (list 'symbol-value (list 'aref (list 'aref message 0) 6)))
  39. ;; list of virtual messages referencing the above real message
  40. (defmacro vm-virtual-messages-of (message) (list 'aref (list 'aref message 0) 7))
  41. ;; list to previous message in the message list
  42. (defmacro vm-reverse-link-of (message) (list 'symbol-value (list 'aref (list 'aref message 0) 8)))
  43. ;; soft data vector
  44. (defmacro vm-softdata-of (message) (list 'aref message 1))
  45. (defmacro vm-number-of (message) (list 'aref (list 'aref message 1) 0))
  46. (defmacro vm-mark-of (message) (list 'aref (list 'aref message 1) 1))
  47. ;; start of summary line
  48. (defmacro vm-su-start-of (message) (list 'aref (list 'aref message 1) 2))
  49. ;; end of summary line
  50. (defmacro vm-su-end-of (message) (list 'aref (list 'aref message 1) 3))
  51. ;; message attribute vector
  52. (defmacro vm-attributes-of (message) (list 'aref message 2))
  53. (defmacro vm-new-flag (message) (list 'aref (list 'aref message 2) 0))
  54. (defmacro vm-unread-flag (message) (list 'aref (list 'aref message 2) 1))
  55. (defmacro vm-deleted-flag (message) (list 'aref (list 'aref message 2) 2))
  56. (defmacro vm-filed-flag (message) (list 'aref (list 'aref message 2) 3))
  57. (defmacro vm-replied-flag (message) (list 'aref (list 'aref message 2) 4))
  58. (defmacro vm-written-flag (message) (list 'aref (list 'aref message 2) 5))
  59. (defmacro vm-forwarded-flag (message) (list 'aref (list 'aref message 2) 6))
  60. (defmacro vm-edited-flag (message) (list 'aref (list 'aref message 2) 7))
  61. ;; message cached data
  62. (defmacro vm-cache-of (message) (list 'aref message 3))
  63. ;; message size in bytes (as a string)
  64. (defmacro vm-byte-count-of (message) (list 'aref (list 'aref message 3) 0))
  65. ;; weekday sent
  66. (defmacro vm-weekday-of (message) (list 'aref (list 'aref message 3) 1))
  67. ;; month day
  68. (defmacro vm-monthday-of (message) (list 'aref (list 'aref message 3) 2))
  69. ;; month sent
  70. (defmacro vm-month-of (message) (list 'aref (list 'aref message 3) 3))
  71. ;; year sent
  72. (defmacro vm-year-of (message) (list 'aref (list 'aref message 3) 4))
  73. ;; hour sent
  74. (defmacro vm-hour-of (message) (list 'aref (list 'aref message 3) 5))
  75. ;; timezone
  76. (defmacro vm-zone-of (message) (list 'aref (list 'aref message 3) 6))
  77. ;; message author's full name (Full-Name: or gouged from From:)
  78. (defmacro vm-full-name-of (message) (list 'aref (list 'aref message 3) 7))
  79. ;; message author address (gouged from From:)
  80. (defmacro vm-from-of (message) (list 'aref (list 'aref message 3) 8))
  81. ;; message ID (Message-Id:)
  82. (defmacro vm-message-id-of (message) (list 'aref (list 'aref message 3) 9))
  83. ;; number of lines in message (as a string)
  84. (defmacro vm-line-count-of (message) (list 'aref (list 'aref message 3) 10))
  85. ;; message subject (Subject:)
  86. (defmacro vm-subject-of (message) (list 'aref (list 'aref message 3) 11))
  87. ;; Regexp that can be used to find the start of the already ordered headers.
  88. (defmacro vm-vheaders-regexp-of (message)
  89.   (list 'aref (list 'aref message 3) 12))
  90. ;; Addresses of recipients in a comma separated list
  91. (defmacro vm-to-of (message) (list 'aref (list 'aref message 3) 13))
  92. ;; Full names of recipients in a comma separated list.  Addresses if
  93. ;; full names not available.
  94. (defmacro vm-to-names-of (message) (list 'aref (list 'aref message 3) 14))
  95. ;; numeric month sent
  96. (defmacro vm-month-number-of (message) (list 'aref (list 'aref message 3) 15))
  97. ;; modificaiton flag for this message
  98. (defmacro vm-modflag-of (message) (list 'aref message 4))
  99.  
  100. (defmacro vm-set-virtual-data-of (message vdata) (list 'aset message 0 vdata))
  101. (defmacro vm-set-start-of (message start) (list 'aset (list 'aref message 0) 0 start))
  102. (defmacro vm-set-vheaders-of (message vh) (list 'aset (list 'aref message 0) 1 vh))
  103. (defmacro vm-set-text-of (message text) (list 'aset (list 'aref message 0) 2 text))
  104. (defmacro vm-set-end-of (message end) (list 'aset (list 'aref message 0) 3 end))
  105. (defmacro vm-set-edit-buffer-of (message buf) (list 'aset (list 'aref message 0) 4 buf))
  106. (defmacro vm-set-message-type-of (message type) (list 'aset (list 'aref message 0) 5 type))
  107. (defmacro vm-set-real-message-sym-of (message sym) (list 'aset (list 'aref message 0) 6 sym))
  108. (defmacro vm-set-virtual-messages-of (message list) (list 'aset (list 'aref message 0) 7 list))
  109. (defmacro vm-set-reverse-link-sym-of (message sym) (list 'aset (list 'aref message 0) 8 sym))
  110. (defmacro vm-set-reverse-link-of (message link) (list 'set (list 'aref (list 'aref message 0) 8) link))
  111. (defmacro vm-set-softdata-of (message data) (list 'aset message 1 data))
  112. (defmacro vm-set-number-of (message n) (list 'aset (list 'aref message 1) 0 n))
  113. (defmacro vm-set-mark-of (message val) (list 'aset (list 'aref message 1) 1 val))
  114. (defmacro vm-set-su-start-of (message pos) (list 'aset (list 'aref message 1) 2 pos))
  115. (defmacro vm-set-su-end-of (message pos) (list 'aset (list 'aref message 1) 3 pos))
  116. (defmacro vm-set-attributes-of (message attrs) (list 'aset message 2 attrs))
  117. ;; The other routines in attributes group are part of the undo system.
  118. (defmacro vm-set-edited-flag (message flag)
  119.   (list 'aset (list 'aref message 2) 7 flag))
  120. (defmacro vm-set-cache-of (message cache) (list 'aset message 3 cache))
  121. (defmacro vm-set-byte-count-of (message count)
  122.   (list 'aset (list 'aref message 3) 0 count))
  123. (defmacro vm-set-weekday-of (message val)
  124.   (list 'aset (list 'aref message 3) 1 val))
  125. (defmacro vm-set-monthday-of (message val)
  126.   (list 'aset (list 'aref message 3) 2 val))
  127. (defmacro vm-set-month-of (message val)
  128.   (list 'aset (list 'aref message 3) 3 val))
  129. (defmacro vm-set-year-of (message val)
  130.   (list 'aset (list 'aref message 3) 4 val))
  131. (defmacro vm-set-hour-of (message val)
  132.   (list 'aset (list 'aref message 3) 5 val))
  133. (defmacro vm-set-zone-of (message val)
  134.   (list 'aset (list 'aref message 3) 6 val))
  135. (defmacro vm-set-full-name-of (message author)
  136.   (list 'aset (list 'aref message 3) 7 author))
  137. (defmacro vm-set-from-of (message author)
  138.   (list 'aset (list 'aref message 3) 8 author))
  139. (defmacro vm-set-message-id-of (message id)
  140.   (list 'aset (list 'aref message 3) 9 id))
  141. (defmacro vm-set-line-count-of (message count)
  142.   (list 'aset (list 'aref message 3) 10 count))
  143. (defmacro vm-set-subject-of (message subject)
  144.   (list 'aset (list 'aref message 3) 11 subject))
  145. (defmacro vm-set-vheaders-regexp-of (message regexp)
  146.   (list 'aset (list 'aref message 3) 12 regexp))
  147. (defmacro vm-set-to-of (message recips)
  148.   (list 'aset (list 'aref message 3) 13 recips))
  149. (defmacro vm-set-to-names-of (message recips)
  150.   (list 'aset (list 'aref message 3) 14 recips))
  151. (defmacro vm-set-month-number-of (message val)
  152.   (list 'aset (list 'aref message 3) 15 val))
  153. (defmacro vm-set-modflag-of (message val) (list 'aset message 4 val))
  154.  
  155. (defun vm-text-end-of (message)
  156.   (- (vm-end-of message)
  157.      (cond ((eq vm-folder-type 'mmdf) 5)
  158.        (t 1))))
  159.  
  160. (defun vm-make-message ()
  161.   (let ((v (make-vector 5 nil)) sym)
  162.     (vm-set-softdata-of v (make-vector vm-softdata-vector-length nil))
  163.     (vm-set-virtual-data-of v (make-vector vm-virtual-data-vector-length nil))
  164.     ;; We use an uninterned symbol here as a level of indirection
  165.     ;; from a purely self-referential structure.  This is
  166.     ;; necessary so that Emacs debugger can be used on this
  167.     ;; program.
  168.     (setq sym (make-symbol "<<>>"))
  169.     (set sym v)
  170.     (vm-set-real-message-sym-of v sym)
  171.     ;; Another uninterned symbol for the reverse link 
  172.     ;; into the message list.
  173.     (setq sym (make-symbol "<--"))
  174.     (vm-set-reverse-link-sym-of v sym)
  175.     v ))
  176.  
  177. (defun vm-find-and-set-text-of (m)
  178.   (save-excursion
  179.     (save-restriction
  180.       (widen)
  181.       (goto-char (vm-start-of m))
  182.       (forward-line 1)
  183.       (search-forward "\n\n" (vm-text-end-of m) t)
  184.       (vm-set-text-of m (point-marker)))))
  185.  
  186.