* wl-summary.el (wl-summary-decide-flag): Use
[elisp/wanderlust.git] / wl / wl-mime.el
index ef80d00..d07020a 100644 (file)
@@ -61,16 +61,15 @@ has Non-nil value\)"
         (list (cons 'wl-original-message-mode
                     (function wl-draft-yank-to-draft-buffer))))
        (message-buffer (wl-current-message-buffer)))
-    (unless message-buffer
-      (error "No message."))
-    (if (get-buffer message-buffer)
+    (if message-buffer
        (save-excursion
-         (set-buffer (wl-current-message-buffer))
+         (set-buffer message-buffer)
          (save-restriction
            (widen)
            (if (wl-region-exists-p)
                (wl-mime-preview-follow-current-region)
-             (mime-preview-follow-current-entity)))))))
+             (mime-preview-follow-current-entity))))
+      (error "No message."))))
 
 ;; modified mime-preview-follow-current-entity from mime-view.el
 (defun wl-mime-preview-follow-current-region ()
@@ -143,10 +142,53 @@ It calls following-method selected from variable
 
 (defalias 'wl-draft-enclose-digest-region 'mime-edit-enclose-digest-region)
 
+(defun wl-draft-attribute-recipients ()
+  (concat (mapconcat
+          'identity
+          (wl-draft-deduce-address-list
+           (current-buffer)
+           (point-min)
+           (save-excursion
+             (goto-char (point-min))
+             (re-search-forward
+              (concat
+               "^"
+               (regexp-quote mail-header-separator)
+               "$")
+              nil t)
+             (point)))
+          ", ")))
+
+(defun wl-draft-attribute-envelope-from ()
+  (or wl-envelope-from
+      (wl-address-header-extract-address wl-from)))
+
+(defun wl-draft-attribute-smtp-posting-server ()
+  (or wl-smtp-posting-server
+      (progn (require 'smtp) smtp-server)
+      "localhost"))
+
+(defun wl-draft-attribute-smtp-posting-port ()
+  (or wl-smtp-posting-port
+      (progn (require 'smtp) smtp-service)))
+
+(defun wl-draft-attribute-value (attr)
+  (let ((name (symbol-name attr))
+       fsymbol symbol)
+    (cond ((and (setq fsymbol (intern-soft
+                              (format "wl-draft-attribute-%s" name)))
+               (fboundp fsymbol))
+          (funcall fsymbol))
+         ((and (setq symbol (intern-soft (format "wl-%s" name)))
+               (boundp symbol))
+          (symbol-value symbol))
+         ((boundp attr)
+          (symbol-value attr)))))
+
 (defun wl-draft-preview-message ()
   "Preview editing message."
   (interactive)
-  (let* (wl-recipients
+  (let* (attribute-list
         (orig-buffer (current-buffer))
         (current-point (point))
         (config-exec-flag wl-draft-config-exec-flag)
@@ -162,32 +204,27 @@ It calls following-method selected from variable
         (mime-edit-translate-buffer-hook
          (append
           (list
-           (function
-            (lambda ()
-              (let ((wl-draft-config-exec-flag config-exec-flag)
-                    (wl-draft-parent-folder parent-folder))
-                (goto-char current-point)
-                (run-hooks 'wl-draft-send-hook)
-                (setq wl-recipients
-                      (condition-case err
-                          (concat (mapconcat
-                                   'identity
-                                   (wl-draft-deduce-address-list
-                                    (current-buffer)
-                                    (point-min)
-                                    (save-excursion
-                                      (goto-char (point-min))
-                                      (re-search-forward
-                                       (concat
-                                        "^"
-                                        (regexp-quote mail-header-separator)
-                                        "$")
-                                       nil t)
-                                      (point)))
-                                   ", "))
-                        (error
-                         (kill-buffer (current-buffer))
-                         (signal (car err) (cdr err)))))))))
+           (lambda ()
+             (let ((wl-draft-config-exec-flag config-exec-flag)
+                   (wl-draft-parent-folder parent-folder)
+                   (copy-buffer (current-buffer)))
+               (with-current-buffer orig-buffer
+                 (wl-copy-local-variables
+                  orig-buffer
+                  copy-buffer
+                  (append wl-draft-config-variables
+                          (wl-draft-clone-local-variables))))
+               (goto-char current-point)
+               (run-hooks 'wl-draft-send-hook)
+               (condition-case err
+                   (setq attribute-list
+                         (mapcar
+                          (lambda (attr)
+                            (cons attr (wl-draft-attribute-value attr)))
+                          wl-draft-preview-attributes-list))
+                 (error
+                  (kill-buffer (current-buffer))
+                  (signal (car err) (cdr err)))))))
           mime-edit-translate-buffer-hook)))
     (mime-edit-preview-message)
     (let ((buffer-read-only nil))
@@ -206,8 +243,9 @@ It calls following-method selected from variable
                  (kill-buffer (get-buffer
                                wl-draft-preview-attributes-buffer-name)))))
     (if (not wl-draft-preview-attributes)
-       (message (concat "Recipients: " wl-recipients))
-;      (ignore-errors ; in case when the window is too small
+       (message (concat "Recipients: "
+                        (cdr (assq 'recipients attribute-list))))
+      (ignore-errors ; in case when the window is too small
        (let* ((cur-win (selected-window))
               (size (min
                      (- (window-height cur-win)
@@ -226,19 +264,13 @@ It calls following-method selected from variable
            (setq buffer-read-only t)
            (let (buffer-read-only)
              (erase-buffer)
-             (dolist (attr wl-draft-preview-attributes-list)
-               (insert (capitalize (symbol-name attr)) ": "
-                       (or
-                        (with-current-buffer orig-buffer
-                          (format "%s"
-                                  (symbol-value
-                                   (intern
-                                    (concat "wl-" (symbol-name attr))))))
-                        "")
+             (dolist (pair attribute-list)
+               (insert (capitalize (symbol-name (car pair))) ": "
+                       (format "%s" (or (cdr pair) ""))
                        "\n"))
              (goto-char (point-min))
              (wl-highlight-headers)))
-         (select-window cur-win)))));)
+         (select-window cur-win))))))
 
 (defalias 'wl-draft-caesar-region  'mule-caesar-region)
 
@@ -367,7 +399,7 @@ It calls following-method selected from variable
     (if (and (or (re-search-forward "^-+END PGP SIGNATURE-+$" nil t)
                 (re-search-backward "^-+END PGP SIGNATURE-+$" nil t))
             (re-search-backward "^-+BEGIN PGP SIGNED MESSAGE-+$" nil t))
-       (let (status m-beg)
+       (let (status)
          (let* ((beg (point))
                 (situation (mime-preview-find-boundary-info))
                 (p-end (aref situation 1))
@@ -396,10 +428,8 @@ It calls following-method selected from variable
          (set-window-start
           (get-buffer-window mime-echo-buffer-name)
           (point-max))
-         (setq m-beg (point))
          (insert-buffer-substring
-          (if status pgg-output-buffer pgg-errors-buffer))
-         (decode-coding-region m-beg (point) wl-cs-autoconv))
+          (if status pgg-output-buffer pgg-errors-buffer)))
       (message "Cannot find pgp signed region"))))
 
 ;; XXX: encrypted multipart isn't represented as multipart
@@ -472,15 +502,23 @@ With ARG, ask destination folder."
   (interactive "P")
   (let ((raw-buf (wl-summary-get-original-buffer))
        (view-buf wl-message-buffer)
-       children message-entity content-type target-name target)
+       message-entity target)
     (save-excursion
-      (setq target wl-summary-buffer-elmo-folder)
-      (when (or arg (not (elmo-folder-writable-p target)))
-       (setq target-name (wl-summary-read-folder wl-default-folder "to extract to"))
-       (setq target (wl-folder-get-elmo-folder target-name)))
+      (when (and (null arg)
+                (elmo-folder-writable-p wl-summary-buffer-elmo-folder))
+       (setq target wl-summary-buffer-elmo-folder))
+      (while (null target)
+       (let ((name (wl-summary-read-folder wl-default-folder
+                                           "to extract to")))
+         (setq target (wl-folder-get-elmo-folder name))
+         (unless (elmo-folder-writable-p target)
+           (message "%s is not writable" name)
+           (setq target nil)
+           (sit-for 1))))
       (wl-summary-set-message-buffer-or-redisplay)
       (with-current-buffer view-buf
-       (setq message-entity (get-text-property (point-min) 'mime-view-entity)))
+       (setq message-entity
+             (get-text-property (point-min) 'mime-view-entity)))
       (when message-entity
        (message "Bursting...")
        (with-current-buffer raw-buf
@@ -488,20 +526,22 @@ With ARG, ask destination folder."
        (message "Bursting...done"))
       (if (elmo-folder-plugged-p target)
          (elmo-folder-check target)))
-    (when (or (not target-name)
-             (string= wl-summary-buffer-folder-name target-name))
+    (when (and target
+              (string= wl-summary-buffer-folder-name
+                       (elmo-folder-name-internal target)))
       (save-excursion (wl-summary-sync-update)))))
 
 ;; internal variable.
 (defvar wl-mime-save-directory nil "Last saved directory.")
 ;;; Yet another save method.
 (defun wl-mime-save-content (entity situation)
-  (let ((filename (read-file-name "Save to file: "
-                                 (expand-file-name
-                                  (or (mime-entity-safe-filename entity)
-                                      ".")
-                                  (or wl-mime-save-directory
-                                      wl-temporary-file-directory)))))
+  (let ((filename (expand-file-name
+                  (read-file-name "Save to file: "
+                                  (expand-file-name
+                                   (or (mime-entity-safe-filename entity)
+                                       ".")
+                                   (or wl-mime-save-directory
+                                       wl-temporary-file-directory))))))
     (while (file-directory-p filename)
       (setq filename (read-file-name "Please set filename (not directory): "
                                     filename)))
@@ -516,11 +556,9 @@ With ARG, ask destination folder."
 (defun wl-mime-combine-message/partial-pieces (entity situation)
   "Internal method for wl to combine message/partial messages automatically."
   (interactive)
-  (let* ((folder (save-excursion
-                  (set-buffer wl-message-buffer-cur-summary-buffer)
+  (let* ((folder (with-current-buffer wl-message-buffer-cur-summary-buffer
                   wl-summary-buffer-elmo-folder))
         (mime-display-header-hook 'wl-highlight-headers)
-        (folder wl-message-buffer-cur-folder)
         (id (or (cdr (assoc "id" situation)) ""))
         (mother (current-buffer))
         (summary-buf wl-message-buffer-cur-summary-buffer)
@@ -555,11 +593,11 @@ With ARG, ask destination folder."
        (elmo-folder-do-each-message-entity (entity folder)
          (when (string-match
                 (regexp-quote subject-id)
-                (elmo-message-entity-field entity 'subject))
+                (elmo-message-entity-field entity 'subject 'decode))
            (let* ((message
                    ;; request message at the cursor in Subject buffer.
                    (wl-message-request-partial
-                    folder
+                    (elmo-folder-name-internal folder)
                     (elmo-message-entity-number entity)))
                   (situation (mime-entity-situation message))
                   (the-id (or (cdr (assoc "id" situation)) "")))
@@ -578,7 +616,7 @@ With ARG, ask destination folder."
 
 (defun wl-mime-display-header (entity situation)
   (let ((elmo-message-ignored-field-list
-        (if wl-message-buffer-all-header-flag
+        (if wl-message-buffer-require-all-header
             nil
           wl-message-ignored-field-list))
        (elmo-message-visible-field-list wl-message-visible-field-list)