Synch to Oort Gnus 200304070816.
[elisp/gnus.git-] / lisp / mml.el
index d97ec34..35e279e 100644 (file)
@@ -1,5 +1,6 @@
 ;;; mml.el --- A package for parsing and validating MML documents
-;; Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
+;;        Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; This file is part of GNU Emacs.
@@ -151,6 +152,7 @@ one charsets.")
        (let* (secure-mode
               (taginfo (mml-read-tag))
               (recipients (cdr (assq 'recipients taginfo)))
+              (sender (cdr (assq 'sender taginfo)))
               (location (cdr (assq 'tag-location taginfo)))
               (mode (cdr (assq 'mode taginfo)))
               (method (cdr (assq 'method taginfo)))
@@ -174,7 +176,9 @@ one charsets.")
          (eval `(mml-insert-tag ,secure-mode
                                 ,@tags
                                 ,(if recipients "recipients")
-                                ,recipients))
+                                ,recipients
+                                ,(if sender "sender")
+                                ,sender))
          ;; restart the parse
          (goto-char location)))
        ((looking-at "<#multipart")
@@ -431,26 +435,26 @@ If MML is non-nil, return the buffer up till the correspondent mml tag."
                      ;; ignore 0x1b, it is part of iso-2022-jp
                      (setq encoding (mm-body-7-or-8))))
                   (t
+                   ;; Only perform format=flowed filling on text/plain
+                   ;; parts where there either isn't a format parameter
+                   ;; in the mml tag or it says "flowed" and there
+                   ;; actually are hard newlines in the text.
+                   (let (use-hard-newlines)
+                     (when (and (string= type "text/plain")
+                                (or (null (assq 'format cont))
+                                    (string= (cdr (assq 'format cont))
+                                             "flowed"))
+                                (setq use-hard-newlines
+                                      (text-property-any
+                                       (point-min) (point-max) 'hard 't)))
+                       (fill-flowed-encode)
+                       ;; Indicate that `mml-insert-mime-headers' should
+                       ;; insert a "; format=flowed" string unless the
+                       ;; user has already specified it.
+                       (setq flowed (null (assq 'format cont)))))
                    (setq charset (mm-encode-body charset))
                    (setq encoding (mm-body-encoding
                                    charset (cdr (assq 'encoding cont))))))
-                 ;; Only perform format=flowed filling on text/plain
-                 ;; parts where there either isn't a format parameter
-                 ;; in the mml tag or it says "flowed" and there
-                 ;; actually are hard newlines in the text.
-                 (let (use-hard-newlines)
-                   (when (and (string= type "text/plain")
-                              (or (null (assq 'format cont))
-                                  (string= (cdr (assq 'format cont))
-                                           "flowed"))
-                              (setq use-hard-newlines
-                                    (text-property-any
-                                     (point-min) (point-max) 'hard 't)))
-                     (fill-flowed-encode)
-                     ;; Indicate that `mml-insert-mime-headers' should
-                     ;; insert a "; format=flowed" string unless the
-                     ;; user has already specified it.
-                     (setq flowed (null (assq 'format cont)))))
                  (setq coded (buffer-string)))
                (mml-insert-mime-headers cont type charset encoding flowed)
                (insert "\n")
@@ -734,7 +738,7 @@ If HANDLES is non-nil, use it instead reparsing the buffer."
        (mml-insert-mml-markup handle buffer textp)))
     (cond
      (mmlp
-      (insert-buffer buffer)
+      (insert-buffer-substring buffer)
       (goto-char (point-max))
       (insert "<#/mml>\n"))
      ((stringp (car handle))
@@ -790,14 +794,22 @@ If HANDLES is non-nil, use it instead reparsing the buffer."
 (defvar mml-mode-map
   (let ((sign (make-sparse-keymap))
        (encrypt (make-sparse-keymap))
+       (signpart (make-sparse-keymap))
+       (encryptpart (make-sparse-keymap))
        (map (make-sparse-keymap))
        (main (make-sparse-keymap)))
     (define-key sign "p" 'mml-secure-message-sign-pgpmime)
     (define-key sign "o" 'mml-secure-message-sign-pgp)
     (define-key sign "s" 'mml-secure-message-sign-smime)
+    (define-key signpart "p" 'mml-secure-sign-pgpmime)
+    (define-key signpart "o" 'mml-secure-sign-pgp)
+    (define-key signpart "s" 'mml-secure-sign-smime)
     (define-key encrypt "p" 'mml-secure-message-encrypt-pgpmime)
     (define-key encrypt "o" 'mml-secure-message-encrypt-pgp)
     (define-key encrypt "s" 'mml-secure-message-encrypt-smime)
+    (define-key encryptpart "p" 'mml-secure-encrypt-pgpmime)
+    (define-key encryptpart "o" 'mml-secure-encrypt-pgp)
+    (define-key encryptpart "s" 'mml-secure-encrypt-smime)
     (define-key map "\C-n" 'mml-unsecure-message)
     (define-key map "f" 'mml-attach-file)
     (define-key map "b" 'mml-attach-buffer)
@@ -808,7 +820,9 @@ If HANDLES is non-nil, use it instead reparsing the buffer."
     (define-key map "v" 'mml-validate)
     (define-key map "P" 'mml-preview)
     (define-key map "s" sign)
+    (define-key map "S" signpart)
     (define-key map "c" encrypt)
+    (define-key map "C" encryptpart)
     ;;(define-key map "n" 'mml-narrow-to-part)
     ;; `M-m' conflicts with `back-to-indentation'.
     ;; (define-key main "\M-m" map)
@@ -831,6 +845,13 @@ If HANDLES is non-nil, use it instead reparsing the buffer."
    ["PGP Encrypt" mml-secure-message-encrypt-pgp t]
    ["S/MIME Sign" mml-secure-message-sign-smime t]
    ["S/MIME Encrypt" mml-secure-message-encrypt-smime t]
+   ("Secure MIME part"
+    ["PGP/MIME Sign Part" mml-secure-sign-pgpmime t]
+    ["PGP/MIME Encrypt Part" mml-secure-encrypt-pgpmime t]
+    ["PGP Sign Part" mml-secure-sign-pgp t]
+    ["PGP Encrypt Part" mml-secure-encrypt-pgp t]
+    ["S/MIME Sign Part" mml-secure-sign-smime t]
+    ["S/MIME Encrypt Part" mml-secure-encrypt-smime t])
    ["Encrypt/Sign off" mml-unsecure-message t]
    ;;["Narrow" mml-narrow-to-part t]
    ["Quote MML" mml-quote-region t]
@@ -919,7 +940,9 @@ See Info node `(emacs-mime)Composing'.
       (when value
        ;; Quote VALUE if it contains suspicious characters.
        (when (string-match "[\"'\\~/*;() \t\n]" value)
-         (setq value (prin1-to-string value)))
+         (setq value (with-output-to-string
+                       (let (print-escape-nonascii)
+                         (prin1 value)))))
        (insert (format " %s=%s" key value)))))
   (insert ">\n"))
 
@@ -987,6 +1010,16 @@ TYPE is the MIME type to use."
   (mml-insert-tag 'part 'type type 'disposition "inline")
   (forward-line -1))
 
+(defun mml-preview-insert-mail-followup-to ()
+  "Insert a Mail-Followup-To header before previewing an article.
+Should be adopted if code in `message-send-mail' is changed."
+  (when (and (message-mail-p)
+            (message-subscribed-p)
+            (not (mail-fetch-field "mail-followup-to"))
+            (message-make-mail-followup-to))
+    (message-position-on-field "Mail-Followup-To" "X-Draft-From")
+    (insert (message-make-mail-followup-to))))
+
 (defun mml-preview (&optional raw)
   "Display current buffer with Gnus, in a new buffer.
 If RAW, don't highlight the article."
@@ -994,6 +1027,7 @@ If RAW, don't highlight the article."
   (save-excursion
     (let* ((buf (current-buffer))
           (message-options message-options)
+          (message-this-is-mail (message-mail-p))
           (message-this-is-news (message-news-p))
           (message-posting-charset (or (gnus-setup-posting-charset
                                         (save-restriction
@@ -1005,7 +1039,8 @@ If RAW, don't highlight the article."
                         (concat (if raw "*Raw MIME preview of "
                                   "*MIME preview of ") (buffer-name))))
       (erase-buffer)
-      (insert-buffer buf)
+      (insert-buffer-substring buf)
+      (mml-preview-insert-mail-followup-to)
       (let ((message-deletable-headers (if (message-news-p)
                                           nil
                                         message-deletable-headers)))
@@ -1034,6 +1069,10 @@ If RAW, don't highlight the article."
            (gnus-article-prepare-display))))
       ;; Disable article-mode-map.
       (use-local-map nil)
+      (make-local-hook 'kill-buffer-hook)
+      (add-hook 'kill-buffer-hook
+               (lambda ()
+                 (mm-destroy-parts gnus-article-mime-handles)) nil t)
       (setq buffer-read-only t)
       (local-set-key "q" (lambda () (interactive) (kill-buffer nil)))
       (goto-char (point-min)))))