*** dist/vm-edit.el.dist Wed Jun 10 12:41:12 1998 --- vm-edit.el Sat Jan 30 23:57:55 1999 *************** *** 62,63 **** --- 62,65 ---- (vm-su-subject (car vm-message-pointer))))) + (if vm-fsfemacs-mule-p + (set-buffer-multibyte nil)) (vm-set-edit-buffer-of (car mp) edit-buf) *** dist/vm-folder.el.dist Sun Jan 17 17:42:33 1999 --- vm-folder.el Sun Jan 31 01:59:24 1999 *************** *** 796,799 **** ((eq vm-folder-type 'From_) ! (if (vm-find-leading-message-separator) ! (forward-char -1))) ((eq vm-folder-type 'BellFrom_) --- 796,799 ---- ((eq vm-folder-type 'From_) ! (vm-find-leading-message-separator) ! (forward-char -1)) ((eq vm-folder-type 'BellFrom_) *** dist/vm-macro.el.dist Tue Dec 15 09:10:20 1998 --- vm-macro.el Sun Jan 31 01:31:59 1999 *************** *** 89 **** --- 89,98 ---- + (defmacro vm-with-unibyte-buffer (&rest body) + (nconc + (list 'if 'vm-fsfemacs-mule-p + (list 'let '((xzx enable-multibyte-characters)) + (list 'unwind-protect + (nconc (list 'let nil '(set-buffer-multibyte nil)) + body) + '(set-buffer-multibyte xzx)))) + body)) *** dist/vm-menu.el.dist Sun Jan 17 17:42:34 1999 --- vm-menu.el Sat Jan 30 14:25:03 1999 *************** *** 54,56 **** ;; paranoia ! (fboundp 'set-file-coding-system)) vm-fsfemacs-p (not vm-xemacs-p) --- 54,56 ---- ;; paranoia ! (fboundp 'set-buffer-file-coding-system)) vm-fsfemacs-p (not vm-xemacs-p) *** dist/vm-mime.el.dist Fri Jan 29 00:13:37 1999 --- vm-mime.el Mon Feb 1 23:07:06 1999 *************** *** 19,20 **** --- 19,22 ---- + (defvar enable-multibyte-characters) + (defun vm-mime-error (&rest args) *************** *** 170,172 **** (defun vm-mime-base64-decode-region (start end &optional crlf) ! (message "Decoding base64...") (let ((work-buffer nil) --- 172,175 ---- (defun vm-mime-base64-decode-region (start end &optional crlf) ! (and (> (- end start) 200) ! (message "Decoding base64...")) (let ((work-buffer nil) *************** *** 239,241 **** (and work-buffer (kill-buffer work-buffer)))) ! (message "Decoding base64... done")) --- 242,245 ---- (and work-buffer (kill-buffer work-buffer)))) ! (and (> (- end start) 200) ! (message "Decoding base64... done"))) *************** *** 266,268 **** (if B-encoding ! (progn ;; if we're B encoding, strip out the line breaks --- 270,273 ---- (if B-encoding ! (save-excursion ! (set-buffer work-buffer) ;; if we're B encoding, strip out the line breaks *************** *** 336,383 **** (buffer-disable-undo work-buffer) ! (goto-char start) ! (setq inputpos start) ! (while (< inputpos end) ! (skip-chars-forward "^=\n" end) ! (setq stop-point (point)) ! (cond ((looking-at "\n") ! ;; spaces or tabs before a hard line break must be ignored ! (skip-chars-backward " \t") ! (setq copy-point (point)) ! (goto-char stop-point)) ! (t (setq copy-point stop-point))) ! (save-excursion ! (set-buffer work-buffer) ! (insert-buffer-substring buf inputpos copy-point)) ! (cond ((= (point) end) t) ! ((looking-at "\n") ! (vm-insert-char ?\n 1 nil work-buffer) ! (forward-char)) ! (t ;; looking at = ! (forward-char) ! ;; a-f because some mailers use lower case hex ! ;; digits despite them being forbidden by the ! ;; MIME spec. ! (cond ((looking-at "[0-9A-Fa-f][0-9A-Fa-f]") ! (vm-insert-char (+ (* (cdr (assq (char-after (point)) ! hex-digit-alist)) ! 16) ! (cdr (assq (char-after ! (1+ (point))) ! hex-digit-alist))) ! 1 nil work-buffer) ! (forward-char 2)) ! ((looking-at "\n") ; soft line break ! (forward-char)) ! ((looking-at "\r") ! ;; assume the user's goatloving ! ;; delivery software didn't convert ! ;; from Internet's CRLF newline ! ;; convention to the local LF ! ;; convention. ! (forward-char)) ! ((looking-at "[ \t]") ! ;; garbage added in transit ! (skip-chars-forward " \t" end)) ! (t (vm-mime-error "something other than line break or hex digits after = in quoted-printable encoding"))))) ! (setq inputpos (point))) (or (markerp end) (setq end (vm-marker end))) --- 341,399 ---- (buffer-disable-undo work-buffer) ! (if vm-mime-qp-decoder-program ! (let* ((binary-process-output t) ; any text already has CRLFs ! ;; use binary coding system in FSF Emacs/MULE ! (coding-system-for-read 'binary) ! (coding-system-for-write 'binary) ! (status (apply 'vm-run-command-on-region ! start end work-buffer ! vm-mime-qp-decoder-program ! vm-mime-qp-decoder-switches))) ! (if (not (eq status t)) ! (vm-mime-error "%s" (cdr status)))) ! (goto-char start) ! (setq inputpos start) ! (while (< inputpos end) ! (skip-chars-forward "^=\n" end) ! (setq stop-point (point)) ! (cond ((looking-at "\n") ! ;; spaces or tabs before a hard line break must be ignored ! (skip-chars-backward " \t") ! (setq copy-point (point)) ! (goto-char stop-point)) ! (t (setq copy-point stop-point))) ! (save-excursion ! (set-buffer work-buffer) ! (insert-buffer-substring buf inputpos copy-point)) ! (cond ((= (point) end) t) ! ((looking-at "\n") ! (vm-insert-char ?\n 1 nil work-buffer) ! (forward-char)) ! (t;; looking at = ! (forward-char) ! ;; a-f because some mailers use lower case hex ! ;; digits despite them being forbidden by the ! ;; MIME spec. ! (cond ((looking-at "[0-9A-Fa-f][0-9A-Fa-f]") ! (vm-insert-char (+ (* (cdr (assq (char-after (point)) ! hex-digit-alist)) ! 16) ! (cdr (assq (char-after ! (1+ (point))) ! hex-digit-alist))) ! 1 nil work-buffer) ! (forward-char 2)) ! ((looking-at "\n") ; soft line break ! (forward-char)) ! ((looking-at "\r") ! ;; assume the user's goatloving ! ;; delivery software didn't convert ! ;; from Internet's CRLF newline ! ;; convention to the local LF ! ;; convention. ! (forward-char)) ! ((looking-at "[ \t]") ! ;; garbage added in transit ! (skip-chars-forward " \t" end)) ! (t (vm-mime-error "something other than line break or hex digits after = in quoted-printable encoding"))))) ! (setq inputpos (point)))) (or (markerp end) (setq end (vm-marker end))) *************** *** 405,438 **** (buffer-disable-undo work-buffer) ! (setq inputpos start) ! (while (< inputpos end) ! (setq char (char-after inputpos)) ! (cond ((= char ?\n) ! (vm-insert-char char 1 nil work-buffer) ! (setq cols 0)) ! ((and (= char 32) ! (not (= (1+ inputpos) end)) ! (not (= ?\n (char-after (1+ inputpos))))) ! (vm-insert-char char 1 nil work-buffer) ! (vm-increment cols)) ! ((or (< char 33) (> char 126) (= char 61) ! (and quote-from (= cols 0) (let ((case-fold-search nil)) ! (looking-at "From "))) ! (and (= cols 0) (= char ?.) ! (looking-at "\\.\\(\n\\|\\'\\)"))) ! (vm-insert-char ?= 1 nil work-buffer) ! (vm-insert-char (car (rassq (lsh char -4) hex-digit-alist)) ! 1 nil work-buffer) ! (vm-insert-char (car (rassq (logand char 15) ! hex-digit-alist)) ! 1 nil work-buffer) ! (setq cols (+ cols 3))) ! (t (vm-insert-char char 1 nil work-buffer) ! (vm-increment cols))) ! (cond ((> cols 70) ! (setq cols 0) ! (if Q-encoding ! nil (vm-insert-char ?= 1 nil work-buffer) ! (vm-insert-char ?\n 1 nil work-buffer)))) ! (vm-increment inputpos)) (or (markerp end) (setq end (vm-marker end))) --- 421,482 ---- (buffer-disable-undo work-buffer) ! (if vm-mime-qp-encoder-program ! (let* ((binary-process-output t) ; any text already has CRLFs ! ;; use binary coding system in FSF Emacs/MULE ! (coding-system-for-read 'binary) ! (coding-system-for-write 'binary) ! (status (apply 'vm-run-command-on-region ! start end work-buffer ! vm-mime-qp-encoder-program ! vm-mime-qp-encoder-switches))) ! (if (not (eq status t)) ! (vm-mime-error "%s" (cdr status))) ! (if quote-from ! (save-excursion ! (set-buffer work-buffer) ! (goto-char (point-min)) ! (while (re-search-forward "^From " nil t) ! (replace-match "=46rom " t t)))) ! (if Q-encoding ! (save-excursion ! (set-buffer work-buffer) ! ;; strip out the line breaks ! (goto-char (point-min)) ! (while (search-forward "=\n" nil t) ! (delete-char -2)) ! ;; strip out the soft line breaks ! (goto-char (point-min)) ! (while (search-forward "\n" nil t) ! (delete-char -1))))) ! (setq inputpos start) ! (while (< inputpos end) ! (setq char (char-after inputpos)) ! (cond ((= char ?\n) ! (vm-insert-char char 1 nil work-buffer) ! (setq cols 0)) ! ((and (= char 32) ! (not (= (1+ inputpos) end)) ! (not (= ?\n (char-after (1+ inputpos))))) ! (vm-insert-char char 1 nil work-buffer) ! (vm-increment cols)) ! ((or (< char 33) (> char 126) (= char 61) ! (and quote-from (= cols 0) (let ((case-fold-search nil)) ! (looking-at "From "))) ! (and (= cols 0) (= char ?.) ! (looking-at "\\.\\(\n\\|\\'\\)"))) (vm-insert-char ?= 1 nil work-buffer) ! (vm-insert-char (car (rassq (lsh char -4) hex-digit-alist)) ! 1 nil work-buffer) ! (vm-insert-char (car (rassq (logand char 15) ! hex-digit-alist)) ! 1 nil work-buffer) ! (setq cols (+ cols 3))) ! (t (vm-insert-char char 1 nil work-buffer) ! (vm-increment cols))) ! (cond ((> cols 70) ! (setq cols 0) ! (if Q-encoding ! nil ! (vm-insert-char ?= 1 nil work-buffer) ! (vm-insert-char ?\n 1 nil work-buffer)))) ! (vm-increment inputpos))) (or (markerp end) (setq end (vm-marker end))) *************** *** 625,627 **** ! (defun vm-mime-parse-entity (&optional m default-type default-encoding) (let ((case-fold-search t) version type qtype encoding id description --- 669,672 ---- ! (defun vm-mime-parse-entity (&optional m default-type default-encoding ! passing-message-only) (let ((case-fold-search t) version type qtype encoding id description *************** *** 631,633 **** (save-excursion ! (if m (progn --- 676,678 ---- (save-excursion ! (if (and m (not passing-message-only)) (progn *************** *** 637,639 **** (save-restriction ! (if m (progn --- 682,684 ---- (save-restriction ! (if (and m (not passing-message-only)) (progn *************** *** 697,698 **** --- 742,744 ---- (cond ((null m) t) + (passing-message-only t) ((null version) *************** *** 701,703 **** (t (vm-mime-error "Unsupported MIME version: %s" version))) ! (cond ((and m (null type)) (throw 'return-value --- 747,749 ---- (t (vm-mime-error "Unsupported MIME version: %s" version))) ! (cond ((and m (not passing-message-only) (null type)) (throw 'return-value *************** *** 756,759 **** (narrow-to-region (point) (point-max)) ! (vm-mime-parse-entity-safe nil c-t ! c-t-e))) nil --- 802,805 ---- (narrow-to-region (point) (point-max)) ! (vm-mime-parse-entity-safe m c-t ! c-t-e t))) nil *************** *** 807,809 **** (setq multipart-list ! (cons (vm-mime-parse-entity-safe nil c-t c-t-e) multipart-list))))))) --- 853,856 ---- (setq multipart-list ! (cons (vm-mime-parse-entity-safe m c-t c-t-e ! t) multipart-list))))))) *************** *** 823,825 **** ! (defun vm-mime-parse-entity-safe (&optional m c-t c-t-e) (or c-t (setq c-t '("text/plain" "charset=us-ascii"))) --- 870,872 ---- ! (defun vm-mime-parse-entity-safe (&optional m c-t c-t-e passing-message-only) (or c-t (setq c-t '("text/plain" "charset=us-ascii"))) *************** *** 830,835 **** (vm-mime-error ! (let ((header (if m (vm-headers-of m) (vm-marker (point-min)))) ! (text (if m (vm-text-of m) --- 877,882 ---- (vm-mime-error ! (let ((header (if (and m (not passing-message-only)) (vm-headers-of m) (vm-marker (point-min)))) ! (text (if (and m (not passing-message-only)) (vm-text-of m) *************** *** 839,841 **** (vm-marker (point))))) ! (text-end (if m (vm-text-end-of m) --- 886,888 ---- (vm-marker (point))))) ! (text-end (if (and m (not passing-message-only)) (vm-text-end-of m) *************** *** 1130,1133 **** vm-message-garbage-alist)) ! (vm-mime-insert-mime-body layout) ! (vm-mime-transfer-decode-region layout (point-min) (point-max)) (call-process-region (point-min) (point-max) shell-file-name --- 1177,1181 ---- vm-message-garbage-alist)) ! (vm-with-unibyte-buffer ! (vm-mime-insert-mime-body layout) ! (vm-mime-transfer-decode-region layout (point-min) (point-max))) (call-process-region (point-min) (point-max) shell-file-name *************** *** 1139,1142 **** (message "Converting %s to %s... done" ! (car (vm-mm-layout-type layout)) ! (nth 1 ooo)) (vector (list (nth 1 ooo)) --- 1187,1190 ---- (message "Converting %s to %s... done" ! (car (vm-mm-layout-type layout)) ! (nth 1 ooo)) (vector (list (nth 1 ooo)) *************** *** 1402,1415 **** (message "Inlining text/html, be patient...") ! ;; We need to keep track of where the end of the ! ;; processed text is. Best way to do this is to ! ;; avoid markers and save-excursion, and just use ! ;; buffer size changes as an indicator. ! (vm-mime-insert-mime-body layout) ! (setq end (point)) ! (setq buffer-size (buffer-size)) ! (vm-mime-transfer-decode-region layout start end) ! (setq end (+ end (- (buffer-size) buffer-size))) ! (setq buffer-size (buffer-size)) ! (w3-region start end) ! (setq end (+ end (- (buffer-size) buffer-size))) ;; remove read-only text properties --- 1450,1464 ---- (message "Inlining text/html, be patient...") ! (vm-with-unibyte-buffer ! ;; We need to keep track of where the end of the ! ;; processed text is. Best way to do this is to ! ;; avoid markers and save-excursion, and just use ! ;; buffer size changes as an indicator. ! (vm-mime-insert-mime-body layout) ! (setq end (point)) ! (setq buffer-size (buffer-size)) ! (vm-mime-transfer-decode-region layout start end) ! (setq end (+ end (- (buffer-size) buffer-size))) ! (setq buffer-size (buffer-size)) ! (w3-region start end) ! (setq end (+ end (- (buffer-size) buffer-size)))) ;; remove read-only text properties *************** *** 1437,1444 **** nil) ! (vm-mime-insert-mime-body layout) ! (setq end (point-marker)) ! (vm-mime-transfer-decode-region layout start end) ! (setq old-size (buffer-size)) ! (vm-mime-charset-decode-region charset start end) ! (set-marker end (+ end (- (buffer-size) old-size))) (or no-highlighting (vm-energize-urls-in-message-region start end)) --- 1486,1494 ---- nil) ! (vm-with-unibyte-buffer ! (vm-mime-insert-mime-body layout) ! (setq end (point-marker)) ! (vm-mime-transfer-decode-region layout start end) ! (setq old-size (buffer-size)) ! (vm-mime-charset-decode-region charset start end) ! (set-marker end (+ end (- (buffer-size) old-size)))) (or no-highlighting (vm-energize-urls-in-message-region start end)) *************** *** 1453,1457 **** (message "Decoding text/enriched, be patient...") ! (vm-mime-insert-mime-body layout) ! (setq end (point-marker)) ! (vm-mime-transfer-decode-region layout start end) ;; enriched-decode expects a couple of headers at the top of --- 1503,1508 ---- (message "Decoding text/enriched, be patient...") ! (vm-with-unibyte-buffer ! (vm-mime-insert-mime-body layout) ! (setq end (point-marker)) ! (vm-mime-transfer-decode-region layout start end)) ;; enriched-decode expects a couple of headers at the top of *************** *** 1476,1478 **** (buffer-read-only nil) ! (start (point)) (coding-system-for-read 'binary) --- 1527,1529 ---- (buffer-read-only nil) ! start (coding-system-for-read 'binary) *************** *** 1488,1518 **** (cond ((or (null tempfile) (null (file-exists-p tempfile))) ! (vm-mime-insert-mime-body layout) ! (setq end (point-marker)) ! (vm-mime-transfer-decode-region layout start end) ! (setq suffix (vm-mime-extract-filename-suffix layout)) ! (setq tempfile (vm-make-tempfile-name suffix)) ! (let ((buffer-file-type buffer-file-type) ! (selective-display nil) ! buffer-file-coding-system) ! ;; Tell DOS/Windows NT whether the file is binary ! (setq buffer-file-type ! (not (vm-mime-text-type-layout-p layout))) ! ;; Tell XEmacs/MULE not to mess with the bits unless ! ;; this is a text type. ! (if (or vm-xemacs-mule-p vm-fsfemacs-mule-p) ! (if (vm-mime-text-type-layout-p layout) ! (set-buffer-file-coding-system 'no-conversion nil) ! (set-buffer-file-coding-system 'binary t))) ! ;; Write an empty tempfile out to disk and set its ! ;; permissions to 0600, then write the actual buffer ! ;; contents to tempfile. ! (write-region start start tempfile nil 0) ! (set-file-modes tempfile 384) ! (write-region start end tempfile nil 0)) ! (delete-region start end) ! (save-excursion ! (vm-select-folder-buffer) ! (setq vm-folder-garbage-alist ! (cons (cons tempfile 'delete-file) ! vm-folder-garbage-alist))))) --- 1539,1571 ---- (cond ((or (null tempfile) (null (file-exists-p tempfile))) ! (vm-with-unibyte-buffer ! (setq start (point)) ! (vm-mime-insert-mime-body layout) ! (setq end (point-marker)) ! (vm-mime-transfer-decode-region layout start end) ! (setq suffix (vm-mime-extract-filename-suffix layout)) ! (setq tempfile (vm-make-tempfile-name suffix)) ! (let ((buffer-file-type buffer-file-type) ! (selective-display nil) ! buffer-file-coding-system) ! ;; Tell DOS/Windows NT whether the file is binary ! (setq buffer-file-type ! (not (vm-mime-text-type-layout-p layout))) ! ;; Tell XEmacs/MULE not to mess with the bits unless ! ;; this is a text type. ! (if (or vm-xemacs-mule-p vm-fsfemacs-mule-p) ! (if (vm-mime-text-type-layout-p layout) ! (set-buffer-file-coding-system 'no-conversion nil) ! (set-buffer-file-coding-system 'binary t))) ! ;; Write an empty tempfile out to disk and set its ! ;; permissions to 0600, then write the actual buffer ! ;; contents to tempfile. ! (write-region start start tempfile nil 0) ! (set-file-modes tempfile 384) ! (write-region start end tempfile nil 0)) ! (delete-region start end) ! (save-excursion ! (vm-select-folder-buffer) ! (setq vm-folder-garbage-alist ! (cons (cons tempfile 'delete-file) ! vm-folder-garbage-alist)))))) *************** *** 1721,1724 **** (buffer-read-only nil)) ! (vm-mime-insert-mime-headers (car (vm-mm-layout-parts layout))) ! (insert ?\n) (save-excursion --- 1774,1778 ---- (buffer-read-only nil)) ! (vm-with-unibyte-buffer ! (vm-mime-insert-mime-headers (car (vm-mm-layout-parts layout))) ! (insert ?\n)) (save-excursion *************** *** 1738,1739 **** --- 1792,1795 ---- (car vm-message-pointer))))) + (if vm-fsfemacs-mule-p + (set-buffer-multibyte nil)) (setq vm-folder-type vm-default-folder-type) *************** *** 1853,1854 **** --- 1909,1912 ---- (set-buffer (generate-new-buffer "assembled message")) + (if vm-fsfemacs-mule-p + (set-buffer-multibyte nil)) (setq vm-folder-type vm-default-folder-type) *************** *** 1892,1894 **** (featurep feature)) ! (let ((start (point)) end tempfile g e (selective-display nil) --- 1950,1952 ---- (featurep feature)) ! (let ((start (point-marker)) end tempfile g e (selective-display nil) *************** *** 1898,1936 **** nil ! (vm-mime-insert-mime-body layout) ! (setq end (point-marker)) ! (vm-mime-transfer-decode-region layout start end) ! (setq tempfile (vm-make-tempfile-name)) ! ;; Write an empty tempfile out to disk and set its ! ;; permissions to 0600, then write the actual buffer ! ;; contents to tempfile. ! (write-region start start tempfile nil 0) ! (set-file-modes tempfile 384) ! ;; coding system for presentation buffer is binary so ! ;; we don't need to set it here. ! (write-region start end tempfile nil 0) ! (message "Creating %s glyph..." name) ! (setq g (make-glyph ! (list ! (cons (list 'win) ! (vector feature ':file tempfile)) ! (cons (list 'win) ! (vector 'string ! ':data ! (format "[Unknown/Bad %s image encoding]" ! name))) ! (cons nil ! (vector 'string ! ':data ! (format "[%s image]\n" name)))))) ! (message "") ! (vm-set-mm-layout-cache ! layout ! (nconc (vm-mm-layout-cache layout) ! (list (cons 'vm-mime-display-internal-image-xxxx g)))) ! (save-excursion ! (vm-select-folder-buffer) ! (setq vm-folder-garbage-alist ! (cons (cons tempfile 'delete-file) ! vm-folder-garbage-alist))) ! (delete-region start end)) (if (not (bolp)) --- 1956,1995 ---- nil ! (vm-with-unibyte-buffer ! (vm-mime-insert-mime-body layout) ! (setq end (point-marker)) ! (vm-mime-transfer-decode-region layout start end) ! (setq tempfile (vm-make-tempfile-name)) ! ;; Write an empty tempfile out to disk and set its ! ;; permissions to 0600, then write the actual buffer ! ;; contents to tempfile. ! (write-region start start tempfile nil 0) ! (set-file-modes tempfile 384) ! ;; coding system for presentation buffer is binary so ! ;; we don't need to set it here. ! (write-region start end tempfile nil 0) ! (message "Creating %s glyph..." name) ! (setq g (make-glyph ! (list ! (cons (list 'win) ! (vector feature ':file tempfile)) ! (cons (list 'win) ! (vector 'string ! ':data ! (format "[Unknown/Bad %s image encoding]" ! name))) ! (cons nil ! (vector 'string ! ':data ! (format "[%s image]\n" name)))))) ! (message "") ! (vm-set-mm-layout-cache ! layout ! (nconc (vm-mm-layout-cache layout) ! (list (cons 'vm-mime-display-internal-image-xxxx g)))) ! (save-excursion ! (vm-select-folder-buffer) ! (setq vm-folder-garbage-alist ! (cons (cons tempfile 'delete-file) ! vm-folder-garbage-alist))) ! (delete-region start end))) (if (not (bolp)) *************** *** 1962,1964 **** (eq (device-type) 'x)))) ! (let ((start (point)) end tempfile (selective-display nil) --- 2021,2023 ---- (eq (device-type) 'x)))) ! (let ((start (point-marker)) end tempfile (selective-display nil) *************** *** 1968,1992 **** nil ! (vm-mime-insert-mime-body layout) ! (setq end (point-marker)) ! (vm-mime-transfer-decode-region layout start end) ! (setq tempfile (vm-make-tempfile-name)) ! ;; Write an empty tempfile out to disk and set its ! ;; permissions to 0600, then write the actual buffer ! ;; contents to tempfile. ! (write-region start start tempfile nil 0) ! (set-file-modes tempfile 384) ! ;; coding system for presentation buffer is binary, so ! ;; we don't need to set it here. ! (write-region start end tempfile nil 0) ! (vm-set-mm-layout-cache ! layout ! (nconc (vm-mm-layout-cache layout) ! (list (cons 'vm-mime-display-internal-audio/basic ! tempfile)))) ! (save-excursion ! (vm-select-folder-buffer) ! (setq vm-folder-garbage-alist ! (cons (cons tempfile 'delete-file) ! vm-folder-garbage-alist))) ! (delete-region start end)) (start-itimer "audioplayer" --- 2027,2052 ---- nil ! (vm-with-unibyte-buffer ! (vm-mime-insert-mime-body layout) ! (setq end (point-marker)) ! (vm-mime-transfer-decode-region layout start end) ! (setq tempfile (vm-make-tempfile-name)) ! ;; Write an empty tempfile out to disk and set its ! ;; permissions to 0600, then write the actual buffer ! ;; contents to tempfile. ! (write-region start start tempfile nil 0) ! (set-file-modes tempfile 384) ! ;; coding system for presentation buffer is binary, so ! ;; we don't need to set it here. ! (write-region start end tempfile nil 0) ! (vm-set-mm-layout-cache ! layout ! (nconc (vm-mm-layout-cache layout) ! (list (cons 'vm-mime-display-internal-audio/basic ! tempfile)))) ! (save-excursion ! (vm-select-folder-buffer) ! (setq vm-folder-garbage-alist ! (cons (cons tempfile 'delete-file) ! vm-folder-garbage-alist))) ! (delete-region start end))) (start-itimer "audioplayer" *************** *** 2167,2170 **** (set-buffer-file-coding-system 'binary t))) ! (vm-mime-insert-mime-body layout) ! (vm-mime-transfer-decode-region layout (point-min) (point-max)) (or (not (file-exists-p file)) --- 2227,2231 ---- (set-buffer-file-coding-system 'binary t))) ! (vm-with-unibyte-buffer ! (vm-mime-insert-mime-body layout) ! (vm-mime-transfer-decode-region layout (point-min) (point-max))) (or (not (file-exists-p file)) *************** *** 2195,2196 **** --- 2256,2259 ---- (set-buffer work-buffer) + (if vm-fsfemacs-mule-p + (set-buffer-multibyte nil)) (vm-mime-insert-mime-body layout) *************** *** 3240,3571 **** (error "Message is already MIME encoded.")) ! (let ((8bit nil) ! (just-one nil) ! (boundary-positions nil) ! (enriched (and (boundp 'enriched-mode) enriched-mode)) ! already-mimed layout o o-list boundary ! type encoding charset params description disposition object ! opoint-min) ! (mail-text) ! (setq o-list (vm-mime-fake-attachment-overlays (point) (point-max)) ! o-list (vm-delete (function ! (lambda (o) ! (overlay-get o 'vm-mime-object))) ! o-list t) ! o-list (sort o-list (function ! (lambda (e1 e2) ! (< (overlay-end e1) ! (overlay-end e2)))))) ! ;; If there's just one attachment and no other readable ! ;; text in the buffer then make the message type just be ! ;; the attachment type rather than sending a multipart ! ;; message with one attachment ! (setq just-one (and (= (length o-list) 1) ! (looking-at "[ \t\n]*") ! (= (match-end 0) ! (overlay-start (car o-list))) ! (save-excursion ! (goto-char (overlay-end (car o-list))) ! (looking-at "[ \t\n]*\\'")))) ! (if (null o-list) ! (progn ! (narrow-to-region (point) (point-max)) ! ;; support enriched-mode for text/enriched composition ! (if enriched ! (let ((enriched-initial-annotation "")) ! (enriched-encode (point-min) (point-max)))) ! (setq charset (vm-determine-proper-charset (point-min) ! (point-max))) ! (if vm-fsfemacs-mule-p ! (encode-coding-region (point-min) (point-max) ! buffer-file-coding-system)) ! (setq encoding (vm-determine-proper-content-transfer-encoding ! (point-min) ! (point-max)) ! encoding (vm-mime-transfer-encode-region encoding ! (point-min) ! (point-max) ! t)) ! (widen) ! (vm-remove-mail-mode-header-separator) ! (goto-char (point-min)) ! (vm-reorder-message-headers ! nil nil "\\(Content-Type:\\|Content-Transfer-Encoding\\|MIME-Version:\\)") ! (insert "MIME-Version: 1.0\n") ! (if enriched ! (insert "Content-Type: text/enriched; charset=" charset "\n") ! (insert "Content-Type: text/plain; charset=" charset "\n")) ! (insert "Content-Transfer-Encoding: " encoding "\n") ! (vm-add-mail-mode-header-separator)) ! (while o-list ! (setq o (car o-list)) ! (if (or just-one ! (save-excursion ! (eq (overlay-start o) ! (re-search-forward "[ \t\n]*" (overlay-start o) t)))) ! (delete-region (point) (overlay-start o)) ! (narrow-to-region (point) (overlay-start o)) ! ;; support enriched-mode for text/enriched composition ! (if enriched ! (let ((enriched-initial-annotation "")) ! (save-excursion ! ;; insert/delete trick needed to avoid ! ;; enriched-mode tags from seeping into the ! ;; attachment overlays. I really wish ! ;; front-advance / rear-advance overlay ! ;; endpoint properties actually worked. ! (goto-char (point-max)) ! (insert-before-markers "\n") ! (enriched-encode (point-min) (1- (point))) ! (goto-char (point-max)) ! (delete-char -1)))) ! (setq charset (vm-determine-proper-charset (point-min) ! (point-max))) ! (if vm-fsfemacs-mule-p ! (encode-coding-region (point-min) (point-max) ! buffer-file-coding-system)) ! (setq encoding (vm-determine-proper-content-transfer-encoding ! (point-min) ! (point-max)) ! encoding (vm-mime-transfer-encode-region encoding ! (point-min) ! (point-max) ! t) ! description (vm-mime-text-description (point-min) (point-max))) ! (setq boundary-positions (cons (point-marker) boundary-positions)) ! (if enriched ! (insert "Content-Type: text/enriched; charset=" charset "\n") ! (insert "Content-Type: text/plain; charset=" charset "\n")) ! (if description ! (insert "Content-Description: " description "\n")) ! (insert "Content-Transfer-Encoding: " encoding "\n\n") ! (widen)) ! (goto-char (overlay-start o)) ! (narrow-to-region (point) (point)) ! (setq object (overlay-get o 'vm-mime-object)) ! ;; insert the object ! (cond ((bufferp object) ! ;; as of FSF Emacs 19.34, even with the hooks ! ;; we've attached to the attachment overlays, ! ;; text STILL can be inserted into them when ! ;; font-lock is enabled. Explaining why is ! ;; beyond the scope of this comment and I ! ;; don't know the answer anyway. This works ! ;; to prevent it. ! (insert-before-markers " ") ! (forward-char -1) ! (insert-buffer-substring object) ! (delete-char 1)) ! ((stringp object) ! (insert-before-markers " ") ! (forward-char -1) ! (let ((coding-system-for-read ! (if (vm-mime-text-type-p ! (overlay-get o 'vm-mime-type)) ! 'no-conversion ! 'binary)) ! ;; don't let buffer-file-coding-system be ! ;; changed by insert-file-contents. The ! ;; value we bind to it to here isn't ! ;; important. ! (buffer-file-coding-system 'binary) ! ;; For NTEmacs 19: need to do this to make ! ;; sure CRs aren't eaten. ! (file-name-buffer-file-type-alist '(("." . t)))) ! (insert-file-contents object)) ! (goto-char (point-max)) ! (delete-char -1))) ! ;; gather information about the object from the extent. ! (if (setq already-mimed (overlay-get o 'vm-mime-encoded)) ! (setq layout (vm-mime-parse-entity ! nil (list "text/plain" "charset=us-ascii") ! "7bit") ! type (or (overlay-get o 'vm-mime-type) ! (car (vm-mm-layout-type layout))) ! params (or (overlay-get o 'vm-mime-parameters) ! (cdr (vm-mm-layout-qtype layout))) ! description (overlay-get o 'vm-mime-description) ! disposition ! (if (not ! (equal ! (car (overlay-get o 'vm-mime-disposition)) ! "unspecified")) ! (overlay-get o 'vm-mime-disposition) ! (vm-mm-layout-qdisposition layout))) ! (setq type (overlay-get o 'vm-mime-type) ! params (overlay-get o 'vm-mime-parameters) ! description (overlay-get o 'vm-mime-description) ! disposition ! (if (not (equal ! (car (overlay-get o 'vm-mime-disposition)) ! "unspecified")) ! (overlay-get o 'vm-mime-disposition) ! nil))) ! (cond ((vm-mime-types-match "text" type) ! (setq encoding ! (vm-determine-proper-content-transfer-encoding ! (if already-mimed ! (vm-mm-layout-body-start layout) ! (point-min)) ! (point-max)) ! encoding (vm-mime-transfer-encode-region ! encoding ! (if already-mimed ! (vm-mm-layout-body-start layout) ! (point-min)) ! (point-max) ! t)) ! (setq 8bit (or 8bit (equal encoding "8bit")))) ! ((vm-mime-composite-type-p type) ! (setq opoint-min (point-min)) ! (if (not already-mimed) ! (setq layout (vm-mime-parse-entity ! nil (list "text/plain" "charset=us-ascii") ! "7bit"))) ! (setq encoding (vm-mime-transfer-encode-layout layout)) ! (setq 8bit (or 8bit (equal encoding "8bit"))) ! (goto-char (point-max)) ! (widen) ! (narrow-to-region opoint-min (point))) ! (t ! (vm-mime-base64-encode-region ! (if already-mimed ! (vm-mm-layout-body-start layout) ! (point-min)) ! (point-max)) ! (setq encoding "base64"))) ! (if just-one ! nil ! (goto-char (point-min)) ! (setq boundary-positions (cons (point-marker) boundary-positions)) ! (if (not already-mimed) ! nil ! ;; trim headers ! (vm-reorder-message-headers nil '("Content-ID:") nil) ! ;; remove header/text separator ! (goto-char (1- (vm-mm-layout-body-start layout))) ! (if (looking-at "\n") ! (delete-char 1))) ! (insert "Content-Type: " type) ! (if params ! (if vm-mime-avoid-folding-content-type ! (insert "; " (mapconcat 'identity params "; ") "\n") ! (insert ";\n\t" (mapconcat 'identity params ";\n\t") "\n")) ! (insert "\n")) ! (and description (insert "Content-Description: " description "\n")) ! (if disposition ! (progn ! (insert "Content-Disposition: " (car disposition)) ! (if (cdr disposition) ! (insert ";\n\t" (mapconcat 'identity ! (cdr disposition) ! ";\n\t"))) ! (insert "\n"))) ! (insert "Content-Transfer-Encoding: " encoding "\n\n")) ! (goto-char (point-max)) ! (widen) ! (save-excursion ! (goto-char (overlay-start o)) ! (vm-assert (looking-at "\\[ATTACHMENT"))) ! (delete-region (overlay-start o) ! (overlay-end o)) ! (delete-overlay o) ! (if (looking-at "\n") ! (delete-char 1)) ! (setq o-list (cdr o-list))) ! ;; handle the remaining chunk of text after the last ! ;; extent, if any. ! (if (or just-one (looking-at "[ \t\n]*\\'")) ! (delete-region (point) (point-max)) ! ;; support enriched-mode for text/enriched composition ! (if enriched ! (let ((enriched-initial-annotation "")) ! (enriched-encode (point) (point-max)))) ! (setq charset (vm-determine-proper-charset (point) ! (point-max))) ! (if vm-fsfemacs-mule-p ! (encode-coding-region (point) (point-max) ! buffer-file-coding-system)) ! (setq encoding (vm-determine-proper-content-transfer-encoding ! (point) ! (point-max)) ! encoding (vm-mime-transfer-encode-region encoding ! (point) ! (point-max) ! t) ! description (vm-mime-text-description (point) (point-max))) ! (setq 8bit (or 8bit (equal encoding "8bit"))) ! (setq boundary-positions (cons (point-marker) boundary-positions)) ! (if enriched ! (insert "Content-Type: text/enriched; charset=" charset "\n") ! (insert "Content-Type: text/plain; charset=" charset "\n")) ! (if description ! (insert "Content-Description: " description "\n")) ! (insert "Content-Transfer-Encoding: " encoding "\n\n") ! (goto-char (point-max))) ! (setq boundary (vm-mime-make-multipart-boundary)) ! (mail-text) ! (while (re-search-forward (concat "^--" ! (regexp-quote boundary) ! "\\(--\\)?$") ! nil t) ! (setq boundary (vm-mime-make-multipart-boundary)) ! (mail-text)) ! (goto-char (point-max)) ! (or just-one (insert "\n--" boundary "--\n")) ! (while boundary-positions ! (goto-char (car boundary-positions)) ! (insert "\n--" boundary "\n") ! (setq boundary-positions (cdr boundary-positions))) ! (if (and just-one already-mimed) ! (progn ! (goto-char (vm-mm-layout-header-start layout)) ! ;; trim headers ! (vm-reorder-message-headers nil '("Content-ID:") nil) ! ;; remove header/text separator ! (goto-char (1- (vm-mm-layout-body-start layout))) ! (if (looking-at "\n") (delete-char 1)) ! ;; copy remainder to enclosing entity's header section ! (goto-char (point-max)) ! (insert-buffer-substring (current-buffer) ! (vm-mm-layout-header-start layout) ! (vm-mm-layout-body-start layout)) ! (delete-region (vm-mm-layout-header-start layout) ! (vm-mm-layout-body-start layout)))) ! (goto-char (point-min)) ! (vm-remove-mail-mode-header-separator) ! (vm-reorder-message-headers ! nil nil "\\(Content-Type:\\|MIME-Version:\\|Content-Transfer-Encoding\\)") ! (vm-add-mail-mode-header-separator) ! (insert "MIME-Version: 1.0\n") ! (if (not just-one) ! (insert (if vm-mime-avoid-folding-content-type ! "Content-Type: multipart/mixed; boundary=\"" ! "Content-Type: multipart/mixed;\n\tboundary=\"") ! boundary "\"\n") ! (insert "Content-Type: " type) ! (if params ! (if vm-mime-avoid-folding-content-type ! (insert "; " (mapconcat 'identity params "; ") "\n") ! (insert ";\n\t" (mapconcat 'identity params ";\n\t") "\n")) ! (insert "\n"))) ! (if (and just-one description) ! (insert "Content-Description: " description "\n")) ! (if (and just-one disposition) ! (progn ! (insert "Content-Disposition: " (car disposition)) ! (if (cdr disposition) ! (if vm-mime-avoid-folding-content-type ! (insert "; " (mapconcat 'identity (cdr disposition) "; ") ! "\n") ! (insert ";\n\t" (mapconcat 'identity (cdr disposition) ! ";\n\t") "\n")) ! (insert "\n")))) ! (if just-one ! (insert "Content-Transfer-Encoding: " encoding "\n") ! (if 8bit ! (insert "Content-Transfer-Encoding: 8bit\n") ! (insert "Content-Transfer-Encoding: 7bit\n"))))))) --- 3303,3635 ---- (error "Message is already MIME encoded.")) ! (vm-with-unibyte-buffer ! (let ((8bit nil) ! (just-one nil) ! (boundary-positions nil) ! (enriched (and (boundp 'enriched-mode) enriched-mode)) ! already-mimed layout o o-list boundary ! type encoding charset params description disposition object ! opoint-min) ! (mail-text) ! (setq o-list (vm-mime-fake-attachment-overlays (point) (point-max)) ! o-list (vm-delete (function ! (lambda (o) ! (overlay-get o 'vm-mime-object))) ! o-list t) ! o-list (sort o-list (function ! (lambda (e1 e2) ! (< (overlay-end e1) ! (overlay-end e2)))))) ! ;; If there's just one attachment and no other readable ! ;; text in the buffer then make the message type just be ! ;; the attachment type rather than sending a multipart ! ;; message with one attachment ! (setq just-one (and (= (length o-list) 1) ! (looking-at "[ \t\n]*") ! (= (match-end 0) ! (overlay-start (car o-list))) ! (save-excursion ! (goto-char (overlay-end (car o-list))) ! (looking-at "[ \t\n]*\\'")))) ! (if (null o-list) ! (progn ! (narrow-to-region (point) (point-max)) ! ;; support enriched-mode for text/enriched composition ! (if enriched ! (let ((enriched-initial-annotation "")) ! (enriched-encode (point-min) (point-max)))) ! (setq charset (vm-determine-proper-charset (point-min) (point-max))) ! (if vm-fsfemacs-mule-p ! (encode-coding-region (point-min) (point-max) ! buffer-file-coding-system)) ! (setq encoding (vm-determine-proper-content-transfer-encoding ! (point-min) ! (point-max)) ! encoding (vm-mime-transfer-encode-region encoding ! (point-min) ! (point-max) ! t)) ! (widen) ! (vm-remove-mail-mode-header-separator) ! (goto-char (point-min)) ! (vm-reorder-message-headers ! nil nil "\\(Content-Type:\\|Content-Transfer-Encoding\\|MIME-Version:\\)") ! (insert "MIME-Version: 1.0\n") ! (if enriched ! (insert "Content-Type: text/enriched; charset=" charset "\n") ! (insert "Content-Type: text/plain; charset=" charset "\n")) ! (insert "Content-Transfer-Encoding: " encoding "\n") ! (vm-add-mail-mode-header-separator)) ! (while o-list ! (setq o (car o-list)) ! (if (or just-one ! (save-excursion ! (eq (overlay-start o) ! (re-search-forward "[ \t\n]*" (overlay-start o) t)))) ! (delete-region (point) (overlay-start o)) ! (narrow-to-region (point) (overlay-start o)) ! ;; support enriched-mode for text/enriched composition ! (if enriched ! (let ((enriched-initial-annotation "")) ! (save-excursion ! ;; insert/delete trick needed to avoid ! ;; enriched-mode tags from seeping into the ! ;; attachment overlays. I really wish ! ;; front-advance / rear-advance overlay ! ;; endpoint properties actually worked. ! (goto-char (point-max)) ! (insert-before-markers "\n") ! (enriched-encode (point-min) (1- (point))) ! (goto-char (point-max)) ! (delete-char -1)))) ! (setq charset (vm-determine-proper-charset (point-min) ! (point-max))) ! (if vm-fsfemacs-mule-p ! (encode-coding-region (point-min) (point-max) ! buffer-file-coding-system)) ! (setq encoding (vm-determine-proper-content-transfer-encoding ! (point-min) ! (point-max)) ! encoding (vm-mime-transfer-encode-region encoding ! (point-min) ! (point-max) ! t) ! description (vm-mime-text-description (point-min) ! (point-max))) ! (setq boundary-positions (cons (point-marker) boundary-positions)) ! (if enriched ! (insert "Content-Type: text/enriched; charset=" charset "\n") ! (insert "Content-Type: text/plain; charset=" charset "\n")) ! (if description (insert "Content-Description: " description "\n")) ! (insert "Content-Transfer-Encoding: " encoding "\n\n") ! (widen)) ! (goto-char (overlay-start o)) ! (narrow-to-region (point) (point)) ! (setq object (overlay-get o 'vm-mime-object)) ! ;; insert the object ! (cond ((bufferp object) ! ;; as of FSF Emacs 19.34, even with the hooks ! ;; we've attached to the attachment overlays, ! ;; text STILL can be inserted into them when ! ;; font-lock is enabled. Explaining why is ! ;; beyond the scope of this comment and I ! ;; don't know the answer anyway. This works ! ;; to prevent it. ! (insert-before-markers " ") ! (forward-char -1) ! (insert-buffer-substring object) (delete-char 1)) ! ((stringp object) ! (insert-before-markers " ") ! (forward-char -1) ! (let ((coding-system-for-read ! (if (vm-mime-text-type-p ! (overlay-get o 'vm-mime-type)) ! 'no-conversion ! 'binary)) ! ;; don't let buffer-file-coding-system be ! ;; changed by insert-file-contents. The ! ;; value we bind to it to here isn't ! ;; important. ! (buffer-file-coding-system 'binary) ! ;; For NTEmacs 19: need to do this to make ! ;; sure CRs aren't eaten. ! (file-name-buffer-file-type-alist '(("." . t)))) ! (insert-file-contents object)) ! (goto-char (point-max)) ! (delete-char -1))) ! ;; gather information about the object from the extent. ! (if (setq already-mimed (overlay-get o 'vm-mime-encoded)) ! (setq layout (vm-mime-parse-entity ! nil (list "text/plain" "charset=us-ascii") ! "7bit") ! type (or (overlay-get o 'vm-mime-type) ! (car (vm-mm-layout-type layout))) ! params (or (overlay-get o 'vm-mime-parameters) ! (cdr (vm-mm-layout-qtype layout))) ! description (overlay-get o 'vm-mime-description) ! disposition ! (if (not ! (equal ! (car (overlay-get o 'vm-mime-disposition)) ! "unspecified")) ! (overlay-get o 'vm-mime-disposition) ! (vm-mm-layout-qdisposition layout))) ! (setq type (overlay-get o 'vm-mime-type) ! params (overlay-get o 'vm-mime-parameters) ! description (overlay-get o 'vm-mime-description) ! disposition ! (if (not (equal ! (car (overlay-get o 'vm-mime-disposition)) ! "unspecified")) ! (overlay-get o 'vm-mime-disposition) ! nil))) ! (cond ((vm-mime-types-match "text" type) ! (setq encoding ! (vm-determine-proper-content-transfer-encoding ! (if already-mimed ! (vm-mm-layout-body-start layout) ! (point-min)) ! (point-max)) ! encoding (vm-mime-transfer-encode-region ! encoding ! (if already-mimed ! (vm-mm-layout-body-start layout) ! (point-min)) ! (point-max) ! t)) ! (setq 8bit (or 8bit (equal encoding "8bit")))) ! ((vm-mime-composite-type-p type) ! (setq opoint-min (point-min)) ! (if (not already-mimed) ! (setq layout (vm-mime-parse-entity ! nil (list "text/plain" "charset=us-ascii") ! "7bit"))) ! (setq encoding (vm-mime-transfer-encode-layout layout)) ! (setq 8bit (or 8bit (equal encoding "8bit"))) ! (goto-char (point-max)) ! (widen) ! (narrow-to-region opoint-min (point))) ! (t ! (vm-mime-base64-encode-region ! (if already-mimed ! (vm-mm-layout-body-start layout) ! (point-min)) ! (point-max)) ! (setq encoding "base64"))) ! (if just-one ! nil ! (goto-char (point-min)) ! (setq boundary-positions (cons (point-marker) boundary-positions)) ! (if (not already-mimed) ! nil ! ;; trim headers ! (vm-reorder-message-headers nil '("Content-ID:") nil) ! ;; remove header/text separator ! (goto-char (1- (vm-mm-layout-body-start layout))) ! (if (looking-at "\n") ! (delete-char 1))) ! (insert "Content-Type: " type) ! (if params ! (if vm-mime-avoid-folding-content-type ! (insert "; " (mapconcat 'identity params "; ") "\n") ! (insert ";\n\t" (mapconcat 'identity params ";\n\t") "\n")) ! (insert "\n")) ! (and description ! (insert "Content-Description: " description "\n")) ! (if disposition ! (progn ! (insert "Content-Disposition: " (car disposition)) ! (if (cdr disposition) ! (insert ";\n\t" (mapconcat 'identity ! (cdr disposition) ! ";\n\t"))) ! (insert "\n"))) ! (insert "Content-Transfer-Encoding: " encoding "\n\n")) ! (goto-char (point-max)) ! (widen) ! (save-excursion ! (goto-char (overlay-start o)) ! (vm-assert (looking-at "\\[ATTACHMENT"))) ! (delete-region (overlay-start o) ! (overlay-end o)) ! (delete-overlay o) ! (if (looking-at "\n") ! (delete-char 1)) ! (setq o-list (cdr o-list))) ! ;; handle the remaining chunk of text after the last ! ;; extent, if any. ! (if (or just-one (looking-at "[ \t\n]*\\'")) ! (delete-region (point) (point-max)) ! ;; support enriched-mode for text/enriched composition ! (if enriched ! (let ((enriched-initial-annotation "")) ! (enriched-encode (point) (point-max)))) ! (setq charset (vm-determine-proper-charset (point) ! (point-max))) ! (if vm-fsfemacs-mule-p ! (encode-coding-region (point) (point-max) ! buffer-file-coding-system)) ! (setq encoding (vm-determine-proper-content-transfer-encoding ! (point) ! (point-max)) ! encoding (vm-mime-transfer-encode-region encoding ! (point) ! (point-max) ! t) ! description (vm-mime-text-description (point) (point-max))) ! (setq 8bit (or 8bit (equal encoding "8bit"))) ! (setq boundary-positions (cons (point-marker) boundary-positions)) ! (if enriched ! (insert "Content-Type: text/enriched; charset=" charset "\n") ! (insert "Content-Type: text/plain; charset=" charset "\n")) ! (if description ! (insert "Content-Description: " description "\n")) ! (insert "Content-Transfer-Encoding: " encoding "\n\n") ! (goto-char (point-max))) ! (setq boundary (vm-mime-make-multipart-boundary)) ! (mail-text) ! (while (re-search-forward (concat "^--" ! (regexp-quote boundary) ! "\\(--\\)?$") ! nil t) ! (setq boundary (vm-mime-make-multipart-boundary)) ! (mail-text)) ! (goto-char (point-max)) ! (or just-one (insert "\n--" boundary "--\n")) ! (while boundary-positions ! (goto-char (car boundary-positions)) ! (insert "\n--" boundary "\n") ! (setq boundary-positions (cdr boundary-positions))) ! (if (and just-one already-mimed) ! (progn ! (goto-char (vm-mm-layout-header-start layout)) ! ;; trim headers ! (vm-reorder-message-headers nil '("Content-ID:") nil) ! ;; remove header/text separator ! (goto-char (1- (vm-mm-layout-body-start layout))) ! (if (looking-at "\n") ! (delete-char 1)) ! ;; copy remainder to enclosing entity's header section ! (goto-char (point-max)) ! (insert-buffer-substring (current-buffer) ! (vm-mm-layout-header-start layout) ! (vm-mm-layout-body-start layout)) ! (delete-region (vm-mm-layout-header-start layout) ! (vm-mm-layout-body-start layout)))) ! (goto-char (point-min)) ! (vm-remove-mail-mode-header-separator) ! (vm-reorder-message-headers ! nil nil "\\(Content-Type:\\|MIME-Version:\\|Content-Transfer-Encoding\\)") ! (vm-add-mail-mode-header-separator) ! (insert "MIME-Version: 1.0\n") ! (if (not just-one) ! (insert (if vm-mime-avoid-folding-content-type ! "Content-Type: multipart/mixed; boundary=\"" ! "Content-Type: multipart/mixed;\n\tboundary=\"") ! boundary "\"\n") ! (insert "Content-Type: " type) ! (if params ! (if vm-mime-avoid-folding-content-type ! (insert "; " (mapconcat 'identity params "; ") "\n") ! (insert ";\n\t" (mapconcat 'identity params ";\n\t") "\n")) ! (insert "\n"))) ! (if (and just-one description) ! (insert "Content-Description: " description "\n")) ! (if (and just-one disposition) ! (progn ! (insert "Content-Disposition: " (car disposition)) ! (if (cdr disposition) ! (if vm-mime-avoid-folding-content-type ! (insert "; " (mapconcat 'identity (cdr disposition) "; ") ! "\n") ! (insert ";\n\t" (mapconcat 'identity (cdr disposition) ! ";\n\t") "\n")) ! (insert "\n")))) ! (if just-one ! (insert "Content-Transfer-Encoding: " encoding "\n") ! (if 8bit ! (insert "Content-Transfer-Encoding: 8bit\n") ! (insert "Content-Transfer-Encoding: 7bit\n")))))))) *** dist/vm-misc.el.dist Fri Jan 29 00:13:37 1999 --- vm-misc.el Sat Jan 30 14:28:38 1999 *************** *** 197,199 **** (if (or vm-xemacs-mule-p vm-fsfemacs-mule-p) ! (set-file-coding-system 'no-conversion nil)) (write-region (point-min) (point-max) where t 'quiet)) --- 197,199 ---- (if (or vm-xemacs-mule-p vm-fsfemacs-mule-p) ! (set-buffer-file-coding-system 'no-conversion nil)) (write-region (point-min) (point-max) where t 'quiet)) *** dist/vm-reply.el.dist Sun Jan 17 17:42:36 1999 --- vm-reply.el Sun Jan 31 22:41:35 1999 *************** *** 432,434 **** (random 1000000) ! (system-name)))))))) --- 432,434 ---- (random 1000000) ! hostname))))))) *** dist/vm-save.el.dist Tue Dec 15 09:10:23 1998 --- vm-save.el Sun Jan 31 01:20:43 1999 *************** *** 56,57 **** --- 56,59 ---- (set-buffer buf) + (if vm-fsfemacs-mule-p + (set-buffer-multibyte nil)) (widen) *** dist/vm-startup.el.dist Fri Jan 29 00:13:38 1999 --- vm-startup.el Fri Feb 5 01:38:45 1999 *************** *** 19,20 **** --- 19,22 ---- + (defvar enable-multibyte-characters) + ;;;###autoload *************** *** 66,67 **** --- 68,71 ---- (enable-local-variables nil) + ;; for Emacs/MULE + (default-enable-multibyte-characters nil) ;; for XEmacs/Mule *************** *** 77,78 **** --- 81,84 ---- (set-buffer folder-buffer) + (if (and vm-fsfemacs-mule-p enable-multibyte-characters) + (set-buffer-multibyte nil)) ;; for XEmacs/MULE *************** *** 311,313 **** ! This is VM 6.65. --- 317,319 ---- ! This is VM 6.66. *** dist/vm-vars.el.dist Fri Jan 29 00:13:39 1999 --- vm-vars.el Mon Feb 1 00:08:40 1999 *************** *** 1050,1051 **** --- 1050,1070 ---- + (defvar vm-mime-qp-decoder-program nil + "*Non-nil value should be a string that names a MIME quoted-printable + decoder. The program should expect to read quoted-printable + data on its standard input and write the converted data to its + standard output.") + + (defvar vm-mime-qp-decoder-switches nil + "*List of command line flags passed to the command named by + `vm-mime-qp-decoder-program'.") + + (defvar vm-mime-qp-encoder-program nil + "*Non-nil value should be a string that names a MIME quoted-printable + encoder. The program should expect arbitrary data on its standard + input and write quoted-printable data to its standard output.") + + (defvar vm-mime-qp-encoder-switches nil + "*List of command line flags passed to the command named by + `vm-mime-qp-encoder-program'.") + (defvar vm-mime-uuencode-decoder-program "uudecode" *************** *** 3555,3557 **** ;; paranoia ! (fboundp 'set-file-coding-system)) vm-fsfemacs-p (not vm-xemacs-p) --- 3574,3576 ---- ;; paranoia ! (fboundp 'set-buffer-file-coding-system)) vm-fsfemacs-p (not vm-xemacs-p) *************** *** 3596,3598 **** )) ! "Alist that maps MIME character sets to MULE coding systemss.") --- 3615,3617 ---- )) ! "Alist that maps MIME character sets to MULE coding systems.") *** dist/vm-version.el.dist Fri Jan 29 00:13:39 1999 --- vm-version.el Fri Feb 5 01:38:44 1999 *************** *** 4,6 **** ! (defconst vm-version "6.65" "Version number of VM.") --- 4,6 ---- ! (defconst vm-version "6.66" "Version number of VM.") *** dist/vm-window.el.dist Fri Jan 29 00:13:39 1999 --- vm-window.el Sun Jan 31 01:03:05 1999 *************** *** 118,119 **** --- 118,121 ---- (set-buffer (setq work-buffer (get-buffer-create "*vm-wconfig*"))) + (if vm-fsfemacs-mule-p + (set-buffer-multibyte nil)) (erase-buffer) *************** *** 134,135 **** --- 136,139 ---- (set-buffer (setq work-buffer (get-buffer-create "*vm-wconfig*"))) + (if vm-fsfemacs-mule-p + (set-buffer-multibyte nil)) ;; for MULE