* wl-highlight.el (wl-highlight-folder-opened-regexp)
[elisp/wanderlust.git] / wl / wl-mime.el
index ecba24c..80d8b51 100644 (file)
@@ -385,11 +385,15 @@ It calls following-method selected from variable
        mime-view-ignored-field-list)
     (mime-view-mode nil nil nil inbuf outbuf)))
 
-(defun wl-message-delete-mime-out-buf ()
-  (let (mime-out-buf mime-out-win)
-    (if (setq mime-out-buf (get-buffer mime-echo-buffer-name))
-       (if (setq mime-out-win (get-buffer-window mime-out-buf))
-           (delete-window mime-out-win)))))
+(defun wl-message-delete-popup-windows ()
+  (dolist (buffer wl-message-popup-buffers)
+    (when (or (stringp buffer)
+             (and (symbolp buffer)
+                  (boundp buffer)
+                  (setq buffer (symbol-value buffer))))
+      (let ((window (get-buffer-window buffer)))
+       (when window
+         (delete-window window))))))
 
 (defun wl-message-request-partial (folder number)
   (elmo-set-work-buf
@@ -509,8 +513,8 @@ It calls following-method selected from variable
     (elmo-with-progress-display (epg-decript nil reporter)
        "Decrypting"
       (epg-context-set-progress-callback context
-                                        #'wl-epg-progress-callback
-                                        reporter)
+                                        (cons #'wl-epg-progress-callback
+                                              reporter))
       (insert (prog1
                  (decode-coding-string
                   (epg-decrypt-string
@@ -526,8 +530,8 @@ It calls following-method selected from variable
     (elmo-with-progress-display (epg-verify nil reporter)
        "Verifying"
       (epg-context-set-progress-callback context
-                                        #'wl-epg-progress-callback
-                                        reporter)
+                                        (cons #'wl-epg-progress-callback
+                                              reporter))
       (epg-verify-string
        context
        (encode-coding-string
@@ -753,6 +757,44 @@ With ARG, ask destination folder."
       (setq wl-mime-save-directory (file-name-directory filename))
       (mime-write-entity-content entity filename))))
 
+(defun wl-summary-extract-attachments-1 (message-entity directory number)
+  ;; returns new number.
+  (let (children filename)
+    (cond
+     ((setq children (mime-entity-children message-entity))
+      (dolist (entity children)
+       (setq number
+             (wl-summary-extract-attachments-1 entity directory number))))
+     ((and (eq (mime-content-disposition-type
+               (mime-entity-content-disposition message-entity))
+              'attachment)
+          (setq filename (mime-entity-safe-filename message-entity)))
+      (let ((full (expand-file-name filename directory)))
+       (when (or (not (file-exists-p full))
+                 (yes-or-no-p
+                  (format "File %s exists. Save anyway? " filename)))
+         (message "Extracting...%s" (setq number (+ 1 number)))
+         (mime-write-entity-content message-entity full)))))
+    number))
+
+(defun wl-summary-extract-attachments (directory)
+  "Extract attachment parts in MIME format into the DIRECTORY."
+  (interactive
+   (let* ((default (or wl-mime-save-directory
+                      wl-temporary-file-directory))
+         (directory (read-directory-name "Extract to " default default t)))
+     (list (if (> (length directory) 0) directory default))))
+  (unless (and (file-writable-p directory)
+              (file-directory-p directory))
+    (error "%s is not writable" directory))
+  (save-excursion
+    (wl-summary-set-message-buffer-or-redisplay)
+    (let ((entity (get-text-property (point-min) 'mime-view-entity)))
+      (when entity
+       (message "Extracting...")
+       (wl-summary-extract-attachments-1 entity directory 0)
+       (message "Extracting...done")))))
+
 ;;; Yet another combine method.
 (defun wl-mime-combine-message/partial-pieces (entity situation)
   "Internal method for wl to combine message/partial messages automatically."
@@ -823,6 +865,8 @@ With ARG, ask destination folder."
        (elmo-message-visible-field-list wl-message-visible-field-list)
        (elmo-message-sorted-field-list wl-message-sort-field-list))
     (elmo-mime-insert-header entity situation)
+    (goto-char (point-min))
+    (delete-matching-lines "^$")
     (wl-highlight-headers)))
 
 (defun wl-mime-decrypt-application/pgp-encrypted (entity situation)
@@ -845,8 +889,9 @@ With ARG, ask destination folder."
             'wl-original-message-mode 'wl-message-exit)
   (set-alist 'mime-preview-over-to-next-method-alist
             'wl-original-message-mode 'wl-message-exit)
-  (add-hook 'wl-summary-redisplay-hook 'wl-message-delete-mime-out-buf)
-  (add-hook 'wl-message-exit-hook 'wl-message-delete-mime-out-buf)
+  (add-hook 'wl-summary-toggle-disp-off-hook 'wl-message-delete-popup-windows)
+  (add-hook 'wl-summary-redisplay-hook 'wl-message-delete-popup-windows)
+  (add-hook 'wl-message-exit-hook 'wl-message-delete-popup-windows)
 
   (ctree-set-calist-strictly
    'mime-preview-condition