+(defun mime-view-application/pgp-with-pgg (entity situation)
+ (let* ((p-win (or (get-buffer-window (current-buffer))
+ (get-largest-window)))
+ (new-name
+ (format "%s-%s" (buffer-name) (mime-entity-number entity)))
+ (mother (current-buffer))
+ (preview-buffer (concat "*Preview-" (buffer-name) "*"))
+ representation-type message-buf)
+ (set-buffer (setq message-buf (get-buffer-create new-name)))
+ (erase-buffer)
+ (mime-insert-entity entity)
+ (cond ((progn
+ (goto-char (point-min))
+ (re-search-forward "^-+BEGIN PGP SIGNED MESSAGE-+$" nil t))
+ (pgg-verify-region (match-beginning 0)(point-max) nil 'fetch)
+ (goto-char (point-min))
+ (delete-region
+ (point-min)
+ (and
+ (re-search-forward "^-+BEGIN PGP SIGNED MESSAGE-+\n\n")
+ (match-end 0)))
+ (delete-region
+ (and (re-search-forward "^-+BEGIN PGP SIGNATURE-+")
+ (match-beginning 0))
+ (point-max))
+ (goto-char (point-min))
+ (while (re-search-forward "^- -" nil t)
+ (replace-match "-"))
+ (setq representation-type (if (mime-entity-cooked-p entity)
+ 'cooked)))
+ ((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 'binary)))
+ (setq major-mode 'mime-show-message-mode)
+ (save-window-excursion
+ (mime-view-buffer nil preview-buffer mother
+ nil representation-type)
+ (make-local-variable 'mime-view-temp-message-buffer)
+ (setq mime-view-temp-message-buffer message-buf))
+ (set-window-buffer p-win preview-buffer)))
+