comparison lisp/vm/vm-mime.el @ 114:8619ce7e4c50 r20-1b9

Import from CVS: tag r20-1b9
author cvs
date Mon, 13 Aug 2007 09:21:54 +0200
parents fe104dbd9147
children 9f59509498e1
comparison
equal deleted inserted replaced
113:2ec2fe4a4c89 114:8619ce7e4c50
46 (or (vm-mime-layout-of m) 46 (or (vm-mime-layout-of m)
47 (progn (vm-set-mime-layout-of 47 (progn (vm-set-mime-layout-of
48 m 48 m
49 (condition-case data 49 (condition-case data
50 (vm-mime-parse-entity m) 50 (vm-mime-parse-entity m)
51 (vm-mime-error (apply 'message (cdr data))))) 51 (vm-mime-error (message "%s" (car (cdr data))))))
52 (vm-mime-layout-of m)))) 52 (vm-mime-layout-of m))))
53 53
54 (defun vm-mm-encoded-header (m) 54 (defun vm-mm-encoded-header (m)
55 (or (vm-mime-encoded-header-flag-of m) 55 (or (vm-mime-encoded-header-flag-of m)
56 (progn (setq m (vm-real-message-of m)) 56 (progn (setq m (vm-real-message-of m))
382 (while (< inputpos end) 382 (while (< inputpos end)
383 (setq char (char-after inputpos)) 383 (setq char (char-after inputpos))
384 (cond ((= char ?\n) 384 (cond ((= char ?\n)
385 (vm-insert-char char 1 nil work-buffer) 385 (vm-insert-char char 1 nil work-buffer)
386 (setq cols 0)) 386 (setq cols 0))
387 ((and (= char 32) (not (= ?\n (char-after (1+ inputpos))))) 387 ((and (= char 32)
388 (not (= (1+ inputpos) end))
389 (not (= ?\n (char-after (1+ inputpos)))))
388 (vm-insert-char char 1 nil work-buffer) 390 (vm-insert-char char 1 nil work-buffer)
389 (vm-increment cols)) 391 (vm-increment cols))
390 ((or (< char 33) (> char 126) (= char 61) 392 ((or (< char 33) (> char 126) (= char 61)
391 (and quote-from (= cols 0) (let ((case-fold-search nil)) 393 (and quote-from (= cols 0) (let ((case-fold-search nil))
392 (looking-at "From ")))) 394 (looking-at "From "))))
416 (and work-buffer (kill-buffer work-buffer))))) 418 (and work-buffer (kill-buffer work-buffer)))))
417 419
418 (defun vm-decode-mime-message-headers (m) 420 (defun vm-decode-mime-message-headers (m)
419 (let ((case-fold-search t) 421 (let ((case-fold-search t)
420 (buffer-read-only nil) 422 (buffer-read-only nil)
421 (did-decode nil)
422 charset encoding match-start match-end start end) 423 charset encoding match-start match-end start end)
423 (save-excursion 424 (save-excursion
424 (goto-char (vm-headers-of m)) 425 (goto-char (vm-headers-of m))
425 (while (re-search-forward vm-mime-encoded-word-regexp (vm-text-of m) t) 426 (while (re-search-forward vm-mime-encoded-word-regexp (vm-text-of m) t)
426 (setq match-start (match-beginning 0) 427 (setq match-start (match-beginning 0)
431 end (vm-marker (match-end 3))) 432 end (vm-marker (match-end 3)))
432 ;; don't change anything if we can't display the 433 ;; don't change anything if we can't display the
433 ;; character set properly. 434 ;; character set properly.
434 (if (not (vm-mime-charset-internally-displayable-p charset)) 435 (if (not (vm-mime-charset-internally-displayable-p charset))
435 nil 436 nil
436 (setq did-decode t)
437 (delete-region end match-end) 437 (delete-region end match-end)
438 (condition-case data 438 (condition-case data
439 (cond ((string-match "B" encoding) 439 (cond ((string-match "B" encoding)
440 (vm-mime-B-decode-region start end)) 440 (vm-mime-B-decode-region start end))
441 ((string-match "Q" encoding) 441 ((string-match "Q" encoding)
445 (vm-mime-error (apply 'message (cdr data)) 445 (vm-mime-error (apply 'message (cdr data))
446 (goto-char start) 446 (goto-char start)
447 (insert "**invalid encoded word**") 447 (insert "**invalid encoded word**")
448 (delete-region (point) end))) 448 (delete-region (point) end)))
449 (vm-mime-charset-decode-region charset start end) 449 (vm-mime-charset-decode-region charset start end)
450 (delete-region match-start start))) 450 (delete-region match-start start))))))
451 ;; if we did some decoding, re-electrify the headers since
452 ;; some of the extents might have been wiped by the
453 ;; decoding process.
454 (if did-decode
455 (save-restriction
456 (narrow-to-region (vm-headers-of m) (vm-text-of m))
457 (vm-energize-urls)
458 (vm-highlight-headers-maybe)
459 (vm-energize-headers-and-xfaces))))))
460 451
461 (defun vm-decode-mime-encoded-words () 452 (defun vm-decode-mime-encoded-words ()
462 (let ((case-fold-search t) 453 (let ((case-fold-search t)
463 (buffer-read-only nil) 454 (buffer-read-only nil)
464 charset encoding match-start match-end start end) 455 charset encoding match-start match-end start end)
630 621
631 (defun vm-mime-parse-entity (&optional m default-type default-encoding) 622 (defun vm-mime-parse-entity (&optional m default-type default-encoding)
632 (let ((case-fold-search t) version type qtype encoding id description 623 (let ((case-fold-search t) version type qtype encoding id description
633 disposition qdisposition boundary boundary-regexp start 624 disposition qdisposition boundary boundary-regexp start
634 multipart-list c-t c-t-e done p returnval) 625 multipart-list c-t c-t-e done p returnval)
635 (and m (message "Parsing MIME message..."))
636 (prog1
637 (catch 'return-value 626 (catch 'return-value
638 (save-excursion 627 (save-excursion
639 (if m 628 (if m
640 (progn 629 (progn
641 (setq m (vm-real-message-of m)) 630 (setq m (vm-real-message-of m))
699 (vm-mime-parse-content-header 688 (vm-mime-parse-content-header
700 disposition ?\;)))) 689 disposition ?\;))))
701 (cond ((null m) t) 690 (cond ((null m) t)
702 ((null version) 691 ((null version)
703 (throw 'return-value 'none)) 692 (throw 'return-value 'none))
704 ((string= version "1.0") t) 693 ((or vm-mime-ignore-mime-version (string= version "1.0")) t)
705 (t (vm-mime-error "Unsupported MIME version: %s" version))) 694 (t (vm-mime-error "Unsupported MIME version: %s" version)))
706 (cond ((and m (null type)) 695 (cond ((and m (null type))
707 (throw 'return-value 696 (throw 'return-value
708 (vector '("text/plain" "charset=us-ascii") 697 (vector '("text/plain" "charset=us-ascii")
709 '("text/plain" "charset=us-ascii") 698 '("text/plain" "charset=us-ascii")
812 disposition qdisposition 801 disposition qdisposition
813 (vm-marker (point-min)) 802 (vm-marker (point-min))
814 (vm-marker (point)) 803 (vm-marker (point))
815 (vm-marker (point-max)) 804 (vm-marker (point-max))
816 (nreverse multipart-list) 805 (nreverse multipart-list)
817 nil ))))) 806 nil )))))))
818 (and m (message "Parsing MIME message... done"))
819 )))
820 807
821 (defun vm-mime-parse-entity-safe (&optional m c-t c-t-e) 808 (defun vm-mime-parse-entity-safe (&optional m c-t c-t-e)
822 (or c-t (setq c-t '("text/plain" "charset=us-ascii"))) 809 (or c-t (setq c-t '("text/plain" "charset=us-ascii")))
823 ;; don't let subpart parse errors make the whole parse fail. use default 810 ;; don't let subpart parse errors make the whole parse fail. use default
824 ;; type if the parse fails. 811 ;; type if the parse fails.
928 (vm-set-hooks-for-frame-deletion)) 915 (vm-set-hooks-for-frame-deletion))
929 (use-local-map vm-mode-map) 916 (use-local-map vm-mode-map)
930 (and (vm-toolbar-support-possible-p) vm-use-toolbar 917 (and (vm-toolbar-support-possible-p) vm-use-toolbar
931 (vm-toolbar-install-toolbar)) 918 (vm-toolbar-install-toolbar))
932 (and (vm-menu-support-possible-p) 919 (and (vm-menu-support-possible-p)
933 (vm-menu-install-menus))) 920 (vm-menu-install-menus))
921 (run-hooks 'vm-presentation-mode-hook))
934 (setq vm-presentation-buffer-handle b))) 922 (setq vm-presentation-buffer-handle b)))
935 (setq b vm-presentation-buffer-handle 923 (setq b vm-presentation-buffer-handle
936 vm-presentation-buffer vm-presentation-buffer-handle 924 vm-presentation-buffer vm-presentation-buffer-handle
937 vm-mime-decoded nil) 925 vm-mime-decoded nil)
938 (save-excursion 926 (save-excursion
1079 ((or (vm-mime-types-match "text/plain" type) 1067 ((or (vm-mime-types-match "text/plain" type)
1080 (vm-mime-types-match "text/enriched" type)) 1068 (vm-mime-types-match "text/enriched" type))
1081 (let ((charset (or (vm-mime-get-parameter layout "charset") 1069 (let ((charset (or (vm-mime-get-parameter layout "charset")
1082 "us-ascii"))) 1070 "us-ascii")))
1083 (vm-mime-charset-internally-displayable-p charset))) 1071 (vm-mime-charset-internally-displayable-p charset)))
1084 ;; commented out until I decide whether W3 is safe to use in 1072 ;; commented out until w3-region behavior gets worked out
1085 ;; light of the porposed javascript extension and the possibility
1086 ;; of executing arbitrary Emacs-Lisp code embedded in a page.
1087 ;; 1073 ;;
1088 ;; ((vm-mime-types-match "text/html" type) 1074 ;; ((vm-mime-types-match "text/html" type)
1089 ;; (condition-case () 1075 ;; (condition-case ()
1090 ;; (progn (require 'w3) 1076 ;; (progn (require 'w3)
1091 ;; (fboundp 'w3-region)) 1077 ;; (fboundp 'w3-region))
1275 (and (not (eq (vm-mm-encoded-header m) 'none)) 1261 (and (not (eq (vm-mm-encoded-header m) 'none))
1276 (vm-decode-mime-message-headers m)) 1262 (vm-decode-mime-message-headers m))
1277 (if (vectorp layout) 1263 (if (vectorp layout)
1278 (progn 1264 (progn
1279 (vm-decode-mime-layout layout) 1265 (vm-decode-mime-layout layout)
1280 (delete-region (point) (point-max))))) 1266 (delete-region (point) (point-max))))
1267 (vm-energize-urls)
1268 (vm-highlight-headers-maybe)
1269 (vm-energize-headers-and-xfaces))
1281 (set-buffer-modified-p modified)))) 1270 (set-buffer-modified-p modified))))
1282 (save-excursion (set-buffer vm-mail-buffer) 1271 (save-excursion (set-buffer vm-mail-buffer)
1283 (setq vm-mime-decoded 'decoded)) 1272 (setq vm-mime-decoded 'decoded))
1284 (intern (buffer-name vm-mail-buffer) vm-buffers-needing-display-update) 1273 (intern (buffer-name vm-mail-buffer) vm-buffers-needing-display-update)
1285 (vm-update-summary-and-mode-line) 1274 (vm-update-summary-and-mode-line)
1347 t ) 1336 t )
1348 1337
1349 (defun vm-mime-display-button-text (layout) 1338 (defun vm-mime-display-button-text (layout)
1350 (vm-mime-display-button-xxxx layout t)) 1339 (vm-mime-display-button-xxxx layout t))
1351 1340
1352 ;; commented out until I decide whether W3 is safe to use in 1341 ;; commented out until w3-region behavior is worked out
1353 ;; light of the proposed javascript extension and the possibility
1354 ;; of executing arbitrary Emacs-Lisp code embedded in a page.
1355 ;; 1342 ;;
1356 ;;(defun vm-mime-display-internal-text/html (layout) 1343 ;;(defun vm-mime-display-internal-text/html (layout)
1357 ;; (let ((buffer-read-only nil) 1344 ;; (let ((buffer-read-only nil)
1358 ;; (work-buffer nil)) 1345 ;; (work-buffer nil))
1359 ;; (message "Inlining text/html, be patient...") 1346 ;; (message "Inlining text/html, be patient...")
1372 ;; (insert-buffer-substring work-buffer)) 1359 ;; (insert-buffer-substring work-buffer))
1373 ;; (and work-buffer (kill-buffer work-buffer))) 1360 ;; (and work-buffer (kill-buffer work-buffer)))
1374 ;; (message "Inlining text/html... done") 1361 ;; (message "Inlining text/html... done")
1375 ;; t )) 1362 ;; t ))
1376 1363
1377 (defun vm-mime-display-internal-text/plain (layout &optional ignore-urls) 1364 (defun vm-mime-display-internal-text/plain (layout &optional no-highlighting)
1378 (let ((start (point)) end old-size 1365 (let ((start (point)) end old-size
1379 (buffer-read-only nil) 1366 (buffer-read-only nil)
1380 (charset (or (vm-mime-get-parameter layout "charset") "us-ascii"))) 1367 (charset (or (vm-mime-get-parameter layout "charset") "us-ascii")))
1381 (if (not (vm-mime-charset-internally-displayable-p charset)) 1368 (if (not (vm-mime-charset-internally-displayable-p charset))
1382 (progn 1369 (progn
1387 (setq end (point-marker)) 1374 (setq end (point-marker))
1388 (vm-mime-transfer-decode-region layout start end) 1375 (vm-mime-transfer-decode-region layout start end)
1389 (setq old-size (buffer-size)) 1376 (setq old-size (buffer-size))
1390 (vm-mime-charset-decode-region charset start end) 1377 (vm-mime-charset-decode-region charset start end)
1391 (set-marker end (+ end (- (buffer-size) old-size))) 1378 (set-marker end (+ end (- (buffer-size) old-size)))
1392 (or ignore-urls (vm-energize-urls-in-message-region start end)) 1379 (or no-highlighting (vm-energize-urls-in-message-region start end))
1393 (goto-char end) 1380 (goto-char end)
1394 t ))) 1381 t )))
1395 1382
1396 (defun vm-mime-display-internal-text/enriched (layout) 1383 (defun vm-mime-display-internal-text/enriched (layout)
1397 (require 'enriched) 1384 (require 'enriched)
1592 (vm-save-buffer-excursion 1579 (vm-save-buffer-excursion
1593 (vm-goto-new-folder-frame-maybe 'folder) 1580 (vm-goto-new-folder-frame-maybe 'folder)
1594 (vm-mode)) 1581 (vm-mode))
1595 ;; temp buffer, don't offer to save it. 1582 ;; temp buffer, don't offer to save it.
1596 (setq buffer-offer-save nil) 1583 (setq buffer-offer-save nil)
1597 (vm-display nil nil (list this-command) '(vm-mode startup))) 1584 (vm-display (or vm-presentation-buffer (current-buffer)) t
1585 (list this-command) '(vm-mode startup)))
1598 t ) 1586 t )
1599 (fset 'vm-mime-display-button-multipart/digest 1587 (fset 'vm-mime-display-button-multipart/digest
1600 'vm-mime-display-internal-multipart/digest) 1588 'vm-mime-display-internal-multipart/digest)
1601 1589
1602 (defun vm-mime-display-internal-message/rfc822 (layout) 1590 (defun vm-mime-display-internal-message/rfc822 (layout)
2588 (forward-char -1) 2576 (forward-char -1)
2589 (insert-buffer-substring object) 2577 (insert-buffer-substring object)
2590 (delete-char 1))) 2578 (delete-char 1)))
2591 ((stringp object) 2579 ((stringp object)
2592 (let ((coding-system-for-read 'no-conversion)) 2580 (let ((coding-system-for-read 'no-conversion))
2593 (insert-file-contents-literally object)))) 2581 (insert-before-markers " ")
2582 (forward-char -1)
2583 (insert-file-contents-literally object)
2584 (delete-char 1))))
2594 ;; gather information about the object from the extent. 2585 ;; gather information about the object from the extent.
2595 (if (setq already-mimed (vm-extent-property e 'vm-mime-encoded)) 2586 (if (setq already-mimed (vm-extent-property e 'vm-mime-encoded))
2596 (setq layout (vm-mime-parse-entity 2587 (setq layout (vm-mime-parse-entity
2597 nil (list "text/plain" "charset=us-ascii") 2588 nil (list "text/plain" "charset=us-ascii")
2598 "7bit") 2589 "7bit")
2893 ;; so vm-mime-encode-composition won't complain 2884 ;; so vm-mime-encode-composition won't complain
2894 (setq major-mode 'mail-mode) 2885 (setq major-mode 'mail-mode)
2895 (vm-insert-region-from-buffer mail-buffer) 2886 (vm-insert-region-from-buffer mail-buffer)
2896 (goto-char (point-min)) 2887 (goto-char (point-min))
2897 (or (vm-mail-mode-get-header-contents "From") 2888 (or (vm-mail-mode-get-header-contents "From")
2898 (insert "From: " (or user-mail-address (user-login-name)) "\n")) 2889 (insert "From: " (user-login-name) "\n"))
2899 (or (vm-mail-mode-get-header-contents "Message-ID") 2890 (or (vm-mail-mode-get-header-contents "Message-ID")
2900 (insert "Message-ID: <fake@fake.fake>\n")) 2891 (insert "Message-ID: <fake@fake.fake>\n"))
2901 (or (vm-mail-mode-get-header-contents "Date") 2892 (or (vm-mail-mode-get-header-contents "Date")
2902 (insert "Date: " 2893 (insert "Date: "
2903 (format-time-string "%a, %d %b %Y %H%M%S %Z" 2894 (format-time-string "%a, %d %b %Y %H%M%S %Z"