+(defsubst wl-mime-node-id-to-string (node-id)
+ (if (consp node-id)
+ (mapconcat (function (lambda (num) (format "%s" (1+ num))))
+ (reverse node-id)
+ ".")
+ "0"))
+
+(defun wl-message-delete-current-part ()
+ "Delete a part under the cursor from the multipart message."
+ (interactive)
+ (save-restriction
+ (widen)
+ (let* ((entity (get-text-property (point) 'mime-view-entity))
+ (node-id (mime-entity-node-id entity))
+ (filename (mime-entity-safe-filename entity))
+ (header-start (mime-buffer-entity-header-start-internal entity))
+ (body-end (mime-buffer-entity-body-end-internal entity))
+ (folder (wl-folder-get-elmo-folder wl-message-buffer-cur-folder))
+ (number wl-message-buffer-cur-number)
+ (msgid (elmo-message-field folder number 'message-id))
+ (orig-buf wl-message-buffer-original-buffer))
+ (if (eq (luna-class-name entity) 'mime-elmo-imap-entity)
+ (error "Please fetch the entire message (by typing 'C-u .') and try again"))
+ (with-current-buffer orig-buf
+ (unless (string-equal
+ (buffer-string)
+ (elmo-message-fetch-string
+ folder number
+ (elmo-make-fetch-strategy 'entire)))
+ (error "Buffer content differs from actual message")))
+ (when (and (elmo-folder-writable-p folder)
+ (buffer-live-p orig-buf)
+ node-id
+ (yes-or-no-p
+ (format "Do you really want to delete part %s? "
+ (wl-mime-node-id-to-string node-id))))
+ (when (with-temp-buffer
+ (insert-buffer orig-buf)
+ (delete-region header-start body-end)
+ (goto-char header-start)
+ (insert "Content-Type: text/plain; charset=US-ASCII\n")
+ (when filename
+ (insert
+ "Content-Disposition:"
+ (mime-encode-field-body
+ (concat ""
+ (and filename
+ (concat " inline; filename=" (std11-wrap-as-quoted-string filename))))
+ "Content-Disposition")
+ "\n"))
+ (insert "\n")
+ (insert "** This part has been removed by Wanderlust **\n\n")
+ (elmo-folder-append-buffer folder))
+
+ (elmo-folder-move-messages
+ folder (list number)
+ (wl-folder-get-elmo-folder wl-trash-folder))
+ (when (and (elmo-cache-get-path msgid)
+ (file-exists-p (elmo-cache-get-path msgid)))
+ (delete-file (elmo-cache-get-path msgid)))
+
+ (mime-preview-quit)
+ (wl-summary-delete-messages-on-buffer (list number))
+ (wl-summary-toggle-disp-msg 'off)
+ (setq wl-message-buffer nil)
+ (wl-summary-sync nil "update"))))))
+
+(defun wl-message-decrypt-pgp-nonmime ()
+ "Decrypt PGP encrypted region"
+ (interactive)
+ (require 'pgg)
+ (save-excursion
+ (beginning-of-line)
+ (if (or (re-search-forward "^-+END PGP MESSAGE-+$" nil t)
+ (re-search-backward "^-+END PGP MESSAGE-+$" nil t))
+ (let (beg end status)
+ (setq end (match-end 0))
+ (if (setq beg (re-search-backward "^-+BEGIN PGP MESSAGE-+$" nil t))
+ (let ((inhibit-read-only t)
+ (buffer-file-coding-system wl-cs-autoconv))
+ (setq status (pgg-decrypt-region beg end))
+ (pgg-display-output-buffer beg end status))
+ (message "Cannot find pgp encrypted region")))
+ (message "Cannot find pgp encrypted region"))))
+
+(defun wl-message-verify-pgp-nonmime ()
+ "Verify PGP signed region"
+ (interactive)
+ (require 'pgg)
+ (save-excursion
+ (beginning-of-line)
+ (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)
+ (let* ((beg (point))
+ (situation (mime-preview-find-boundary-info))
+ (p-end (aref situation 1))
+ (entity (aref situation 2))
+ (count 0))
+ (goto-char p-end)
+ (while (< beg (point))
+ (if (re-search-backward "^-+BEGIN PGP SIGNED MESSAGE-+$" nil t)
+ (setq count (+ count 1))
+ (debug)))
+ (with-temp-buffer
+ (set-buffer-multibyte nil)
+ (insert (mime-entity-body entity))
+ (goto-char (point-max))
+ (while (> count 0)
+ (if (re-search-backward "^-+BEGIN PGP SIGNED MESSAGE-+$" nil t)
+ (setq count (- count 1))
+ (debug)))
+ (let ((r-beg (point))
+ (r-end (re-search-forward "^-+END PGP SIGNATURE-+$" nil t)))
+ (if r-end
+ (setq status (pgg-verify-region r-beg r-end nil 'fetch))
+ (debug)))))
+ (mime-show-echo-buffer)
+ (set-buffer mime-echo-buffer-name)
+ (set-window-start
+ (get-buffer-window mime-echo-buffer-name)
+ (point-max))
+ (insert-buffer-substring
+ (if status pgg-output-buffer pgg-errors-buffer)))
+ (message "Cannot find pgp signed region"))))
+
+;; XXX: encrypted multipart isn't represented as multipart
+(defun wl-mime-preview-application/pgp (parent-entity entity situation)
+ (require 'pgg)
+ (goto-char (point-max))
+ (let ((p (point))
+ raw-buf to-buf representation-type child-entity)
+ (goto-char p)
+ (save-restriction
+ (narrow-to-region p p)
+ (setq to-buf (current-buffer))
+ (with-temp-buffer
+ (setq raw-buf (current-buffer))
+ (mime-insert-entity entity)
+ (when (progn
+ (goto-char (point-min))
+ (re-search-forward "^-+BEGIN PGP MESSAGE-+$" nil t))
+ (pgg-decrypt-region (point-min)(point-max))
+ (delete-region (point-min) (point-max))
+ (insert-buffer pgg-output-buffer)
+ (setq representation-type 'elmo-buffer))
+ (setq child-entity (mime-parse-message
+ (mm-expand-class-name representation-type)
+ nil
+ parent-entity
+ (mime-entity-node-id-internal parent-entity)))
+ (mime-display-entity
+ child-entity
+ nil
+ `((header . visible)
+ (body . visible)
+ (entity-button . invisible))
+ to-buf)))))
+
+(defun wl-mime-preview-application/pgp-encrypted (entity situation)
+ (let* ((entity-node-id (mime-entity-node-id entity))
+ (mother (mime-entity-parent entity))
+ (knum (car entity-node-id))
+ (onum (if (> knum 0)
+ (1- knum)
+ (1+ knum)))
+ (orig-entity (nth onum (mime-entity-children mother))))
+ (wl-mime-preview-application/pgp entity orig-entity situation)))
+