Mercurial > hg > xemacs-beta
diff lisp/vm/vm-digest.el @ 2:ac2d302a0011 r19-15b2
Import from CVS: tag r19-15b2
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:46:35 +0200 |
parents | 376386a54a3c |
children | 49a24b4fd526 |
line wrap: on
line diff
--- a/lisp/vm/vm-digest.el Mon Aug 13 08:45:53 2007 +0200 +++ b/lisp/vm/vm-digest.el Mon Aug 13 08:46:35 2007 +0200 @@ -210,6 +210,88 @@ (insert (format "This is an RFC 1153 digest.\n(%d message%s)\n----------------------------------------------------------------------\n" (length message-list) (if (cdr message-list) "s" ""))) (goto-char start))))) +(defun vm-rfc1521-encapsulate-messages (message-list keep-list discard-regexp) + "Encapsulate the messages in MESSAGE-LIST as per RFC 1521 (MIME). +The resulting digest is inserted at point in the current buffer. +MIME headers at point-max are added/updated. +Point is not moved. + +MESSAGE-LIST should be a list of message structs (real or virtual). +These are the messages that will be encapsulated. +KEEP-LIST should be a list of regexps matching headers to keep. +DISCARD-REGEXP should be a regexp that matches headers to be discarded. +KEEP-LIST and DISCARD-REGEXP are used to order and trim the headers +to be forwarded. See the docs for vm-reorder-message-headers +to find out how KEEP-LIST and DISCARD-REGEXP are used." + (if message-list + (let ((target-buffer (current-buffer)) + (mlist message-list) + (boundary (format "-----%07X%07X" (abs (random)) (abs (random)))) +; insertion-point + source-buffer m start) + (save-restriction + ;; narrow to a zero length region to avoid interacting + ;; with anything that might have already been inserted + ;; into the buffer. + (narrow-to-region (point) (point)) + (setq start (point)) + (while mlist + (insert "--" boundary "\nContent-Type: message/rfc822\n\n") + (setq m (vm-real-message-of (car mlist)) + source-buffer (vm-buffer-of m)) + (save-excursion + (set-buffer source-buffer) + (save-restriction + (widen) + (save-excursion + (set-buffer target-buffer) + (let ((beg (point))) + (insert-buffer-substring source-buffer (vm-headers-of m) + (vm-text-end-of m)) + (goto-char beg) + (vm-reorder-message-headers nil nil + "\\(X-VM-\\|Status:\\)") + (vm-reorder-message-headers nil keep-list discard-regexp) + )))) + (goto-char (point-max)) + (insert "\n") + (setq mlist (cdr mlist))) + (insert "--" boundary "--\n") + + (goto-char start) + (insert "--" boundary "\nContent-Type: text/plain\n\n") + (insert (format + "This is an RFC 1521 (MIME) digest; %d message%s.\n\n\n\n\n" + (length message-list) + (if (cdr message-list) "s" ""))) +; (setq insertion-point (point-marker)) + (goto-char start)) + + ;; outside of the save-restriction + (save-excursion + (let (end) + (goto-char (point-min)) + (re-search-forward + (concat "^" (regexp-quote mail-header-separator) "$") + nil t) + (setq end (point)) + (goto-char (point-min)) + (cond + ((re-search-forward "^content-type:" end t) + (delete-region (point) (progn (forward-line 1) (point))) + (while (looking-at " \t") + (delete-region (point) (progn (forward-line 1) (point)))))) + (goto-char end) + (insert "MIME-Version: 1.0\n" + "Content-Type: multipart/digest; boundary=\"" + boundary "\"\n") + )) + +; (goto-char insertion-point) +; (set-marker insertion-point nil) + ))) + + (defun vm-rfc1153-or-rfc934-burst-message (m rfc1153) "Burst messages from the digest message M. M should be a message struct for a real message. @@ -371,6 +453,8 @@ (vm-rfc934-burst-message m)) ((equal digest-type "rfc1153") (vm-rfc1153-burst-message m)) + ((equal digest-type "rfc1521") + (error "Don't yet know how to burst MIME digests.")) (t (error "Unknown digest type: %s" digest-type))) (message "Bursting %s digest... done" digest-type) (vm-clear-modification-flag-undos) @@ -393,7 +477,8 @@ (setq totals-blurb (vm-emit-totals-blurb)) (vm-display nil nil '(vm-burst-digest vm-burst-rfc934-digest - vm-burst-rfc1153-digest) + vm-burst-rfc1153-digest + vm-burst-rfc1521-digest) (list this-command)) (if (vm-thoughtfully-select-message) (vm-preview-current-message) @@ -410,16 +495,25 @@ (interactive) (vm-burst-digest "rfc1153")) +(defun vm-burst-rfc1521-digest () + "Burst an RFC 1521 (MIME) style digest" + (interactive) + (vm-burst-digest "rfc1521")) + (defun vm-guess-digest-type (m) "Guess the digest type of the message M. M should be the message struct of a real message. -Returns either \"rfc934\" or \"rfc1153\"." +Returns either \"rfc934\", \"rfc1153\", or \"rfc1521\"." (save-excursion (set-buffer (vm-buffer-of m)) (save-excursion (save-restriction (widen) - (goto-char (vm-text-of m)) - (if (search-forward "\n----------------------------------------------------------------------\n" nil t) - "rfc1153" - "rfc934"))))) + (goto-char (vm-headers-of m)) + (if (let ((case-fold-search t)) + (re-search-forward "^MIME-Version:" nil t)) + "rfc1521" + (goto-char (vm-text-of m)) + (if (search-forward "\n----------------------------------------------------------------------\n" nil t) + "rfc1153" + "rfc934"))))))