*** empty log message ***
[elisp/gnus.git-] / lisp / gnus-msg.el
index 38104fe..23759b3 100644 (file)
@@ -1,9 +1,10 @@
-;;; gnus-msg.el --- mail and post interface for Gnus
-;; Copyright (C) 1995,96,97 Free Software Foundation, Inc.
+;;; gnus-msg.el --- mail and post interface for Semi-gnus
+;; Copyright (C) 1995,96,97,98 Free Software Foundation, Inc.
 
 ;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
-;;     Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
-;; Keywords: news
+;;         Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
+;;         MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; Keywords: mail, news, MIME
 
 ;; This file is part of GNU Emacs.
 
 (require 'message)
 (require 'gnus-art)
 
-;; Added by Sudish Joseph <joseph@cis.ohio-state.edu>.
-(defvar gnus-post-method nil
+(defcustom gnus-post-method nil
   "*Preferred method for posting USENET news.
-If this variable is nil, Gnus will use the current method to decide
-which method to use when posting.  If it is non-nil, it will override
-the current method.  This method will not be used in mail groups and
-the like, only in \"real\" newsgroups.
 
-The value must be a valid method as discussed in the documentation of
-`gnus-select-method'.  It can also be a list of methods.  If that is
-the case, the user will be queried for what select method to use when
-posting.")
+If this variable is `current', Gnus will use the \"current\" select
+method when posting.  If it is nil (which is the default), Gnus will
+use the native posting method of the server.
+
+This method will not be used in mail groups and the like, only in
+\"real\" newsgroups.
+
+If not nil nor `native', the value must be a valid method as discussed
+in the documentation of `gnus-select-method'. It can also be a list of
+methods. If that is the case, the user will be queried for what select
+method to use when posting."
+  :group 'gnus-group-foreign
+  :type `(choice (const nil)
+                (const native)
+                (sexp :tag "Methods" ,gnus-select-method)))
 
 (defvar gnus-outgoing-message-group nil
   "*All outgoing messages will be put in this group.
@@ -66,13 +73,6 @@ the group.")
 (defvar gnus-add-to-list nil
   "*If non-nil, add a `to-list' parameter automatically.")
 
-(defvar gnus-sent-message-ids-file
-  (nnheader-concat gnus-directory "Sent-Message-IDs")
-  "File where Gnus saves a cache of sent message ids.")
-
-(defvar gnus-sent-message-ids-length 1000
-  "The number of sent Message-IDs to save.")
-
 (defvar gnus-crosspost-complaint
   "Hi,
 
@@ -164,10 +164,12 @@ Thank you for your help in stamping out bugs.
 (defmacro gnus-setup-message (config &rest forms)
   (let ((winconf (make-symbol "gnus-setup-message-winconf"))
        (buffer (make-symbol "gnus-setup-message-buffer"))
-       (article (make-symbol "gnus-setup-message-article")))
+       (article (make-symbol "gnus-setup-message-article"))
+       (group (make-symbol "gnus-setup-message-group")))
     `(let ((,winconf (current-window-configuration))
           (,buffer (buffer-name (current-buffer)))
           (,article (and gnus-article-reply (gnus-summary-article-number)))
+          (,group gnus-newsgroup-name)
           (message-header-setup-hook
            (copy-sequence message-header-setup-hook)))
        (add-hook 'message-header-setup-hook 'gnus-inews-insert-gcc)
@@ -178,9 +180,9 @@ Thank you for your help in stamping out bugs.
         (gnus-inews-add-send-actions ,winconf ,buffer ,article)
         (setq gnus-message-buffer (current-buffer))
         (set (make-local-variable 'gnus-message-group-art)
-             (cons ,gnus-newsgroup-name ,article))
+             (cons ,group ,article))
         (make-local-variable 'gnus-newsgroup-name)
-        (run-hooks 'gnus-message-setup-hook))
+        (gnus-run-hooks 'gnus-message-setup-hook))
        (gnus-configure-windows ,config t)
        (set-buffer-modified-p nil))))
 
@@ -194,9 +196,9 @@ Thank you for your help in stamping out bugs.
   (message-add-action
    `(set-window-configuration ,winconf) 'exit 'postpone 'kill)
   (message-add-action
-   `(when (buffer-name (get-buffer ,buffer))
+   `(when (gnus-buffer-exists-p ,buffer)
       (save-excursion
-       (set-buffer (get-buffer ,buffer))
+       (set-buffer ,buffer)
        ,(when article
           `(gnus-summary-mark-article-as-replied ,article))))
    'send))
@@ -217,8 +219,7 @@ Thank you for your help in stamping out bugs.
 If ARG, post to the group under point.
 If ARG is 1, prompt for a group name."
   (interactive "P")
-  ;; Bind this variable here to make message mode hooks
-  ;; work ok.
+  ;; Bind this variable here to make message mode hooks work ok.
   (let ((gnus-newsgroup-name
         (if arg
             (if (= 1 (prefix-numeric-value arg))
@@ -319,9 +320,9 @@ header line with the old Message-ID."
       (message-supersede)
       (push
        `((lambda ()
-          (when (buffer-name (get-buffer ,gnus-summary-buffer))
+          (when (gnus-buffer-exists-p ,gnus-summary-buffer)
             (save-excursion
-              (set-buffer (get-buffer ,gnus-summary-buffer))
+              (set-buffer ,gnus-summary-buffer)
               (gnus-cache-possibly-remove-article ,article nil nil nil t)
               (gnus-summary-mark-as-read ,article gnus-canceled-mark)))))
        message-send-actions))))
@@ -340,7 +341,7 @@ header line with the old Message-ID."
   (let ((article-buffer (or article-buffer gnus-article-buffer))
        end beg contents)
     (if (not (and (get-buffer article-buffer)
-                 (buffer-name (get-buffer article-buffer))))
+                 (gnus-buffer-exists-p article-buffer)))
        (error "Can't find any article buffer")
       (save-excursion
        (set-buffer article-buffer)
@@ -436,18 +437,23 @@ If SILENT, don't prompt the user."
      ;; If the group-method is nil (which shouldn't happen) we use
      ;; the default method.
      ((null group-method)
-      (or gnus-post-method gnus-select-method message-post-method))
-     ;; We want this group's method.
+      (or (and (null (eq gnus-post-method 'active)) gnus-post-method)
+              gnus-select-method message-post-method))
+     ;; We want the inverse of the default
      ((and arg (not (eq arg 0)))
-      group-method)
+      (if (eq gnus-post-method 'active)
+         gnus-select-method
+       group-method))
      ;; We query the user for a post method.
      ((or arg
          (and gnus-post-method
+              (not (eq gnus-post-method 'current))
               (listp (car gnus-post-method))))
       (let* ((methods
              ;; Collect all methods we know about.
              (append
-              (when gnus-post-method
+              (when (and gnus-post-method
+                         (not (eq gnus-post-method 'current)))
                 (if (listp (car gnus-post-method))
                     gnus-post-method
                   (list gnus-post-method)))
@@ -480,41 +486,13 @@ If SILENT, don't prompt the user."
                   (cons (or gnus-last-posting-server "") 0))))
          method-alist))))
      ;; Override normal method.
+     ((eq gnus-post-method 'current)
+      group-method) 
      (gnus-post-method
       gnus-post-method)
      ;; Use the normal select method.
      (t gnus-select-method))))
 
-;;;
-;;; Check whether the message has been sent already.
-;;;
-
-(defvar gnus-inews-sent-ids nil)
-
-(defun gnus-inews-reject-message ()
-  "Check whether this message has already been sent."
-  (when gnus-sent-message-ids-file
-    (let ((message-id (save-restriction (message-narrow-to-headers)
-                                       (mail-fetch-field "message-id")))
-         end)
-      (when message-id
-       (unless gnus-inews-sent-ids
-         (ignore-errors
-           (load t t t)))
-       (if (member message-id gnus-inews-sent-ids)
-           ;; Reject this message.
-           (not (gnus-yes-or-no-p
-                 (format "Message %s already sent.  Send anyway? "
-                         message-id)))
-         (push message-id gnus-inews-sent-ids)
-         ;; Chop off the last Message-IDs.
-         (when (setq end (nthcdr gnus-sent-message-ids-length
-                                 gnus-inews-sent-ids))
-           (setcdr end nil))
-         (nnheader-temp-write gnus-sent-message-ids-file
-           (gnus-prin1 `(setq gnus-inews-sent-ids ',gnus-inews-sent-ids)))
-         nil)))))
-
 \f
 
 ;; Dummy to avoid byte-compile warning.
@@ -529,32 +507,6 @@ If SILENT, don't prompt the user."
   (interactive)
   gnus-version)
 
-;; Written by "Mr. Per Persson" <pp@gnu.ai.mit.edu>.
-(defun gnus-inews-insert-mime-headers ()
-  (goto-char (point-min))
-  (let ((mail-header-separator
-        (progn
-          (goto-char (point-min))
-          (if (and (search-forward (concat "\n" mail-header-separator "\n")
-                                   nil t)
-                   (not (search-backward "\n\n" nil t)))
-              mail-header-separator
-            ""))))
-    (or (mail-position-on-field "Mime-Version")
-       (insert "1.0")
-       (cond ((save-restriction
-                (widen)
-                (goto-char (point-min))
-                (re-search-forward "[\200-\377]" nil t))
-              (or (mail-position-on-field "Content-Type")
-                  (insert "text/plain; charset=ISO-8859-1"))
-              (or (mail-position-on-field "Content-Transfer-Encoding")
-                  (insert "8bit")))
-             (t (or (mail-position-on-field "Content-Type")
-                    (insert "text/plain; charset=US-ASCII"))
-                (or (mail-position-on-field "Content-Transfer-Encoding")
-                    (insert "7bit")))))))
-
 \f
 ;;;
 ;;; Gnus Mail Functions
@@ -608,7 +560,11 @@ If FULL-HEADERS (the prefix), include full headers when forwarding."
   (interactive "P")
   (gnus-setup-message 'forward
     (gnus-summary-select-article)
-    (set-buffer gnus-original-article-buffer)
+    (let ((charset default-mime-charset))
+      (set-buffer gnus-original-article-buffer)
+      (make-local-variable 'default-mime-charset)
+      (setq default-mime-charset charset)
+      )
     (let ((message-included-forward-headers
           (if full-headers "" message-included-forward-headers)))
       (message-forward post))))
@@ -929,7 +885,7 @@ this is a reply."
              (save-excursion
                (nnheader-set-temp-buffer " *acc*")
                (insert-buffer-substring message-encoding-buffer)
-               (run-hooks 'gnus-before-do-gcc-hook)
+               (gnus-run-hooks 'gnus-before-do-gcc-hook)
                (goto-char (point-min))
                (when (re-search-forward
                       (concat "^" (regexp-quote mail-header-separator) "$")
@@ -1032,11 +988,6 @@ this is a reply."
                (insert " ")))
            (insert "\n")))))))
 
-(gnus-add-shutdown 'gnus-inews-close 'gnus)
-
-(defun gnus-inews-close ()
-  (setq gnus-inews-sent-ids nil))
-
 ;;; Allow redefinition of functions.
 
 (gnus-ems-redefine)