annotate lisp/mail/rmailmm.el @ 112257:103d72f0a1d5

Another improvement of MIME handling in rmail.
author Kenichi Handa <handa@m17n.org>
date Wed, 12 Jan 2011 15:08:55 +0900
parents 6fd3dcdcc675
children 932e0e85675a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1 ;;; rmailmm.el --- MIME decoding and display stuff for RMAIL
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
2
112218
376148b31b5e Add 2011 to FSF/AIST copyright years.
Glenn Morris <rgm@gnu.org>
parents: 112073
diff changeset
3 ;; Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
4
101380
50eed64d8f54 Comment (add Author: header).
Glenn Morris <rgm@gnu.org>
parents: 101370
diff changeset
5 ;; Author: Alexander Pohoyda
50eed64d8f54 Comment (add Author: header).
Glenn Morris <rgm@gnu.org>
parents: 101370
diff changeset
6 ;; Alex Schroeder
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
7 ;; Maintainer: FSF
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
8 ;; Keywords: mail
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
9
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
10 ;; This file is part of GNU Emacs.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
11
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
12 ;; GNU Emacs is free software: you can redistribute it and/or modify
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
13 ;; it under the terms of the GNU General Public License as published by
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
14 ;; the Free Software Foundation, either version 3 of the License, or
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
15 ;; (at your option) any later version.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
16
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
17 ;; GNU Emacs is distributed in the hope that it will be useful,
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
20 ;; GNU General Public License for more details.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
21
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
22 ;; You should have received a copy of the GNU General Public License
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
23 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
24
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
25 ;;; Commentary:
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
26
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
27 ;; Essentially based on the design of Alexander Pohoyda's MIME
102317
562b3a7e1016 Update commentary.
Glenn Morris <rgm@gnu.org>
parents: 101890
diff changeset
28 ;; extensions (mime-display.el and mime.el).
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
29
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
30 ;; This file provides two operation modes for viewing a MIME message.
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
31
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
32 ;; (1) When rmail-enable-mime is non-nil (now it is the default), the
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
33 ;; function `rmail-show-mime' is automatically called. That function
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
34 ;; shows a MIME message directly in RMAIL's view buffer.
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
35
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
36 ;; (2) When rmail-enable-mime is nil, the command 'v' (or M-x
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
37 ;; rmail-mime) shows a MIME message in a new buffer "*RMAIL*".
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
38
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
39 ;; Both operations share the intermediate functions rmail-mime-process
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
40 ;; and rmail-mime-process-multipart as below.
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
41
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
42 ;; rmail-show-mime
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
43 ;; +- rmail-mime-parse
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
44 ;; | +- rmail-mime-process <--+------------+
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
45 ;; | | +---------+ |
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
46 ;; | + rmail-mime-process-multipart --+
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
47 ;; |
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
48 ;; + rmail-mime-insert <----------------+
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
49 ;; +- rmail-mime-insert-text |
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
50 ;; +- rmail-mime-insert-bulk |
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
51 ;; +- rmail-mime-insert-multipart --+
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
52 ;;
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
53 ;; rmail-mime
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
54 ;; +- rmail-mime-show <----------------------------------+
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
55 ;; +- rmail-mime-process |
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
56 ;; +- rmail-mime-handle |
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
57 ;; +- rmail-mime-text-handler |
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
58 ;; +- rmail-mime-bulk-handler |
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
59 ;; | + rmail-mime-insert-bulk
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
60 ;; +- rmail-mime-multipart-handler |
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
61 ;; +- rmail-mime-process-multipart --+
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
62
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
63 ;; In addition, for the case of rmail-enable-mime being non-nil, this
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
64 ;; file provides two functions rmail-insert-mime-forwarded-message and
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
65 ;; rmail-insert-mime-resent-message for composing forwarded and resent
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
66 ;; messages respectively.
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
67
105176
debabf496159 (rmail-mime-media-type-handlers-alist): Doc fix. Add image handler.
Glenn Morris <rgm@gnu.org>
parents: 105175
diff changeset
68 ;; Todo:
debabf496159 (rmail-mime-media-type-handlers-alist): Doc fix. Add image handler.
Glenn Morris <rgm@gnu.org>
parents: 105175
diff changeset
69
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
70 ;; Make rmail-mime-media-type-handlers-alist usable in the first
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
71 ;; operation mode.
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
72 ;; Handle multipart/alternative in the second operation mode.
105211
7c61dadc38f9 (rmail-mime-show-images, rmail-mime-bulk-handler):
Glenn Morris <rgm@gnu.org>
parents: 105198
diff changeset
73 ;; Offer the option to call external/internal viewers (doc-view, xpdf, etc).
105176
debabf496159 (rmail-mime-media-type-handlers-alist): Doc fix. Add image handler.
Glenn Morris <rgm@gnu.org>
parents: 105175
diff changeset
74
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
75 ;;; Code:
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
76
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
77 (require 'rmail)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
78 (require 'mail-parse)
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
79 (require 'message)
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
80
102403
b7059e95eba9 (rmail-mime-media-type-handlers-alist)
Glenn Morris <rgm@gnu.org>
parents: 102317
diff changeset
81 ;;; User options.
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
82
105193
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
83 (defgroup rmail-mime nil
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
84 "Rmail MIME handling options."
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
85 :prefix "rmail-mime-"
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
86 :group 'rmail)
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
87
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
88 (defcustom rmail-mime-media-type-handlers-alist
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
89 '(("multipart/.*" rmail-mime-multipart-handler)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
90 ("text/.*" rmail-mime-text-handler)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
91 ("text/\\(x-\\)?patch" rmail-mime-bulk-handler)
105193
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
92 ("\\(image\\|audio\\|video\\|application\\)/.*" rmail-mime-bulk-handler))
102403
b7059e95eba9 (rmail-mime-media-type-handlers-alist)
Glenn Morris <rgm@gnu.org>
parents: 102317
diff changeset
93 "Functions to handle various content types.
102421
62a954f574fa (rmail-mime-media-type-handlers-alist): Fix doc and custom type.
Glenn Morris <rgm@gnu.org>
parents: 102403
diff changeset
94 This is an alist with elements of the form (REGEXP FUNCTION ...).
62a954f574fa (rmail-mime-media-type-handlers-alist): Fix doc and custom type.
Glenn Morris <rgm@gnu.org>
parents: 102403
diff changeset
95 The first item is a regular expression matching a content-type.
62a954f574fa (rmail-mime-media-type-handlers-alist): Fix doc and custom type.
Glenn Morris <rgm@gnu.org>
parents: 102403
diff changeset
96 The remaining elements are handler functions to run, in order of
105176
debabf496159 (rmail-mime-media-type-handlers-alist): Doc fix. Add image handler.
Glenn Morris <rgm@gnu.org>
parents: 105175
diff changeset
97 decreasing preference. These are called until one returns non-nil.
debabf496159 (rmail-mime-media-type-handlers-alist): Doc fix. Add image handler.
Glenn Morris <rgm@gnu.org>
parents: 105175
diff changeset
98 Note that this only applies to items with an inline Content-Disposition,
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
99 all others are handled by `rmail-mime-bulk-handler'.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
100 Note also that this alist is ignored when the variable
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
101 `rmail-enable-mime' is non-nil."
102421
62a954f574fa (rmail-mime-media-type-handlers-alist): Fix doc and custom type.
Glenn Morris <rgm@gnu.org>
parents: 102403
diff changeset
102 :type '(alist :key-type regexp :value-type (repeat function))
105193
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
103 :version "23.1"
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
104 :group 'rmail-mime)
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
105
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
106 (defcustom rmail-mime-attachment-dirs-alist
101890
4f858364bb26 (rmail-mime-attachment-dirs-alist): Use temporary-file-directory.
Chong Yidong <cyd@stupidchicken.com>
parents: 101380
diff changeset
107 `(("text/.*" "~/Documents")
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
108 ("image/.*" "~/Pictures")
101890
4f858364bb26 (rmail-mime-attachment-dirs-alist): Use temporary-file-directory.
Chong Yidong <cyd@stupidchicken.com>
parents: 101380
diff changeset
109 (".*" "~/Desktop" "~" ,temporary-file-directory))
102403
b7059e95eba9 (rmail-mime-media-type-handlers-alist)
Glenn Morris <rgm@gnu.org>
parents: 102317
diff changeset
110 "Default directories to save attachments of various types into.
b7059e95eba9 (rmail-mime-media-type-handlers-alist)
Glenn Morris <rgm@gnu.org>
parents: 102317
diff changeset
111 This is an alist with elements of the form (REGEXP DIR ...).
b7059e95eba9 (rmail-mime-media-type-handlers-alist)
Glenn Morris <rgm@gnu.org>
parents: 102317
diff changeset
112 The first item is a regular expression matching a content-type.
b7059e95eba9 (rmail-mime-media-type-handlers-alist)
Glenn Morris <rgm@gnu.org>
parents: 102317
diff changeset
113 The remaining elements are directories, in order of decreasing preference.
b7059e95eba9 (rmail-mime-media-type-handlers-alist)
Glenn Morris <rgm@gnu.org>
parents: 102317
diff changeset
114 The first directory that exists is used."
b7059e95eba9 (rmail-mime-media-type-handlers-alist)
Glenn Morris <rgm@gnu.org>
parents: 102317
diff changeset
115 :type '(alist :key-type regexp :value-type (repeat directory))
b7059e95eba9 (rmail-mime-media-type-handlers-alist)
Glenn Morris <rgm@gnu.org>
parents: 102317
diff changeset
116 :version "23.1"
105193
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
117 :group 'rmail-mime)
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
118
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
119 (defcustom rmail-mime-show-images 'button
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
120 "What to do with image attachments that Emacs is capable of displaying.
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
121 If nil, do nothing special. If `button', add an extra button
105211
7c61dadc38f9 (rmail-mime-show-images, rmail-mime-bulk-handler):
Glenn Morris <rgm@gnu.org>
parents: 105198
diff changeset
122 that when pushed displays the image in the buffer. If a number,
7c61dadc38f9 (rmail-mime-show-images, rmail-mime-bulk-handler):
Glenn Morris <rgm@gnu.org>
parents: 105198
diff changeset
123 automatically show images if they are smaller than that size (in
7c61dadc38f9 (rmail-mime-show-images, rmail-mime-bulk-handler):
Glenn Morris <rgm@gnu.org>
parents: 105198
diff changeset
124 bytes), otherwise add a display button. Anything else means to
7c61dadc38f9 (rmail-mime-show-images, rmail-mime-bulk-handler):
Glenn Morris <rgm@gnu.org>
parents: 105198
diff changeset
125 automatically display the image in the buffer."
105193
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
126 :type '(choice (const :tag "Add button to view image" button)
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
127 (const :tag "No special treatment" nil)
105211
7c61dadc38f9 (rmail-mime-show-images, rmail-mime-bulk-handler):
Glenn Morris <rgm@gnu.org>
parents: 105198
diff changeset
128 (number :tag "Show if smaller than certain size")
105193
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
129 (other :tag "Always show" show))
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
130 :version "23.2"
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
131 :group 'rmail-mime)
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
132
102403
b7059e95eba9 (rmail-mime-media-type-handlers-alist)
Glenn Morris <rgm@gnu.org>
parents: 102317
diff changeset
133 ;;; End of user options.
b7059e95eba9 (rmail-mime-media-type-handlers-alist)
Glenn Morris <rgm@gnu.org>
parents: 102317
diff changeset
134
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
135 ;;; Global variables that always have let-binding when referred.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
136
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
137 (defvar rmail-mime-mbox-buffer nil
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
138 "Buffer containing the mbox data.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
139 The value is usually nil, and bound to a proper value while
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
140 processing MIME.")
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
141
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
142 (defvar rmail-mime-view-buffer nil
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
143 "Buffer showing a message.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
144 The value is usually nil, and bound to a proper value while
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
145 processing MIME.")
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
146
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
147 (defvar rmail-mime-coding-system nil
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
148 "The first coding-system used for decoding a MIME entity.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
149 The value is usually nil, and bound to non-nil while inserting
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
150 MIME entities.")
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
151
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
152 ;;; MIME-entity object
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
153
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
154 (defun rmail-mime-entity (type disposition transfer-encoding
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
155 display header tagline body children handler)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
156 "Retrun a newly created MIME-entity object from arguments.
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
157
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
158 A MIME-entity is a vector of 9 elements:
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
159
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
160 [TYPE DISPOSITION TRANSFER-ENCODING DISPLAY HEADER TAGLINE BODY
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
161 CHILDREN HANDLER]
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
162
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
163 TYPE and DISPOSITION correspond to MIME headers Content-Type and
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
164 Cotent-Disposition respectively, and has this format:
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
165
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
166 \(VALUE (ATTRIBUTE . VALUE) (ATTRIBUTE . VALUE) ...)
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
167
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
168 VALUE is a string and ATTRIBUTE is a symbol.
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
169
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
170 Consider the following header, for example:
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
171
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
172 Content-Type: multipart/mixed;
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
173 boundary=\"----=_NextPart_000_0104_01C617E4.BDEC4C40\"
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
174
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
175 The corresponding TYPE argument must be:
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
176
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
177 \(\"multipart/mixed\"
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
178 \(\"boundary\" . \"----=_NextPart_000_0104_01C617E4.BDEC4C40\"))
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
179
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
180 TRANSFER-ENCODING corresponds to MIME header
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
181 Content-Transfer-Encoding, and is a lowercased string.
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
182
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
183 DISPLAY is a vector [CURRENT NEW], where CURRENT indicates how
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
184 the header, tagline, and body of the entity are displayed now,
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
185 and NEW indicates how their displaying should be updated.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
186 Both elements are vector [HEADER-DISPLAY TAGLINE-DISPLAY BODY-DISPLAY],
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
187 where each element is a symbol for the corresponding item that
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
188 has these values:
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
189 nil: not displayed
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
190 t: displayed by the decoded presentation form
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
191 raw: displayed by the raw MIME data (for the header and body only)
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
192
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
193 HEADER and BODY are vectors [BEG END DISPLAY-FLAG], where BEG and
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
194 END specify the region of the header or body lines in RMAIL's
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
195 data (mbox) buffer, and DISPLAY-FLAG non-nil means that the
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
196 header or body is, by default, displayed by the decoded
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
197 presentation form.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
198
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
199 TAGLINE is a vector [TAG BULK-DATA DISPLAY-FLAG], where TAG is a
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
200 string indicating the depth and index number of the entity,
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
201 BULK-DATA is a cons (SIZE . TYPE) indicating the size and type of
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
202 an attached data, DISPLAY-FLAG non-nil means that the tagline is,
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
203 by default, displayed.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
204
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
205 CHILDREN is a list of child MIME-entities. A \"multipart/*\"
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
206 entity have one or more children. A \"message/rfc822\" entity
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
207 has just one child. Any other entity has no child.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
208
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
209 HANDLER is a function to insert the entity according to DISPLAY.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
210 It is called with one argument ENTITY."
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
211 (vector type disposition transfer-encoding
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
212 display header tagline body children handler))
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
213
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
214 ;; Accessors for a MIME-entity object.
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
215 (defsubst rmail-mime-entity-type (entity) (aref entity 0))
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
216 (defsubst rmail-mime-entity-disposition (entity) (aref entity 1))
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
217 (defsubst rmail-mime-entity-transfer-encoding (entity) (aref entity 2))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
218 (defsubst rmail-mime-entity-display (entity) (aref entity 3))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
219 (defsubst rmail-mime-entity-header (entity) (aref entity 4))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
220 (defsubst rmail-mime-entity-tagline (entity) (aref entity 5))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
221 (defsubst rmail-mime-entity-body (entity) (aref entity 6))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
222 (defsubst rmail-mime-entity-children (entity) (aref entity 7))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
223 (defsubst rmail-mime-entity-handler (entity) (aref entity 8))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
224
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
225 (defsubst rmail-mime-message-p ()
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
226 "Non-nil if and only if the current message is a MIME."
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
227 (or (get-text-property (point) 'rmail-mime-entity)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
228 (get-text-property (point-min) 'rmail-mime-entity)))
102403
b7059e95eba9 (rmail-mime-media-type-handlers-alist)
Glenn Morris <rgm@gnu.org>
parents: 102317
diff changeset
229
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
230 ;;; Buttons
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
231
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
232 (defun rmail-mime-save (button)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
233 "Save the attachment using info in the BUTTON."
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
234 (let* ((rmail-mime-mbox-buffer rmail-view-buffer)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
235 (filename (button-get button 'filename))
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
236 (directory (button-get button 'directory))
105019
a4b91a313ddf (rmail-mime-save): If file exists, don't try to be clever and add a
Glenn Morris <rgm@gnu.org>
parents: 104907
diff changeset
237 (data (button-get button 'data))
a4b91a313ddf (rmail-mime-save): If file exists, don't try to be clever and add a
Glenn Morris <rgm@gnu.org>
parents: 104907
diff changeset
238 (ofilename filename))
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
239 (setq filename (expand-file-name
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
240 (read-file-name (format "Save as (default: %s): " filename)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
241 directory
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
242 (expand-file-name filename directory))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
243 directory))
105019
a4b91a313ddf (rmail-mime-save): If file exists, don't try to be clever and add a
Glenn Morris <rgm@gnu.org>
parents: 104907
diff changeset
244 ;; If arg is just a directory, use the default file name, but in
a4b91a313ddf (rmail-mime-save): If file exists, don't try to be clever and add a
Glenn Morris <rgm@gnu.org>
parents: 104907
diff changeset
245 ;; that directory (copied from write-file).
a4b91a313ddf (rmail-mime-save): If file exists, don't try to be clever and add a
Glenn Morris <rgm@gnu.org>
parents: 104907
diff changeset
246 (if (file-directory-p filename)
a4b91a313ddf (rmail-mime-save): If file exists, don't try to be clever and add a
Glenn Morris <rgm@gnu.org>
parents: 104907
diff changeset
247 (setq filename (expand-file-name
a4b91a313ddf (rmail-mime-save): If file exists, don't try to be clever and add a
Glenn Morris <rgm@gnu.org>
parents: 104907
diff changeset
248 (file-name-nondirectory ofilename)
a4b91a313ddf (rmail-mime-save): If file exists, don't try to be clever and add a
Glenn Morris <rgm@gnu.org>
parents: 104907
diff changeset
249 (file-name-as-directory filename))))
a4b91a313ddf (rmail-mime-save): If file exists, don't try to be clever and add a
Glenn Morris <rgm@gnu.org>
parents: 104907
diff changeset
250 (with-temp-buffer
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
251 (set-buffer-file-coding-system 'no-conversion)
109330
d03ee75f7be2 mail/rmailmm.el (rmail-mime-save): Make the temp buffer unibyte,
Eli Zaretskii <eliz@gnu.org>
parents: 106953
diff changeset
252 ;; Needed e.g. by jka-compr, so if the attachment is a compressed
d03ee75f7be2 mail/rmailmm.el (rmail-mime-save): Make the temp buffer unibyte,
Eli Zaretskii <eliz@gnu.org>
parents: 106953
diff changeset
253 ;; file, the magic signature compares equal with the unibyte
d03ee75f7be2 mail/rmailmm.el (rmail-mime-save): Make the temp buffer unibyte,
Eli Zaretskii <eliz@gnu.org>
parents: 106953
diff changeset
254 ;; signature string recorded in jka-compr-compression-info-list.
d03ee75f7be2 mail/rmailmm.el (rmail-mime-save): Make the temp buffer unibyte,
Eli Zaretskii <eliz@gnu.org>
parents: 106953
diff changeset
255 (set-buffer-multibyte nil)
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
256 (setq buffer-undo-list t)
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
257 (if (stringp data)
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
258 (insert data)
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
259 ;; DATA is a MIME-entity object.
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
260 (let ((transfer-encoding (rmail-mime-entity-transfer-encoding data))
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
261 (body (rmail-mime-entity-body data)))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
262 (insert-buffer-substring rmail-mime-mbox-buffer
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
263 (aref body 0) (aref body 1))
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
264 (cond ((string= transfer-encoding "base64")
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
265 (ignore-errors (base64-decode-region (point-min) (point-max))))
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
266 ((string= transfer-encoding "quoted-printable")
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
267 (quoted-printable-decode-region (point-min) (point-max))))))
105019
a4b91a313ddf (rmail-mime-save): If file exists, don't try to be clever and add a
Glenn Morris <rgm@gnu.org>
parents: 104907
diff changeset
268 (write-region nil nil filename nil nil nil t))))
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
269
105019
a4b91a313ddf (rmail-mime-save): If file exists, don't try to be clever and add a
Glenn Morris <rgm@gnu.org>
parents: 104907
diff changeset
270 (define-button-type 'rmail-mime-save 'action 'rmail-mime-save)
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
271
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
272 (defun rmail-mime-entity-segment (pos &optional entity)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
273 "Return a vector describing the displayed region of a MIME-entity at POS.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
274 Optional 2nd argument ENTITY is the MIME-entity at POS.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
275 The value is a vector [ INDEX HEADER TAGLINE BODY END], where
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
276 INDEX: index into the returned vector indicating where POS is (1..3).
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
277 HEADER: the position of the beginning of a header
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
278 TAGLINE: the position of the beginning of a tagline
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
279 BODY: the position of the beginning of a body
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
280 END: the position of the end of the entity."
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
281 (save-excursion
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
282 (or entity
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
283 (setq entity (get-text-property pos 'rmail-mime-entity)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
284 (if (not entity)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
285 (vector 1 (point) (point) (point) (point))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
286 (let ((current (aref (rmail-mime-entity-display entity) 0))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
287 (beg (if (and (> pos (point-min))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
288 (eq (get-text-property (1- pos) 'rmail-mime-entity)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
289 entity))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
290 (previous-single-property-change pos 'rmail-mime-entity
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
291 nil (point-min))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
292 pos))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
293 (index 1)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
294 tagline-beg body-beg end)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
295 (goto-char beg)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
296 (if (aref current 0)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
297 (search-forward "\n\n" nil t))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
298 (setq tagline-beg (point))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
299 (if (>= pos tagline-beg)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
300 (setq index 2))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
301 (if (aref current 1)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
302 (forward-line 1))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
303 (setq body-beg (point))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
304 (if (>= pos body-beg)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
305 (setq index 3))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
306 (if (aref current 2)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
307 (let ((tag (aref (rmail-mime-entity-tagline entity) 0))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
308 tag2)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
309 (setq end (next-single-property-change beg 'rmail-mime-entity
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
310 nil (point-max)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
311 (while (and (< end (point-max))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
312 (setq entity (get-text-property end 'rmail-mime-entity)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
313 tag2 (aref (rmail-mime-entity-tagline entity) 0))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
314 (and (> (length tag2) 0)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
315 (eq (string-match tag tag2) 0)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
316 (setq end (next-single-property-change end 'rmail-mime-entity
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
317 nil (point-max)))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
318 (setq end body-beg))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
319 (vector index beg tagline-beg body-beg end)))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
320
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
321 (defun rmail-mime-shown-mode (entity)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
322 "Make MIME-entity ENTITY displayed by the default way."
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
323 (let ((new (aref (rmail-mime-entity-display entity) 1)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
324 (aset new 0 (aref (rmail-mime-entity-header entity) 2))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
325 (aset new 1 (aref (rmail-mime-entity-tagline entity) 2))
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
326 (aset new 2 (aref (rmail-mime-entity-body entity) 2)))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
327 (dolist (child (rmail-mime-entity-children entity))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
328 (rmail-mime-shown-mode child)))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
329
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
330 (defun rmail-mime-hidden-mode (entity)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
331 "Make MIME-entity ENTITY displayed in the hidden mode."
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
332 (let ((new (aref (rmail-mime-entity-display entity) 1)))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
333 (aset new 0 nil)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
334 (aset new 1 t)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
335 (aset new 2 nil))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
336 (dolist (child (rmail-mime-entity-children entity))
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
337 (rmail-mime-hidden-mode child)))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
338
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
339 (defun rmail-mime-raw-mode (entity)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
340 "Make MIME-entity ENTITY displayed in the raw mode."
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
341 (let ((new (aref (rmail-mime-entity-display entity) 1)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
342 (aset new 0 'raw)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
343 (aset new 1 nil)
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
344 (aset new 2 'raw))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
345 (dolist (child (rmail-mime-entity-children entity))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
346 (rmail-mime-raw-mode child)))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
347
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
348 (defun rmail-mime-toggle-raw (entity)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
349 "Toggle on and off the raw display mode of MIME-entity ENTITY."
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
350 (let* ((pos (if (eobp) (1- (point-max)) (point)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
351 (entity (get-text-property pos 'rmail-mime-entity))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
352 (current (aref (rmail-mime-entity-display entity) 0))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
353 (segment (rmail-mime-entity-segment pos entity)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
354 (if (not (eq (aref current 0) 'raw))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
355 ;; Enter the raw mode.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
356 (rmail-mime-raw-mode entity)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
357 ;; Enter the shown mode.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
358 (rmail-mime-shown-mode entity))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
359 (let ((inhibit-read-only t)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
360 (modified (buffer-modified-p)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
361 (save-excursion
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
362 (goto-char (aref segment 1))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
363 (rmail-mime-insert entity)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
364 (restore-buffer-modified-p modified)))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
365
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
366 (defun rmail-mime-toggle-hidden ()
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
367 "Hide or show the body of MIME-entity at point."
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
368 (interactive)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
369 (when (rmail-mime-message-p)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
370 (let* ((rmail-mime-mbox-buffer rmail-view-buffer)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
371 (rmail-mime-view-buffer (current-buffer))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
372 (pos (if (eobp) (1- (point-max)) (point)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
373 (entity (get-text-property pos 'rmail-mime-entity))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
374 (current (aref (rmail-mime-entity-display entity) 0))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
375 (segment (rmail-mime-entity-segment pos entity)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
376 (if (aref current 2)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
377 ;; Enter the hidden mode.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
378 (progn
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
379 ;; If point is in the body part, move it to the tagline
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
380 ;; (or the header if tagline is not displayed).
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
381 (if (= (aref segment 0) 3)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
382 (goto-char (aref segment 2)))
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
383 (rmail-mime-hidden-mode entity)
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
384 ;; If the current entity is the topmost one, display the
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
385 ;; header.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
386 (if (and rmail-mime-mbox-buffer (= (aref segment 1) (point-min)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
387 (let ((new (aref (rmail-mime-entity-display entity) 1)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
388 (aset new 0 t))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
389 ;; Enter the shown mode.
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
390 (rmail-mime-shown-mode entity)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
391 ;; Force this body shown.
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
392 (aset (aref (rmail-mime-entity-display entity) 1) 2 t))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
393 (let ((inhibit-read-only t)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
394 (modified (buffer-modified-p))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
395 (rmail-mime-mbox-buffer rmail-view-buffer)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
396 (rmail-mime-view-buffer rmail-buffer))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
397 (save-excursion
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
398 (goto-char (aref segment 1))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
399 (rmail-mime-insert entity)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
400 (restore-buffer-modified-p modified))))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
401
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
402 (define-key rmail-mode-map "\t" 'forward-button)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
403 (define-key rmail-mode-map [backtab] 'backward-button)
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
404 (define-key rmail-mode-map "\r" 'rmail-mime-toggle-hidden)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
405
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
406 ;;; Handlers
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
407
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
408 (defun rmail-mime-insert-tagline (entity &rest item-list)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
409 "Insert a tag line for MIME-entity ENTITY.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
410 ITEM-LIST is a list of strings or button-elements (list) to be added
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
411 to the tag line."
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
412 (insert "[")
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
413 (let ((tag (aref (rmail-mime-entity-tagline entity) 0)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
414 (if (> (length tag) 0) (insert (substring tag 1) ":")))
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
415 (insert (car (rmail-mime-entity-type entity)) " ")
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
416 (insert-button (let ((new (aref (rmail-mime-entity-display entity) 1)))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
417 (if (aref new 2) "Hide" "Show"))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
418 :type 'rmail-mime-toggle
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
419 'help-echo "mouse-2, RET: Toggle show/hide")
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
420 (dolist (item item-list)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
421 (when item
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
422 (if (stringp item)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
423 (insert item)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
424 (apply 'insert-button item))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
425 (insert "]\n"))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
426
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
427 (defun rmail-mime-update-tagline (entity)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
428 "Update the current tag line for MIME-entity ENTITY."
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
429 (let ((inhibit-read-only t)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
430 (modified (buffer-modified-p))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
431 ;; If we are going to show the body, the new button label is
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
432 ;; "Hide". Otherwise, it's "Show".
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
433 (label (if (aref (aref (rmail-mime-entity-display entity) 1) 2) "Hide"
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
434 "Show"))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
435 (button (next-button (point))))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
436 ;; Go to the second character of the button "Show" or "Hide".
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
437 (goto-char (1+ (button-start button)))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
438 (setq button (button-at (point)))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
439 (save-excursion
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
440 (insert label)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
441 (delete-region (point) (button-end button)))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
442 (delete-region (button-start button) (point))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
443 (put-text-property (point) (button-end button) 'rmail-mime-entity entity)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
444 (restore-buffer-modified-p modified)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
445 (forward-line 1)))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
446
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
447 (defun rmail-mime-insert-header (header)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
448 "Decode and insert a MIME-entity header HEADER in the current buffer.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
449 HEADER is a vector [BEG END DEFAULT-STATUS].
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
450 See `rmail-mime-entity' for the detail."
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
451 (let ((pos (point))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
452 (last-coding-system-used nil))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
453 (save-restriction
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
454 (narrow-to-region pos pos)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
455 (with-current-buffer rmail-mime-mbox-buffer
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
456 (let ((rmail-buffer rmail-mime-mbox-buffer)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
457 (rmail-view-buffer rmail-mime-view-buffer))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
458 (save-excursion
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
459 (goto-char (aref header 0))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
460 (rmail-copy-headers (point) (aref header 1)))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
461 (rfc2047-decode-region pos (point))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
462 (if (and last-coding-system-used (not rmail-mime-coding-system))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
463 (setq rmail-mime-coding-system last-coding-system-used))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
464 (goto-char (point-min))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
465 (rmail-highlight-headers)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
466 (goto-char (point-max))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
467 (insert "\n"))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
468
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
469 (defun rmail-mime-text-handler (content-type
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
470 content-disposition
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
471 content-transfer-encoding)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
472 "Handle the current buffer as a plain text MIME part."
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
473 (rmail-mime-insert-text
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
474 (rmail-mime-entity content-type content-disposition
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
475 content-transfer-encoding
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
476 (vector (vector nil nil nil) (vector nil nil t))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
477 (vector nil nil nil) (vector "" (cons nil nil) t)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
478 (vector nil nil nil) nil 'rmail-mime-insert-text))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
479 t)
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
480
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
481 (defun rmail-mime-insert-decoded-text (entity)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
482 "Decode and insert the text body of MIME-entity ENTITY."
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
483 (let* ((content-type (rmail-mime-entity-type entity))
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
484 (charset (cdr (assq 'charset (cdr content-type))))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
485 (coding-system (if charset
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
486 (coding-system-from-name charset)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
487 (body (rmail-mime-entity-body entity))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
488 (pos (point)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
489 (or (and coding-system (coding-system-p coding-system))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
490 (setq coding-system 'undecided))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
491 (if (stringp (aref body 0))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
492 (insert (aref body 0))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
493 (let ((transfer-encoding (rmail-mime-entity-transfer-encoding entity)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
494 (insert-buffer-substring rmail-mime-mbox-buffer
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
495 (aref body 0) (aref body 1))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
496 (cond ((string= transfer-encoding "base64")
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
497 (ignore-errors (base64-decode-region pos (point))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
498 ((string= transfer-encoding "quoted-printable")
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
499 (quoted-printable-decode-region pos (point))))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
500 (decode-coding-region pos (point) coding-system)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
501 (or rmail-mime-coding-system
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
502 (setq rmail-mime-coding-system coding-system))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
503 (or (bolp) (insert "\n"))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
504
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
505 (defun rmail-mime-insert-text (entity)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
506 "Presentation handler for a plain text MIME entity."
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
507 (let ((current (aref (rmail-mime-entity-display entity) 0))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
508 (new (aref (rmail-mime-entity-display entity) 1))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
509 (header (rmail-mime-entity-header entity))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
510 (tagline (rmail-mime-entity-tagline entity))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
511 (body (rmail-mime-entity-body entity))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
512 (beg (point))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
513 (segment (rmail-mime-entity-segment (point) entity)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
514
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
515 (or (integerp (aref body 0))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
516 (let ((data (buffer-string)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
517 (aset body 0 data)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
518 (delete-region (point-min) (point-max))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
519
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
520 ;; header
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
521 (if (eq (aref current 0) (aref new 0))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
522 (goto-char (aref segment 2))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
523 (if (aref current 0)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
524 (delete-char (- (aref segment 2) (aref segment 1))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
525 (if (aref new 0)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
526 (rmail-mime-insert-header header)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
527 ;; tagline
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
528 (if (eq (aref current 1) (aref new 1))
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
529 (if (or (not (aref current 1))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
530 (eq (aref current 2) (aref new 2)))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
531 (forward-char (- (aref segment 3) (aref segment 2)))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
532 (rmail-mime-update-tagline entity))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
533 (if (aref current 1)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
534 (delete-char (- (aref segment 3) (aref segment 2))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
535 (if (aref new 1)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
536 (rmail-mime-insert-tagline entity)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
537 ;; body
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
538 (if (eq (aref current 2) (aref new 2))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
539 (forward-char (- (aref segment 4) (aref segment 3)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
540 (if (aref current 2)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
541 (delete-char (- (aref segment 4) (aref segment 3))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
542 (if (aref new 2)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
543 (rmail-mime-insert-decoded-text entity)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
544 (put-text-property beg (point) 'rmail-mime-entity entity)))
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
545
102403
b7059e95eba9 (rmail-mime-media-type-handlers-alist)
Glenn Morris <rgm@gnu.org>
parents: 102317
diff changeset
546 ;; FIXME move to the test/ directory?
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
547 (defun test-rmail-mime-handler ()
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
548 "Test of a mail using no MIME parts at all."
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
549 (let ((mail "To: alex@gnu.org
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
550 Content-Type: text/plain; charset=koi8-r
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
551 Content-Transfer-Encoding: 8bit
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
552 MIME-Version: 1.0
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
553
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
554 \372\304\322\301\327\323\324\327\325\312\324\305\41"))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
555 (switch-to-buffer (get-buffer-create "*test*"))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
556 (erase-buffer)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
557 (set-buffer-multibyte nil)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
558 (insert mail)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
559 (rmail-mime-show t)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
560 (set-buffer-multibyte t)))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
561
105193
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
562
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
563 (defun rmail-mime-insert-image (entity)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
564 "Decode and insert the image body of MIME-entity ENTITY."
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
565 (let* ((content-type (car (rmail-mime-entity-type entity)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
566 (bulk-data (aref (rmail-mime-entity-tagline entity) 1))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
567 (body (rmail-mime-entity-body entity))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
568 data)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
569 (if (stringp (aref body 0))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
570 (setq data (aref body 0))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
571 (let ((rmail-mime-mbox-buffer rmail-view-buffer)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
572 (transfer-encoding (rmail-mime-entity-transfer-encoding entity)))
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
573 (with-temp-buffer
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
574 (set-buffer-multibyte nil)
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
575 (setq buffer-undo-list t)
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
576 (insert-buffer-substring rmail-mime-mbox-buffer
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
577 (aref body 0) (aref body 1))
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
578 (cond ((string= transfer-encoding "base64")
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
579 (ignore-errors (base64-decode-region (point-min) (point-max))))
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
580 ((string= transfer-encoding "quoted-printable")
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
581 (quoted-printable-decode-region (point-min) (point-max))))
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
582 (setq data
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
583 (buffer-substring-no-properties (point-min) (point-max))))))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
584 (insert-image (create-image data (cdr bulk-data) t))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
585 (insert "\n")))
105193
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
586
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
587 (defun rmail-mime-toggle-button (button)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
588 "Hide or show the body of the MIME-entity associated with BUTTON."
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
589 (save-excursion
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
590 (goto-char (button-start button))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
591 (rmail-mime-toggle-hidden)))
105193
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
592
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
593 (define-button-type 'rmail-mime-toggle 'action 'rmail-mime-toggle-button)
105193
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
594
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
595
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
596 (defun rmail-mime-bulk-handler (content-type
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
597 content-disposition
105193
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
598 content-transfer-encoding)
105176
debabf496159 (rmail-mime-media-type-handlers-alist): Doc fix. Add image handler.
Glenn Morris <rgm@gnu.org>
parents: 105175
diff changeset
599 "Handle the current buffer as an attachment to download.
105193
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
600 For images that Emacs is capable of displaying, the behavior
d05b41e0a7ef (rmail-mime): New custom group.
Glenn Morris <rgm@gnu.org>
parents: 105176
diff changeset
601 depends upon the value of `rmail-mime-show-images'."
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
602 (rmail-mime-insert-bulk
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
603 (rmail-mime-entity content-type content-disposition content-transfer-encoding
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
604 (vector (vector nil nil nil) (vector nil t nil))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
605 (vector nil nil nil) (vector "" (cons nil nil) t)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
606 (vector nil nil nil) nil 'rmail-mime-insert-bulk)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
607
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
608 (defun rmail-mime-set-bulk-data (entity)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
609 "Setup the information about the attachment object for MIME-entity ENTITY.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
610 The value is non-nil if and only if the attachment object should be shown
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
611 directly."
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
612 (let ((content-type (car (rmail-mime-entity-type entity)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
613 (size (cdr (assq 'size (cdr (rmail-mime-entity-disposition entity)))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
614 (bulk-data (aref (rmail-mime-entity-tagline entity) 1))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
615 (body (rmail-mime-entity-body entity))
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
616 type to-show)
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
617 (cond (size
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
618 (setq size (string-to-number size)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
619 ((stringp (aref body 0))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
620 (setq size (length (aref body 0))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
621 (t
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
622 ;; Rough estimation of the size.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
623 (let ((encoding (rmail-mime-entity-transfer-encoding entity)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
624 (setq size (- (aref body 1) (aref body 0)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
625 (cond ((string= encoding "base64")
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
626 (setq size (/ (* size 3) 4)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
627 ((string= encoding "quoted-printable")
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
628 (setq size (/ (* size 7) 3)))))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
629
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
630 (cond
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
631 ((string-match "text/" content-type)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
632 (setq type 'text))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
633 ((string-match "image/\\(.*\\)" content-type)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
634 (setq type (image-type-from-file-name
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
635 (concat "." (match-string 1 content-type))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
636 (if (and (memq type image-types)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
637 (image-type-available-p type))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
638 (if (and rmail-mime-show-images
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
639 (not (eq rmail-mime-show-images 'button))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
640 (or (not (numberp rmail-mime-show-images))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
641 (< size rmail-mime-show-images)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
642 (setq to-show t))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
643 (setq type nil))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
644 (setcar bulk-data size)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
645 (setcdr bulk-data type)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
646 to-show))
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
647
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
648 (defun rmail-mime-insert-bulk (entity)
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
649 "Presentation handler for an attachment MIME entity."
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
650 (let* ((content-type (rmail-mime-entity-type entity))
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
651 (content-disposition (rmail-mime-entity-disposition entity))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
652 (current (aref (rmail-mime-entity-display entity) 0))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
653 (new (aref (rmail-mime-entity-display entity) 1))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
654 (header (rmail-mime-entity-header entity))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
655 (tagline (rmail-mime-entity-tagline entity))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
656 (bulk-data (aref tagline 1))
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
657 (body (rmail-mime-entity-body entity))
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
658 ;; Find the default directory for this media type.
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
659 (directory (catch 'directory
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
660 (dolist (entry rmail-mime-attachment-dirs-alist)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
661 (when (string-match (car entry) (car content-type))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
662 (dolist (dir (cdr entry))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
663 (when (file-directory-p dir)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
664 (throw 'directory dir)))))))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
665 (filename (or (cdr (assq 'name (cdr content-type)))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
666 (cdr (assq 'filename (cdr content-disposition)))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
667 "noname"))
105198
550b90cc7226 (rmail-mime-bulk-handler): Print the size of attachments.
Glenn Morris <rgm@gnu.org>
parents: 105193
diff changeset
668 (units '(B kB MB GB))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
669 (segment (rmail-mime-entity-segment (point) entity))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
670 beg data size)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
671
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
672 (if (integerp (aref body 0))
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
673 (setq data entity
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
674 size (car bulk-data))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
675 (if (stringp (aref body 0))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
676 (setq data (aref body 0))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
677 (setq data (string-as-unibyte (buffer-string)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
678 (aset body 0 data)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
679 (rmail-mime-set-bulk-data entity)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
680 (delete-region (point-min) (point-max)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
681 (setq size (length data)))
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
682 (while (and (> size 1024.0) ; cribbed from gnus-agent-expire-done-message
105198
550b90cc7226 (rmail-mime-bulk-handler): Print the size of attachments.
Glenn Morris <rgm@gnu.org>
parents: 105193
diff changeset
683 (cdr units))
550b90cc7226 (rmail-mime-bulk-handler): Print the size of attachments.
Glenn Morris <rgm@gnu.org>
parents: 105193
diff changeset
684 (setq size (/ size 1024.0)
550b90cc7226 (rmail-mime-bulk-handler): Print the size of attachments.
Glenn Morris <rgm@gnu.org>
parents: 105193
diff changeset
685 units (cdr units)))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
686
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
687 (setq beg (point))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
688
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
689 ;; header
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
690 (if (eq (aref current 0) (aref new 0))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
691 (goto-char (aref segment 2))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
692 (if (aref current 0)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
693 (delete-char (- (aref segment 2) (aref segment 1))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
694 (if (aref new 0)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
695 (rmail-mime-insert-header header)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
696
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
697 ;; tagline
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
698 (if (eq (aref current 1) (aref new 1))
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
699 (if (or (not (aref current 1))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
700 (eq (aref current 2) (aref new 2)))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
701 (forward-char (- (aref segment 3) (aref segment 2)))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
702 (rmail-mime-update-tagline entity))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
703 (if (aref current 1)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
704 (delete-char (- (aref segment 3) (aref segment 2))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
705 (if (aref new 1)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
706 (rmail-mime-insert-tagline
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
707 entity
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
708 " Save:"
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
709 (list filename
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
710 :type 'rmail-mime-save
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
711 'help-echo "mouse-2, RET: Save attachment"
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
712 'filename filename
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
713 'directory (file-name-as-directory directory)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
714 'data data)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
715 (format " (%.0f%s)" size (car units))
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
716 ;; We don't need this button because the "type" string of a
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
717 ;; tagline is the button to do this.
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
718 ;; (if (cdr bulk-data)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
719 ;; " ")
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
720 ;; (if (cdr bulk-data)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
721 ;; (list "Toggle show/hide"
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
722 ;; :type 'rmail-mime-image
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
723 ;; 'help-echo "mouse-2, RET: Toggle show/hide"
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
724 ;; 'image-type (cdr bulk-data)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
725 ;; 'image-data data))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
726 )))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
727 ;; body
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
728 (if (eq (aref current 2) (aref new 2))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
729 (forward-char (- (aref segment 4) (aref segment 3)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
730 (if (aref current 2)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
731 (delete-char (- (aref segment 4) (aref segment 3))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
732 (if (aref new 2)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
733 (cond ((eq (cdr bulk-data) 'text)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
734 (rmail-mime-insert-decoded-text entity))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
735 ((cdr bulk-data)
112240
6fd3dcdcc675 Fix handling of unknown MIME type (bug#7651).
Kenichi Handa <handa@m17n.org>
parents: 112218
diff changeset
736 (rmail-mime-insert-image entity))
6fd3dcdcc675 Fix handling of unknown MIME type (bug#7651).
Kenichi Handa <handa@m17n.org>
parents: 112218
diff changeset
737 (t
6fd3dcdcc675 Fix handling of unknown MIME type (bug#7651).
Kenichi Handa <handa@m17n.org>
parents: 112218
diff changeset
738 ;; As we don't know how to display the body, just
6fd3dcdcc675 Fix handling of unknown MIME type (bug#7651).
Kenichi Handa <handa@m17n.org>
parents: 112218
diff changeset
739 ;; insert it as a text.
6fd3dcdcc675 Fix handling of unknown MIME type (bug#7651).
Kenichi Handa <handa@m17n.org>
parents: 112218
diff changeset
740 (rmail-mime-insert-decoded-text entity)))))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
741 (put-text-property beg (point) 'rmail-mime-entity entity)))
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
742
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
743 (defun test-rmail-mime-bulk-handler ()
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
744 "Test of a mail used as an example in RFC 2183."
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
745 (let ((mail "Content-Type: image/jpeg
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
746 Content-Disposition: attachment; filename=genome.jpeg;
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
747 modification-date=\"Wed, 12 Feb 1997 16:29:51 -0500\";
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
748 Content-Description: a complete map of the human genome
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
749 Content-Transfer-Encoding: base64
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
750
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
751 iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAABGdBTUEAALGPC/xhBQAAAAZQ
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
752 TFRF////AAAAVcLTfgAAAPZJREFUeNq9ldsOwzAIQ+3//+l1WlvA5ZLsoUiTto4TB+ISoAjy
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
753 +ITfRBfcAmgRFFeAm+J6uhdKdFhFWUgDkFsK0oUp/9G2//Kj7Jx+5tSKOdBscgUYiKHRS/me
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
754 WATQdRUvAK0Bnmshmtn79PpaLBbbOZkjKvRnjRZoRswOkG1wFchKew2g9wXVJVZL/m4+B+vv
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
755 9AxQQR2Q33SgAYJzzVACdAWjAfRYzYFO9n6SLnydtQHSMxYDMAKqZ/8FS/lTK+zuq3CtK64L
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
756 UDwbgUEAUmk2Zyg101d6PhCDySgAvTvDgKiuOrc4dLxUb7UMnhGIexyI+d6U+ABuNAP4Simx
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
757 lgAAAABJRU5ErkJggg==
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
758 "))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
759 (switch-to-buffer (get-buffer-create "*test*"))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
760 (erase-buffer)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
761 (insert mail)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
762 (rmail-mime-show)))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
763
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
764 (defun rmail-mime-multipart-handler (content-type
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
765 content-disposition
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
766 content-transfer-encoding)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
767 "Handle the current buffer as a multipart MIME body.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
768 The current buffer should be narrowed to the body. CONTENT-TYPE,
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
769 CONTENT-DISPOSITION, and CONTENT-TRANSFER-ENCODING are the values
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
770 of the respective parsed headers. See `rmail-mime-handle' for their
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
771 format."
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
772 (rmail-mime-process-multipart
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
773 content-type content-disposition content-transfer-encoding nil)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
774 t)
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
775
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
776 (defun rmail-mime-process-multipart (content-type
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
777 content-disposition
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
778 content-transfer-encoding
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
779 parse-tag)
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
780 "Process the current buffer as a multipart MIME body.
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
781
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
782 If PARSE-TAG is nil, modify the current buffer directly for
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
783 showing the MIME body and return nil.
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
784
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
785 Otherwise, PARSE-TAG is a string indicating the depth and index
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
786 number of the entity. In this case, parse the current buffer and
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
787 return a list of MIME-entity objects.
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
788
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
789 The other arguments are the same as `rmail-mime-multipart-handler'."
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
790 ;; Some MUAs start boundaries with "--", while it should start
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
791 ;; with "CRLF--", as defined by RFC 2046:
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
792 ;; The boundary delimiter MUST occur at the beginning of a line,
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
793 ;; i.e., following a CRLF, and the initial CRLF is considered to
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
794 ;; be attached to the boundary delimiter line rather than part
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
795 ;; of the preceding part.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
796 ;; We currently don't handle that.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
797 (let ((boundary (cdr (assq 'boundary content-type)))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
798 (subtype (cadr (split-string (car content-type) "/")))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
799 (index 0)
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
800 beg end next entities)
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
801 (unless boundary
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
802 (rmail-mm-get-boundary-error-message
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
803 "No boundary defined" content-type content-disposition
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
804 content-transfer-encoding))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
805 (setq boundary (concat "\n--" boundary))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
806 ;; Hide the body before the first bodypart
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
807 (goto-char (point-min))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
808 (when (and (search-forward boundary nil t)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
809 (looking-at "[ \t]*\n"))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
810 (if parse-tag
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
811 (narrow-to-region (match-end 0) (point-max))
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
812 (delete-region (point-min) (match-end 0))))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
813
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
814 ;; Change content-type to the proper default one for the children.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
815 (cond ((string-match "mixed" subtype)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
816 (setq content-type '("text/plain")))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
817 ((string-match "digest" subtype)
112240
6fd3dcdcc675 Fix handling of unknown MIME type (bug#7651).
Kenichi Handa <handa@m17n.org>
parents: 112218
diff changeset
818 (setq content-type '("message/rfc822")))
6fd3dcdcc675 Fix handling of unknown MIME type (bug#7651).
Kenichi Handa <handa@m17n.org>
parents: 112218
diff changeset
819 (t
6fd3dcdcc675 Fix handling of unknown MIME type (bug#7651).
Kenichi Handa <handa@m17n.org>
parents: 112218
diff changeset
820 (setq content-type nil)))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
821
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
822 ;; Loop over all body parts, where beg points at the beginning of
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
823 ;; the part and end points at the end of the part. next points at
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
824 ;; the beginning of the next part. The current point is just
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
825 ;; after the boundary tag.
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
826 (setq beg (point-min))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
827 (while (search-forward boundary nil t)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
828 (setq end (match-beginning 0))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
829 ;; If this is the last boundary according to RFC 2046, hide the
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
830 ;; epilogue, else hide the boundary only. Use a marker for
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
831 ;; `next' because `rmail-mime-show' may change the buffer.
105175
721db724bb12 (rmail-mime-multipart-handler): Accept the case where
Glenn Morris <rgm@gnu.org>
parents: 105019
diff changeset
832 (cond ((looking-at "--[ \t]*$")
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
833 (setq next (point-max-marker)))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
834 ((looking-at "[ \t]*\n")
105175
721db724bb12 (rmail-mime-multipart-handler): Accept the case where
Glenn Morris <rgm@gnu.org>
parents: 105019
diff changeset
835 (setq next (copy-marker (match-end 0) t)))
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
836 (t
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
837 (rmail-mm-get-boundary-error-message
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
838 "Malformed boundary" content-type content-disposition
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
839 content-transfer-encoding)))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
840
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
841 (setq index (1+ index))
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
842 ;; Handle the part.
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
843 (if parse-tag
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
844 (save-restriction
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
845 (narrow-to-region beg end)
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
846 (let ((child (rmail-mime-process
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
847 nil (format "%s/%d" parse-tag index)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
848 content-type content-disposition)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
849 ;; Display a tagline.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
850 (aset (aref (rmail-mime-entity-display child) 1) 1
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
851 (aset (rmail-mime-entity-tagline child) 2 t))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
852 (push child entities)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
853
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
854 (delete-region end next)
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
855 (save-restriction
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
856 (narrow-to-region beg end)
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
857 (rmail-mime-show)))
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
858 (goto-char (setq beg next)))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
859
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
860 (when parse-tag
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
861 (setq entities (nreverse entities))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
862 (if (string-match "alternative" subtype)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
863 ;; Find the best entity to show, and hide all the others.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
864 (let (best second)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
865 (dolist (child entities)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
866 (if (string= (or (car (rmail-mime-entity-disposition child))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
867 (car content-disposition))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
868 "inline")
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
869 (if (string-match "text/plain"
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
870 (car (rmail-mime-entity-type child)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
871 (setq best child)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
872 (if (string-match "text/.*"
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
873 (car (rmail-mime-entity-type child)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
874 (setq second child)))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
875 (or best (not second) (setq best second))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
876 (dolist (child entities)
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
877 (unless (eq best child)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
878 (aset (rmail-mime-entity-body child) 2 nil)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
879 (rmail-mime-hidden-mode child)))))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
880 entities)))
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
881
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
882 (defun test-rmail-mime-multipart-handler ()
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
883 "Test of a mail used as an example in RFC 2046."
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
884 (let ((mail "From: Nathaniel Borenstein <nsb@bellcore.com>
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
885 To: Ned Freed <ned@innosoft.com>
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
886 Date: Sun, 21 Mar 1993 23:56:48 -0800 (PST)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
887 Subject: Sample message
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
888 MIME-Version: 1.0
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
889 Content-type: multipart/mixed; boundary=\"simple boundary\"
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
890
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
891 This is the preamble. It is to be ignored, though it
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
892 is a handy place for composition agents to include an
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
893 explanatory note to non-MIME conformant readers.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
894
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
895 --simple boundary
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
896
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
897 This is implicitly typed plain US-ASCII text.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
898 It does NOT end with a linebreak.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
899 --simple boundary
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
900 Content-type: text/plain; charset=us-ascii
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
901
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
902 This is explicitly typed plain US-ASCII text.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
903 It DOES end with a linebreak.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
904
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
905 --simple boundary--
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
906
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
907 This is the epilogue. It is also to be ignored."))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
908 (switch-to-buffer (get-buffer-create "*test*"))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
909 (erase-buffer)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
910 (insert mail)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
911 (rmail-mime-show t)))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
912
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
913 (defun rmail-mime-insert-multipart (entity)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
914 "Presentation handler for a multipart MIME entity."
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
915 (let ((current (aref (rmail-mime-entity-display entity) 0))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
916 (new (aref (rmail-mime-entity-display entity) 1))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
917 (header (rmail-mime-entity-header entity))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
918 (tagline (rmail-mime-entity-tagline entity))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
919 (body (rmail-mime-entity-body entity))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
920 (beg (point))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
921 (segment (rmail-mime-entity-segment (point) entity)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
922 ;; header
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
923 (if (eq (aref current 0) (aref new 0))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
924 (goto-char (aref segment 2))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
925 (if (aref current 0)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
926 (delete-char (- (aref segment 2) (aref segment 1))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
927 (if (aref new 0)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
928 (rmail-mime-insert-header header)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
929 ;; tagline
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
930 (if (eq (aref current 1) (aref new 1))
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
931 (if (or (not (aref current 1))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
932 (eq (aref current 2) (aref new 2)))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
933 (forward-char (- (aref segment 3) (aref segment 2)))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
934 (rmail-mime-update-tagline entity))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
935 (if (aref current 1)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
936 (delete-char (- (aref segment 3) (aref segment 2))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
937 (if (aref new 1)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
938 (rmail-mime-insert-tagline entity)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
939
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
940 (put-text-property beg (point) 'rmail-mime-entity entity)
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
941
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
942 ;; body
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
943 (if (eq (aref current 2) (aref new 2))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
944 (forward-char (- (aref segment 4) (aref segment 3)))
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
945 (dolist (child (rmail-mime-entity-children entity))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
946 (rmail-mime-insert child)))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
947 entity))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
948
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
949 ;;; Main code
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
950
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
951 (defun rmail-mime-handle (content-type
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
952 content-disposition
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
953 content-transfer-encoding)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
954 "Handle the current buffer as a MIME part.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
955 The current buffer should be narrowed to the respective body, and
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
956 point should be at the beginning of the body.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
957
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
958 CONTENT-TYPE, CONTENT-DISPOSITION, and CONTENT-TRANSFER-ENCODING
106339
656eabdc03be (rmail-mime-handle): Doc fix.
Glenn Morris <rgm@gnu.org>
parents: 106178
diff changeset
959 are the values of the respective parsed headers. The latter should
656eabdc03be (rmail-mime-handle): Doc fix.
Glenn Morris <rgm@gnu.org>
parents: 106178
diff changeset
960 be downcased. The parsed headers for CONTENT-TYPE and CONTENT-DISPOSITION
656eabdc03be (rmail-mime-handle): Doc fix.
Glenn Morris <rgm@gnu.org>
parents: 106178
diff changeset
961 have the form
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
962
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
963 \(VALUE . ALIST)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
964
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
965 In other words:
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
966
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
967 \(VALUE (ATTRIBUTE . VALUE) (ATTRIBUTE . VALUE) ...)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
968
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
969 VALUE is a string and ATTRIBUTE is a symbol.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
970
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
971 Consider the following header, for example:
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
972
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
973 Content-Type: multipart/mixed;
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
974 boundary=\"----=_NextPart_000_0104_01C617E4.BDEC4C40\"
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
975
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
976 The parsed header value:
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
977
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
978 \(\"multipart/mixed\"
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
979 \(\"boundary\" . \"----=_NextPart_000_0104_01C617E4.BDEC4C40\"))"
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
980 ;; Handle the content transfer encodings we know. Unknown transfer
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
981 ;; encodings will be passed on to the various handlers.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
982 (cond ((string= content-transfer-encoding "base64")
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
983 (when (ignore-errors
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
984 (base64-decode-region (point) (point-max)))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
985 (setq content-transfer-encoding nil)))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
986 ((string= content-transfer-encoding "quoted-printable")
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
987 (quoted-printable-decode-region (point) (point-max))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
988 (setq content-transfer-encoding nil))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
989 ((string= content-transfer-encoding "8bit")
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
990 ;; FIXME: Is this the correct way?
106953
a1e356d208cd * mail/rmailmm.el (rmail-mime-handle): Don't set the buffer to unibyte
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 106815
diff changeset
991 ;; No, of course not, it just means there's no decoding to do.
a1e356d208cd * mail/rmailmm.el (rmail-mime-handle): Don't set the buffer to unibyte
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 106815
diff changeset
992 ;; (set-buffer-multibyte nil)
a1e356d208cd * mail/rmailmm.el (rmail-mime-handle): Don't set the buffer to unibyte
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 106815
diff changeset
993 (setq content-transfer-encoding nil)
a1e356d208cd * mail/rmailmm.el (rmail-mime-handle): Don't set the buffer to unibyte
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 106815
diff changeset
994 ))
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
995 ;; Inline stuff requires work. Attachments are handled by the bulk
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
996 ;; handler.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
997 (if (string= "inline" (car content-disposition))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
998 (let ((stop nil))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
999 (dolist (entry rmail-mime-media-type-handlers-alist)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1000 (when (and (string-match (car entry) (car content-type)) (not stop))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1001 (progn
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1002 (setq stop (funcall (cadr entry) content-type
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1003 content-disposition
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1004 content-transfer-encoding))))))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1005 ;; Everything else is an attachment.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1006 (rmail-mime-bulk-handler content-type
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1007 content-disposition
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1008 content-transfer-encoding))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1009 (save-restriction
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1010 (widen)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1011 (let ((entity (get-text-property (1- (point)) 'rmail-mime-entity))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1012 current new)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1013 (when entity
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1014 (setq current (aref (rmail-mime-entity-display entity) 0)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1015 new (aref (rmail-mime-entity-display entity) 1))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1016 (dotimes (i 3)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1017 (aset current i (aref new i)))))))
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1018
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1019 (defun rmail-mime-show (&optional show-headers)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1020 "Handle the current buffer as a MIME message.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1021 If SHOW-HEADERS is non-nil, then the headers of the current part
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1022 will shown as usual for a MIME message. The headers are also
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1023 shown for the content type message/rfc822. This function will be
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1024 called recursively if multiple parts are available.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1025
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1026 The current buffer must contain a single message. It will be
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1027 modified."
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1028 (rmail-mime-process show-headers nil))
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1029
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1030 (defun rmail-mime-process (show-headers parse-tag &optional
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1031 default-content-type
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1032 default-content-disposition)
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1033 (let ((end (point-min))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1034 content-type
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1035 content-transfer-encoding
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1036 content-disposition)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1037 ;; `point-min' returns the beginning and `end' points at the end
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1038 ;; of the headers.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1039 (goto-char (point-min))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1040 ;; If we're showing a part without headers, then it will start
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1041 ;; with a newline.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1042 (if (eq (char-after) ?\n)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1043 (setq end (1+ (point)))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1044 (when (search-forward "\n\n" nil t)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1045 (setq end (match-end 0))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1046 (save-restriction
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1047 (narrow-to-region (point-min) end)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1048 ;; FIXME: Default disposition of the multipart entities should
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1049 ;; be inherited.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1050 (setq content-type
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1051 (mail-fetch-field "Content-Type")
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1052 content-transfer-encoding
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1053 (mail-fetch-field "Content-Transfer-Encoding")
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1054 content-disposition
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1055 (mail-fetch-field "Content-Disposition")))))
106339
656eabdc03be (rmail-mime-handle): Doc fix.
Glenn Morris <rgm@gnu.org>
parents: 106178
diff changeset
1056 ;; Per RFC 2045, C-T-E is case insensitive (bug#5070), but the others
656eabdc03be (rmail-mime-handle): Doc fix.
Glenn Morris <rgm@gnu.org>
parents: 106178
diff changeset
1057 ;; are not completely so. Hopefully mail-header-parse-* DTRT.
656eabdc03be (rmail-mime-handle): Doc fix.
Glenn Morris <rgm@gnu.org>
parents: 106178
diff changeset
1058 (if content-transfer-encoding
656eabdc03be (rmail-mime-handle): Doc fix.
Glenn Morris <rgm@gnu.org>
parents: 106178
diff changeset
1059 (setq content-transfer-encoding (downcase content-transfer-encoding)))
656eabdc03be (rmail-mime-handle): Doc fix.
Glenn Morris <rgm@gnu.org>
parents: 106178
diff changeset
1060 (setq content-type
656eabdc03be (rmail-mime-handle): Doc fix.
Glenn Morris <rgm@gnu.org>
parents: 106178
diff changeset
1061 (if content-type
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1062 (or (mail-header-parse-content-type content-type)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1063 '("text/plain"))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1064 (or default-content-type '("text/plain"))))
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1065 (setq content-disposition
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1066 (if content-disposition
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1067 (mail-header-parse-content-disposition content-disposition)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1068 ;; If none specified, we are free to choose what we deem
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1069 ;; suitable according to RFC 2183. We like inline.
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1070 (or default-content-disposition '("inline"))))
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1071 ;; Unrecognized disposition types are to be treated like
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1072 ;; attachment according to RFC 2183.
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1073 (unless (member (car content-disposition) '("inline" "attachment"))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1074 (setq content-disposition '("attachment")))
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1075
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1076 (if parse-tag
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1077 (let* ((is-inline (string= (car content-disposition) "inline"))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1078 (header (vector (point-min) end nil))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1079 (tagline (vector parse-tag (cons nil nil) t))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1080 (body (vector end (point-max) is-inline))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1081 (new (vector (aref header 2) (aref tagline 2) (aref body 2)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1082 children handler entity)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1083 (cond ((string-match "multipart/.*" (car content-type))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1084 (save-restriction
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1085 (narrow-to-region (1- end) (point-max))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1086 (setq children (rmail-mime-process-multipart
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1087 content-type
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1088 content-disposition
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1089 content-transfer-encoding
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1090 parse-tag)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1091 handler 'rmail-mime-insert-multipart)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1092 ((string-match "message/rfc822" (car content-type))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1093 (save-restriction
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1094 (narrow-to-region end (point-max))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1095 (let* ((msg (rmail-mime-process t parse-tag
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1096 '("text/plain") '("inline")))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1097 (msg-new (aref (rmail-mime-entity-display msg) 1)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1098 ;; Show header of the child.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1099 (aset msg-new 0 t)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1100 (aset (rmail-mime-entity-header msg) 2 t)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1101 ;; Hide tagline of the child.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1102 (aset msg-new 1 nil)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1103 (aset (rmail-mime-entity-tagline msg) 2 nil)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1104 (setq children (list msg)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1105 handler 'rmail-mime-insert-multipart))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1106 ((and is-inline (string-match "text/" (car content-type)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1107 ;; Don't need a tagline.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1108 (aset new 1 (aset tagline 2 nil))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1109 (setq handler 'rmail-mime-insert-text))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1110 (t
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1111 ;; Force hidden mode.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1112 (aset new 1 (aset tagline 2 t))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1113 (aset new 2 (aset body 2 nil))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1114 (setq handler 'rmail-mime-insert-bulk)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1115 (setq entity (rmail-mime-entity content-type
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1116 content-disposition
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1117 content-transfer-encoding
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1118 (vector (vector nil nil nil) new)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1119 header tagline body children handler))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1120 (if (and (eq handler 'rmail-mime-insert-bulk)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1121 (rmail-mime-set-bulk-data entity))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1122 ;; Show the body.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1123 (aset new 2 (aset body 2 t)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1124 entity)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1125
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1126 ;; Hide headers and handle the part.
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1127 (put-text-property (point-min) (point-max) 'rmail-mime-entity
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1128 (rmail-mime-entity
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1129 content-type content-disposition
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1130 content-transfer-encoding
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1131 (vector (vector 'raw nil 'raw) (vector 'raw nil 'raw))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1132 (vector nil nil 'raw) (vector "" (cons nil nil) nil)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1133 (vector nil nil 'raw) nil nil))
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1134 (save-restriction
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1135 (cond ((string= (car content-type) "message/rfc822")
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1136 (narrow-to-region end (point-max)))
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1137 ((not show-headers)
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1138 (delete-region (point-min) end)))
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1139 (rmail-mime-handle content-type content-disposition
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1140 content-transfer-encoding)))))
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1141
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1142 (defun rmail-mime-parse ()
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1143 "Parse the current Rmail message as a MIME message.
112073
24ab54013884 Fix error handling of MIME parsing.
Kenichi Handa <handa@m17n.org>
parents: 112062
diff changeset
1144 The value is a MIME-entiy object (see `rmail-mime-entity').
24ab54013884 Fix error handling of MIME parsing.
Kenichi Handa <handa@m17n.org>
parents: 112062
diff changeset
1145 If an error occurs, return an error message string."
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1146 (let ((rmail-mime-mbox-buffer (if (rmail-buffers-swapped-p)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1147 rmail-view-buffer
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1148 (current-buffer))))
112073
24ab54013884 Fix error handling of MIME parsing.
Kenichi Handa <handa@m17n.org>
parents: 112062
diff changeset
1149 (condition-case err
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1150 (with-current-buffer rmail-mime-mbox-buffer
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1151 (save-excursion
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1152 (goto-char (point-min))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1153 (let* ((entity (rmail-mime-process t ""
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1154 '("text/plain") '("inline")))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1155 (new (aref (rmail-mime-entity-display entity) 1)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1156 ;; Show header.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1157 (aset new 0 (aset (rmail-mime-entity-header entity) 2 t))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1158 ;; Show tagline if and only if body is not shown.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1159 (if (aref new 2)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1160 (aset new 1 (aset (rmail-mime-entity-tagline entity) 2 nil))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1161 (aset new 1 (aset (rmail-mime-entity-tagline entity) 2 t)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1162 entity)))
112073
24ab54013884 Fix error handling of MIME parsing.
Kenichi Handa <handa@m17n.org>
parents: 112062
diff changeset
1163 (error (format "%s" err)))))
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1164
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1165 (defun rmail-mime-insert (entity)
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1166 "Insert a MIME-entity ENTITY in the current buffer.
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1167
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1168 This function will be called recursively if multiple parts are
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1169 available."
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1170 (let ((current (aref (rmail-mime-entity-display entity) 0))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1171 (new (aref (rmail-mime-entity-display entity) 1)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1172 (if (not (eq (aref new 0) 'raw))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1173 ;; Not a raw-mode. Each handler should handle it.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1174 (funcall (rmail-mime-entity-handler entity) entity)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1175 (let ((header (rmail-mime-entity-header entity))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1176 (tagline (rmail-mime-entity-tagline entity))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1177 (body (rmail-mime-entity-body entity))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1178 (beg (point))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1179 (segment (rmail-mime-entity-segment (point) entity)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1180 ;; header
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1181 (if (eq (aref current 0) (aref new 0))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1182 (goto-char (aref segment 2))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1183 (if (aref current 0)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1184 (delete-char (- (aref segment 2) (aref segment 1))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1185 (insert-buffer-substring rmail-mime-mbox-buffer
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1186 (aref header 0) (aref header 1)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1187 ;; tagline
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1188 (if (aref current 1)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1189 (delete-char (- (aref segment 3) (aref segment 2))))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1190 ;; body
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1191 (let ((children (rmail-mime-entity-children entity)))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1192 (if children
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1193 (progn
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1194 (put-text-property beg (point) 'rmail-mime-entity entity)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1195 (dolist (child children)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1196 (rmail-mime-insert child)))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1197 (if (eq (aref current 2) (aref new 2))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1198 (forward-char (- (aref segment 4) (aref segment 3)))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1199 (if (aref current 2)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1200 (delete-char (- (aref segment 4) (aref segment 3))))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1201 (insert-buffer-substring rmail-mime-mbox-buffer
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1202 (aref body 0) (aref body 1))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1203 (or (bolp) (insert "\n")))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1204 (put-text-property beg (point) 'rmail-mime-entity entity)))))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1205 (dotimes (i 3)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1206 (aset current i (aref new i)))))
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1207
105176
debabf496159 (rmail-mime-media-type-handlers-alist): Doc fix. Add image handler.
Glenn Morris <rgm@gnu.org>
parents: 105175
diff changeset
1208 (define-derived-mode rmail-mime-mode fundamental-mode "RMIME"
debabf496159 (rmail-mime-media-type-handlers-alist): Doc fix. Add image handler.
Glenn Morris <rgm@gnu.org>
parents: 105175
diff changeset
1209 "Major mode used in `rmail-mime' buffers."
debabf496159 (rmail-mime-media-type-handlers-alist): Doc fix. Add image handler.
Glenn Morris <rgm@gnu.org>
parents: 105175
diff changeset
1210 (setq font-lock-defaults '(rmail-font-lock-keywords t t nil nil)))
debabf496159 (rmail-mime-media-type-handlers-alist): Doc fix. Add image handler.
Glenn Morris <rgm@gnu.org>
parents: 105175
diff changeset
1211
102317
562b3a7e1016 Update commentary.
Glenn Morris <rgm@gnu.org>
parents: 101890
diff changeset
1212 ;;;###autoload
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1213 (defun rmail-mime (&optional arg)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1214 "Toggle displaying of a MIME message.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1215
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1216 The actualy behavior depends on the value of `rmail-enable-mime'.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1217
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1218 If `rmail-enable-mime' is t (default), this command change the
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1219 displaying of a MIME message between decoded presentation form
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1220 and raw data.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1221
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1222 With ARG, toggle the displaying of the current MIME entity only.
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1223
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1224 If `rmail-enable-mime' is nil, this creates a temporary
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1225 \"*RMAIL*\" buffer holding a decoded copy of the message. Inline
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1226 content-types are handled according to
102403
b7059e95eba9 (rmail-mime-media-type-handlers-alist)
Glenn Morris <rgm@gnu.org>
parents: 102317
diff changeset
1227 `rmail-mime-media-type-handlers-alist'. By default, this
b7059e95eba9 (rmail-mime-media-type-handlers-alist)
Glenn Morris <rgm@gnu.org>
parents: 102317
diff changeset
1228 displays text and multipart messages, and offers to download
b7059e95eba9 (rmail-mime-media-type-handlers-alist)
Glenn Morris <rgm@gnu.org>
parents: 102317
diff changeset
1229 attachments as specfied by `rmail-mime-attachment-dirs-alist'."
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1230 (interactive "P")
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1231 (if rmail-enable-mime
112257
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1232 (with-current-buffer rmail-buffer
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1233 (if (rmail-mime-message-p)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1234 (let ((rmail-mime-mbox-buffer rmail-view-buffer)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1235 (rmail-mime-view-buffer rmail-buffer)
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1236 (entity (get-text-property (point) 'rmail-mime-entity)))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1237 (if arg
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1238 (if entity
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1239 (rmail-mime-toggle-raw entity))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1240 (goto-char (point-min))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1241 (rmail-mime-toggle-raw
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1242 (get-text-property (point) 'rmail-mime-entity))))
103d72f0a1d5 Another improvement of MIME handling in rmail.
Kenichi Handa <handa@m17n.org>
parents: 112240
diff changeset
1243 (message "Not a MIME message")))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1244 (let* ((data (rmail-apply-in-message rmail-current-message 'buffer-string))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1245 (buf (get-buffer-create "*RMAIL*"))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1246 (rmail-mime-mbox-buffer rmail-view-buffer)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1247 (rmail-mime-view-buffer buf))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1248 (set-buffer buf)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1249 (setq buffer-undo-list t)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1250 (let ((inhibit-read-only t))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1251 ;; Decoding the message in fundamental mode for speed, only
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1252 ;; switching to rmail-mime-mode at the end for display. Eg
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1253 ;; quoted-printable-decode-region gets very slow otherwise (Bug#4993).
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1254 (fundamental-mode)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1255 (erase-buffer)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1256 (insert data)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1257 (rmail-mime-show t)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1258 (rmail-mime-mode)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1259 (set-buffer-modified-p nil))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1260 (view-buffer buf))))
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1261
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1262 (defun rmail-mm-get-boundary-error-message (message type disposition encoding)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1263 "Return MESSAGE with more information on the main mime components."
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1264 (error "%s; type: %s; disposition: %s; encoding: %s"
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1265 message type disposition encoding))
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1266
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1267 (defun rmail-show-mime ()
111885
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1268 "Function to set in `rmail-show-mime-function' (which see)."
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1269 (let ((entity (rmail-mime-parse))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1270 (rmail-mime-mbox-buffer rmail-buffer)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1271 (rmail-mime-view-buffer rmail-view-buffer)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1272 (rmail-mime-coding-system nil))
112073
24ab54013884 Fix error handling of MIME parsing.
Kenichi Handa <handa@m17n.org>
parents: 112062
diff changeset
1273 (if (vectorp entity)
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1274 (with-current-buffer rmail-mime-view-buffer
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1275 (erase-buffer)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1276 (rmail-mime-insert entity)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1277 (if rmail-mime-coding-system
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1278 (set-buffer-file-coding-system rmail-mime-coding-system t t)))
112073
24ab54013884 Fix error handling of MIME parsing.
Kenichi Handa <handa@m17n.org>
parents: 112062
diff changeset
1279 ;; Decoding failed. ENTITY is an error message. Insert the
24ab54013884 Fix error handling of MIME parsing.
Kenichi Handa <handa@m17n.org>
parents: 112062
diff changeset
1280 ;; original message body as is, and show warning.
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1281 (let ((region (with-current-buffer rmail-mime-mbox-buffer
111885
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1282 (goto-char (point-min))
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1283 (re-search-forward "^$" nil t)
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1284 (forward-line 1)
112073
24ab54013884 Fix error handling of MIME parsing.
Kenichi Handa <handa@m17n.org>
parents: 112062
diff changeset
1285 (vector (point-min) (point) (point-max)))))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1286 (with-current-buffer rmail-mime-view-buffer
111885
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1287 (let ((inhibit-read-only t))
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1288 (erase-buffer)
112073
24ab54013884 Fix error handling of MIME parsing.
Kenichi Handa <handa@m17n.org>
parents: 112062
diff changeset
1289 (rmail-mime-insert-header region)
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1290 (insert-buffer-substring rmail-mime-mbox-buffer
112073
24ab54013884 Fix error handling of MIME parsing.
Kenichi Handa <handa@m17n.org>
parents: 112062
diff changeset
1291 (aref region 1) (aref region 2))))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1292 (set-buffer-file-coding-system 'no-conversion t t)
112073
24ab54013884 Fix error handling of MIME parsing.
Kenichi Handa <handa@m17n.org>
parents: 112062
diff changeset
1293 (message "MIME decoding failed: %s" entity)))))
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1294
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1295 (setq rmail-show-mime-function 'rmail-show-mime)
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1296
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1297 (defun rmail-insert-mime-forwarded-message (forward-buffer)
111885
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1298 "Function to set in `rmail-insert-mime-forwarded-message-function' (which see)."
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1299 (let ((rmail-mime-mbox-buffer
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1300 (with-current-buffer forward-buffer rmail-view-buffer)))
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1301 (save-restriction
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1302 (narrow-to-region (point) (point))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1303 (message-forward-make-body-mime rmail-mime-mbox-buffer))))
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1304
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1305 (setq rmail-insert-mime-forwarded-message-function
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1306 'rmail-insert-mime-forwarded-message)
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1307
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1308 (defun rmail-insert-mime-resent-message (forward-buffer)
111885
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1309 "Function to set in `rmail-insert-mime-resent-message-function' (which see)."
111769
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1310 (insert-buffer-substring
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1311 (with-current-buffer forward-buffer rmail-view-buffer))
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1312 (goto-char (point-min))
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1313 (when (looking-at "From ")
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1314 (forward-line 1)
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1315 (delete-region (point-min) (point))))
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1316
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1317 (setq rmail-insert-mime-resent-message-function
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1318 'rmail-insert-mime-resent-message)
0e19494fd75d Improve rmail's MIME handling.
Kenichi Handa <handa@m17n.org>
parents: 109330
diff changeset
1319
111885
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1320 (defun rmail-search-mime-message (msg regexp)
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1321 "Function to set in `rmail-search-mime-message-function' (which see)."
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1322 (save-restriction
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1323 (narrow-to-region (rmail-msgbeg msg) (rmail-msgend msg))
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1324 (let* ((rmail-mime-mbox-buffer (current-buffer))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1325 (rmail-mime-view-buffer rmail-view-buffer)
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1326 (header-end (save-excursion
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1327 (re-search-forward "^$" nil 'move) (point)))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1328 (body-end (point-max))
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1329 (entity (rmail-mime-parse)))
111885
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1330 (or
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1331 ;; At first, just search the headers.
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1332 (with-temp-buffer
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1333 (insert-buffer-substring rmail-mime-mbox-buffer nil header-end)
111885
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1334 (rfc2047-decode-region (point-min) (point))
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1335 (goto-char (point-min))
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1336 (re-search-forward regexp nil t))
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1337 ;; Next, search the body.
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1338 (if (and entity
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1339 (let* ((content-type (rmail-mime-entity-type entity))
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1340 (charset (cdr (assq 'charset (cdr content-type)))))
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1341 (or (not (string-match "text/.*" (car content-type)))
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1342 (and charset
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1343 (not (string= (downcase charset) "us-ascii"))))))
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1344 ;; Search the decoded MIME message.
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1345 (with-temp-buffer
112062
34341d09c440 Enable display mode of MIME message in rmail.
Kenichi Handa <handa@m17n.org>
parents: 111885
diff changeset
1346 (rmail-mime-insert entity)
111885
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1347 (goto-char (point-min))
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1348 (re-search-forward regexp nil t))
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1349 ;; Search the body without decoding.
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1350 (goto-char header-end)
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1351 (re-search-forward regexp nil t))))))
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1352
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1353 (setq rmail-search-mime-message-function 'rmail-search-mime-message)
bbc996a3871b Implement rmail-search-mime-message-function.
Kenichi Handa <handa@m17n.org>
parents: 111773
diff changeset
1354
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1355 (provide 'rmailmm)
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1356
104907
6a35503cf20b Put autoloads in rmail.el rather than loaddefs.el.
Glenn Morris <rgm@gnu.org>
parents: 102421
diff changeset
1357 ;; Local Variables:
6a35503cf20b Put autoloads in rmail.el rather than loaddefs.el.
Glenn Morris <rgm@gnu.org>
parents: 102421
diff changeset
1358 ;; generated-autoload-file: "rmail.el"
6a35503cf20b Put autoloads in rmail.el rather than loaddefs.el.
Glenn Morris <rgm@gnu.org>
parents: 102421
diff changeset
1359 ;; End:
6a35503cf20b Put autoloads in rmail.el rather than loaddefs.el.
Glenn Morris <rgm@gnu.org>
parents: 102421
diff changeset
1360
101360
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1361 ;; arch-tag: 3f2c5e5d-1aef-4512-bc20-fd737c9d5dd9
b10df8502c4a Renamed all pmail* files to rmail*.
Bastien Guerry <bzg@altern.org>
parents:
diff changeset
1362 ;;; rmailmm.el ends here