X-Git-Url: http://cgit.sxemacs.org/?a=blobdiff_plain;f=lisp%2Fmm-extern.el;h=b6bf1639343f0f39f143bd5472a2446af9a325fd;hb=dee3b415bd86cf0c59063b95edfa0c3f909138af;hp=88d101b4ae0462b900bfaca310ab35f7fc228635;hpb=673ff59b37a94e4057dda899fd156e6d09622656;p=gnus diff --git a/lisp/mm-extern.el b/lisp/mm-extern.el index 88d101b4a..b6bf16393 100644 --- a/lisp/mm-extern.el +++ b/lisp/mm-extern.el @@ -1,5 +1,5 @@ ;;; mm-extern.el --- showing message/external-body -;; Copyright (C) 2000 Free Software Foundation, Inc. +;; Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc. ;; Author: Shenghuo Zhu ;; Keywords: message external-body @@ -25,11 +25,11 @@ ;;; Code: -(eval-when-compile - (require 'cl)) +(eval-when-compile (require 'cl)) (require 'mm-util) (require 'mm-decode) +(require 'mm-url) (defvar mm-extern-function-alist '((local-file . mm-extern-local-file) @@ -37,33 +37,37 @@ (anon-ftp . mm-extern-anon-ftp) (ftp . mm-extern-ftp) ;;; (tftp . mm-extern-tftp) -;;; (mail-server . mm-extern-mail-server)) + (mail-server . mm-extern-mail-server) ;;; (afs . mm-extern-afs)) )) (defvar mm-extern-anonymous "anonymous") (defun mm-extern-local-file (handle) + (erase-buffer) (let ((name (cdr (assq 'name (cdr (mm-handle-type handle))))) (coding-system-for-read mm-binary-coding-system)) (unless name - (error "The filename is not specified.")) - (mm-disable-multibyte-mule4) - (mm-insert-file-contents name nil nil nil nil t))) + (error "The filename is not specified")) + (mm-disable-multibyte) + (if (file-exists-p name) + (mm-insert-file-contents name nil nil nil nil t) + (error (format "File %s is gone" name))))) (defun mm-extern-url (handle) - (require 'url) + (erase-buffer) (let ((url (cdr (assq 'url (cdr (mm-handle-type handle))))) (name buffer-file-name) (coding-system-for-read mm-binary-coding-system)) (unless url - (error "URL is not specified.")) - (mm-with-unibyte-current-buffer-mule4 - (url-insert-file-contents url)) - (mm-disable-multibyte-mule4) + (error "URL is not specified")) + (mm-with-unibyte-current-buffer + (mm-url-insert-file-contents url)) + (mm-disable-multibyte) (setq buffer-file-name name))) (defun mm-extern-anon-ftp (handle) + (erase-buffer) (let* ((params (cdr (mm-handle-type handle))) (name (cdr (assq 'name params))) (site (cdr (assq 'site params))) @@ -74,29 +78,53 @@ "@" site ":" directory "/" name)) (coding-system-for-read mm-binary-coding-system)) (unless name - (error "The filename is not specified.")) - (mm-disable-multibyte-mule4) + (error "The filename is not specified")) + (mm-disable-multibyte) (mm-insert-file-contents path nil nil nil nil t))) (defun mm-extern-ftp (handle) (let (mm-extern-anonymous) (mm-extern-anon-ftp handle))) +(defun mm-extern-mail-server (handle) + (require 'message) + (let* ((params (cdr (mm-handle-type handle))) + (server (cdr (assq 'server params))) + (subject (or (cdr (assq 'subject params)) "none")) + (buf (current-buffer)) + info) + (if (y-or-n-p (format "Send a request message to %s?" server)) + (save-window-excursion + (message-mail server subject) + (message-goto-body) + (delete-region (point) (point-max)) + (insert-buffer-substring buf) + (message "Requesting external body...") + (message-send-and-exit) + (setq info "Request is sent.") + (message info)) + (setq info "Request is not sent.")) + (goto-char (point-min)) + (insert "[" info "]\n\n"))) + ;;;###autoload (defun mm-inline-external-body (handle &optional no-display) "Show the external-body part of HANDLE. -This function replaces the buffer of HANDLE with a buffer contains +This function replaces the buffer of HANDLE with a buffer contains the entire message. If NO-DISPLAY is nil, display it. Otherwise, do nothing after replacing." - (let* ((access-type (cdr (assq 'access-type + (let* ((access-type (cdr (assq 'access-type (cdr (mm-handle-type handle))))) - (func (cdr (assq (intern (downcase access-type)) + (func (cdr (assq (intern + (downcase + (or access-type + (error "Couldn't find access type")))) mm-extern-function-alist))) gnus-displaying-mime buf handles) (unless (mm-handle-cache handle) (unless func - (error (format "Access type (%s) is not supported." access-type))) + (error (format "Access type (%s) is not supported" access-type))) (with-temp-buffer (mm-insert-part handle) (goto-char (point-max)) @@ -104,20 +132,19 @@ If NO-DISPLAY is nil, display it. Otherwise, do nothing after replacing." (setq handles (mm-dissect-buffer t))) (unless (bufferp (car handles)) (mm-destroy-parts handles) - (error "Multipart external body is not supported.")) + (error "Multipart external body is not supported")) (save-excursion ;; single part - (kill-buffer (mm-handle-buffer handles)) - (set-buffer (setq buf (generate-new-buffer " *mm*"))) - (condition-case err - (funcall func handle) - (error - ;; Don't require gnus-util - (when (gnus-buffer-exists-p buf) - (kill-buffer buf)) - (error err))) - (setcar handles (current-buffer)) + (set-buffer (setq buf (mm-handle-buffer handles))) + (let (good) + (unwind-protect + (progn + (funcall func handle) + (setq good t)) + (unless good + (mm-destroy-parts handles)))) (mm-handle-set-cache handle handles)) - (push handles gnus-article-mime-handles)) + (setq gnus-article-mime-handles + (mm-merge-handles gnus-article-mime-handles handles))) (unless no-display (save-excursion (save-restriction @@ -136,4 +163,6 @@ If NO-DISPLAY is nil, display it. Otherwise, do nothing after replacing." (error nil)) (delete-region ,(point-min-marker) ,(point-max-marker)))))))))) -;; mm-extern.el ends here +(provide 'mm-extern) + +;;; mm-extern.el ends here