Synch to No Gnus 200501120840.
[elisp/gnus.git-] / lisp / nnimap.el
index 944c814..4a4a261 100644 (file)
@@ -212,6 +212,7 @@ variable is the symbol `default' the default behaviour is
 used (which currently is nil, unless you use a statistical
 spam.el test); if this variable is another non-nil value bodies
 will be downloaded."
+  :version "21.4"
   :group 'nnimap
   :type '(choice (const :tag "Let system decide" deault)
                 boolean))
@@ -220,9 +221,10 @@ will be downloaded."
 
 (defcustom nnimap-close-asynchronous t
   "Close mailboxes asynchronously in `nnimap-close-group'.
-This means that errors cought by nnimap when closing the mailbox will
+This means that errors caught by nnimap when closing the mailbox will
 not prevent Gnus from updating the group status, which may be harmful.
 However, it increases speed."
+  :version "21.4"
   :type 'boolean
   :group 'nnimap)
 
@@ -231,6 +233,7 @@ However, it increases speed."
 This increases the speed of closing mailboxes (quiting group) but may
 decrease the speed of selecting another mailbox later.  Re-selecting
 the same mailbox will be faster though."
+  :version "21.4"
   :type 'boolean
   :group 'nnimap)
 
@@ -243,6 +246,7 @@ more carefully for new mail.
 
 In summary, the default is O((1-p)*k+p*n) and changing it to nil makes
 it O(n).  If p is small, then the default is probably faster."
+  :version "21.4"
   :type 'boolean
   :group 'nnimap)
 
@@ -472,6 +476,14 @@ An example plist would be '(\"name\" \"Gnus\" \"version\" gnus-version-number
   "Return buffer for SERVER, if nil use current server."
   (cadr (assoc (or server nnimap-current-server) nnimap-server-buffer-alist)))
 
+(defun nnimap-remove-server-from-buffer-alist (server list)
+  "Remove SERVER from LIST."
+  (let (l)
+    (dolist (e list)
+      (unless (equal server (car-safe e))
+       (push e l)))
+    l))
+
 (defun nnimap-possibly-change-server (server)
   "Return buffer for SERVER, changing the current server as a side-effect.
 If SERVER is nil, uses the current server."
@@ -757,23 +769,31 @@ If EXAMINE is non-nil the group is selected read-only."
       (imap-close nnimap-server-buffer)
       (nnheader-report 'nnimap "Server %s is not IMAP4 compliant" server))
     (let* ((list (netrc-parse nnimap-authinfo-file))
-          (port (if nnimap-server-port
-                    (int-to-string nnimap-server-port)
-                  "imap"))
-          (alist (or (netrc-machine list server port "imap")
-                     (netrc-machine list
-                                    (or nnimap-server-address
-                                        nnimap-address)
-                                    port "imap")
-                     (netrc-machine list server port "imaps")
-                     (netrc-machine list
-                                    (or nnimap-server-address
-                                        nnimap-address)
-                                    port "imaps")))
-          (user (netrc-get alist "login"))
-          (passwd (netrc-get alist "password")))
+          (port (if nnimap-server-port
+                    (int-to-string nnimap-server-port)
+                  "imap"))
+          (user (netrc-machine-user-or-password 
+                 "login"
+                 list
+                 (list server
+                       (or nnimap-server-address
+                           nnimap-address))
+                 (list port)
+                 (list "imap" "imaps")))
+          (passwd (netrc-machine-user-or-password 
+                   "password"
+                   list
+                   (list server
+                         (or nnimap-server-address
+                             nnimap-address))
+                   (list port)
+                   (list "imap" "imaps"))))
       (if (imap-authenticate user passwd nnimap-server-buffer)
-         (prog1
+         (prog2
+             (setq nnimap-server-buffer-alist
+                   (nnimap-remove-server-from-buffer-alist 
+                    server
+                    nnimap-server-buffer-alist))
              (push (list server nnimap-server-buffer)
                    nnimap-server-buffer-alist)
            (imap-id nnimap-id nnimap-server-buffer)
@@ -830,7 +850,9 @@ Return nil if the server couldn't be closed for some reason."
       (setq nnimap-server-buffer nil
            nnimap-current-server nil
            nnimap-server-buffer-alist
-           (delq server nnimap-server-buffer-alist)))
+           (nnimap-remove-server-from-buffer-alist 
+            server
+            nnimap-server-buffer-alist)))
     (nnoo-close-server 'nnimap server)))
 
 (deffoo nnimap-request-close ()
@@ -851,9 +873,11 @@ function is generally only called when Gnus is shutting down."
   ;; BEWARE: we used to use string-as-multibyte here which is braindead
   ;; because it will turn accidental emacs-mule-valid byte sequences
   ;; into multibyte chars.  --Stef
-  (funcall (if (and (fboundp 'string-to-multibyte)
-                   (subrp (symbol-function 'string-to-multibyte)))
-              'string-to-multibyte
+  ;; Reverted, braindead got 7.5 out of 10 on imdb, so it can't be
+  ;; that bad. --Simon
+  (funcall (if (and (fboundp 'string-as-multibyte)
+                   (subrp (symbol-function 'string-as-multibyte)))
+              'string-as-multibyte
             'identity)
           (or string "")))