(mime-entity-parent): New function; abolish `mime-raw-entity-parent'.
[elisp/semi.git] / mime-edit.el
index c4f69d2..56e77b0 100644 (file)
@@ -523,7 +523,7 @@ If it is not specified for a major-mode,
   :type 'list)
 
 (defconst mime-edit-split-ignored-field-regexp
-  "\\(^Content-\\|^Subject:\\|^Mime-Version:\\)")
+  "\\(^Content-\\|^Subject:\\|^Mime-Version:\\|Message-Id:\\)")
 
 (defvar mime-edit-split-blind-field-regexp
   "\\(^[BDFbdf]cc:\\|^cc:[ \t]*$\\)")
@@ -536,11 +536,11 @@ If it is not specified for a major-mode,
 ;;; @@ about PGP
 ;;;
 
-(defvar mime-edit-signing-type 'pgp-elkins
-  "*PGP signing type (pgp-elkins, pgp-kazu or nil).")
+(defvar mime-edit-signing-type 'pgp-mime
+  "*PGP signing type (pgp-mime, pgp-kazu or nil).")
 
-(defvar mime-edit-encrypting-type 'pgp-elkins
-  "*PGP encrypting type (pgp-elkins, pgp-kazu or nil).")
+(defvar mime-edit-encrypting-type 'pgp-mime
+  "*PGP encrypting type (pgp-mime, pgp-kazu or nil).")
 
 
 ;;; @@ about tag
@@ -599,13 +599,15 @@ If it is not specified for a major-mode,
                   (substring emacs-version 0 (match-beginning 0))
                 emacs-version)))
       (if (featurep 'mule)
-         (concat "Emacs " ver
-                 (if enable-multibyte-characters
-                     (concat ", MULE " mule-version)
-                   " (with raw setting)")
-                 (if (featurep 'meadow)
-                     (concat ", " (Meadow-version))
-                   ))
+         (if (boundp 'enable-multibyte-characters)
+             (concat "Emacs " ver
+                     (if enable-multibyte-characters
+                         (concat ", MULE " mule-version)
+                       " (with raw setting)")
+                     (if (featurep 'meadow)
+                         (concat ", " (Meadow-version))
+                       ))
+           (concat "MULE " mule-version " based on Emacs " ver))
        ver)))
   "Body of X-Emacs field.
 If variable `mime-edit-insert-x-emacs-field' is not nil, it is
@@ -634,65 +636,59 @@ Tspecials means any character that matches with it in header must be quoted.")
 (defvar mime-edit-mode-flag nil)
 (make-variable-buffer-local 'mime-edit-mode-flag)
 
+(defvar mime-edit-mode-entity-prefix "\C-c\C-x"
+  "Keymap prefix for MIME-Edit mode commands to insert entity or set status.")
+(defvar mime-edit-mode-entity-map (make-sparse-keymap)
+  "Keymap for MIME-Edit mode commands to insert entity or set status.")
+
+(define-key mime-edit-mode-entity-map "\C-t" 'mime-edit-insert-text)
+(define-key mime-edit-mode-entity-map "\C-i" 'mime-edit-insert-file)
+(define-key mime-edit-mode-entity-map "\C-e" 'mime-edit-insert-external)
+(define-key mime-edit-mode-entity-map "\C-v" 'mime-edit-insert-voice)
+(define-key mime-edit-mode-entity-map "\C-y" 'mime-edit-insert-message)
+(define-key mime-edit-mode-entity-map "\C-m" 'mime-edit-insert-mail)
+(define-key mime-edit-mode-entity-map "\C-w" 'mime-edit-insert-signature)
+(define-key mime-edit-mode-entity-map "\C-s" 'mime-edit-insert-signature)
+(define-key mime-edit-mode-entity-map "\C-k" 'mime-edit-insert-key)
+(define-key mime-edit-mode-entity-map "t"    'mime-edit-insert-tag)
+
+(define-key mime-edit-mode-entity-map "7" 'mime-edit-set-transfer-level-7bit)
+(define-key mime-edit-mode-entity-map "8" 'mime-edit-set-transfer-level-8bit)
+(define-key mime-edit-mode-entity-map "/" 'mime-edit-set-split)
+(define-key mime-edit-mode-entity-map "s" 'mime-edit-set-sign)
+(define-key mime-edit-mode-entity-map "v" 'mime-edit-set-sign)
+(define-key mime-edit-mode-entity-map "e" 'mime-edit-set-encrypt)
+(define-key mime-edit-mode-entity-map "h" 'mime-edit-set-encrypt)
+(define-key mime-edit-mode-entity-map "p" 'mime-edit-preview-message)
+(define-key mime-edit-mode-entity-map "\C-z" 'mime-edit-exit)
+(define-key mime-edit-mode-entity-map "?" 'mime-edit-help)
+
+(defvar mime-edit-mode-enclosure-prefix "\C-c\C-m"
+  "Keymap prefix for MIME-Edit mode commands about enclosure.")
+(defvar mime-edit-mode-enclosure-map (make-sparse-keymap)
+  "Keymap for MIME-Edit mode commands about enclosure.")
+
+(define-key mime-edit-mode-enclosure-map
+  "\C-a" 'mime-edit-enclose-alternative-region)
+(define-key mime-edit-mode-enclosure-map
+  "\C-p" 'mime-edit-enclose-parallel-region)
+(define-key mime-edit-mode-enclosure-map
+  "\C-m" 'mime-edit-enclose-mixed-region)
+(define-key mime-edit-mode-enclosure-map
+  "\C-d" 'mime-edit-enclose-digest-region)
+(define-key mime-edit-mode-enclosure-map
+  "\C-s" 'mime-edit-enclose-signed-region)
+(define-key mime-edit-mode-enclosure-map
+  "\C-e" 'mime-edit-enclose-encrypted-region)
+(define-key mime-edit-mode-enclosure-map
+  "\C-q" 'mime-edit-enclose-quote-region)
+
 (defvar mime-edit-mode-map (make-sparse-keymap)
   "Keymap for MIME-Edit mode commands.")
-
-(define-key mime-edit-mode-map
-  "\C-c\C-x\C-t"       'mime-edit-insert-text)
-(define-key mime-edit-mode-map
-  "\C-c\C-x\C-i"       'mime-edit-insert-file)
-(define-key mime-edit-mode-map
-  "\C-c\C-x\C-e"       'mime-edit-insert-external)
-(define-key mime-edit-mode-map
-  "\C-c\C-x\C-v"       'mime-edit-insert-voice)
-(define-key mime-edit-mode-map
-  "\C-c\C-x\C-y"       'mime-edit-insert-message)
-(define-key mime-edit-mode-map
-  "\C-c\C-x\C-m"       'mime-edit-insert-mail)
-(define-key mime-edit-mode-map
-  "\C-c\C-x\C-w"       'mime-edit-insert-signature)
 (define-key mime-edit-mode-map
-  "\C-c\C-x\C-s"       'mime-edit-insert-signature)
+  mime-edit-mode-entity-prefix mime-edit-mode-entity-map)
 (define-key mime-edit-mode-map
-  "\C-c\C-x\C-k"       'mime-edit-insert-key)
-(define-key mime-edit-mode-map
-  "\C-c\C-xt"          'mime-edit-insert-tag)
-
-(define-key mime-edit-mode-map
-  "\C-c\C-m\C-a"       'mime-edit-enclose-alternative-region)
-(define-key mime-edit-mode-map
-  "\C-c\C-m\C-p"       'mime-edit-enclose-parallel-region)
-(define-key mime-edit-mode-map
-  "\C-c\C-m\C-m"       'mime-edit-enclose-mixed-region)
-(define-key mime-edit-mode-map
-  "\C-c\C-m\C-d"       'mime-edit-enclose-digest-region)
-(define-key mime-edit-mode-map
-  "\C-c\C-m\C-s"       'mime-edit-enclose-signed-region)
-(define-key mime-edit-mode-map
-  "\C-c\C-m\C-e"       'mime-edit-enclose-encrypted-region)
-(define-key mime-edit-mode-map
-  "\C-c\C-m\C-q"       'mime-edit-enclose-quote-region)
-
-(define-key mime-edit-mode-map
-  "\C-c\C-x7"          'mime-edit-set-transfer-level-7bit)
-(define-key mime-edit-mode-map
-  "\C-c\C-x8"          'mime-edit-set-transfer-level-8bit)
-(define-key mime-edit-mode-map
-  "\C-c\C-x/"          'mime-edit-set-split)
-(define-key mime-edit-mode-map
-  "\C-c\C-xs"          'mime-edit-set-sign)
-(define-key mime-edit-mode-map
-  "\C-c\C-xv"          'mime-edit-set-sign)
-(define-key mime-edit-mode-map
-  "\C-c\C-xe"          'mime-edit-set-encrypt)
-(define-key mime-edit-mode-map
-  "\C-c\C-xh"          'mime-edit-set-encrypt)
-(define-key mime-edit-mode-map
-  "\C-c\C-x\C-p"       'mime-edit-preview-message)
-(define-key mime-edit-mode-map
-  "\C-c\C-x\C-z"       'mime-edit-exit)
-(define-key mime-edit-mode-map
-  "\C-c\C-x?"          'mime-edit-help)
+  mime-edit-mode-enclosure-prefix mime-edit-mode-enclosure-map)
 
 (defconst mime-edit-menu-title "MIME-Edit")
 
@@ -773,6 +769,8 @@ Tspecials means any character that matches with it in header must be quoted.")
 ;;; @ functions
 ;;;
 
+(defvar mime-edit-touched-flag nil)
+
 ;;;###autoload
 (defun mime-edit-mode ()
   "MIME minor mode for editing the tagged MIME message.
@@ -908,8 +906,7 @@ User customizable variables (not documented all of them):
   (interactive)
   (if mime-edit-mode-flag
       (mime-edit-exit)
-    (if (and (boundp 'mime-edit-touched-flag)
-            mime-edit-touched-flag)
+    (if mime-edit-touched-flag
        (mime-edit-again)
       (make-local-variable 'mime-edit-touched-flag)
       (setq mime-edit-touched-flag t)
@@ -1580,21 +1577,17 @@ Parameter must be '(PROMPT CHOICE1 (CHOISE2 ...))."
       (let ((bb (match-beginning 0))
            (be (match-end 0))
            (type (buffer-substring (match-beginning 1)(match-end 1)))
-           end-exp eb ee)
+           end-exp eb)
        (setq end-exp (format "--}-<<%s>>\n" type))
        (widen)
        (if (re-search-forward end-exp nil t)
-           (progn
-             (setq eb (match-beginning 0))
-             (setq ee (match-end 0))
-             )
+           (setq eb (match-beginning 0))
          (setq eb (point-max))
-         (setq ee (point-max))
          )
        (narrow-to-region be eb)
        (goto-char be)
        (if (re-search-forward mime-edit-multipart-beginning-regexp nil t)
-           (let (ret)
+           (progn
              (narrow-to-region (match-beginning 0)(point-max))
              (mime-edit-find-inmost)
              )
@@ -1628,16 +1621,16 @@ Parameter must be '(PROMPT CHOICE1 (CHOISE2 ...))."
                 (mime-edit-enquote-region bb eb)
                 )
                ((string-equal type "signed")
-                (cond ((eq mime-edit-signing-type 'pgp-elkins)
-                       (mime-edit-sign-pgp-elkins bb eb boundary)
+                (cond ((eq mime-edit-signing-type 'pgp-mime)
+                       (mime-edit-sign-pgp-mime bb eb boundary)
                        )
                       ((eq mime-edit-signing-type 'pgp-kazu)
                        (mime-edit-sign-pgp-kazu bb eb boundary)
                        ))
                 )
                ((string-equal type "encrypted")
-                (cond ((eq mime-edit-encrypting-type 'pgp-elkins)
-                       (mime-edit-encrypt-pgp-elkins bb eb boundary)
+                (cond ((eq mime-edit-encrypting-type 'pgp-mime)
+                       (mime-edit-encrypt-pgp-mime bb eb boundary)
                        )
                       ((eq mime-edit-encrypting-type 'pgp-kazu)
                        (mime-edit-encrypt-pgp-kazu bb eb boundary)
@@ -1675,7 +1668,7 @@ Parameter must be '(PROMPT CHOICE1 (CHOISE2 ...))."
          (replace-match (concat "-" (substring tag 2)))
          )))))
 
-(defun mime-edit-sign-pgp-elkins (beg end boundary)
+(defun mime-edit-sign-pgp-mime (beg end boundary)
   (save-excursion
     (save-restriction
       (narrow-to-region beg end)
@@ -1683,9 +1676,7 @@ Parameter must be '(PROMPT CHOICE1 (CHOISE2 ...))."
              (mime-edit-translate-region beg end boundary))
             (ctype    (car ret))
             (encoding (nth 1 ret))
-            (parts    (nth 3 ret))
-            (pgp-boundary (concat "pgp-sign-" boundary))
-            )
+            (pgp-boundary (concat "pgp-sign-" boundary)))
        (goto-char beg)
        (insert (format "Content-Type: %s\n" ctype))
        (if encoding
@@ -1733,7 +1724,7 @@ Parameter must be '(PROMPT CHOICE1 (CHOISE2 ...))."
     (vector from recipients header)
     ))
 
-(defun mime-edit-encrypt-pgp-elkins (beg end boundary)
+(defun mime-edit-encrypt-pgp-mime (beg end boundary)
   (save-excursion
     (save-restriction
       (let (from recipients header)
@@ -1747,9 +1738,7 @@ Parameter must be '(PROMPT CHOICE1 (CHOISE2 ...))."
                (mime-edit-translate-region beg end boundary))
               (ctype    (car ret))
               (encoding (nth 1 ret))
-              (parts    (nth 3 ret))
-              (pgp-boundary (concat "pgp-" boundary))
-              )
+              (pgp-boundary (concat "pgp-" boundary)))
          (goto-char beg)
          (insert header)
          (insert (format "Content-Type: %s\n" ctype))
@@ -1914,17 +1903,15 @@ Content-Transfer-Encoding: 7bit
              (insert encoding)))
        ))))
 
-(defun mime-edit-translate-single-part-tag (&optional prefix)
+(defun mime-edit-translate-single-part-tag (boundary &optional prefix)
   "Translate single-part-tag to MIME header."
   (if (re-search-forward mime-edit-single-part-tag-regexp nil t)
       (let* ((beg (match-beginning 0))
             (end (match-end 0))
-            (tag (buffer-substring beg end))
-            )
+            (tag (buffer-substring beg end)))
        (delete-region beg end)
        (let ((contype (mime-edit-get-contype tag))
-             (encoding (mime-edit-get-encoding tag))
-             )
+             (encoding (mime-edit-get-encoding tag)))
          (insert (concat prefix "--" boundary "\n"))
          (save-restriction
            (narrow-to-region (point)(point))
@@ -1969,9 +1956,8 @@ Content-Transfer-Encoding: 7bit
         (t
          ;; It's a multipart message.
          (goto-char (point-min))
-         (and (mime-edit-translate-single-part-tag)
-              (while (mime-edit-translate-single-part-tag "\n"))
-              )
+         (and (mime-edit-translate-single-part-tag boundary)
+              (while (mime-edit-translate-single-part-tag boundary "\n")))
          ;; Define Content-Type as "multipart/mixed".
          (setq contype
                (concat "multipart/mixed;\n boundary=\"" boundary "\""))
@@ -2104,9 +2090,7 @@ Content-Transfer-Encoding: 7bit
        ;; encoded.
        (let* ((encoding "base64")      ;Encode in BASE64 by default.
               (beg (mime-edit-content-beginning))
-              (end (mime-edit-content-end))
-              (body (buffer-substring beg end))
-              )
+              (end (mime-edit-content-end)))
          (mime-encode-region beg end encoding)
          (mime-edit-define-encoding encoding))
        (forward-line 1)
@@ -2559,10 +2543,9 @@ Content-Type: message/partial; id=%s; number=%d; total=%d\n%s\n"
     (goto-char (point-min))
     (let ((ctl (mime-read-Content-Type)))
       (if ctl
-         (let ((type (car ctl))
-               (stype (car (cdr ctl)))
-               (params (cdr (cdr ctl)))
-               )
+         (let ((type (mime-content-type-primary-type ctl))
+               (stype (mime-content-type-subtype ctl))
+               (params (mime-content-type-parameters ctl)))
            (cond
             ((and (eq type 'application)(eq stype 'pgp-signature))
              (delete-region (point-min)(point-max))