annotate lisp/vm/vm-mime.el @ 131:869e1851236b xemacs-20-1p4

Import from CVS: tag xemacs-20-1p4
author cvs
date Mon, 13 Aug 2007 09:29:07 +0200
parents 1370575f1259
children b980b6286996
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1 ;;; MIME support functions
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2 ;;; Copyright (C) 1997 Kyle E. Jones
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3 ;;;
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
4 ;;; This program is free software; you can redistribute it and/or modify
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
5 ;;; it under the terms of the GNU General Public License as published by
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
6 ;;; the Free Software Foundation; either version 1, or (at your option)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
7 ;;; any later version.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
8 ;;;
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
9 ;;; This program is distributed in the hope that it will be useful,
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
10 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
11 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
12 ;;; GNU General Public License for more details.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
13 ;;;
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
14 ;;; You should have received a copy of the GNU General Public License
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
15 ;;; along with this program; if not, write to the Free Software
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
16 ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
17
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
18 (provide 'vm-mime)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
19
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
20 (defun vm-mime-error (&rest args)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
21 (signal 'vm-mime-error (list (apply 'format args)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
22 (error "can't return from vm-mime-error"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
23
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
24 (if (fboundp 'define-error)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
25 (define-error 'vm-mime-error "MIME error")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
26 (put 'vm-mime-error 'error-conditions '(vm-mime-error error))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
27 (put 'vm-mime-error 'error-message "MIME error"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
28
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
29 (defun vm-mm-layout-type (e) (aref e 0))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
30 (defun vm-mm-layout-qtype (e) (aref e 1))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
31 (defun vm-mm-layout-encoding (e) (aref e 2))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
32 (defun vm-mm-layout-id (e) (aref e 3))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
33 (defun vm-mm-layout-description (e) (aref e 4))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
34 (defun vm-mm-layout-disposition (e) (aref e 5))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
35 (defun vm-mm-layout-qdisposition (e) (aref e 6))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
36 (defun vm-mm-layout-header-start (e) (aref e 7))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
37 (defun vm-mm-layout-body-start (e) (aref e 8))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
38 (defun vm-mm-layout-body-end (e) (aref e 9))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
39 (defun vm-mm-layout-parts (e) (aref e 10))
131
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
40 ;; if display of MIME part fails, error string will be here.
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
41 (defun vm-mm-layout-cache (e) (aref e 11))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
42
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
43 (defun vm-set-mm-layout-type (e type) (aset e 0 type))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
44 (defun vm-set-mm-layout-cache (e c) (aset e 11 c))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
45
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
46 (defun vm-mm-layout (m)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
47 (or (vm-mime-layout-of m)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
48 (progn (vm-set-mime-layout-of
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
49 m
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
50 (condition-case data
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
51 (vm-mime-parse-entity m)
114
8619ce7e4c50 Import from CVS: tag r20-1b9
cvs
parents: 110
diff changeset
52 (vm-mime-error (message "%s" (car (cdr data))))))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
53 (vm-mime-layout-of m))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
54
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
55 (defun vm-mm-encoded-header (m)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
56 (or (vm-mime-encoded-header-flag-of m)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
57 (progn (setq m (vm-real-message-of m))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
58 (vm-set-mime-encoded-header-flag-of
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
59 m
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
60 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
61 (set-buffer (vm-buffer-of m))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
62 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
63 (save-restriction
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
64 (widen)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
65 (goto-char (vm-headers-of m))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
66 (or (re-search-forward vm-mime-encoded-word-regexp
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
67 (vm-text-of m) t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
68 'none)))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
69 (vm-mime-encoded-header-flag-of m))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
70
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
71 (defun vm-mime-Q-decode-region (start end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
72 (let ((buffer-read-only nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
73 (subst-char-in-region start end ?_ (string-to-char " ") t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
74 (vm-mime-qp-decode-region start end)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
75
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
76 (fset 'vm-mime-B-decode-region 'vm-mime-base64-decode-region)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
77
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
78 (defun vm-mime-Q-encode-region (start end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
79 (let ((buffer-read-only nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
80 (subst-char-in-region start end (string-to-char " ") ?_ t)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
81 (vm-mime-qp-encode-region start end t)))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
82
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
83 (defun vm-mime-B-encode-region (start end)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
84 (vm-mime-base64-encode-region start end nil t))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
85
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
86 (defun vm-mime-crlf-to-lf-region (start end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
87 (let ((buffer-read-only nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
88 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
89 (save-restriction
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
90 (narrow-to-region start end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
91 (goto-char start)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
92 (while (search-forward "\r\n" nil t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
93 (delete-char -2)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
94 (insert "\n"))))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
95
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
96 (defun vm-mime-lf-to-crlf-region (start end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
97 (let ((buffer-read-only nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
98 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
99 (save-restriction
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
100 (narrow-to-region start end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
101 (goto-char start)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
102 (while (search-forward "\n" nil t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
103 (delete-char -1)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
104 (insert "\r\n"))))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
105
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
106 (defun vm-mime-charset-decode-region (charset start end)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
107 (or (markerp end) (setq end (vm-marker end)))
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
108 (cond (vm-xemacs-mule-p
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
109 (if (eq (device-type) 'x)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
110 (let ((buffer-read-only nil)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
111 (cell (cdr (vm-string-assoc
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
112 charset
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
113 vm-mime-mule-charset-to-coding-alist)))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
114 (oend (marker-position end))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
115 (opoint (point)))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
116 (if cell
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
117 (progn
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
118 (set-marker end (+ start
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
119 (or (decode-coding-region
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
120 start end (car cell))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
121 (- oend start))))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
122 (put-text-property start end 'vm-string t)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
123 (put-text-property start end 'vm-charset charset)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
124 (put-text-property start end 'vm-coding (car cell))))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
125 ;; In XEmacs 20.0 beta93 decode-coding-region moves point.
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
126 (goto-char opoint))))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
127 ((not (vm-multiple-fonts-possible-p)) nil)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
128 ((vm-string-member charset vm-mime-default-face-charsets) nil)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
129 (t
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
130 (let ((font (cdr (vm-string-assoc
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
131 charset
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
132 vm-mime-charset-font-alist)))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
133 (face (make-face (make-symbol "temp-face")))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
134 (e (vm-make-extent start end)))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
135 (put-text-property start end 'vm-string t)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
136 (put-text-property start end 'vm-charset charset)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
137 (if font
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
138 (condition-case data
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
139 (progn (set-face-font face font)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
140 (vm-set-extent-property e 'face face))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
141 (error nil)))))))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
142
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
143 (defun vm-mime-transfer-decode-region (layout start end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
144 (let ((case-fold-search t) (crlf nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
145 (cond ((string-match "^base64$" (vm-mm-layout-encoding layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
146 (cond ((vm-mime-types-match "text"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
147 (car (vm-mm-layout-type layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
148 (setq crlf t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
149 ((vm-mime-types-match "message"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
150 (car (vm-mm-layout-type layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
151 (setq crlf t)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
152 (vm-mime-base64-decode-region start end crlf))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
153 ((string-match "^quoted-printable$"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
154 (vm-mm-layout-encoding layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
155 (vm-mime-qp-decode-region start end)))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
156
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
157 (defun vm-mime-base64-decode-region (start end &optional crlf)
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
158 (message "Decoding base64...")
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
159 (let ((work-buffer nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
160 (done nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
161 (counter 0)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
162 (bits 0)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
163 (lim 0) inputpos
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
164 (non-data-chars (concat "^=" vm-mime-base64-alphabet)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
165 (unwind-protect
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
166 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
167 (setq work-buffer (generate-new-buffer " *vm-work*"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
168 (buffer-disable-undo work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
169 (if vm-mime-base64-decoder-program
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
170 (let* ((binary-process-output t) ; any text already has CRLFs
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
171 (status (apply 'vm-run-command-on-region
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
172 start end work-buffer
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
173 vm-mime-base64-decoder-program
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
174 vm-mime-base64-decoder-switches)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
175 (if (not (eq status t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
176 (vm-mime-error "%s" (cdr status))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
177 (goto-char start)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
178 (skip-chars-forward non-data-chars end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
179 (while (not done)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
180 (setq inputpos (point))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
181 (cond
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
182 ((> (skip-chars-forward vm-mime-base64-alphabet end) 0)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
183 (setq lim (point))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
184 (while (< inputpos lim)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
185 (setq bits (+ bits
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
186 (aref vm-mime-base64-alphabet-decoding-vector
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
187 (char-after inputpos))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
188 (vm-increment counter)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
189 (vm-increment inputpos)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
190 (cond ((= counter 4)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
191 (vm-insert-char (lsh bits -16) 1 nil work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
192 (vm-insert-char (logand (lsh bits -8) 255) 1 nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
193 work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
194 (vm-insert-char (logand bits 255) 1 nil work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
195 (setq bits 0 counter 0))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
196 (t (setq bits (lsh bits 6)))))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
197 (cond
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
198 ((= (point) end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
199 (if (not (zerop counter))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
200 (vm-mime-error "at least %d bits missing at end of base64 encoding"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
201 (* (- 4 counter) 6)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
202 (setq done t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
203 ((= (char-after (point)) 61) ; 61 is ASCII equals
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
204 (setq done t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
205 (cond ((= counter 1)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
206 (vm-mime-error "at least 2 bits missing at end of base64 encoding"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
207 ((= counter 2)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
208 (vm-insert-char (lsh bits -10) 1 nil work-buffer))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
209 ((= counter 3)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
210 (vm-insert-char (lsh bits -16) 1 nil work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
211 (vm-insert-char (logand (lsh bits -8) 255)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
212 1 nil work-buffer))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
213 ((= counter 0) t)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
214 (t (skip-chars-forward non-data-chars end)))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
215 (and crlf
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
216 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
217 (set-buffer work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
218 (vm-mime-crlf-to-lf-region (point-min) (point-max))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
219 (or (markerp end) (setq end (vm-marker end)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
220 (goto-char start)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
221 (insert-buffer-substring work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
222 (delete-region (point) end))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
223 (and work-buffer (kill-buffer work-buffer))))
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
224 (message "Decoding base64... done"))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
225
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
226 (defun vm-mime-base64-encode-region (start end &optional crlf B-encoding)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
227 (and (> (- end start) 200)
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
228 (message "Encoding base64..."))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
229 (let ((work-buffer nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
230 (counter 0)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
231 (cols 0)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
232 (bits 0)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
233 (alphabet vm-mime-base64-alphabet)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
234 inputpos)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
235 (unwind-protect
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
236 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
237 (setq work-buffer (generate-new-buffer " *vm-work*"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
238 (buffer-disable-undo work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
239 (if crlf
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
240 (progn
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
241 (or (markerp end) (setq end (vm-marker end)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
242 (vm-mime-lf-to-crlf-region start end)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
243 (if vm-mime-base64-encoder-program
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
244 (let ((status (apply 'vm-run-command-on-region
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
245 start end work-buffer
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
246 vm-mime-base64-encoder-program
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
247 vm-mime-base64-encoder-switches)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
248 (if (not (eq status t))
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
249 (vm-mime-error "%s" (cdr status)))
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
250 (if B-encoding
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
251 (progn
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
252 ;; if we're B encoding, strip out the line breaks
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
253 (goto-char (point-min))
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
254 (while (search-forward "\n" nil t)
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
255 (delete-char -1)))))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
256 (setq inputpos start)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
257 (while (< inputpos end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
258 (setq bits (+ bits (char-after inputpos)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
259 (vm-increment counter)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
260 (cond ((= counter 3)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
261 (vm-insert-char (aref alphabet (lsh bits -18)) 1 nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
262 work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
263 (vm-insert-char (aref alphabet (logand (lsh bits -12) 63))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
264 1 nil work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
265 (vm-insert-char (aref alphabet (logand (lsh bits -6) 63))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
266 1 nil work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
267 (vm-insert-char (aref alphabet (logand bits 63)) 1 nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
268 work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
269 (setq cols (+ cols 4))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
270 (cond ((= cols 72)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
271 (setq cols 0)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
272 (if (not B-encoding)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
273 (vm-insert-char ?\n 1 nil work-buffer))))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
274 (setq bits 0 counter 0))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
275 (t (setq bits (lsh bits 8))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
276 (vm-increment inputpos))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
277 ;; write out any remaining bits with appropriate padding
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
278 (if (= counter 0)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
279 nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
280 (setq bits (lsh bits (- 16 (* 8 counter))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
281 (vm-insert-char (aref alphabet (lsh bits -18)) 1 nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
282 work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
283 (vm-insert-char (aref alphabet (logand (lsh bits -12) 63))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
284 1 nil work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
285 (if (= counter 1)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
286 (vm-insert-char ?= 2 nil work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
287 (vm-insert-char (aref alphabet (logand (lsh bits -6) 63))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
288 1 nil work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
289 (vm-insert-char ?= 1 nil work-buffer)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
290 (if (> cols 0)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
291 (vm-insert-char ?\n 1 nil work-buffer)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
292 (or (markerp end) (setq end (vm-marker end)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
293 (goto-char start)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
294 (insert-buffer-substring work-buffer)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
295 (delete-region (point) end)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
296 (and (> (- end start) 200)
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
297 (message "Encoding base64... done"))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
298 (- end start))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
299 (and work-buffer (kill-buffer work-buffer)))))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
300
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
301 (defun vm-mime-qp-decode-region (start end)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
302 (and (> (- end start) 200)
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
303 (message "Decoding quoted-printable..."))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
304 (let ((work-buffer nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
305 (buf (current-buffer))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
306 (case-fold-search nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
307 (hex-digit-alist '((?0 . 0) (?1 . 1) (?2 . 2) (?3 . 3)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
308 (?4 . 4) (?5 . 5) (?6 . 6) (?7 . 7)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
309 (?8 . 8) (?9 . 9) (?A . 10) (?B . 11)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
310 (?C . 12) (?D . 13) (?E . 14) (?F . 15)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
311 inputpos stop-point copy-point)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
312 (unwind-protect
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
313 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
314 (setq work-buffer (generate-new-buffer " *vm-work*"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
315 (buffer-disable-undo work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
316 (goto-char start)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
317 (setq inputpos start)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
318 (while (< inputpos end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
319 (skip-chars-forward "^=\n" end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
320 (setq stop-point (point))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
321 (cond ((looking-at "\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
322 ;; spaces or tabs before a hard line break must be ignored
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
323 (skip-chars-backward " \t")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
324 (setq copy-point (point))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
325 (goto-char stop-point))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
326 (t (setq copy-point stop-point)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
327 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
328 (set-buffer work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
329 (insert-buffer-substring buf inputpos copy-point))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
330 (cond ((= (point) end) t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
331 ((looking-at "\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
332 (vm-insert-char ?\n 1 nil work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
333 (forward-char))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
334 (t ;; looking at =
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
335 (forward-char)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
336 (cond ((looking-at "[0-9A-F][0-9A-F]")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
337 (vm-insert-char (+ (* (cdr (assq (char-after (point))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
338 hex-digit-alist))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
339 16)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
340 (cdr (assq (char-after
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
341 (1+ (point)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
342 hex-digit-alist)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
343 1 nil work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
344 (forward-char 2))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
345 ((looking-at "\n") ; soft line break
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
346 (forward-char))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
347 ((looking-at "\r")
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
348 ;; assume the user's goatloving
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
349 ;; delivery software didn't convert
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
350 ;; from Internet's CRLF newline
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
351 ;; convention to the local LF
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
352 ;; convention.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
353 (forward-char))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
354 ((looking-at "[ \t]")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
355 ;; garbage added in transit
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
356 (skip-chars-forward " \t" end))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
357 (t (vm-mime-error "something other than line break or hex digits after = in quoted-printable encoding")))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
358 (setq inputpos (point)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
359 (or (markerp end) (setq end (vm-marker end)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
360 (goto-char start)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
361 (insert-buffer-substring work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
362 (delete-region (point) end))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
363 (and work-buffer (kill-buffer work-buffer))))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
364 (and (> (- end start) 200)
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
365 (message "Decoding quoted-printable... done")))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
366
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
367 (defun vm-mime-qp-encode-region (start end &optional Q-encoding quote-from)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
368 (and (> (- end start) 200)
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
369 (message "Encoding quoted-printable..."))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
370 (let ((work-buffer nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
371 (buf (current-buffer))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
372 (cols 0)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
373 (hex-digit-alist '((?0 . 0) (?1 . 1) (?2 . 2) (?3 . 3)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
374 (?4 . 4) (?5 . 5) (?6 . 6) (?7 . 7)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
375 (?8 . 8) (?9 . 9) (?A . 10) (?B . 11)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
376 (?C . 12) (?D . 13) (?E . 14) (?F . 15)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
377 char inputpos)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
378 (unwind-protect
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
379 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
380 (setq work-buffer (generate-new-buffer " *vm-work*"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
381 (buffer-disable-undo work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
382 (setq inputpos start)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
383 (while (< inputpos end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
384 (setq char (char-after inputpos))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
385 (cond ((= char ?\n)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
386 (vm-insert-char char 1 nil work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
387 (setq cols 0))
114
8619ce7e4c50 Import from CVS: tag r20-1b9
cvs
parents: 110
diff changeset
388 ((and (= char 32)
8619ce7e4c50 Import from CVS: tag r20-1b9
cvs
parents: 110
diff changeset
389 (not (= (1+ inputpos) end))
8619ce7e4c50 Import from CVS: tag r20-1b9
cvs
parents: 110
diff changeset
390 (not (= ?\n (char-after (1+ inputpos)))))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
391 (vm-insert-char char 1 nil work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
392 (vm-increment cols))
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
393 ((or (< char 33) (> char 126) (= char 61)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
394 (and quote-from (= cols 0) (let ((case-fold-search nil))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
395 (looking-at "From "))))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
396 (vm-insert-char ?= 1 nil work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
397 (vm-insert-char (car (rassq (lsh char -4) hex-digit-alist))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
398 1 nil work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
399 (vm-insert-char (car (rassq (logand char 15)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
400 hex-digit-alist))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
401 1 nil work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
402 (setq cols (+ cols 3)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
403 (t (vm-insert-char char 1 nil work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
404 (vm-increment cols)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
405 (cond ((> cols 70)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
406 (setq cols 0)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
407 (if Q-encoding
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
408 nil
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
409 (vm-insert-char ?= 1 nil work-buffer)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
410 (vm-insert-char ?\n 1 nil work-buffer))))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
411 (vm-increment inputpos))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
412 (or (markerp end) (setq end (vm-marker end)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
413 (goto-char start)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
414 (insert-buffer-substring work-buffer)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
415 (delete-region (point) end)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
416 (and (> (- end start) 200)
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
417 (message "Encoding quoted-printable... done"))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
418 (- end start))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
419 (and work-buffer (kill-buffer work-buffer)))))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
420
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
421 (defun vm-decode-mime-message-headers (m)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
422 (let ((case-fold-search t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
423 (buffer-read-only nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
424 charset encoding match-start match-end start end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
425 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
426 (goto-char (vm-headers-of m))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
427 (while (re-search-forward vm-mime-encoded-word-regexp (vm-text-of m) t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
428 (setq match-start (match-beginning 0)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
429 match-end (match-end 0)
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
430 charset (buffer-substring (match-beginning 1) (match-end 1))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
431 encoding (buffer-substring (match-beginning 2) (match-end 2))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
432 start (match-beginning 3)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
433 end (vm-marker (match-end 3)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
434 ;; don't change anything if we can't display the
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
435 ;; character set properly.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
436 (if (not (vm-mime-charset-internally-displayable-p charset))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
437 nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
438 (delete-region end match-end)
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
439 (condition-case data
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
440 (cond ((string-match "B" encoding)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
441 (vm-mime-B-decode-region start end))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
442 ((string-match "Q" encoding)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
443 (vm-mime-Q-decode-region start end))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
444 (t (vm-mime-error "unknown encoded word encoding, %s"
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
445 encoding)))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
446 (vm-mime-error (apply 'message (cdr data))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
447 (goto-char start)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
448 (insert "**invalid encoded word**")
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
449 (delete-region (point) end)))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
450 (vm-mime-charset-decode-region charset start end)
114
8619ce7e4c50 Import from CVS: tag r20-1b9
cvs
parents: 110
diff changeset
451 (delete-region match-start start))))))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
452
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
453 (defun vm-decode-mime-encoded-words ()
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
454 (let ((case-fold-search t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
455 (buffer-read-only nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
456 charset encoding match-start match-end start end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
457 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
458 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
459 (while (re-search-forward vm-mime-encoded-word-regexp nil t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
460 (setq match-start (match-beginning 0)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
461 match-end (match-end 0)
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
462 charset (buffer-substring (match-beginning 1) (match-end 1))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
463 encoding (buffer-substring (match-beginning 2) (match-end 2))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
464 start (match-beginning 3)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
465 end (vm-marker (match-end 3)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
466 ;; don't change anything if we can't display the
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
467 ;; character set properly.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
468 (if (not (vm-mime-charset-internally-displayable-p charset))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
469 nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
470 (delete-region end match-end)
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
471 (condition-case data
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
472 (cond ((string-match "B" encoding)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
473 (vm-mime-B-decode-region start end))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
474 ((string-match "Q" encoding)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
475 (vm-mime-Q-decode-region start end))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
476 (t (vm-mime-error "unknown encoded word encoding, %s"
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
477 encoding)))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
478 (vm-mime-error (apply 'message (cdr data))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
479 (goto-char start)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
480 (insert "**invalid encoded word**")
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
481 (delete-region (point) end)))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
482 (vm-mime-charset-decode-region charset start end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
483 (delete-region match-start start))))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
484
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
485 (defun vm-decode-mime-encoded-words-in-string (string)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
486 (if (and vm-display-using-mime
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
487 (string-match vm-mime-encoded-word-regexp string))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
488 (vm-with-string-as-temp-buffer string 'vm-decode-mime-encoded-words)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
489 string ))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
490
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
491 (defun vm-reencode-mime-encoded-words ()
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
492 (let ((charset nil)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
493 start coding pos q-encoding
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
494 old-size
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
495 (case-fold-search t)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
496 (done nil))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
497 (save-excursion
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
498 (setq start (point-min))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
499 (while (not done)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
500 (setq charset (get-text-property start 'vm-charset))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
501 (setq pos (next-single-property-change start 'vm-charset))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
502 (or pos (setq pos (point-max) done t))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
503 (if charset
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
504 (progn
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
505 (if (setq coding (get-text-property start 'vm-coding))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
506 (progn
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
507 (setq old-size (buffer-size))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
508 (encode-coding-region start pos coding)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
509 (setq pos (+ pos (- (buffer-size) old-size)))))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
510 (setq pos
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
511 (+ start
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
512 (if (setq q-encoding
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
513 (string-match "^iso-8859-\\|^us-ascii"
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
514 charset))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
515 (vm-mime-Q-encode-region start pos)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
516 (vm-mime-B-encode-region start pos))))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
517 (goto-char pos)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
518 (insert "?=")
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
519 (setq pos (point))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
520 (goto-char start)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
521 (insert "=?" charset "?" (if q-encoding "Q" "B") "?")))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
522 (setq start pos)))))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
523
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
524 (defun vm-reencode-mime-encoded-words-in-string (string)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
525 (if (and vm-display-using-mime
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
526 (text-property-any 0 (length string) 'vm-string t string))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
527 (vm-with-string-as-temp-buffer string 'vm-reencode-mime-encoded-words)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
528 string ))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
529
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
530 (fset 'vm-mime-parse-content-header 'vm-parse-structured-header)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
531
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
532 (defun vm-mime-get-header-contents (header-name-regexp)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
533 (let ((contents nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
534 regexp)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
535 (setq regexp (concat "^\\(" header-name-regexp "\\)\\|\\(^$\\)"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
536 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
537 (let ((case-fold-search t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
538 (if (and (re-search-forward regexp nil t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
539 (match-beginning 1)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
540 (progn (goto-char (match-beginning 0))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
541 (vm-match-header)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
542 (vm-matched-header-contents)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
543 nil )))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
544
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
545 (defun vm-mime-parse-entity (&optional m default-type default-encoding)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
546 (let ((case-fold-search t) version type qtype encoding id description
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
547 disposition qdisposition boundary boundary-regexp start
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
548 multipart-list c-t c-t-e done p returnval)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
549 (catch 'return-value
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
550 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
551 (if m
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
552 (progn
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
553 (setq m (vm-real-message-of m))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
554 (set-buffer (vm-buffer-of m))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
555 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
556 (save-restriction
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
557 (if m
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
558 (progn
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
559 (setq version (vm-get-header-contents m "MIME-Version:")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
560 version (car (vm-mime-parse-content-header version))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
561 type (vm-get-header-contents m "Content-Type:")
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
562 qtype (vm-mime-parse-content-header type ?\; t)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
563 type (vm-mime-parse-content-header type ?\;)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
564 encoding (or (vm-get-header-contents
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
565 m "Content-Transfer-Encoding:")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
566 "7bit")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
567 encoding (car (vm-mime-parse-content-header encoding))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
568 id (vm-get-header-contents m "Content-ID:")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
569 id (car (vm-mime-parse-content-header id))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
570 description (vm-get-header-contents
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
571 m "Content-Description:")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
572 description (and description
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
573 (if (string-match "^[ \t\n]$"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
574 description)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
575 nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
576 description))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
577 disposition (vm-get-header-contents
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
578 m "Content-Disposition:")
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
579 qdisposition (and disposition
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
580 (vm-mime-parse-content-header
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
581 disposition ?\; t))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
582 disposition (and disposition
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
583 (vm-mime-parse-content-header
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
584 disposition ?\;)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
585 (widen)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
586 (narrow-to-region (vm-headers-of m) (vm-text-end-of m)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
587 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
588 (setq type (vm-mime-get-header-contents "Content-Type:")
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
589 qtype (or (vm-mime-parse-content-header type ?\; t)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
590 default-type)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
591 type (or (vm-mime-parse-content-header type ?\;)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
592 default-type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
593 encoding (or (vm-mime-get-header-contents
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
594 "Content-Transfer-Encoding:")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
595 default-encoding)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
596 encoding (car (vm-mime-parse-content-header encoding))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
597 id (vm-mime-get-header-contents "Content-ID:")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
598 id (car (vm-mime-parse-content-header id))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
599 description (vm-mime-get-header-contents
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
600 "Content-Description:")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
601 description (and description (if (string-match "^[ \t\n]+$"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
602 description)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
603 nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
604 description))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
605 disposition (vm-mime-get-header-contents
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
606 "Content-Disposition:")
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
607 qdisposition (and disposition
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
608 (vm-mime-parse-content-header
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
609 disposition ?\; t))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
610 disposition (and disposition
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
611 (vm-mime-parse-content-header
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
612 disposition ?\;))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
613 (cond ((null m) t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
614 ((null version)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
615 (throw 'return-value 'none))
114
8619ce7e4c50 Import from CVS: tag r20-1b9
cvs
parents: 110
diff changeset
616 ((or vm-mime-ignore-mime-version (string= version "1.0")) t)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
617 (t (vm-mime-error "Unsupported MIME version: %s" version)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
618 (cond ((and m (null type))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
619 (throw 'return-value
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
620 (vector '("text/plain" "charset=us-ascii")
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
621 '("text/plain" "charset=us-ascii")
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
622 encoding id description
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
623 disposition qdisposition
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
624 (vm-headers-of m)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
625 (vm-text-of m)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
626 (vm-text-end-of m)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
627 nil nil nil )))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
628 ((null type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
629 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
630 (or (re-search-forward "^\n\\|\n\\'" nil t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
631 (vm-mime-error "MIME part missing header/body separator line"))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
632 (vector default-type default-type
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
633 encoding id description
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
634 disposition qdisposition
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
635 (vm-marker (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
636 (vm-marker (point))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
637 (vm-marker (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
638 nil nil nil ))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
639 ((null (string-match "[^/ ]+/[^/ ]+" (car type)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
640 (vm-mime-error "Malformed MIME content type: %s" (car type)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
641 ((and (string-match "^multipart/\\|^message/" (car type))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
642 (null (string-match "^\\(7bit\\|8bit\\|binary\\)$"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
643 encoding)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
644 (vm-mime-error "Opaque transfer encoding used with multipart or message type: %s, %s" (car type) encoding))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
645 ((and (string-match "^message/partial$" (car type))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
646 (null (string-match "^7bit$" encoding)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
647 (vm-mime-error "Non-7BIT transfer encoding used with message/partial message: %s" encoding))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
648 ((string-match "^multipart/digest" (car type))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
649 (setq c-t '("message/rfc822")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
650 c-t-e "7bit"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
651 ((string-match "^multipart/" (car type))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
652 (setq c-t '("text/plain" "charset=us-ascii")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
653 c-t-e "7bit")) ; below
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
654 ((string-match "^message/\\(rfc822\\|news\\)" (car type))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
655 (setq c-t '("text/plain" "charset=us-ascii")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
656 c-t-e "7bit")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
657 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
658 (or (re-search-forward "^\n\\|\n\\'" nil t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
659 (vm-mime-error "MIME part missing header/body separator line"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
660 (throw 'return-value
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
661 (vector type qtype encoding id description
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
662 disposition qdisposition
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
663 (vm-marker (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
664 (vm-marker (point))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
665 (vm-marker (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
666 (list
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
667 (save-restriction
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
668 (narrow-to-region (point) (point-max))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
669 (vm-mime-parse-entity-safe nil c-t
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
670 c-t-e)))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
671 nil )))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
672 (t
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
673 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
674 (or (re-search-forward "^\n\\|\n\\'" nil t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
675 (vm-mime-error "MIME part missing header/body separator line"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
676 (throw 'return-value
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
677 (vector type qtype encoding id description
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
678 disposition qdisposition
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
679 (vm-marker (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
680 (vm-marker (point))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
681 (vm-marker (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
682 nil nil ))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
683 (setq p (cdr type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
684 boundary nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
685 (while p
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
686 (if (string-match "^boundary=" (car p))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
687 (setq boundary (car (vm-parse (car p) "=\\(.+\\)"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
688 p nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
689 (setq p (cdr p))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
690 (or boundary
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
691 (vm-mime-error
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
692 "Boundary parameter missing in %s type specification"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
693 (car type)))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
694 ;; the \' in the regexp is to "be liberal" in the
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
695 ;; face of broken software that does not add a line
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
696 ;; break after the final boundary of a nested
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
697 ;; multipart entity.
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
698 (setq boundary-regexp
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
699 (concat "^--" (regexp-quote boundary)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
700 "\\(--\\)?[ \t]*\\(\n\\|\\'\\)"))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
701 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
702 (setq start nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
703 multipart-list nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
704 done nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
705 (while (and (not done) (re-search-forward boundary-regexp nil t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
706 (cond ((null start)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
707 (setq start (match-end 0)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
708 (t
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
709 (and (match-beginning 1)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
710 (setq done t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
711 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
712 (save-restriction
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
713 (narrow-to-region start (1- (match-beginning 0)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
714 (setq start (match-end 0))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
715 (setq multipart-list
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
716 (cons (vm-mime-parse-entity-safe nil c-t c-t-e)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
717 multipart-list)))))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
718 (if (not done)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
719 (vm-mime-error "final %s boundary missing" boundary))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
720 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
721 (or (re-search-forward "^\n\\|\n\\'" nil t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
722 (vm-mime-error "MIME part missing header/body separator line"))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
723 (vector type qtype encoding id description
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
724 disposition qdisposition
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
725 (vm-marker (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
726 (vm-marker (point))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
727 (vm-marker (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
728 (nreverse multipart-list)
114
8619ce7e4c50 Import from CVS: tag r20-1b9
cvs
parents: 110
diff changeset
729 nil )))))))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
730
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
731 (defun vm-mime-parse-entity-safe (&optional m c-t c-t-e)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
732 (or c-t (setq c-t '("text/plain" "charset=us-ascii")))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
733 ;; don't let subpart parse errors make the whole parse fail. use default
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
734 ;; type if the parse fails.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
735 (condition-case error-data
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
736 (vm-mime-parse-entity nil c-t c-t-e)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
737 (vm-mime-error
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
738 (let ((header (if m
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
739 (vm-headers-of m)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
740 (vm-marker (point-min))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
741 (text (if m
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
742 (vm-text-of m)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
743 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
744 (re-search-forward "^\n\\|\n\\'"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
745 nil 0)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
746 (vm-marker (point)))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
747 (text-end (if m
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
748 (vm-text-end-of m)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
749 (vm-marker (point-max)))))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
750 (vector c-t c-t
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
751 (vm-determine-proper-content-transfer-encoding text text-end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
752 nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
753 ;; cram the error message into the description slot
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
754 (car (cdr error-data))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
755 ;; mark as an attachment to improve the chance that the user
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
756 ;; will see the description.
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
757 '("attachment") '("attachment")
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
758 header
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
759 text
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
760 text-end)))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
761
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
762 (defun vm-mime-get-xxx-parameter (layout name param-list)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
763 (let ((match-end (1+ (length name)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
764 (name-regexp (concat (regexp-quote name) "="))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
765 (case-fold-search t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
766 (done nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
767 (while (and param-list (not done))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
768 (if (and (string-match name-regexp (car param-list))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
769 (= (match-end 0) match-end))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
770 (setq done t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
771 (setq param-list (cdr param-list))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
772 (and (car param-list) (car (vm-parse (car param-list) "=\\(.*\\)")))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
773
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
774 (defun vm-mime-get-parameter (layout name)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
775 (vm-mime-get-xxx-parameter layout name (cdr (vm-mm-layout-type layout))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
776
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
777 (defun vm-mime-get-disposition-parameter (layout name)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
778 (vm-mime-get-xxx-parameter layout name
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
779 (cdr (vm-mm-layout-disposition layout))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
780
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
781 (defun vm-mime-insert-mime-body (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
782 (vm-insert-region-from-buffer (marker-buffer (vm-mm-layout-body-start layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
783 (vm-mm-layout-body-start layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
784 (vm-mm-layout-body-end layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
785
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
786 (defun vm-mime-insert-mime-headers (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
787 (vm-insert-region-from-buffer (marker-buffer (vm-mm-layout-body-start layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
788 (vm-mm-layout-header-start layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
789 (vm-mm-layout-body-start layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
790 (if (and (not (bobp)) (char-equal (char-after (1- (point))) ?\n))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
791 (delete-char -1)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
792
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
793 (defun vm-make-presentation-copy (m)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
794 (let ((mail-buffer (current-buffer))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
795 b mm
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
796 (real-m (vm-real-message-of m))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
797 (modified (buffer-modified-p)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
798 (cond ((or (null vm-presentation-buffer-handle)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
799 (null (buffer-name vm-presentation-buffer-handle)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
800 (setq b (generate-new-buffer (concat (buffer-name)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
801 " Presentation")))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
802 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
803 (set-buffer b)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
804 (if (fboundp 'buffer-disable-undo)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
805 (buffer-disable-undo (current-buffer))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
806 ;; obfuscation to make the v19 compiler not whine
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
807 ;; about obsolete functions.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
808 (let ((x 'buffer-flush-undo))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
809 (funcall x (current-buffer))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
810 (setq mode-name "VM Presentation"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
811 major-mode 'vm-presentation-mode
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
812 vm-message-pointer (list nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
813 vm-mail-buffer mail-buffer
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
814 mode-popup-menu (and vm-use-menus vm-popup-menu-on-mouse-3
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
815 (vm-menu-support-possible-p)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
816 (vm-menu-mode-menu))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
817 ;; Default to binary file type for DOS/NT.
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
818 buffer-file-type t
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
819 ;; Tell XEmacs/MULE not to mess with the text on writes.
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
820 buffer-read-only t
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
821 mode-line-format vm-mode-line-format)
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
822 ;; scroll in place messes with scroll-up and this loses
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
823 (defvar scroll-in-place)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
824 (make-local-variable 'scroll-in-place)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
825 (setq scroll-in-place nil)
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
826 (and vm-xemacs-mule-p
110
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents: 30
diff changeset
827 (set-buffer-file-coding-system 'no-conversion t))
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
828 (cond (vm-fsfemacs-19-p
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
829 ;; need to do this outside the let because
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
830 ;; loading disp-table initializes
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
831 ;; standard-display-table.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
832 (require 'disp-table)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
833 (let* ((standard-display-table
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
834 (copy-sequence standard-display-table)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
835 (standard-display-european t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
836 (setq buffer-display-table standard-display-table))))
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
837 (if (and vm-frame-per-folder (vm-multiple-frames-possible-p))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
838 (vm-set-hooks-for-frame-deletion))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
839 (use-local-map vm-mode-map)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
840 (and (vm-toolbar-support-possible-p) vm-use-toolbar
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
841 (vm-toolbar-install-toolbar))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
842 (and (vm-menu-support-possible-p)
114
8619ce7e4c50 Import from CVS: tag r20-1b9
cvs
parents: 110
diff changeset
843 (vm-menu-install-menus))
8619ce7e4c50 Import from CVS: tag r20-1b9
cvs
parents: 110
diff changeset
844 (run-hooks 'vm-presentation-mode-hook))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
845 (setq vm-presentation-buffer-handle b)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
846 (setq b vm-presentation-buffer-handle
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
847 vm-presentation-buffer vm-presentation-buffer-handle
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
848 vm-mime-decoded nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
849 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
850 (set-buffer (vm-buffer-of real-m))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
851 (save-restriction
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
852 (widen)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
853 ;; must reference this now so that headers will be in
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
854 ;; their final position before the message is copied.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
855 ;; otherwise the vheader offset computed below will be
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
856 ;; wrong.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
857 (vm-vheaders-of real-m)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
858 (set-buffer b)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
859 (widen)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
860 (let ((buffer-read-only nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
861 (modified (buffer-modified-p)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
862 (unwind-protect
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
863 (progn
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
864 (erase-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
865 (insert-buffer-substring (vm-buffer-of real-m)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
866 (vm-start-of real-m)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
867 (vm-end-of real-m)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
868 (set-buffer-modified-p modified)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
869 (setq mm (copy-sequence m))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
870 (vm-set-location-data-of mm (vm-copy (vm-location-data-of m)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
871 (set-marker (vm-start-of mm) (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
872 (set-marker (vm-headers-of mm) (+ (vm-start-of mm)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
873 (- (vm-headers-of real-m)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
874 (vm-start-of real-m))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
875 (set-marker (vm-vheaders-of mm) (+ (vm-start-of mm)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
876 (- (vm-vheaders-of real-m)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
877 (vm-start-of real-m))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
878 (set-marker (vm-text-of mm) (+ (vm-start-of mm)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
879 (- (vm-text-of real-m)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
880 (vm-start-of real-m))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
881 (set-marker (vm-text-end-of mm) (+ (vm-start-of mm)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
882 (- (vm-text-end-of real-m)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
883 (vm-start-of real-m))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
884 (set-marker (vm-end-of mm) (+ (vm-start-of mm)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
885 (- (vm-end-of real-m)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
886 (vm-start-of real-m))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
887 (setcar vm-message-pointer mm)))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
888
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
889 (fset 'vm-presentation-mode 'vm-mode)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
890 (put 'vm-presentation-mode 'mode-class 'special)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
891
110
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents: 30
diff changeset
892 (defvar buffer-file-coding-system)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
893
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
894 (defun vm-determine-proper-charset (beg end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
895 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
896 (save-restriction
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
897 (narrow-to-region beg end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
898 (catch 'done
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
899 (goto-char (point-min))
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
900 (if vm-xemacs-mule-p
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
901 (let ((charsets (delq 'ascii (charsets-in-region beg end))))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
902 (cond ((null charsets)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
903 "us-ascii")
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
904 ((cdr charsets)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
905 (or (car (cdr
110
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents: 30
diff changeset
906 (assq (coding-system-name
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents: 30
diff changeset
907 buffer-file-coding-system)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents: 30
diff changeset
908 vm-mime-mule-coding-to-charset-alist)))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
909 "iso-2022-jp"))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
910 (t
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
911 (or (car (cdr
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
912 (assoc
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
913 (car charsets)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
914 vm-mime-mule-charset-to-charset-alist)))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
915 "unknown"))))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
916 (and (re-search-forward "[^\000-\177]" nil t)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
917 (throw 'done (or vm-mime-8bit-composition-charset
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
918 "iso-8859-1")))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
919 (throw 'done "us-ascii"))))))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
920
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
921 (defun vm-determine-proper-content-transfer-encoding (beg end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
922 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
923 (save-restriction
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
924 (narrow-to-region beg end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
925 (catch 'done
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
926 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
927 (and (re-search-forward "[\000\015]" nil t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
928 (throw 'done "binary"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
929
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
930 (let ((toolong nil) bol)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
931 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
932 (setq bol (point))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
933 (while (and (not (eobp)) (not toolong))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
934 (forward-line)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
935 (setq toolong (> (- (point) bol) 998)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
936 bol (point)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
937 (and toolong (throw 'done "binary")))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
938
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
939 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
940 (and (re-search-forward "[\200-\377]" nil t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
941 (throw 'done "8bit"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
942
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
943 "7bit"))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
944
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
945 (defun vm-mime-types-match (type type/subtype)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
946 (let ((case-fold-search t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
947 (cond ((string-match "/" type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
948 (if (and (string-match (regexp-quote type) type/subtype)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
949 (equal 0 (match-beginning 0))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
950 (equal (length type/subtype) (match-end 0)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
951 t
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
952 nil ))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
953 ((and (string-match (regexp-quote type) type/subtype)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
954 (equal 0 (match-beginning 0))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
955 (equal (save-match-data
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
956 (string-match "/" type/subtype (match-end 0)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
957 (match-end 0)))))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
958
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
959 (defvar native-sound-only-on-console)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
960
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
961 (defun vm-mime-can-display-internal (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
962 (let ((type (car (vm-mm-layout-type layout))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
963 (cond ((vm-mime-types-match "image/jpeg" type)
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
964 (and vm-xemacs-p
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
965 (featurep 'jpeg)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
966 (eq (device-type) 'x)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
967 ((vm-mime-types-match "image/gif" type)
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
968 (and vm-xemacs-p
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
969 (featurep 'gif)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
970 (eq (device-type) 'x)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
971 ((vm-mime-types-match "image/png" type)
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
972 (and vm-xemacs-p
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
973 (featurep 'png)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
974 (eq (device-type) 'x)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
975 ((vm-mime-types-match "image/tiff" type)
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
976 (and vm-xemacs-p
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
977 (featurep 'tiff)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
978 (eq (device-type) 'x)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
979 ((vm-mime-types-match "audio/basic" type)
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
980 (and vm-xemacs-p
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
981 (or (featurep 'native-sound)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
982 (featurep 'nas-sound))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
983 (or (device-sound-enabled-p)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
984 (and (featurep 'native-sound)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
985 (not native-sound-only-on-console)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
986 (eq (device-type) 'x)))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
987 ((vm-mime-types-match "multipart" type) t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
988 ((vm-mime-types-match "message/external-body" type) nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
989 ((vm-mime-types-match "message" type) t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
990 ((or (vm-mime-types-match "text/plain" type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
991 (vm-mime-types-match "text/enriched" type))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
992 (let ((charset (or (vm-mime-get-parameter layout "charset")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
993 "us-ascii")))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
994 (vm-mime-charset-internally-displayable-p charset)))
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
995 ((vm-mime-types-match "text/html" type)
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
996 (condition-case ()
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
997 (progn (require 'w3)
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
998 (fboundp 'w3-region))
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
999 (error nil)))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1000 (t nil))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1001
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1002 (defun vm-mime-can-convert (type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1003 (let ((alist vm-mime-type-converter-alist)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1004 ;; fake layout. make it the wrong length so an error will
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1005 ;; be signaled if vm-mime-can-display-internal ever asks
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1006 ;; for one of the other fields
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1007 (fake-layout (make-vector 1 (list nil)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1008 (done nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1009 (while (and alist (not done))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1010 (cond ((and (vm-mime-types-match (car (car alist)) type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1011 (or (progn
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1012 (setcar (aref fake-layout 0) (nth 1 (car alist)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1013 (vm-mime-can-display-internal fake-layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1014 (vm-mime-find-external-viewer (nth 1 (car alist)))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1015 (setq done t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1016 (t (setq alist (cdr alist)))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1017 (and alist (car alist))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1018
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1019 (defun vm-mime-convert-undisplayable-layout (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1020 (let ((ooo (vm-mime-can-convert (car (vm-mm-layout-type layout)))))
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
1021 (message "Converting %s to %s..."
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1022 (car (vm-mm-layout-type layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1023 (nth 1 ooo))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1024 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1025 (set-buffer (generate-new-buffer " *mime object*"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1026 (setq vm-message-garbage-alist
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1027 (cons (cons (current-buffer) 'kill-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1028 vm-message-garbage-alist))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1029 (vm-mime-insert-mime-body layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1030 (vm-mime-transfer-decode-region layout (point-min) (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1031 (call-process-region (point-min) (point-max) shell-file-name
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1032 t t nil shell-command-switch (nth 2 ooo))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1033 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1034 (insert "Content-Type: " (nth 1 ooo) "\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1035 (insert "Content-Transfer-Encoding: binary\n\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1036 (set-buffer-modified-p nil)
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
1037 (message "Converting %s to %s... done"
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1038 (car (vm-mm-layout-type layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1039 (nth 1 ooo))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1040 (vector (list (nth 1 ooo))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1041 (list (nth 1 ooo))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1042 "binary"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1043 (vm-mm-layout-id layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1044 (vm-mm-layout-description layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1045 (vm-mm-layout-disposition layout)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1046 (vm-mm-layout-qdisposition layout)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1047 (vm-marker (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1048 (vm-marker (point))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1049 (vm-marker (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1050 nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1051 nil ))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1052
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1053 (defun vm-mime-should-display-button (layout dont-honor-content-disposition)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1054 (if (and vm-honor-mime-content-disposition
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1055 (not dont-honor-content-disposition)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1056 (vm-mm-layout-disposition layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1057 (let ((case-fold-search t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1058 (string-match "^attachment$" (car (vm-mm-layout-disposition layout))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1059 (let ((i-list vm-auto-displayed-mime-content-types)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1060 (type (car (vm-mm-layout-type layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1061 (matched nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1062 (if (eq i-list t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1063 nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1064 (while (and i-list (not matched))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1065 (if (vm-mime-types-match (car i-list) type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1066 (setq matched t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1067 (setq i-list (cdr i-list))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1068 (not matched) ))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1069
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1070 (defun vm-mime-should-display-internal (layout dont-honor-content-disposition)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1071 (if (and vm-honor-mime-content-disposition
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1072 (not dont-honor-content-disposition)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1073 (vm-mm-layout-disposition layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1074 (let ((case-fold-search t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1075 (string-match "^inline$" (car (vm-mm-layout-disposition layout))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1076 (let ((i-list vm-mime-internal-content-types)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1077 (type (car (vm-mm-layout-type layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1078 (matched nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1079 (if (eq i-list t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1080 t
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1081 (while (and i-list (not matched))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1082 (if (vm-mime-types-match (car i-list) type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1083 (setq matched t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1084 (setq i-list (cdr i-list))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1085 matched ))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1086
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1087 (defun vm-mime-find-external-viewer (type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1088 (let ((e-alist vm-mime-external-content-types-alist)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1089 (matched nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1090 (while (and e-alist (not matched))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1091 (if (and (vm-mime-types-match (car (car e-alist)) type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1092 (cdr (car e-alist)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1093 (setq matched (cdr (car e-alist)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1094 (setq e-alist (cdr e-alist))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1095 matched ))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1096 (fset 'vm-mime-should-display-external 'vm-mime-find-external-viewer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1097
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1098 (defun vm-mime-delete-button-maybe (extent)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1099 (let ((buffer-read-only))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1100 ;; if displayed MIME object should replace the button
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1101 ;; remove the button now.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1102 (cond ((vm-extent-property extent 'vm-mime-disposable)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1103 (delete-region (vm-extent-start-position extent)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1104 (vm-extent-end-position extent))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1105 (vm-detach-extent extent)))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1106
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1107 (defun vm-decode-mime-message ()
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1108 "Decode the MIME objects in the current message.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1109
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1110 The first time this command is run on a message, decoding is done.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1111 The second time, buttons for all the objects are displayed instead.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1112 The third time, the raw, undecoded data is displayed.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1113
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1114 If decoding, the decoded objects might be displayed immediately, or
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1115 buttons might be displayed that you need to activate to view the
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1116 object. See the documentation for the variables
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1117
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1118 vm-auto-displayed-mime-content-types
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1119 vm-mime-internal-content-types
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1120 vm-mime-external-content-types-alist
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1121
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1122 to see how to control whether you see buttons or objects.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1123
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1124 If the variable vm-mime-display-function is set, then its value
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1125 is called as a function with no arguments, and none of the
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1126 actions mentioned in the preceding paragraphs are done. At the
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1127 time of the call, the current buffer will be the presentation
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1128 buffer for the folder and a copy of the current message will be
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1129 in the buffer. The function is expected to make the message
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1130 `MIME presentable' to the user in whatever manner it sees fit."
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1131 (interactive)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1132 (vm-follow-summary-cursor)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1133 (vm-select-folder-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1134 (vm-check-for-killed-summary)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1135 (vm-check-for-killed-presentation)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1136 (vm-error-if-folder-empty)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1137 (if (and (not vm-display-using-mime)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1138 (null vm-mime-display-function))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1139 (error "MIME display disabled, set vm-display-using-mime non-nil to enable."))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1140 (if vm-mime-display-function
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1141 (progn
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1142 (vm-make-presentation-copy (car vm-message-pointer))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1143 (set-buffer vm-presentation-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1144 (funcall vm-mime-display-function))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1145 (if vm-mime-decoded
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1146 (if (eq vm-mime-decoded 'decoded)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1147 (let ((vm-preview-read-messages nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1148 (vm-auto-decode-mime-messages t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1149 (vm-honor-mime-content-disposition nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1150 (vm-auto-displayed-mime-content-types '("multipart")))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1151 (setq vm-mime-decoded nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1152 (intern (buffer-name) vm-buffers-needing-display-update)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1153 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1154 (vm-preview-current-message))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1155 (setq vm-mime-decoded 'buttons))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1156 (let ((vm-preview-read-messages nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1157 (vm-auto-decode-mime-messages nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1158 (intern (buffer-name) vm-buffers-needing-display-update)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1159 (vm-preview-current-message)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1160 (let ((layout (vm-mm-layout (car vm-message-pointer)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1161 (m (car vm-message-pointer)))
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
1162 (message "Decoding MIME message...")
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1163 (cond ((stringp layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1164 (error "Invalid MIME message: %s" layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1165 (if (vm-mime-plain-message-p m)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1166 (error "Message needs no decoding."))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1167 (or vm-presentation-buffer
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1168 ;; maybe user killed it
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1169 (error "No presentation buffer."))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1170 (set-buffer vm-presentation-buffer)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1171 (if (and (interactive-p) (eq vm-system-state 'previewing))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1172 (let ((vm-display-using-mime nil))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1173 (vm-show-current-message)))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1174 (setq m (car vm-message-pointer))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1175 (vm-save-restriction
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1176 (widen)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1177 (goto-char (vm-text-of m))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1178 (let ((buffer-read-only nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1179 (modified (buffer-modified-p)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1180 (unwind-protect
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1181 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1182 (and (not (eq (vm-mm-encoded-header m) 'none))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1183 (vm-decode-mime-message-headers m))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1184 (if (vectorp layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1185 (progn
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1186 (vm-decode-mime-layout layout)
114
8619ce7e4c50 Import from CVS: tag r20-1b9
cvs
parents: 110
diff changeset
1187 (delete-region (point) (point-max))))
8619ce7e4c50 Import from CVS: tag r20-1b9
cvs
parents: 110
diff changeset
1188 (vm-energize-urls)
8619ce7e4c50 Import from CVS: tag r20-1b9
cvs
parents: 110
diff changeset
1189 (vm-highlight-headers-maybe)
8619ce7e4c50 Import from CVS: tag r20-1b9
cvs
parents: 110
diff changeset
1190 (vm-energize-headers-and-xfaces))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1191 (set-buffer-modified-p modified))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1192 (save-excursion (set-buffer vm-mail-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1193 (setq vm-mime-decoded 'decoded))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1194 (intern (buffer-name vm-mail-buffer) vm-buffers-needing-display-update)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1195 (vm-update-summary-and-mode-line)
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
1196 (message "Decoding MIME message... done"))))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1197 (vm-display nil nil '(vm-decode-mime-message)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1198 '(vm-decode-mime-message reading-message)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1199
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1200 (defun vm-decode-mime-layout (layout &optional dont-honor-c-d)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1201 (let ((modified (buffer-modified-p)) type type-no-subtype (extent nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1202 (unwind-protect
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1203 (progn
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1204 (if (not (vectorp layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1205 (progn
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1206 (setq extent layout
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1207 layout (vm-extent-property extent 'vm-mime-layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1208 (goto-char (vm-extent-start-position extent))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1209 (setq type (downcase (car (vm-mm-layout-type layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1210 type-no-subtype (car (vm-parse type "\\([^/]+\\)")))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1211 (cond ((and (vm-mime-should-display-button layout dont-honor-c-d)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1212 (or (condition-case nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1213 (funcall (intern
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1214 (concat "vm-mime-display-button-"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1215 type))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1216 layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1217 (void-function nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1218 (condition-case nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1219 (funcall (intern
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1220 (concat "vm-mime-display-button-"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1221 type-no-subtype))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1222 layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1223 (void-function nil)))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1224 ((and (vm-mime-should-display-internal layout dont-honor-c-d)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1225 (condition-case nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1226 (funcall (intern
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1227 (concat "vm-mime-display-internal-"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1228 type))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1229 layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1230 (void-function nil))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1231 ((vm-mime-types-match "multipart" type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1232 (or (condition-case nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1233 (funcall (intern
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1234 (concat "vm-mime-display-internal-"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1235 type))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1236 layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1237 (void-function nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1238 (vm-mime-display-internal-multipart/mixed layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1239 ((and (vm-mime-should-display-external type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1240 (vm-mime-display-external-generic layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1241 (and extent (vm-set-extent-property
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1242 extent 'vm-mime-disposable nil)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1243 ((vm-mime-can-convert type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1244 (vm-decode-mime-layout
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1245 (vm-mime-convert-undisplayable-layout layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1246 ((and (or (vm-mime-types-match "message" type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1247 (vm-mime-types-match "text" type))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1248 ;; display unmatched message and text types as
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1249 ;; text/plain.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1250 (vm-mime-display-internal-text/plain layout)))
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1251 (t (and extent (vm-mime-rewrite-failed-button
131
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1252 extent
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1253 (or (vm-mm-layout-cache layout)
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1254 "no external viewer defined for type")))
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1255 (vm-mime-display-internal-application/octet-stream
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1256 (or extent layout))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1257 (and extent (vm-mime-delete-button-maybe extent)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1258 (set-buffer-modified-p modified)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1259 t )
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1260
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1261 (defun vm-mime-display-button-text (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1262 (vm-mime-display-button-xxxx layout t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1263
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
1264 (defun vm-mime-display-internal-text/html (layout)
131
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1265 (if (fboundp 'w3-region)
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1266 (let ((buffer-read-only nil)
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1267 (work-buffer nil))
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1268 (message "Inlining text/html, be patient...")
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1269 ;; w3-region is not as tame as we would like.
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1270 ;; make sure the yoke is firmly attached.
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1271 (unwind-protect
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1272 (progn
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1273 (save-excursion
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1274 (set-buffer (setq work-buffer
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1275 (generate-new-buffer " *workbuf*")))
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1276 (vm-mime-insert-mime-body layout)
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1277 (vm-mime-transfer-decode-region layout (point-min) (point-max))
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1278 (save-excursion
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1279 (save-window-excursion
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1280 (w3-region (point-min) (point-max)))))
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1281 (insert-buffer-substring work-buffer))
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1282 (and work-buffer (kill-buffer work-buffer)))
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1283 (message "Inlining text/html... done")
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1284 t )
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1285 (vm-set-mm-layout-cache layout "Need W3 to inline HTML")
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1286 nil ))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1287
114
8619ce7e4c50 Import from CVS: tag r20-1b9
cvs
parents: 110
diff changeset
1288 (defun vm-mime-display-internal-text/plain (layout &optional no-highlighting)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1289 (let ((start (point)) end old-size
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1290 (buffer-read-only nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1291 (charset (or (vm-mime-get-parameter layout "charset") "us-ascii")))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1292 (if (not (vm-mime-charset-internally-displayable-p charset))
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1293 (progn
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1294 (vm-set-mm-layout-cache
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1295 layout (concat "Undisplayable charset: " charset))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1296 nil)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1297 (vm-mime-insert-mime-body layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1298 (setq end (point-marker))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1299 (vm-mime-transfer-decode-region layout start end)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1300 (setq old-size (buffer-size))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1301 (vm-mime-charset-decode-region charset start end)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1302 (set-marker end (+ end (- (buffer-size) old-size)))
114
8619ce7e4c50 Import from CVS: tag r20-1b9
cvs
parents: 110
diff changeset
1303 (or no-highlighting (vm-energize-urls-in-message-region start end))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1304 (goto-char end)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1305 t )))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1306
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1307 (defun vm-mime-display-internal-text/enriched (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1308 (require 'enriched)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1309 (let ((start (point)) end
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1310 (buffer-read-only nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1311 (enriched-verbose t))
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
1312 (message "Decoding text/enriched, be patient...")
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1313 (vm-mime-insert-mime-body layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1314 (setq end (point-marker))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1315 (vm-mime-transfer-decode-region layout start end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1316 ;; enriched-decode expects a couple of headers at the top of
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1317 ;; the region and will remove anything that looks like a
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1318 ;; header. Put a header section here for it to eat so it
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1319 ;; won't eat message text instead.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1320 (goto-char start)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1321 (insert "Comment: You should not see this header\n\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1322 (enriched-decode start end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1323 (vm-energize-urls-in-message-region start end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1324 (goto-char end)
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
1325 (message "Decoding text/enriched... done")
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1326 t ))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1327
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1328 (defun vm-mime-display-external-generic (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1329 (let ((program-list (vm-mime-find-external-viewer
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1330 (car (vm-mm-layout-type layout))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1331 (process (nth 0 (vm-mm-layout-cache layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1332 (tempfile (nth 1 (vm-mm-layout-cache layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1333 (buffer-read-only nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1334 (start (point))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1335 end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1336 (if (and (processp process) (eq (process-status process) 'run))
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1337 t
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1338 (cond ((or (null tempfile) (null (file-exists-p tempfile)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1339 (vm-mime-insert-mime-body layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1340 (setq end (point-marker))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1341 (vm-mime-transfer-decode-region layout start end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1342 (setq tempfile (vm-make-tempfile-name))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1343 (let ((buffer-file-type buffer-file-type)
110
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents: 30
diff changeset
1344 buffer-file-coding-system)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1345 ;; Tell DOS/Windows NT whether the file is binary
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1346 (setq buffer-file-type (not (vm-mime-text-type-p layout)))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1347 ;; Tell XEmacs/MULE not to mess with the bits unless
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1348 ;; this is a text type.
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
1349 (if vm-xemacs-mule-p
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1350 (if (vm-mime-text-type-p layout)
110
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents: 30
diff changeset
1351 (set-buffer-file-coding-system 'no-conversion nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents: 30
diff changeset
1352 (set-buffer-file-coding-system 'binary t)))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1353 (write-region start end tempfile nil 0))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1354 (delete-region start end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1355 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1356 (vm-select-folder-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1357 (setq vm-folder-garbage-alist
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1358 (cons (cons tempfile 'delete-file)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1359 vm-folder-garbage-alist)))))
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1360 (message "Launching %s..." (mapconcat 'identity program-list " "))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1361 (setq process
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1362 (apply 'start-process
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1363 (format "view %25s" (vm-mime-layout-description layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1364 nil (append program-list (list tempfile))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1365 (process-kill-without-query process t)
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
1366 (message "Launching %s... done" (mapconcat 'identity
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1367 program-list
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1368 " "))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1369 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1370 (vm-select-folder-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1371 (setq vm-message-garbage-alist
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1372 (cons (cons process 'delete-process)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1373 vm-message-garbage-alist)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1374 (vm-set-mm-layout-cache layout (list process tempfile))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1375 t )
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1376
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1377 (defun vm-mime-display-internal-application/octet-stream (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1378 (if (vectorp layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1379 (let ((buffer-read-only nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1380 (description (vm-mm-layout-description layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1381 (vm-mime-insert-button
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1382 (format "%-35.35s [%s to save to a file]"
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1383 (vm-mime-layout-description layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1384 (if (vm-mouse-support-possible-p)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1385 "Click mouse-2"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1386 "Press RETURN"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1387 (function
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1388 (lambda (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1389 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1390 (vm-mime-display-internal-application/octet-stream layout))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1391 layout nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1392 (goto-char (vm-extent-start-position layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1393 (setq layout (vm-extent-property layout 'vm-mime-layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1394 ;; support old "name" paramater for application/octet-stream
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1395 ;; but don't override the "filename" parameter extracted from
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1396 ;; Content-Disposition, if any.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1397 (let ((default-filename
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1398 (if (vm-mime-get-disposition-parameter layout "filename")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1399 nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1400 (vm-mime-get-parameter layout "name"))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1401 (vm-mime-send-body-to-file layout default-filename)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1402 t )
126
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
1403 (fset 'vm-mime-display-button-application/octet-stream
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1404 'vm-mime-display-internal-application/octet-stream)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1405
126
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
1406 (defun vm-mime-display-button-application (layout)
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
1407 (vm-mime-display-button-xxxx layout nil))
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
1408
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1409 (defun vm-mime-display-button-image (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1410 (vm-mime-display-button-xxxx layout t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1411
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1412 (defun vm-mime-display-button-audio (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1413 (vm-mime-display-button-xxxx layout nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1414
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1415 (defun vm-mime-display-button-video (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1416 (vm-mime-display-button-xxxx layout t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1417
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1418 (defun vm-mime-display-button-message (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1419 (vm-mime-display-button-xxxx layout t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1420
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1421 (defun vm-mime-display-button-multipart (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1422 (vm-mime-display-button-xxxx layout t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1423
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1424 (defun vm-mime-display-internal-multipart/mixed (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1425 (let ((part-list (vm-mm-layout-parts layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1426 (while part-list
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1427 (vm-decode-mime-layout (car part-list))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1428 (setq part-list (cdr part-list)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1429 t ))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1430
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1431 (defun vm-mime-display-internal-multipart/alternative (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1432 (let (best-layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1433 (cond ((eq vm-mime-alternative-select-method 'best)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1434 (let ((done nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1435 (best nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1436 part-list type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1437 (setq part-list (vm-mm-layout-parts layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1438 part-list (nreverse (copy-sequence part-list)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1439 (while (and part-list (not done))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1440 (setq type (car (vm-mm-layout-type (car part-list))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1441 (if (or (vm-mime-can-display-internal (car part-list))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1442 (vm-mime-find-external-viewer type))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1443 (setq best (car part-list)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1444 done t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1445 (setq part-list (cdr part-list))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1446 (setq best-layout (or best (car (vm-mm-layout-parts layout))))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1447 ((eq vm-mime-alternative-select-method 'best-internal)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1448 (let ((done nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1449 (best nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1450 (second-best nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1451 part-list type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1452 (setq part-list (vm-mm-layout-parts layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1453 part-list (nreverse (copy-sequence part-list)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1454 (while (and part-list (not done))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1455 (setq type (car (vm-mm-layout-type (car part-list))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1456 (cond ((vm-mime-can-display-internal (car part-list))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1457 (setq best (car part-list)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1458 done t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1459 ((and (null second-best)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1460 (vm-mime-find-external-viewer type))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1461 (setq second-best (car part-list))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1462 (setq part-list (cdr part-list)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1463 (setq best-layout (or best second-best
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1464 (car (vm-mm-layout-parts layout)))))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1465 (vm-decode-mime-layout best-layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1466
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1467 (defun vm-mime-display-button-multipart/parallel (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1468 (vm-mime-insert-button
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1469 (format "%-35.35s [%s to display in parallel]"
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1470 (vm-mime-layout-description layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1471 (if (vm-mouse-support-possible-p)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1472 "Click mouse-2"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1473 "Press RETURN"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1474 (function
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1475 (lambda (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1476 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1477 (let ((vm-auto-displayed-mime-content-types t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1478 (vm-decode-mime-layout layout t)))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1479 layout t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1480
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1481 (fset 'vm-mime-display-internal-multipart/parallel
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1482 'vm-mime-display-internal-multipart/mixed)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1483
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1484 (defun vm-mime-display-internal-multipart/digest (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1485 (if (vectorp layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1486 (let ((buffer-read-only nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1487 (vm-mime-insert-button
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1488 (format "%-35.35s [%s to display]"
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1489 (vm-mime-layout-description layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1490 (if (vm-mouse-support-possible-p)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1491 "Click mouse-2"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1492 "Press RETURN"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1493 (function
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1494 (lambda (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1495 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1496 (vm-mime-display-internal-multipart/digest layout))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1497 layout nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1498 (goto-char (vm-extent-start-position layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1499 (setq layout (vm-extent-property layout 'vm-mime-layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1500 (set-buffer (generate-new-buffer (format "digest from %s/%s"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1501 (buffer-name vm-mail-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1502 (vm-number-of
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1503 (car vm-message-pointer)))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1504 (setq vm-folder-type vm-default-folder-type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1505 (vm-mime-burst-layout layout nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1506 (vm-save-buffer-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1507 (vm-goto-new-folder-frame-maybe 'folder)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1508 (vm-mode))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1509 ;; temp buffer, don't offer to save it.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1510 (setq buffer-offer-save nil)
114
8619ce7e4c50 Import from CVS: tag r20-1b9
cvs
parents: 110
diff changeset
1511 (vm-display (or vm-presentation-buffer (current-buffer)) t
8619ce7e4c50 Import from CVS: tag r20-1b9
cvs
parents: 110
diff changeset
1512 (list this-command) '(vm-mode startup)))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1513 t )
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1514 (fset 'vm-mime-display-button-multipart/digest
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1515 'vm-mime-display-internal-multipart/digest)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1516
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1517 (defun vm-mime-display-button-message/rfc822 (layout)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1518 (let ((buffer-read-only nil))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1519 (vm-mime-insert-button
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1520 (format "%-35.35s [%s to display]"
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1521 (vm-mime-layout-description layout)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1522 (if (vm-mouse-support-possible-p)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1523 "Click mouse-2"
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1524 "Press RETURN"))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1525 (function
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1526 (lambda (layout)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1527 (save-excursion
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1528 (vm-mime-display-internal-message/rfc822 layout))))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1529 layout nil)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1530 (fset 'vm-mime-display-button-message/news
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1531 'vm-mime-display-button-message/rfc822)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1532
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1533 (defun vm-mime-display-internal-message/rfc822 (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1534 (if (vectorp layout)
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1535 (vm-mime-display-internal-text/plain layout)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1536 (goto-char (vm-extent-start-position layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1537 (setq layout (vm-extent-property layout 'vm-mime-layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1538 (set-buffer (generate-new-buffer
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1539 (format "message from %s/%s"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1540 (buffer-name vm-mail-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1541 (vm-number-of
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1542 (car vm-message-pointer)))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1543 (setq vm-folder-type vm-default-folder-type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1544 (vm-mime-burst-layout layout nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1545 (set-buffer-modified-p nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1546 (vm-save-buffer-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1547 (vm-goto-new-folder-frame-maybe 'folder)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1548 (vm-mode))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1549 ;; temp buffer, don't offer to save it.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1550 (setq buffer-offer-save nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1551 (vm-display (or vm-presentation-buffer (current-buffer)) t
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1552 (list this-command) '(vm-mode startup)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1553 t )
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1554 (fset 'vm-mime-display-internal-message/news
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1555 'vm-mime-display-internal-message/rfc822)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1556
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1557 (defun vm-mime-display-internal-message/partial (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1558 (if (vectorp layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1559 (let ((buffer-read-only nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1560 (number (vm-mime-get-parameter layout "number"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1561 (total (vm-mime-get-parameter layout "total")))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1562 (vm-mime-insert-button
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1563 (format "%-35.35s [%s to attempt assembly]"
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1564 (concat (vm-mime-layout-description layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1565 (and number (concat ", part " number))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1566 (and number total (concat " of " total)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1567 (if (vm-mouse-support-possible-p)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1568 "Click mouse-2"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1569 "Press RETURN"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1570 (function
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1571 (lambda (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1572 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1573 (vm-mime-display-internal-message/partial layout))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1574 layout nil))
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
1575 (message "Assembling message...")
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1576 (let ((parts nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1577 (missing nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1578 (work-buffer nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1579 extent id o number total m i prev part-header-pos
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1580 p-id p-number p-total p-list)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1581 (setq extent layout
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1582 layout (vm-extent-property extent 'vm-mime-layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1583 id (vm-mime-get-parameter layout "id"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1584 (if (null id)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1585 (vm-mime-error
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1586 "message/partial message missing id parameter"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1587 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1588 (set-buffer (marker-buffer (vm-mm-layout-body-start layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1589 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1590 (save-restriction
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1591 (widen)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1592 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1593 (while (and (search-forward id nil t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1594 (setq m (vm-message-at-point)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1595 (setq o (vm-mm-layout m))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1596 (if (not (vectorp o))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1597 nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1598 (setq p-list (vm-mime-find-message/partials o id))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1599 (while p-list
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1600 (setq p-id (vm-mime-get-parameter (car p-list) "id"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1601 (setq p-total (vm-mime-get-parameter (car p-list) "total"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1602 (if (null p-total)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1603 nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1604 (setq p-total (string-to-int p-total))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1605 (if (< p-total 1)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1606 (vm-mime-error "message/partial specified part total < 0, %d" p-total))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1607 (if total
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1608 (if (not (= total p-total))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1609 (vm-mime-error "message/partial speificed total differs between parts, (%d != %d)" p-total total))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1610 (setq total p-total)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1611 (setq p-number (vm-mime-get-parameter (car p-list) "number"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1612 (if (null p-number)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1613 (vm-mime-error
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1614 "message/partial message missing number parameter"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1615 (setq p-number (string-to-int p-number))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1616 (if (< p-number 1)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1617 (vm-mime-error "message/partial part number < 0, %d"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1618 p-number))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1619 (if (and total (> p-number total))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1620 (vm-mime-error "message/partial part number greater than expected number of parts, (%d > %d)" p-number total))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1621 (setq parts (cons (list p-number (car p-list)) parts)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1622 p-list (cdr p-list))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1623 (goto-char (vm-mm-layout-body-end o))))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1624 (if (null total)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1625 (vm-mime-error "total number of parts not specified in any message/partial part"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1626 (setq parts (sort parts
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1627 (function
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1628 (lambda (p q)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1629 (< (car p)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1630 (car q))))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1631 (setq i 0
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1632 p-list parts)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1633 (while p-list
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1634 (cond ((< i (car (car p-list)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1635 (vm-increment i)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1636 (cond ((not (= i (car (car p-list))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1637 (setq missing (cons i missing)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1638 (t (setq prev p-list
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1639 p-list (cdr p-list)))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1640 (t
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1641 ;; remove duplicate part
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1642 (setcdr prev (cdr p-list))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1643 (setq p-list (cdr p-list)))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1644 (while (< i total)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1645 (vm-increment i)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1646 (setq missing (cons i missing)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1647 (if missing
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1648 (vm-mime-error "part%s %s%s missing"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1649 (if (cdr missing) "s" "")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1650 (mapconcat
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1651 (function identity)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1652 (nreverse (mapcar 'int-to-string
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1653 (or (cdr missing) missing)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1654 ", ")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1655 (if (cdr missing)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1656 (concat " and " (car missing))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1657 "")))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1658 (set-buffer (generate-new-buffer "assembled message"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1659 (setq vm-folder-type vm-default-folder-type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1660 (vm-mime-insert-mime-headers (car (cdr (car parts))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1661 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1662 (vm-reorder-message-headers
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1663 nil nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1664 "\\(Encrypted\\|Content-\\|MIME-Version\\|Message-ID\\|Subject\\|X-VM-\\|Status\\)")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1665 (goto-char (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1666 (setq part-header-pos (point))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1667 (while parts
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1668 (vm-mime-insert-mime-body (car (cdr (car parts))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1669 (setq parts (cdr parts)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1670 (goto-char part-header-pos)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1671 (vm-reorder-message-headers
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1672 nil '("Subject" "MIME-Version" "Content-" "Message-ID" "Encrypted") nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1673 (vm-munge-message-separators vm-folder-type (point-min) (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1674 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1675 (insert (vm-leading-message-separator))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1676 (goto-char (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1677 (insert (vm-trailing-message-separator))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1678 (set-buffer-modified-p nil)
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
1679 (message "Assembling message... done")
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1680 (vm-save-buffer-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1681 (vm-goto-new-folder-frame-maybe 'folder)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1682 (vm-mode))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1683 ;; temp buffer, don't offer to save it.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1684 (setq buffer-offer-save nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1685 (vm-display (or vm-presentation-buffer (current-buffer)) t
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1686 (list this-command) '(vm-mode startup)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1687 t ))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1688 (fset 'vm-mime-display-button-message/partial
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1689 'vm-mime-display-internal-message/partial)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1690
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1691 (defun vm-mime-display-internal-image-xxxx (layout feature name)
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
1692 (if (and vm-xemacs-p
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1693 (featurep feature)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1694 (eq (device-type) 'x))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1695 (let ((start (point)) end tempfile g e
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1696 (buffer-read-only nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1697 (if (vm-mm-layout-cache layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1698 (setq g (vm-mm-layout-cache layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1699 (vm-mime-insert-mime-body layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1700 (setq end (point-marker))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1701 (vm-mime-transfer-decode-region layout start end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1702 (setq tempfile (vm-make-tempfile-name))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1703 ;; coding system for presentation buffer is binary
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1704 (write-region start end tempfile nil 0)
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
1705 (message "Creating %s glyph..." name)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1706 (setq g (make-glyph
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1707 (list (vector feature ':file tempfile)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1708 (vector 'string
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1709 ':data
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1710 (format "[Unknown %s image encoding]\n"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1711 name)))))
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
1712 (message "")
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1713 (vm-set-mm-layout-cache layout g)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1714 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1715 (vm-select-folder-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1716 (setq vm-folder-garbage-alist
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1717 (cons (cons tempfile 'delete-file)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1718 vm-folder-garbage-alist)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1719 (delete-region start end))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1720 (if (not (bolp))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1721 (insert-char ?\n 2)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1722 (insert-char ?\n 1))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1723 (setq e (vm-make-extent (1- (point)) (point)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1724 (vm-set-extent-property e 'begin-glyph g)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1725 t )))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1726
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1727 (defun vm-mime-display-internal-image/gif (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1728 (vm-mime-display-internal-image-xxxx layout 'gif "GIF"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1729
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1730 (defun vm-mime-display-internal-image/jpeg (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1731 (vm-mime-display-internal-image-xxxx layout 'jpeg "JPEG"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1732
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1733 (defun vm-mime-display-internal-image/png (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1734 (vm-mime-display-internal-image-xxxx layout 'png "PNG"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1735
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1736 (defun vm-mime-display-internal-image/tiff (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1737 (vm-mime-display-internal-image-xxxx layout 'tiff "TIFF"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1738
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1739 (defun vm-mime-display-internal-audio/basic (layout)
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
1740 (if (and vm-xemacs-p
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1741 (or (featurep 'native-sound)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1742 (featurep 'nas-sound))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1743 (or (device-sound-enabled-p)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1744 (and (featurep 'native-sound)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1745 (not native-sound-only-on-console)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1746 (eq (device-type) 'x))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1747 (let ((start (point)) end tempfile
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1748 (buffer-read-only nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1749 (if (vm-mm-layout-cache layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1750 (setq tempfile (vm-mm-layout-cache layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1751 (vm-mime-insert-mime-body layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1752 (setq end (point-marker))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1753 (vm-mime-transfer-decode-region layout start end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1754 (setq tempfile (vm-make-tempfile-name))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1755 ;; coding system for presentation buffer is binary
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1756 (write-region start end tempfile nil 0)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1757 (vm-set-mm-layout-cache layout tempfile)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1758 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1759 (vm-select-folder-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1760 (setq vm-folder-garbage-alist
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1761 (cons (cons tempfile 'delete-file)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1762 vm-folder-garbage-alist)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1763 (delete-region start end))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1764 (start-itimer "audioplayer"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1765 (list 'lambda nil (list 'play-sound-file tempfile))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1766 1)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1767 t )
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1768 nil ))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1769
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1770 (defun vm-mime-display-button-xxxx (layout disposable)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1771 (let ((description (vm-mime-layout-description layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1772 (vm-mime-insert-button
131
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1773 (format "%-35.35s [%s to attempt display]"
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1774 description
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1775 (if (vm-mouse-support-possible-p) "Click mouse-2" "Press RETURN"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1776 (function
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1777 (lambda (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1778 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1779 (let ((vm-auto-displayed-mime-content-types t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1780 (vm-decode-mime-layout layout t)))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1781 layout disposable)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1782 t ))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1783
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1784 (defun vm-mime-run-display-function-at-point (&optional function dispose)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1785 (interactive)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1786 ;; save excursion to keep point from moving. its motion would
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1787 ;; drag window point along, to a place arbitrarily far from
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1788 ;; where it was when the user triggered the button.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1789 (save-excursion
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
1790 (cond (vm-fsfemacs-19-p
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1791 (let (o-list o (found nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1792 (setq o-list (overlays-at (point)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1793 (while (and o-list (not found))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1794 (cond ((overlay-get (car o-list) 'vm-mime-layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1795 (setq found t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1796 (funcall (or function (overlay-get (car o-list)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1797 'vm-mime-function))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1798 (car o-list))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1799 (setq o-list (cdr o-list)))))
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
1800 (vm-xemacs-p
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1801 (let ((e (extent-at (point) nil 'vm-mime-layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1802 (funcall (or function (extent-property e 'vm-mime-function))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1803 e))))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1804
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1805 ;; for the karking compiler
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1806 (defvar vm-menu-mime-dispose-menu)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1807
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
1808 (defun vm-mime-set-extent-glyph-for-type (e type)
126
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
1809 (if (and vm-xemacs-p
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
1810 (featurep 'xpm)
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
1811 (eq (device-type) 'x)
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
1812 (> (device-bitplanes) 7))
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
1813 (let ((dir vm-image-directory)
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1814 (colorful (> (device-bitplanes) 15))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1815 (tuples
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1816 '(("text" "document-simple.xpm" "document-colorful.xpm")
126
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
1817 ("image" "mona_stamp-simple.xpm" "mona_stamp-colorful.xpm")
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1818 ("audio" "audio_stamp-simple.xpm" "audio_stamp-colorful.xpm")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1819 ("video" "film-simple.xpm" "film-colorful.xpm")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1820 ("message" "message-simple.xpm" "message-colorful.xpm")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1821 ("application" "gear-simple.xpm" "gear-colorful.xpm")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1822 ("multipart" "stuffed_box-simple.xpm"
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1823 "stuffed_box-colorful.xpm")))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1824 glyph file sym p)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1825 (setq file (catch 'done
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1826 (while tuples
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1827 (if (vm-mime-types-match (car (car tuples)) type)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1828 (throw 'done (car tuples))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1829 (setq tuples (cdr tuples))))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1830 nil)
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
1831 file (and file (if colorful (nth 2 file) (nth 1 file)))
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1832 sym (and file (intern file vm-image-obarray))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1833 glyph (and sym (boundp sym) (symbol-value sym))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1834 glyph (or glyph (not file)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1835 (make-glyph
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1836 (vector 'autodetect
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1837 ':data (expand-file-name file dir)))))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
1838 (and sym (not (boundp sym)) (set sym glyph))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1839 (and glyph (set-extent-begin-glyph e glyph)))))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1840
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1841 (defun vm-mime-insert-button (caption action layout disposable)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1842 (let ((start (point)) e
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1843 (keymap (make-sparse-keymap))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1844 (buffer-read-only nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1845 (if (fboundp 'set-keymap-parents)
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1846 (if (current-local-map)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1847 (set-keymap-parents keymap (list (current-local-map))))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1848 (setq keymap (nconc keymap (current-local-map))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1849 (define-key keymap "\r" 'vm-mime-run-display-function-at-point)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1850 (if (and (vm-mouse-xemacs-mouse-p) vm-popup-menu-on-mouse-3)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1851 (define-key keymap 'button3 'vm-menu-popup-mime-dispose-menu))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1852 (if (not (bolp))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1853 (insert "\n"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1854 (insert caption "\n")
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
1855 ;; we must use the same interface that the vm-extent functions
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
1856 ;; use. if they use overlays, then we call make-overlay.
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
1857 (if (eq (symbol-function 'vm-make-extent) 'make-overlay)
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
1858 ;; we MUST have the five arg make-overlay. overlays must
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
1859 ;; advance when text is inserted at their start position or
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
1860 ;; inline text and graphics will seep into the button
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
1861 ;; overlay and then be removed when the button is removed.
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1862 (setq e (make-overlay start (point) nil t nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1863 (setq e (make-extent start (point)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1864 (set-extent-property e 'start-open t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1865 (set-extent-property e 'end-open t))
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
1866 (vm-mime-set-extent-glyph-for-type e (car (vm-mm-layout-type layout)))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1867 ;; for emacs
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1868 (vm-set-extent-property e 'mouse-face 'highlight)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1869 (vm-set-extent-property e 'local-map keymap)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1870 ;; for xemacs
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1871 (vm-set-extent-property e 'highlight t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1872 (vm-set-extent-property e 'keymap keymap)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1873 (vm-set-extent-property e 'balloon-help 'vm-mouse-3-help)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1874 ;; for all
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1875 (vm-set-extent-property e 'vm-mime-disposable disposable)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1876 (vm-set-extent-property e 'face vm-mime-button-face)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1877 (vm-set-extent-property e 'vm-mime-layout layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1878 (vm-set-extent-property e 'vm-mime-function action)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1879
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1880 (defun vm-mime-rewrite-failed-button (button error-string)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1881 (let* ((buffer-read-only nil)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1882 (start (point)))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1883 (goto-char (vm-extent-start-position button))
131
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
1884 (insert (format "DISPLAY FAILED -- %s\n" error-string))
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1885 (vm-set-extent-endpoints button start (vm-extent-end-position button))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1886 (delete-region (point) (vm-extent-end-position button))))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1887
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1888 (defun vm-mime-send-body-to-file (layout &optional default-filename)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1889 (if (not (vectorp layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1890 (setq layout (vm-extent-property layout 'vm-mime-layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1891 (or default-filename
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1892 (setq default-filename
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1893 (vm-mime-get-disposition-parameter layout "filename")))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1894 (and default-filename
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1895 (setq default-filename (file-name-nondirectory default-filename)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1896 (let ((work-buffer nil)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1897 ;; evade the XEmacs dialog box, yeccch.
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1898 (use-dialog-box nil)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1899 (dir vm-mime-attachment-save-directory)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1900 (done nil)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1901 file)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1902 (while (not done)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1903 (setq file
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1904 (read-file-name
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1905 (if default-filename
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1906 (format "Write MIME body to file (default %s): "
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1907 default-filename)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1908 "Write MIME body to file: ")
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1909 dir default-filename)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1910 file (expand-file-name file dir))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1911 (if (not (file-directory-p file))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1912 (setq done t)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1913 (if default-filename
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1914 (message "%s is a directory" file)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1915 (error "%s is a directory" file))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1916 (sit-for 2)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1917 (setq dir file
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1918 default-filename (if (string-match "/$" file)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1919 (concat file default-filename)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1920 (concat file "/" default-filename)))))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1921 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1922 (unwind-protect
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1923 (progn
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1924 (setq work-buffer (generate-new-buffer " *vm-work*"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1925 (buffer-disable-undo work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1926 (set-buffer work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1927 ;; Tell DOS/Windows NT whether the file is binary
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1928 (setq buffer-file-type (not (vm-mime-text-type-p layout)))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1929 ;; Tell XEmacs/MULE not to mess with the bits unless
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1930 ;; this is a text type.
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
1931 (if vm-xemacs-mule-p
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
1932 (if (vm-mime-text-type-p layout)
110
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents: 30
diff changeset
1933 (set-buffer-file-coding-system 'no-conversion nil)
fe104dbd9147 Import from CVS: tag r20-1b7
cvs
parents: 30
diff changeset
1934 (set-buffer-file-coding-system 'binary t)))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1935 (vm-mime-insert-mime-body layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1936 (vm-mime-transfer-decode-region layout (point-min) (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1937 (or (not (file-exists-p file))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1938 (y-or-n-p "File exists, overwrite? ")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1939 (error "Aborted"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1940 (write-region (point-min) (point-max) file nil nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1941 (and work-buffer (kill-buffer work-buffer))))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1942
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1943 (defun vm-mime-pipe-body-to-command (command layout &optional discard-output)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1944 (if (not (vectorp layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1945 (setq layout (vm-extent-property layout 'vm-mime-layout)))
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1946 (let ((output-buffer (if discard-output
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1947 0
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1948 (get-buffer-create "*Shell Command Output*")))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1949 (work-buffer nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1950 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1951 (if (bufferp output-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1952 (progn
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1953 (set-buffer output-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1954 (erase-buffer)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1955 (unwind-protect
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1956 (progn
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1957 (setq work-buffer (generate-new-buffer " *vm-work*"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1958 (buffer-disable-undo work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1959 (set-buffer work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1960 (vm-mime-insert-mime-body layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1961 (vm-mime-transfer-decode-region layout (point-min) (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1962 (let ((pop-up-windows (and pop-up-windows
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1963 (eq vm-mutable-windows t)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1964 ;; Tell DOS/Windows NT whether the input is binary
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1965 (binary-process-input (not (vm-mime-text-type-p layout))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1966 (call-process-region (point-min) (point-max)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1967 (or shell-file-name "sh")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1968 nil output-buffer nil
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1969 shell-command-switch command)))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1970 (and work-buffer (kill-buffer work-buffer)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1971 (if (bufferp output-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1972 (progn
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1973 (set-buffer output-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1974 (if (not (zerop (buffer-size)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1975 (vm-display output-buffer t (list this-command)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1976 '(vm-pipe-message-to-command))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1977 (vm-display nil nil (list this-command)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1978 '(vm-pipe-message-to-command)))))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1979 t )
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
1980
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1981 (defun vm-mime-pipe-body-to-queried-command (layout &optional discard-output)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1982 (let ((command (read-string "Pipe to command: ")))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1983 (vm-mime-pipe-body-to-command command layout discard-output)))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1984
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1985 (defun vm-mime-pipe-body-to-queried-command-discard-output (layout)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1986 (vm-mime-pipe-body-to-queried-command layout t))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1987
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1988 (defun vm-mime-send-body-to-printer (layout)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1989 (vm-mime-pipe-body-to-command (mapconcat (function identity)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1990 (nconc (list vm-print-command)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1991 vm-print-command-switches)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1992 " ")
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1993 layout))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1994
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1995 (defun vm-mime-display-body-as-text (button)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1996 (let ((vm-auto-displayed-mime-content-types '("text/plain"))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1997 (layout (copy-sequence (vm-extent-property button 'vm-mime-layout))))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1998 (vm-set-extent-property button 'vm-mime-disposable t)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
1999 (vm-set-extent-property button 'vm-mime-layout layout)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2000 ;; not universally correct, but close enough.
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2001 (vm-set-mm-layout-type layout '("text/plain" "charset=us-ascii"))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2002 (goto-char (vm-extent-start-position button))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2003 (vm-decode-mime-layout button t)))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2004
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2005 (defun vm-mime-display-body-using-external-viewer (button)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2006 (let ((layout (vm-extent-property button 'vm-mime-layout)))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2007 (goto-char (vm-extent-start-position button))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2008 (if (not (vm-mime-find-external-viewer (car (vm-mm-layout-type layout))))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2009 (error "No viewer defined for type %s"
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2010 (car (vm-mm-layout-type layout)))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2011 (vm-mime-display-external-generic layout))))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2012
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2013 (defun vm-mime-scrub-description (string)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2014 (let ((work-buffer nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2015 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2016 (unwind-protect
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2017 (progn
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2018 (setq work-buffer (generate-new-buffer " *vm-work*"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2019 (buffer-disable-undo work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2020 (set-buffer work-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2021 (insert string)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2022 (while (re-search-forward "[ \t\n]+" nil t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2023 (replace-match " "))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2024 (buffer-string))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2025 (and work-buffer (kill-buffer work-buffer))))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2026
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2027 (defun vm-mime-layout-description (layout)
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2028 (let ((type (car (vm-mm-layout-type layout)))
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2029 description name)
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2030 (setq description
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2031 (if (vm-mm-layout-description layout)
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2032 (vm-mime-scrub-description (vm-mm-layout-description layout))))
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2033 (concat
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2034 (if description description "")
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2035 (if description ", " "")
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2036 (cond ((vm-mime-types-match "multipart/digest" type)
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2037 (let ((n (length (vm-mm-layout-parts layout))))
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2038 (format "digest (%d message%s)" n (if (= n 1) "" "s"))))
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2039 ((vm-mime-types-match "multipart/alternative" type)
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2040 "multipart alternative")
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2041 ((vm-mime-types-match "multipart" type)
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2042 (let ((n (length (vm-mm-layout-parts layout))))
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2043 (format "multipart message (%d part%s)" n (if (= n 1) "" "s"))))
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2044 ((vm-mime-types-match "text/plain" type)
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2045 (format "plain text%s"
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2046 (let ((charset (vm-mime-get-parameter layout "charset")))
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2047 (if charset
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2048 (concat ", " charset)
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2049 ""))))
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2050 ((vm-mime-types-match "text/enriched" type)
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2051 "enriched text")
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2052 ((vm-mime-types-match "text/html" type)
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2053 "HTML")
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2054 ((vm-mime-types-match "image/gif" type)
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2055 "GIF image")
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2056 ((vm-mime-types-match "image/jpeg" type)
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2057 "JPEG image")
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2058 ((and (vm-mime-types-match "application/octet-stream" type)
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2059 (setq name (vm-mime-get-parameter layout "name"))
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2060 (save-match-data (not (string-match "^[ \t]*$" name))))
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2061 name)
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2062 (t type)))))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2063
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2064 (defun vm-mime-layout-contains-type (layout type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2065 (if (vm-mime-types-match type (car (vm-mm-layout-type layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2066 layout
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2067 (let ((p (vm-mm-layout-parts layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2068 (result nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2069 (done nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2070 (while (and p (not done))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2071 (if (setq result (vm-mime-layout-contains-type (car p) type))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2072 (setq done t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2073 (setq p (cdr p))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2074 result )))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2075
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2076 (defun vm-mime-plain-message-p (m)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2077 (save-match-data
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2078 (let ((o (vm-mm-layout m))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2079 (case-fold-search t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2080 (and (eq (vm-mm-encoded-header m) 'none)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2081 (or (not (vectorp o))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2082 (and (vm-mime-types-match "text/plain"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2083 (car (vm-mm-layout-type o)))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2084 (let* ((charset (or (vm-mime-get-parameter o "charset")
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2085 "us-ascii")))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2086 (vm-string-member charset vm-mime-default-face-charsets))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2087 (string-match "^\\(7bit\\|8bit\\|binary\\)$"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2088 (vm-mm-layout-encoding o))))))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2089
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2090 (defun vm-mime-text-type-p (layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2091 (or (vm-mime-types-match "text" (car (vm-mm-layout-type layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2092 (vm-mime-types-match "message" (car (vm-mm-layout-type layout)))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2093
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2094 (defun vm-mime-charset-internally-displayable-p (name)
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
2095 (cond ((and vm-xemacs-mule-p (eq (device-type) 'x))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2096 (vm-string-assoc name vm-mime-mule-charset-to-coding-alist))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2097 ((vm-multiple-fonts-possible-p)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2098 (or (vm-string-member name vm-mime-default-face-charsets)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2099 (vm-string-assoc name vm-mime-charset-font-alist)))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2100 (t
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2101 (vm-string-member name vm-mime-default-face-charsets))))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2102
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2103 (defun vm-mime-find-message/partials (layout id)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2104 (let ((list nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2105 (type (vm-mm-layout-type layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2106 (cond ((vm-mime-types-match "multipart" (car type))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2107 (let ((parts (vm-mm-layout-parts layout)) o)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2108 (while parts
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2109 (setq o (vm-mime-find-message/partials (car parts) id))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2110 (if o
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2111 (setq list (nconc o list)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2112 (setq parts (cdr parts)))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2113 ((vm-mime-types-match "message/partial" (car type))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2114 (if (equal (vm-mime-get-parameter layout "id") id)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2115 (setq list (cons layout list)))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2116 list ))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2117
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2118 (defun vm-message-at-point ()
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2119 (let ((mp vm-message-list)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2120 (point (point))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2121 (done nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2122 (while (and mp (not done))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2123 (if (and (>= point (vm-start-of (car mp)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2124 (<= point (vm-end-of (car mp))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2125 (setq done t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2126 (setq mp (cdr mp))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2127 (car mp)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2128
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2129 (defun vm-mime-make-multipart-boundary ()
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
2130 (let ((boundary (make-string 10 ?a))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2131 (i 0))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2132 (random t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2133 (while (< i (length boundary))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2134 (aset boundary i (aref vm-mime-base64-alphabet
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2135 (% (vm-abs (lsh (random) -8))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2136 (length vm-mime-base64-alphabet))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2137 (vm-increment i))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2138 boundary ))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2139
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2140 (defun vm-mime-attach-file (file type &optional charset description)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2141 "Attach a file to a VM composition buffer to be sent along with the message.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2142 The file is not inserted into the buffer and MIME encoded until
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2143 you execute vm-mail-send or vm-mail-send-and-exit. A visible tag
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2144 indicating the existence of the attachment is placed in the
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2145 composition buffer. You can move the attachment around or remove
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2146 it entirely with normal text editing commands. If you remove the
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2147 attachment tag, the attachment will not be sent.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2148
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2149 First argument, FILE, is the name of the file to attach. Second
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2150 argument, TYPE, is the MIME Content-Type of the file. Optional
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2151 third argument CHARSET is the character set of the attached
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2152 document. This argument is only used for text types, and it is
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2153 ignored for other types. Optional fourth argument DESCRIPTION
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2154 should be a one line description of the file.
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2155
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2156 When called interactively all arguments are read from the
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2157 minibuffer.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2158
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2159 This command is for attaching files that do not have a MIME
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2160 header section at the top. For files with MIME headers, you
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2161 should use vm-mime-attach-mime-file to attach such a file. VM
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2162 will extract the content type information from the headers in
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2163 this case and not prompt you for it in the minibuffer."
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2164 (interactive
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2165 ;; protect value of last-command and this-command
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2166 (let ((last-command last-command)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2167 (this-command this-command)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2168 (charset nil)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2169 description file default-type type)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2170 (if (null vm-send-using-mime)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2171 (error "MIME attachments disabled, set vm-send-using-mime non-nil to enable."))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2172 (setq file (vm-read-file-name "Attach file: " nil nil t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2173 default-type (or (vm-mime-default-type-from-filename file)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2174 "application/octet-stream")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2175 type (completing-read
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2176 (format "Content type (default %s): "
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2177 default-type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2178 vm-mime-type-completion-alist)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2179 type (if (> (length type) 0) type default-type))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2180 (if (vm-mime-types-match "text" type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2181 (setq charset (completing-read "Character set (default US-ASCII): "
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2182 vm-mime-charset-completion-alist)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2183 charset (if (> (length charset) 0) charset)))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2184 (setq description (read-string "One line description: "))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2185 (if (string-match "^[ \t]*$" description)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2186 (setq description nil))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2187 (list file type charset description)))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2188 (if (null vm-send-using-mime)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2189 (error "MIME attachments disabled, set vm-send-using-mime non-nil to enable."))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2190 (if (file-directory-p file)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2191 (error "%s is a directory, cannot attach" file))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2192 (if (not (file-exists-p file))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2193 (error "No such file: %s" file))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2194 (if (not (file-readable-p file))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2195 (error "You don't have permission to read %s" file))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2196 (and charset (setq charset (list (concat "charset=" charset))))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2197 (and description (setq description (vm-mime-scrub-description description)))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2198 (vm-mime-attach-object file type charset description nil))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2199
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2200 (defun vm-mime-attach-mime-file (file)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2201 "Attach a MIME encoded file to a VM composition buffer to be sent
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2202 along with the message.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2203
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2204 The file is not inserted into the buffer until you execute
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2205 vm-mail-send or vm-mail-send-and-exit. A visible tag indicating
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2206 the existence of the attachment is placed in the composition
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2207 buffer. You can move the attachment around or remove it entirely
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2208 with normal text editing commands. If you remove the attachment
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2209 tag, the attachment will not be sent.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2210
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2211 The sole argument, FILE, is the name of the file to attach.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2212 When called interactively the FILE argument is read from the
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2213 minibuffer.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2214
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2215 This command is for attaching files that have a MIME
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2216 header section at the top. For files without MIME headers, you
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2217 should use vm-mime-attach-file to attach such a file. VM
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2218 will interactively query you for the file type information."
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2219 (interactive
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2220 ;; protect value of last-command and this-command
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2221 (let ((last-command last-command)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2222 (this-command this-command)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2223 file)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2224 (if (null vm-send-using-mime)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2225 (error "MIME attachments disabled, set vm-send-using-mime non-nil to enable."))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2226 (setq file (vm-read-file-name "Attach file: " nil nil t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2227 (list file)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2228 (if (null vm-send-using-mime)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2229 (error "MIME attachments disabled, set vm-send-using-mime non-nil to enable."))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2230 (if (file-directory-p file)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2231 (error "%s is a directory, cannot attach" file))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2232 (if (not (file-exists-p file))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2233 (error "No such file: %s" file))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2234 (if (not (file-readable-p file))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2235 (error "You don't have permission to read %s" file))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2236 (vm-mime-attach-object file nil nil nil t))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2237
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2238 (defun vm-mime-attach-object (object type params description mimed)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2239 (if (not (eq major-mode 'mail-mode))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2240 (error "Command must be used in a VM Mail mode buffer."))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2241 (let (start end e tag-string disposition)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2242 (if (< (point) (save-excursion (mail-text) (point)))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2243 (mail-text))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2244 (setq start (point)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2245 tag-string (format "[ATTACHMENT %s, %s]" object
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2246 (or type "MIME file")))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2247 (insert tag-string "\n")
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2248 (setq end (1- (point)))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2249 (if (and (stringp object) (not mimed))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2250 (progn
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2251 (if (or (vm-mime-types-match "application" type)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2252 (vm-mime-types-match "model" type))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2253 (setq disposition (list "attachment"))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2254 (setq disposition (list "inline")))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2255 (setq disposition (nconc disposition
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2256 (list
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2257 (concat "filename=\""
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2258 (file-name-nondirectory object)
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2259 "\"")))))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2260 (setq disposition (list "unspecified")))
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
2261 (cond (vm-fsfemacs-19-p
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2262 (put-text-property start end 'front-sticky nil)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2263 (put-text-property start end 'rear-nonsticky t)
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2264 ;; can't be intangible because menu clicking at a position needs
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2265 ;; to set point inside the tag so that a command can access the
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2266 ;; text properties there.
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2267 ;; (put-text-property start end 'intangible object)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2268 (put-text-property start end 'face vm-mime-button-face)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2269 (put-text-property start end 'vm-mime-type type)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2270 (put-text-property start end 'vm-mime-object object)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2271 (put-text-property start end 'vm-mime-parameters params)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2272 (put-text-property start end 'vm-mime-description description)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2273 (put-text-property start end 'vm-mime-disposition disposition)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2274 (put-text-property start end 'vm-mime-encoded mimed)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2275 (put-text-property start end 'vm-mime-object object))
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
2276 (vm-xemacs-p
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2277 (setq e (make-extent start end))
126
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
2278 (vm-mime-set-extent-glyph-for-type e (or type "text/plain"))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2279 (set-extent-property e 'start-open t)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2280 (set-extent-property e 'face vm-mime-button-face)
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2281 (set-extent-property e 'duplicable t)
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2282 (let ((keymap (make-sparse-keymap)))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2283 (if vm-popup-menu-on-mouse-3
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2284 (define-key keymap 'button3
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2285 'vm-menu-popup-content-disposition-menu))
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2286 (set-extent-property e 'keymap keymap)
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2287 (set-extent-property e 'balloon-help 'vm-mouse-3-help))
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2288 (set-extent-property e 'vm-mime-type type)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2289 (set-extent-property e 'vm-mime-object object)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2290 (set-extent-property e 'vm-mime-parameters params)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2291 (set-extent-property e 'vm-mime-description description)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2292 (set-extent-property e 'vm-mime-disposition disposition)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2293 (set-extent-property e 'vm-mime-encoded mimed)))))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2294
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2295 (defun vm-mime-attachment-disposition-at-point ()
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
2296 (cond (vm-fsfemacs-19-p
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2297 (let ((disp (get-text-property (point) 'vm-mime-disposition)))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2298 (intern (car disp))))
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
2299 (vm-xemacs-p
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2300 (let* ((e (extent-at (point) nil 'vm-mime-disposition))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2301 (disp (extent-property e 'vm-mime-disposition)))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2302 (intern (car disp))))))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2303
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2304 (defun vm-mime-set-attachment-disposition-at-point (sym)
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
2305 (cond (vm-fsfemacs-19-p
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2306 (let ((disp (get-text-property (point) 'vm-mime-disposition)))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2307 (setcar disp (symbol-name sym))))
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
2308 (vm-xemacs-p
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2309 (let* ((e (extent-at (point) nil 'vm-mime-disposition))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2310 (disp (extent-property e 'vm-mime-disposition)))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2311 (setcar disp (symbol-name sym))))))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2312
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2313 (defun vm-disallow-overlay-endpoint-insertion (overlay after start end
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2314 &optional old-size)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2315 (cond ((null after) nil)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2316 ((= start (overlay-start overlay))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2317 (move-overlay overlay end (overlay-end overlay)))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2318 ((= start (overlay-end overlay))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2319 (move-overlay overlay (overlay-start overlay) start))))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2320
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2321 (defun vm-mime-fake-attachment-overlays (start end)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2322 (let ((o-list nil)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2323 (done nil)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2324 (pos start)
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
2325 object props o)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2326 (save-excursion
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2327 (save-restriction
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2328 (narrow-to-region start end)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2329 (while (not done)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2330 (setq object (get-text-property pos 'vm-mime-object))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2331 (setq pos (next-single-property-change pos 'vm-mime-object))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2332 (or pos (setq pos (point-max) done t))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2333 (if object
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2334 (progn
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2335 (setq o (make-overlay start pos))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2336 (overlay-put o 'insert-in-front-hooks
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2337 '(vm-disallow-overlay-endpoint-insertion))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2338 (overlay-put o 'insert-behind-hooks
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2339 '(vm-disallow-overlay-endpoint-insertion))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2340 (setq props (text-properties-at start))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2341 (while props
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2342 (overlay-put o (car props) (car (cdr props)))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2343 (setq props (cdr (cdr props))))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2344 (setq o-list (cons o o-list))))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2345 (setq start pos))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2346 o-list ))))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2347
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2348 (defun vm-mime-default-type-from-filename (file)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2349 (let ((alist vm-mime-attachment-auto-type-alist)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2350 (case-fold-search t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2351 (done nil))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2352 (while (and alist (not done))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2353 (if (string-match (car (car alist)) file)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2354 (setq done t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2355 (setq alist (cdr alist))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2356 (and alist (cdr (car alist)))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2357
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2358 (defun vm-remove-mail-mode-header-separator ()
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2359 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2360 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2361 (if (re-search-forward (concat "^" mail-header-separator "$") nil t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2362 (progn
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2363 (delete-region (match-beginning 0) (match-end 0))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2364 t )
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2365 nil )))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2366
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2367 (defun vm-add-mail-mode-header-separator ()
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2368 (save-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2369 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2370 (if (re-search-forward "^$" nil t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2371 (replace-match mail-header-separator t t))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2372
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2373 (defun vm-mime-transfer-encode-region (encoding beg end crlf)
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2374 (let ((case-fold-search t)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2375 (armor-from (and vm-mime-composition-armor-from-lines
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2376 (let ((case-fold-search nil))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2377 (save-excursion
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2378 (goto-char beg)
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2379 (re-search-forward "^From " nil t))))))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2380 (cond ((string-match "^binary$" encoding)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2381 (vm-mime-base64-encode-region beg end crlf)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2382 (setq encoding "base64"))
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2383 ((and (not armor-from) (string-match "^7bit$" encoding)) t)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2384 ((string-match "^base64$" encoding) t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2385 ((string-match "^quoted-printable$" encoding) t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2386 ((eq vm-mime-8bit-text-transfer-encoding 'quoted-printable)
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2387 (vm-mime-qp-encode-region beg end nil armor-from)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2388 (setq encoding "quoted-printable"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2389 ((eq vm-mime-8bit-text-transfer-encoding 'base64)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2390 (vm-mime-base64-encode-region beg end crlf)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2391 (setq encoding "base64"))
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2392 (armor-from (vm-mime-qp-encode-region beg end nil armor-from))
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2393 ((eq vm-mime-8bit-text-transfer-encoding '8bit) t))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2394 encoding ))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2395
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2396 (defun vm-mime-transfer-encode-layout (layout)
126
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
2397 (let ((encoding
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
2398 (vm-mime-transfer-encode-region (vm-mm-layout-encoding layout)
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
2399 (vm-mm-layout-body-start layout)
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
2400 (vm-mm-layout-body-end layout)
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
2401 (vm-mime-text-type-p layout))))
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
2402 (save-excursion
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
2403 (save-restriction
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
2404 (goto-char (vm-mm-layout-header-start layout))
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
2405 (narrow-to-region (point) (vm-mm-layout-body-start layout))
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
2406 (vm-reorder-message-headers nil nil "Content-Transfer-Encoding:")
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
2407 (insert "Content-Transfer-Encoding: " encoding "\n")))))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2408
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2409 (defun vm-mime-encode-composition ()
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2410 "MIME encode the current mail composition buffer.
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2411 Attachment tags added to the buffer with vm-mime-attach-file are expanded
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2412 and the approriate content-type and boundary markup information is added."
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2413 (interactive)
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
2414 (cond (vm-xemacs-mule-p
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2415 (vm-mime-xemacs-encode-composition))
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
2416 (vm-xemacs-p
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2417 (vm-mime-xemacs-encode-composition))
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
2418 (vm-fsfemacs-19-p
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2419 (vm-mime-fsfemacs-encode-composition))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2420 (t
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2421 (error "don't know how to MIME encode composition for %s"
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2422 (emacs-version)))))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2423
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2424 (defun vm-mime-xemacs-encode-composition ()
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2425 (save-restriction
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2426 (widen)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2427 (if (not (eq major-mode 'mail-mode))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2428 (error "Command must be used in a VM Mail mode buffer."))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2429 (or (null (vm-mail-mode-get-header-contents "MIME-Version:"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2430 (error "Message is already MIME encoded."))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2431 (let ((8bit nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2432 (just-one nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2433 (boundary-positions nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2434 already-mimed layout e e-list boundary
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2435 type encoding charset params description disposition object
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2436 opoint-min)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2437 (mail-text)
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2438 (setq e-list (extent-list nil (point) (point-max))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2439 e-list (vm-delete (function
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2440 (lambda (e)
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2441 (extent-property e 'vm-mime-object)))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2442 e-list t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2443 e-list (sort e-list (function
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2444 (lambda (e1 e2)
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2445 (< (extent-end-position e1)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2446 (extent-end-position e2))))))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2447 ;; If there's just one attachment and no other readable
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2448 ;; text in the buffer then make the message type just be
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2449 ;; the attachment type rather than sending a multipart
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2450 ;; message with one attachment
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2451 (setq just-one (and (= (length e-list) 1)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2452 (looking-at "[ \t\n]*")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2453 (= (match-end 0)
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2454 (extent-start-position (car e-list)))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2455 (save-excursion
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2456 (goto-char (extent-end-position (car e-list)))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2457 (looking-at "[ \t\n]*\\'"))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2458 (if (null e-list)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2459 (progn
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2460 (narrow-to-region (point) (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2461 (setq charset (vm-determine-proper-charset (point-min)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2462 (point-max)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2463 (setq encoding (vm-determine-proper-content-transfer-encoding
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2464 (point-min)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2465 (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2466 encoding (vm-mime-transfer-encode-region encoding
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2467 (point-min)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2468 (point-max)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2469 t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2470 (widen)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2471 (vm-remove-mail-mode-header-separator)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2472 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2473 (vm-reorder-message-headers
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2474 nil nil "\\(Content-Type:\\|Content-Transfer-Encoding\\|MIME-Version:\\)")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2475 (insert "MIME-Version: 1.0\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2476 (insert "Content-Type: text/plain; charset=" charset "\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2477 (insert "Content-Transfer-Encoding: " encoding "\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2478 (vm-add-mail-mode-header-separator))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2479 (while e-list
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2480 (setq e (car e-list))
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2481 (if (or just-one (= (point) (extent-start-position e)))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2482 nil
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2483 (narrow-to-region (point) (extent-start-position e))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2484 (setq charset (vm-determine-proper-charset (point-min)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2485 (point-max)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2486 (setq encoding (vm-determine-proper-content-transfer-encoding
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2487 (point-min)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2488 (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2489 encoding (vm-mime-transfer-encode-region encoding
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2490 (point-min)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2491 (point-max)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2492 t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2493 (setq boundary-positions (cons (point-marker) boundary-positions))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2494 (insert "Content-Type: text/plain; charset=" charset "\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2495 (insert "Content-Transfer-Encoding: " encoding "\n\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2496 (widen))
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2497 (goto-char (extent-start-position e))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2498 (narrow-to-region (point) (point))
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2499 (setq object (extent-property e 'vm-mime-object))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2500 ;; insert the object
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2501 (cond ((bufferp object)
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2502 (insert-buffer-substring object))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2503 ((stringp object)
131
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
2504 (let ((coding-system-for-read 'no-conversion)
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
2505 ;; don't let file-coding-system be changed
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
2506 ;; by insert-file-contents-literally. The
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
2507 ;; value we bind to it to here isn't important.
869e1851236b Import from CVS: tag xemacs-20-1p4
cvs
parents: 126
diff changeset
2508 (buffer-file-coding-system 'no-conversion))
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2509 (insert-file-contents-literally object))))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2510 ;; gather information about the object from the extent.
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2511 (if (setq already-mimed (extent-property e 'vm-mime-encoded))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2512 (setq layout (vm-mime-parse-entity
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2513 nil (list "text/plain" "charset=us-ascii")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2514 "7bit")
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2515 type (or (extent-property e 'vm-mime-type)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2516 (car (vm-mm-layout-type layout)))
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2517 params (or (extent-property e 'vm-mime-parameters)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2518 (cdr (vm-mm-layout-qtype layout)))
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2519 description (extent-property e 'vm-mime-description)
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2520 disposition
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2521 (if (not
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2522 (equal
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2523 (car (extent-property e 'vm-mime-disposition))
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2524 "unspecified"))
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2525 (extent-property e 'vm-mime-disposition)
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2526 (vm-mm-layout-qdisposition layout)))
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2527 (setq type (extent-property e 'vm-mime-type)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2528 params (extent-property e 'vm-mime-parameters)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2529 description (extent-property e 'vm-mime-description)
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2530 disposition
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2531 (if (not (equal
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2532 (car (extent-property e 'vm-mime-disposition))
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2533 "unspecified"))
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2534 (extent-property e 'vm-mime-disposition)
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2535 nil)))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2536 (cond ((vm-mime-types-match "text" type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2537 (setq encoding
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2538 (vm-determine-proper-content-transfer-encoding
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2539 (if already-mimed
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2540 (vm-mm-layout-body-start layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2541 (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2542 (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2543 encoding (vm-mime-transfer-encode-region
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2544 encoding
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2545 (if already-mimed
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2546 (vm-mm-layout-body-start layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2547 (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2548 (point-max)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2549 t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2550 (setq 8bit (or 8bit (equal encoding "8bit"))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2551 ((or (vm-mime-types-match "message/rfc822" type)
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2552 (vm-mime-types-match "message/news" type)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2553 (vm-mime-types-match "multipart" type))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2554 (setq opoint-min (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2555 (if (not already-mimed)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2556 (setq layout (vm-mime-parse-entity
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2557 nil (list "text/plain" "charset=us-ascii")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2558 "7bit")))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2559 ;; MIME messages of type "message" and
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2560 ;; "multipart" are required to have a non-opaque
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2561 ;; content transfer encoding. This means that
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2562 ;; if the user only wants to send out 7bit data,
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2563 ;; then any subpart that contains 8bit data must
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2564 ;; have an opaque (qp or base64) 8->7bit
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2565 ;; conversion performed on it so that the
126
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
2566 ;; enclosing entity can use a non-opaque
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2567 ;; encoding.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2568 ;;
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2569 ;; message/partial requires a "7bit" encoding so
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2570 ;; force 8->7 conversion in that case.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2571 (let ((vm-mime-8bit-text-transfer-encoding
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2572 (if (vm-mime-types-match "message/partial" type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2573 'quoted-printable
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2574 vm-mime-8bit-text-transfer-encoding)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2575 (vm-mime-map-atomic-layouts 'vm-mime-transfer-encode-layout
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2576 (vm-mm-layout-parts layout)))
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
2577 ;; now figure out a proper content transfer
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2578 ;; encoding value for the enclosing entity.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2579 (re-search-forward "^\n" nil t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2580 (save-restriction
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2581 (narrow-to-region (point) (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2582 (setq encoding
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2583 (vm-determine-proper-content-transfer-encoding
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2584 (point-min)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2585 (point-max))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2586 (setq 8bit (or 8bit (equal encoding "8bit")))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2587 (goto-char (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2588 (widen)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2589 (narrow-to-region opoint-min (point)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2590 (t
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2591 (vm-mime-base64-encode-region
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2592 (if already-mimed
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2593 (vm-mm-layout-body-start layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2594 (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2595 (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2596 (setq encoding "base64")))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2597 (if just-one
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2598 nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2599 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2600 (setq boundary-positions (cons (point-marker) boundary-positions))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2601 (if (not already-mimed)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2602 nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2603 ;; trim headers
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2604 (vm-reorder-message-headers
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2605 nil (nconc (list "Content-Disposition:" "Content-ID:")
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2606 (if description
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2607 (list "Content-Description:")
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2608 nil))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2609 nil)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2610 ;; remove header/text separator
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2611 (goto-char (1- (vm-mm-layout-body-start layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2612 (if (looking-at "\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2613 (delete-char 1)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2614 (insert "Content-Type: " type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2615 (if params
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2616 (if vm-mime-avoid-folding-content-type
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2617 (insert "; " (mapconcat 'identity params "; ") "\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2618 (insert ";\n\t" (mapconcat 'identity params ";\n\t") "\n"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2619 (insert "\n"))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2620 (and description
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2621 (insert "Content-Description: " description "\n"))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2622 (if disposition
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2623 (progn
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2624 (insert "Content-Disposition: " (car disposition))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2625 (if (cdr disposition)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2626 (insert ";\n\t" (mapconcat 'identity
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2627 (cdr disposition)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2628 ";\n\t")))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2629 (insert "\n")))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2630 (insert "Content-Transfer-Encoding: " encoding "\n\n"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2631 (goto-char (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2632 (widen)
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2633 (save-excursion
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2634 (goto-char (extent-start-position e))
30
ec9a17fef872 Import from CVS: tag r19-15b98
cvs
parents: 26
diff changeset
2635 (vm-assert (looking-at "\\[ATTACHMENT")))
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2636 (delete-region (extent-start-position e)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2637 (extent-end-position e))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2638 (detach-extent e)
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2639 (if (looking-at "\n")
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2640 (delete-char 1))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2641 (setq e-list (cdr e-list)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2642 ;; handle the remaining chunk of text after the last
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2643 ;; extent, if any.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2644 (if (or just-one (= (point) (point-max)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2645 nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2646 (setq charset (vm-determine-proper-charset (point)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2647 (point-max)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2648 (setq encoding (vm-determine-proper-content-transfer-encoding
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2649 (point)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2650 (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2651 encoding (vm-mime-transfer-encode-region encoding
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2652 (point)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2653 (point-max)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2654 t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2655 (setq 8bit (or 8bit (equal encoding "8bit")))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2656 (setq boundary-positions (cons (point-marker) boundary-positions))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2657 (insert "Content-Type: text/plain; charset=" charset "\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2658 (insert "Content-Transfer-Encoding: " encoding "\n\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2659 (goto-char (point-max)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2660 (setq boundary (vm-mime-make-multipart-boundary))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2661 (mail-text)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2662 (while (re-search-forward (concat "^--"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2663 (regexp-quote boundary)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2664 "\\(--\\)?$")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2665 nil t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2666 (setq boundary (vm-mime-make-multipart-boundary))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2667 (mail-text))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2668 (goto-char (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2669 (or just-one (insert "\n--" boundary "--\n"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2670 (while boundary-positions
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2671 (goto-char (car boundary-positions))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2672 (insert "\n--" boundary "\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2673 (setq boundary-positions (cdr boundary-positions)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2674 (if (and just-one already-mimed)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2675 (progn
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2676 (goto-char (vm-mm-layout-header-start layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2677 ;; trim headers
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2678 (vm-reorder-message-headers
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2679 nil '("Content-Description:" "Content-ID:") nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2680 ;; remove header/text separator
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2681 (goto-char (1- (vm-mm-layout-body-start layout)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2682 (if (looking-at "\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2683 (delete-char 1))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2684 ;; copy remainder to enclosing entity's header section
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2685 (insert-buffer-substring (current-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2686 (vm-mm-layout-header-start layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2687 (vm-mm-layout-body-start layout))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2688 (delete-region (vm-mm-layout-header-start layout)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2689 (vm-mm-layout-body-start layout))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2690 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2691 (vm-remove-mail-mode-header-separator)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2692 (vm-reorder-message-headers
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2693 nil nil "\\(Content-Type:\\|MIME-Version:\\|Content-Transfer-Encoding\\)")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2694 (vm-add-mail-mode-header-separator)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2695 (insert "MIME-Version: 1.0\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2696 (if (not just-one)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2697 (insert (if vm-mime-avoid-folding-content-type
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2698 "Content-Type: multipart/mixed; boundary=\""
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2699 "Content-Type: multipart/mixed;\n\tboundary=\"")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2700 boundary "\"\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2701 (insert "Content-Type: " type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2702 (if params
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2703 (if vm-mime-avoid-folding-content-type
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2704 (insert "; " (mapconcat 'identity params "; ") "\n")
126
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
2705 (insert ";\n\t" (mapconcat 'identity params ";\n\t") "\n"))
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
2706 (insert "\n")))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2707 (if just-one
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2708 (and description
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2709 (insert "Content-Description: " description "\n")))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2710 (if (and just-one disposition)
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2711 (progn
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2712 (insert "Content-Disposition: " (car disposition))
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2713 (if (cdr disposition)
126
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
2714 (if vm-mime-avoid-folding-content-type
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
2715 (insert "; " (mapconcat 'identity (cdr disposition) "; ")
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
2716 "\n")
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
2717 (insert ";\n\t" (mapconcat 'identity (cdr disposition)
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
2718 ";\n\t")))
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
2719 (insert "\n"))))
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
2720 (if just-one
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2721 (insert "Content-Transfer-Encoding: " encoding "\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2722 (if 8bit
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2723 (insert "Content-Transfer-Encoding: 8bit\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2724 (insert "Content-Transfer-Encoding: 7bit\n")))))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
2725
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2726 (defun vm-mime-fsfemacs-encode-composition ()
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2727 (save-restriction
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2728 (widen)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2729 (if (not (eq major-mode 'mail-mode))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2730 (error "Command must be used in a VM Mail mode buffer."))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2731 (or (null (vm-mail-mode-get-header-contents "MIME-Version:"))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2732 (error "Message is already MIME encoded."))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2733 (let ((8bit nil)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2734 (just-one nil)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2735 (boundary-positions nil)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2736 already-mimed layout o o-list boundary
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2737 type encoding charset params description disposition object
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2738 opoint-min)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2739 (mail-text)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2740 (setq o-list (vm-mime-fake-attachment-overlays (point) (point-max))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2741 o-list (vm-delete (function
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2742 (lambda (o)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2743 (overlay-get o 'vm-mime-object)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2744 o-list t)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2745 o-list (sort o-list (function
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2746 (lambda (e1 e2)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2747 (< (overlay-end e1)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2748 (overlay-end e2))))))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2749 ;; If there's just one attachment and no other readable
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2750 ;; text in the buffer then make the message type just be
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2751 ;; the attachment type rather than sending a multipart
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2752 ;; message with one attachment
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2753 (setq just-one (and (= (length o-list) 1)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2754 (looking-at "[ \t\n]*")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2755 (= (match-end 0)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2756 (overlay-start (car o-list)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2757 (save-excursion
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2758 (goto-char (overlay-end (car o-list)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2759 (looking-at "[ \t\n]*\\'"))))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2760 (if (null o-list)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2761 (progn
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2762 (narrow-to-region (point) (point-max))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2763 (setq charset (vm-determine-proper-charset (point-min)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2764 (point-max)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2765 (setq encoding (vm-determine-proper-content-transfer-encoding
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2766 (point-min)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2767 (point-max))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2768 encoding (vm-mime-transfer-encode-region encoding
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2769 (point-min)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2770 (point-max)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2771 t))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2772 (widen)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2773 (vm-remove-mail-mode-header-separator)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2774 (goto-char (point-min))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2775 (vm-reorder-message-headers
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2776 nil nil "\\(Content-Type:\\|Content-Transfer-Encoding\\|MIME-Version:\\)")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2777 (insert "MIME-Version: 1.0\n")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2778 (insert "Content-Type: text/plain; charset=" charset "\n")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2779 (insert "Content-Transfer-Encoding: " encoding "\n")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2780 (vm-add-mail-mode-header-separator))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2781 (while o-list
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2782 (setq o (car o-list))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2783 (if (or just-one (= (point) (overlay-start o)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2784 nil
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2785 (narrow-to-region (point) (overlay-start o))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2786 (setq charset (vm-determine-proper-charset (point-min)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2787 (point-max)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2788 (setq encoding (vm-determine-proper-content-transfer-encoding
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2789 (point-min)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2790 (point-max))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2791 encoding (vm-mime-transfer-encode-region encoding
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2792 (point-min)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2793 (point-max)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2794 t))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2795 (setq boundary-positions (cons (point-marker) boundary-positions))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2796 (insert "Content-Type: text/plain; charset=" charset "\n")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2797 (insert "Content-Transfer-Encoding: " encoding "\n\n")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2798 (widen))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2799 (goto-char (overlay-start o))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2800 (narrow-to-region (point) (point))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2801 (setq object (overlay-get o 'vm-mime-object))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2802 ;; insert the object
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2803 (cond ((bufferp object)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2804 ;; as of FSF Emacs 19.34, even with the hooks
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2805 ;; we've attached to the attachment overlays,
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2806 ;; text STILL can be inserted into them when
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2807 ;; font-lock is enabled. Explaining why is
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2808 ;; beyond the scope of this comment and I
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2809 ;; don't know the answer anyway. This works
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2810 ;; to prevent it.
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2811 (insert-before-markers " ")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2812 (forward-char -1)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2813 (insert-buffer-substring object)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2814 (delete-char 1))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2815 ((stringp object)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2816 (insert-before-markers " ")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2817 (forward-char -1)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2818 (insert-file-contents object)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2819 (goto-char (point-max))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2820 (delete-char -1)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2821 ;; gather information about the object from the extent.
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2822 (if (setq already-mimed (overlay-get o 'vm-mime-encoded))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2823 (setq layout (vm-mime-parse-entity
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2824 nil (list "text/plain" "charset=us-ascii")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2825 "7bit")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2826 type (or (overlay-get o 'vm-mime-type)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2827 (car (vm-mm-layout-type layout)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2828 params (or (overlay-get o 'vm-mime-parameters)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2829 (cdr (vm-mm-layout-qtype layout)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2830 description (overlay-get o 'vm-mime-description)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2831 disposition
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2832 (if (not
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2833 (equal
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2834 (car (overlay-get o 'vm-mime-disposition))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2835 "unspecified"))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2836 (overlay-get o 'vm-mime-disposition)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2837 (vm-mm-layout-qdisposition layout)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2838 (setq type (overlay-get o 'vm-mime-type)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2839 params (overlay-get o 'vm-mime-parameters)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2840 description (overlay-get o 'vm-mime-description)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2841 disposition
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2842 (if (not (equal
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2843 (car (overlay-get o 'vm-mime-disposition))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2844 "unspecified"))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2845 (overlay-get o 'vm-mime-disposition)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2846 nil)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2847 (cond ((vm-mime-types-match "text" type)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2848 (setq encoding
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2849 (vm-determine-proper-content-transfer-encoding
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2850 (if already-mimed
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2851 (vm-mm-layout-body-start layout)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2852 (point-min))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2853 (point-max))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2854 encoding (vm-mime-transfer-encode-region
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2855 encoding
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2856 (if already-mimed
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2857 (vm-mm-layout-body-start layout)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2858 (point-min))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2859 (point-max)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2860 t))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2861 (setq 8bit (or 8bit (equal encoding "8bit"))))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2862 ((or (vm-mime-types-match "message/rfc822" type)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2863 (vm-mime-types-match "message/news" type)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2864 (vm-mime-types-match "multipart" type))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2865 (setq opoint-min (point-min))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2866 (if (not already-mimed)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2867 (setq layout (vm-mime-parse-entity
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2868 nil (list "text/plain" "charset=us-ascii")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2869 "7bit")))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2870 ;; MIME messages of type "message" and
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2871 ;; "multipart" are required to have a non-opaque
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2872 ;; content transfer encoding. This means that
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2873 ;; if the user only wants to send out 7bit data,
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2874 ;; then any subpart that contains 8bit data must
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2875 ;; have an opaque (qp or base64) 8->7bit
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2876 ;; conversion performed on it so that the
126
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
2877 ;; enclosing entity can use a non-opaque
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2878 ;; encoding.
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2879 ;;
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2880 ;; message/partial requires a "7bit" encoding so
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2881 ;; force 8->7 conversion in that case.
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2882 (let ((vm-mime-8bit-text-transfer-encoding
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2883 (if (vm-mime-types-match "message/partial" type)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2884 'quoted-printable
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2885 vm-mime-8bit-text-transfer-encoding)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2886 (vm-mime-map-atomic-layouts 'vm-mime-transfer-encode-layout
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2887 (vm-mm-layout-parts layout)))
120
cca96a509cfe Import from CVS: tag r20-1b12
cvs
parents: 118
diff changeset
2888 ;; now figure out a proper content transfer
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2889 ;; encoding value for the enclosing entity.
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2890 (re-search-forward "^\n" nil t)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2891 (save-restriction
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2892 (narrow-to-region (point) (point-max))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2893 (setq encoding
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2894 (vm-determine-proper-content-transfer-encoding
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2895 (point-min)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2896 (point-max))))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2897 (setq 8bit (or 8bit (equal encoding "8bit")))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2898 (goto-char (point-max))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2899 (widen)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2900 (narrow-to-region opoint-min (point)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2901 (t
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2902 (vm-mime-base64-encode-region
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2903 (if already-mimed
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2904 (vm-mm-layout-body-start layout)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2905 (point-min))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2906 (point-max))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2907 (setq encoding "base64")))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2908 (if just-one
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2909 nil
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2910 (goto-char (point-min))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2911 (setq boundary-positions (cons (point-marker) boundary-positions))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2912 (if (not already-mimed)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2913 nil
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2914 ;; trim headers
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2915 (vm-reorder-message-headers
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2916 nil (nconc (list "Content-Disposition:" "Content-ID:")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2917 (if description
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2918 (list "Content-Description:")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2919 nil))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2920 nil)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2921 ;; remove header/text separator
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2922 (goto-char (1- (vm-mm-layout-body-start layout)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2923 (if (looking-at "\n")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2924 (delete-char 1)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2925 (insert "Content-Type: " type)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2926 (if params
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2927 (if vm-mime-avoid-folding-content-type
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2928 (insert "; " (mapconcat 'identity params "; ") "\n")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2929 (insert ";\n\t" (mapconcat 'identity params ";\n\t") "\n"))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2930 (insert "\n"))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2931 (and description
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2932 (insert "Content-Description: " description "\n"))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2933 (if disposition
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2934 (progn
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2935 (insert "Content-Disposition: " (car disposition))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2936 (if (cdr disposition)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2937 (insert ";\n\t" (mapconcat 'identity
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2938 (cdr disposition)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2939 ";\n\t")))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2940 (insert "\n")))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2941 (insert "Content-Transfer-Encoding: " encoding "\n\n"))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2942 (goto-char (point-max))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2943 (widen)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2944 (save-excursion
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2945 (goto-char (overlay-start o))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2946 (vm-assert (looking-at "\\[ATTACHMENT")))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2947 (delete-region (overlay-start o)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2948 (overlay-end o))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2949 (delete-overlay o)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2950 (if (looking-at "\n")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2951 (delete-char 1))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2952 (setq o-list (cdr o-list)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2953 ;; handle the remaining chunk of text after the last
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2954 ;; extent, if any.
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2955 (if (or just-one (= (point) (point-max)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2956 nil
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2957 (setq charset (vm-determine-proper-charset (point)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2958 (point-max)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2959 (setq encoding (vm-determine-proper-content-transfer-encoding
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2960 (point)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2961 (point-max))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2962 encoding (vm-mime-transfer-encode-region encoding
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2963 (point)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2964 (point-max)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2965 t))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2966 (setq 8bit (or 8bit (equal encoding "8bit")))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2967 (setq boundary-positions (cons (point-marker) boundary-positions))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2968 (insert "Content-Type: text/plain; charset=" charset "\n")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2969 (insert "Content-Transfer-Encoding: " encoding "\n\n")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2970 (goto-char (point-max)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2971 (setq boundary (vm-mime-make-multipart-boundary))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2972 (mail-text)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2973 (while (re-search-forward (concat "^--"
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2974 (regexp-quote boundary)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2975 "\\(--\\)?$")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2976 nil t)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2977 (setq boundary (vm-mime-make-multipart-boundary))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2978 (mail-text))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2979 (goto-char (point-max))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2980 (or just-one (insert "\n--" boundary "--\n"))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2981 (while boundary-positions
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2982 (goto-char (car boundary-positions))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2983 (insert "\n--" boundary "\n")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2984 (setq boundary-positions (cdr boundary-positions)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2985 (if (and just-one already-mimed)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2986 (progn
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2987 (goto-char (vm-mm-layout-header-start layout))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2988 ;; trim headers
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2989 (vm-reorder-message-headers
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2990 nil '("Content-Description:" "Content-ID:") nil)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2991 ;; remove header/text separator
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2992 (goto-char (1- (vm-mm-layout-body-start layout)))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2993 (if (looking-at "\n")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2994 (delete-char 1))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2995 ;; copy remainder to enclosing entity's header section
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2996 (insert-buffer-substring (current-buffer)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2997 (vm-mm-layout-header-start layout)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2998 (vm-mm-layout-body-start layout))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
2999 (delete-region (vm-mm-layout-header-start layout)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3000 (vm-mm-layout-body-start layout))))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3001 (goto-char (point-min))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3002 (vm-remove-mail-mode-header-separator)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3003 (vm-reorder-message-headers
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3004 nil nil "\\(Content-Type:\\|MIME-Version:\\|Content-Transfer-Encoding\\)")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3005 (vm-add-mail-mode-header-separator)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3006 (insert "MIME-Version: 1.0\n")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3007 (if (not just-one)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3008 (insert (if vm-mime-avoid-folding-content-type
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3009 "Content-Type: multipart/mixed; boundary=\""
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3010 "Content-Type: multipart/mixed;\n\tboundary=\"")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3011 boundary "\"\n")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3012 (insert "Content-Type: " type)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3013 (if params
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3014 (if vm-mime-avoid-folding-content-type
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3015 (insert "; " (mapconcat 'identity params "; ") "\n")
126
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
3016 (insert ";\n\t" (mapconcat 'identity params ";\n\t") "\n"))
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
3017 (insert "\n")))
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3018 (if just-one
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3019 (and description
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3020 (insert "Content-Description: " description "\n")))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3021 (if (and just-one disposition)
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3022 (progn
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3023 (insert "Content-Disposition: " (car disposition))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3024 (if (cdr disposition)
126
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
3025 (if vm-mime-avoid-folding-content-type
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
3026 (insert "; " (mapconcat 'identity (cdr disposition) "; ")
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
3027 "\n")
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
3028 (insert ";\n\t" (mapconcat 'identity (cdr disposition)
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
3029 ";\n\t")))
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
3030 (insert "\n"))))
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3031 (if just-one
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3032 (insert "Content-Transfer-Encoding: " encoding "\n")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3033 (if 8bit
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3034 (insert "Content-Transfer-Encoding: 8bit\n")
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3035 (insert "Content-Transfer-Encoding: 7bit\n")))))))
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3036
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3037 (defun vm-mime-fragment-composition (size)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3038 (save-restriction
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3039 (widen)
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
3040 (message "Fragmenting message...")
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3041 (let ((buffers nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3042 (id (vm-mime-make-multipart-boundary))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3043 (n 1)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3044 (the-end nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3045 b header-start header-end master-buffer start end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3046 (vm-remove-mail-mode-header-separator)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3047 ;; message/partial must have "7bit" content transfer
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3048 ;; encoding, so verify that everything has been encoded for
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3049 ;; 7bit transmission.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3050 (let ((vm-mime-8bit-text-transfer-encoding
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3051 (if (eq vm-mime-8bit-text-transfer-encoding '8bit)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3052 'quoted-printable
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3053 vm-mime-8bit-text-transfer-encoding)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3054 (vm-mime-map-atomic-layouts
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3055 'vm-mime-transfer-encode-layout
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3056 (list (vm-mime-parse-entity nil (list "text/plain" "charset=us-ascii")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3057 "7bit"))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3058 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3059 (setq header-start (point))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3060 (search-forward "\n\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3061 (setq header-end (1- (point)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3062 (setq master-buffer (current-buffer))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3063 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3064 (setq start (point))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3065 (while (not (eobp))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3066 (condition-case nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3067 (progn
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3068 (forward-char (max (- size 150) 2000))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3069 (beginning-of-line))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3070 (end-of-buffer (setq the-end t)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3071 (setq end (point))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3072 (setq b (generate-new-buffer (concat (buffer-name) " part "
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3073 (int-to-string n))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3074 (setq buffers (cons b buffers))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3075 (set-buffer b)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3076 (make-local-variable 'vm-send-using-mime)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3077 (setq vm-send-using-mime nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3078 (insert-buffer-substring master-buffer header-start header-end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3079 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3080 (vm-reorder-message-headers nil nil
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3081 "\\(Content-Type:\\|MIME-Version:\\|Content-Transfer-Encoding\\)")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3082 (insert "MIME-Version: 1.0\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3083 (insert (format
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3084 (if vm-mime-avoid-folding-content-type
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3085 "Content-Type: message/partial; id=%s; number=%d"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3086 "Content-Type: message/partial;\n\tid=%s;\n\tnumber=%d")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3087 id n))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3088 (if the-end
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3089 (if vm-mime-avoid-folding-content-type
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3090 (insert (format "; total=%d\n" n))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3091 (insert (format ";\n\ttotal=%d\n" n)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3092 (insert "\n"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3093 (insert "Content-Transfer-Encoding: 7bit\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3094 (goto-char (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3095 (insert mail-header-separator "\n")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3096 (insert-buffer-substring master-buffer start end)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3097 (vm-increment n)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3098 (set-buffer master-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3099 (setq start (point)))
118
7d55a9ba150c Import from CVS: tag r20-1b11
cvs
parents: 116
diff changeset
3100 (vm-add-mail-mode-header-separator)
26
441bb1e64a06 Import from CVS: tag r19-15b96
cvs
parents: 24
diff changeset
3101 (message "Fragmenting message... done")
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3102 (nreverse buffers))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3103
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3104 (defun vm-mime-preview-composition ()
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3105 "Show how the current composition buffer might be displayed
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3106 in a MIME-aware mail reader. VM copies and encodes the current
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3107 mail composition buffer and displays it as a mail folder.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3108 Type `q' to quit this temp folder and return to composing your
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3109 message."
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3110 (interactive)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3111 (if (not (eq major-mode 'mail-mode))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3112 (error "Command must be used in a VM Mail mode buffer."))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3113 (let ((temp-buffer nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3114 (mail-buffer (current-buffer))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3115 e-list)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3116 (unwind-protect
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3117 (progn
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3118 (setq temp-buffer (generate-new-buffer "composition preview"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3119 (set-buffer temp-buffer)
126
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
3120 ;; so vm-mime-xxxx-encode-composition won't complain
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3121 (setq major-mode 'mail-mode)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3122 (vm-insert-region-from-buffer mail-buffer)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3123 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3124 (or (vm-mail-mode-get-header-contents "From")
114
8619ce7e4c50 Import from CVS: tag r20-1b9
cvs
parents: 110
diff changeset
3125 (insert "From: " (user-login-name) "\n"))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3126 (or (vm-mail-mode-get-header-contents "Message-ID")
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 20
diff changeset
3127 (insert "Message-ID: <fake@fake.fake>\n"))
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3128 (or (vm-mail-mode-get-header-contents "Date")
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3129 (insert "Date: "
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3130 (format-time-string "%a, %d %b %Y %H%M%S %Z"
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3131 (current-time))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3132 "\n"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3133 (and vm-send-using-mime
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3134 (null (vm-mail-mode-get-header-contents "MIME-Version:"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3135 (vm-mime-encode-composition))
126
1370575f1259 Import from CVS: tag xemacs-20-1p1
cvs
parents: 120
diff changeset
3136 (vm-remove-mail-mode-header-separator)
20
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3137 (goto-char (point-min))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3138 (insert (vm-leading-message-separator 'From_))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3139 (goto-char (point-max))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3140 (insert (vm-trailing-message-separator 'From_))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3141 (set-buffer-modified-p nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3142 ;; point of no return, don't kill it if the user quits
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3143 (setq temp-buffer nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3144 (let ((vm-auto-decode-mime-messages t)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3145 (vm-auto-displayed-mime-content-types t))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3146 (vm-save-buffer-excursion
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3147 (vm-goto-new-folder-frame-maybe 'folder)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3148 (vm-mode)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3149 (message
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3150 (substitute-command-keys
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3151 "Type \\[vm-quit] to continue composing your message"))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3152 ;; temp buffer, don't offer to save it.
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3153 (setq buffer-offer-save nil)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3154 (vm-display (or vm-presentation-buffer (current-buffer)) t
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3155 (list this-command) '(vm-mode startup)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3156 (and temp-buffer (kill-buffer temp-buffer)))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3157
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3158 (defun vm-mime-composite-type-p (type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3159 (or (vm-mime-types-match "message" type)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3160 (vm-mime-types-match "multipart" type)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3161
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3162 (defun vm-mime-map-atomic-layouts (function list)
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3163 (while list
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3164 (if (vm-mime-composite-type-p (car (vm-mm-layout-type (car list))))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3165 (vm-mime-map-atomic-layouts function (vm-mm-layout-parts (car list)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3166 (funcall function (car list)))
859a2309aef8 Import from CVS: tag r19-15b93
cvs
parents:
diff changeset
3167 (setq list (cdr list))))