* nnmail.el (nnmail-cache-insert): make sure that the
[gnus] / lisp / gnus-int.el
index e52bb5e..1aba291 100644 (file)
@@ -1,5 +1,5 @@
 ;;; gnus-int.el --- backend interface functions for Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
 ;;        Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 (eval-when-compile (require 'cl))
 
 (require 'gnus)
+(require 'message)
+(require 'gnus-range)
+
+(autoload 'gnus-agent-expire "gnus-agent")
 
 (defcustom gnus-open-server-hook nil
   "Hook called just before opening connection to the news server."
   "The default status if the server is not able to open.
 If the server is covered by Gnus agent, the possible values are
 `denied', set the server denied; `offline', set the server offline;
-`nil', ask user.  If the server is not covered by Gnus agent, set the
+nil, ask user.  If the server is not covered by Gnus agent, set the
 server denied."
   :group 'gnus-start
   :type '(choice (const :tag "Ask" nil)
                 (const :tag "Deny server" denied)
-                (const :tag "Unplugg Agent" offline)))
+                (const :tag "Unplug Agent" offline)))
+
+(defvar gnus-internal-registry-spool-current-method nil
+  "The current method, for the registry.")
 
 ;;;
 ;;; Server Communication
@@ -194,12 +201,17 @@ If it is down, start it up (again)."
          nil)
       ;; Open the server.
       (let ((result
-            (condition-case ()
+            (condition-case err
                 (funcall (gnus-get-function gnus-command-method 'open-server)
                          (nth 1 gnus-command-method)
                          (nthcdr 2 gnus-command-method))
+               (error
+                (gnus-message 1 (format
+                                 "Unable to open server due to: %s"
+                                 (error-message-string err)))
+                nil)
               (quit
-               (message "Quit trying to open server")
+               (gnus-message 1 "Quit trying to open server")
                nil))))
        ;; If this hasn't been opened before, we add it to the list.
        (unless elem
@@ -219,12 +231,21 @@ If it is down, start it up (again)."
                               (format "Unable to open %s:%s, go offline? "
                                       (car gnus-command-method)
                                       (cadr gnus-command-method)))
-                             'offline
+                              'offline
                            'denied))
                    'denied)))
        ;; Return the result from the "open" call.
-       (or (eq (cadr elem) 'offline)
-           result)))))
+        (cond ((eq (cadr elem) 'offline)
+               ;; I'm avoiding infinite recursion by binding unopen
+               ;; status to denied (The logic of this routine
+               ;; guarantees that I can't get to this point with
+               ;; unopen status already bound to denied).
+               (unless (eq gnus-server-unopen-status 'denied)
+                 (let ((gnus-server-unopen-status 'denied))
+                   (gnus-open-server gnus-command-method)))
+               t)
+              (t
+               result))))))
 
 (defun gnus-close-server (gnus-command-method)
   "Close the connection to GNUS-COMMAND-METHOD."
@@ -266,8 +287,8 @@ If it is down, start it up (again)."
 
 (defun gnus-status-message (gnus-command-method)
   "Return the status message from GNUS-COMMAND-METHOD.
-If GNUS-COMMAND-METHOD is a string, it is interpreted as a group name.  The method
-this group uses will be queried."
+If GNUS-COMMAND-METHOD is a string, it is interpreted as a group
+name.  The method this group uses will be queried."
   (let ((gnus-command-method
         (if (stringp gnus-command-method)
             (gnus-find-method-for-group gnus-command-method)
@@ -330,7 +351,7 @@ If FETCH-OLD, retrieve all headers (or some subset thereof) in the group."
     (cond
      ((and gnus-use-cache (numberp (car articles)))
       (gnus-cache-retrieve-headers articles group fetch-old))
-     ((and gnus-agent gnus-agent-cache (gnus-online gnus-command-method)
+     ((and gnus-agent (gnus-online gnus-command-method)
           (gnus-agent-method-p gnus-command-method))
       (gnus-agent-retrieve-headers articles group fetch-old))
      (t
@@ -362,7 +383,7 @@ If FETCH-OLD, retrieve all headers (or some subset thereof) in the group."
               (gnus-group-real-name group) article))))
 
 (defun gnus-request-set-mark (group action)
-  "Set marks on articles in the backend."
+  "Set marks on articles in the back end."
   (let ((gnus-command-method (gnus-find-method-for-group group)))
     (if (not (gnus-check-backend-function
              'request-set-mark (car gnus-command-method)))
@@ -372,7 +393,7 @@ If FETCH-OLD, retrieve all headers (or some subset thereof) in the group."
               (nth 1 gnus-command-method)))))
 
 (defun gnus-request-update-mark (group article mark)
-  "Allow the backend to change the mark the user tries to put on an article."
+  "Allow the back end to change the mark the user tries to put on an article."
   (let ((gnus-command-method (gnus-find-method-for-group group)))
     (if (not (gnus-check-backend-function
              'request-update-mark (car gnus-command-method)))
@@ -402,9 +423,7 @@ If BUFFER, insert the article in that group."
       (setq res (cons group article)
            clean-up t))
      ;; Check the agent cache.
-     ((and gnus-agent gnus-agent-cache gnus-plugged
-          (numberp article)
-          (gnus-agent-request-article article group))
+     ((gnus-agent-request-article article group)
       (setq res (cons group article)
            clean-up t))
      ;; Use `head' function.
@@ -437,9 +456,7 @@ If BUFFER, insert the article in that group."
       (setq res (cons group article)
            clean-up t))
      ;; Check the agent cache.
-     ((and gnus-agent gnus-agent-cache gnus-plugged
-          (numberp article)
-          (gnus-agent-request-article article group))
+     ((gnus-agent-request-article article group)
       (setq res (cons group article)
            clean-up t))
      ;; Use `head' function.
@@ -473,9 +490,11 @@ If GROUP is nil, all groups on GNUS-COMMAND-METHOD are scanned."
        (gnus-inhibit-demon t)
        (mail-source-plugged gnus-plugged))
     (if (or gnus-plugged (not (gnus-agent-method-p gnus-command-method)))
-       (funcall (gnus-get-function gnus-command-method 'request-scan)
-                (and group (gnus-group-real-name group))
-                (nth 1 gnus-command-method)))))
+       (progn
+         (setq gnus-internal-registry-spool-current-method gnus-command-method)
+         (funcall (gnus-get-function gnus-command-method 'request-scan)
+                  (and group (gnus-group-real-name group))
+                  (nth 1 gnus-command-method))))))
 
 (defsubst gnus-request-update-info (info gnus-command-method)
   "Request that GNUS-COMMAND-METHOD update INFO."
@@ -502,23 +521,27 @@ If GROUP is nil, all groups on GNUS-COMMAND-METHOD are scanned."
 
 (defun gnus-request-expire-articles (articles group &optional force)
   (let* ((gnus-command-method (gnus-find-method-for-group group))
-        (not-deleted 
-         (funcall 
+        (not-deleted
+         (funcall
           (gnus-get-function gnus-command-method 'request-expire-articles)
           articles (gnus-group-real-name group) (nth 1 gnus-command-method)
           force)))
-    (when (and gnus-agent gnus-agent-cache (gnus-agent-method-p gnus-command-method))
+    (when (and gnus-agent
+              (gnus-agent-method-p gnus-command-method))
       (let ((expired-articles (gnus-sorted-difference articles not-deleted)))
         (when expired-articles
           (gnus-agent-expire expired-articles group 'force))))
     not-deleted))
 
-(defun gnus-request-move-article (article group server accept-function &optional last)
+(defun gnus-request-move-article (article group server accept-function
+                                         &optional last)
   (let* ((gnus-command-method (gnus-find-method-for-group group))
-        (result (funcall (gnus-get-function gnus-command-method 'request-move-article)
+        (result (funcall (gnus-get-function gnus-command-method
+                                            'request-move-article)
                          article (gnus-group-real-name group)
                          (nth 1 gnus-command-method) accept-function last)))
-    (when (and result gnus-agent gnus-agent-cache (gnus-agent-method-p gnus-command-method))
+    (when (and result gnus-agent
+              (gnus-agent-method-p gnus-command-method))
       (gnus-agent-expire (list article) group 'force))
     result))