]> git.eshelyaron.com Git - emacs.git/commitdiff
Synch with Gnus trunk
authorKatsumi Yamaoka <yamaoka@jpl.org>
Tue, 23 Mar 2010 07:37:09 +0000 (07:37 +0000)
committerKatsumi Yamaoka <yamaoka@jpl.org>
Tue, 23 Mar 2010 07:37:09 +0000 (07:37 +0000)
=====================
2010-03-23  Katsumi Yamaoka  <yamaoka@jpl.org>

 * gnus-art.el (canlock-verify): Autoload it for Emacs 21.

 * message.el (ecomplete-setup): Autoload it for Emacs <23.

 * mml-sec.el (mml-secure-cache-passphrase): Default to t that is
 password-cache's default if it is not bound.
 (mml-secure-passphrase-cache-expiry): Default to 16 that is
 password-cache-expiry's default if it is not bound.

 * pop3.el (pop3-list): Don't use 3rd arg of `split-string' which is not
 available in Emacs 21.

2010-03-23  Teodor Zlatanov  <tzz@lifelogs.com>

 * auth-source.el (auth-sources): Fix up definition so extra parameters
 are always inline.

2010-03-22  Martin Stjernholm  <mast@lysator.liu.se>

 * nnimap.el (nnimap-verify-uidvalidity): Fixed bug where uidvalidity
 wasn't updated after mismatch.  Clear cached mailbox info correctly
 when uidvalidity changes.
 (nnimap-group-prefixed-name): New function to avoid some code
 duplication.
 (nnimap-verify-uidvalidity, nnimap-group-overview-filename)
 (nnimap-request-group): Use it.
 (nnimap-retrieve-groups, nnimap-verify-uidvalidity)
 (nnimap-update-unseen): Significantly improved speed of Gnus startup
 with many imap folders.  This is done by caching the group status from
 the imap server persistently in a group parameter `imap-status'. (This
 was cached before too if `nnimap-retrieve-groups-asynchronous' was set,
 but not persistently, so every Gnus startup was still very slow.)

2010-03-20  Teodor Zlatanov  <tzz@lifelogs.com>

 * auth-source.el: Set up autoloads.  Bump to 23.2 because of the
 secrets.el dependency.
 (auth-sources): Add optional user name.  Add secrets.el configuration
 choice (unused right now).

2010-03-20  Teodor Zlatanov  <tzz@lifelogs.com>

 * gnus-sum.el (gnus-summary-make-menu-bar): Let
 `gnus-registry-install-shortcuts' fill in the functions.

 * gnus-registry.el (gnus-summary-misc-menu): Declare to avoid
 warnings.
 (gnus-registry-misc-menus): Variable to hold registry mark menus.
 (gnus-registry-install-shortcuts): Populate and use it in a
 `gnus-summary-menu-hook' lambda, under "Gnus"->"Registry Marks".

2010-03-20  Martin Stjernholm  <mast@lysator.liu.se>

 * nnimap.el (nnimap-decode-group-name, nnimap-encode-group-name):
 In-place substitutions for the group name encoding/decoding.
 (nnimap-find-minmax-uid, nnimap-possibly-change-group)
 (nnimap-retrieve-headers-progress, nnimap-possibly-change-group)
 (nnimap-retrieve-headers-progress, nnimap-request-article-part)
 (nnimap-update-unseen, nnimap-request-list)
 (nnimap-retrieve-groups, nnimap-request-update-info-internal)
 (nnimap-request-set-mark, nnimap-split-to-groups)
 (nnimap-split-articles, nnimap-request-newgroups)
 (nnimap-request-create-group, nnimap-request-accept-article)
 (nnimap-request-delete-group, nnimap-request-rename-group)
 (nnimap-acl-get, nnimap-acl-edit): Use them.  Replace `mbx' with
 `encoded-mbx' for consistency.
 (nnimap-close-group): Call `imap-current-mailbox' instead of using the
 variable `imap-current-mailbox'.

 * gnus-agent.el (gnus-agent-fetch-articles, gnus-agent-fetch-headers)
 (gnus-agent-regenerate-group): Use `gnus-agent-decoded-group-name'.

2010-03-20  Bojan Petrovic  <bpetrovi@f.bg.ac.rs>

 * pop3.el (pop3-display-message-size-flag): Display message size byte
 counts during POP3 download.
 (pop3-movemail): Use it.
 (pop3-list): Implement listing of available messages.

2010-03-20  Mark Triggs  <mst@dishevelled.net>  (tiny change)

 * nnir.el (nnir-get-article-nov-override-function): New function to
 override the normal NOV retrieval.
 (nnir-retrieve-headers): Use it.

lisp/gnus/ChangeLog
lisp/gnus/auth-source.el
lisp/gnus/gnus-agent.el
lisp/gnus/gnus-art.el
lisp/gnus/gnus-registry.el
lisp/gnus/gnus-sum.el
lisp/gnus/message.el
lisp/gnus/mml-sec.el
lisp/gnus/nnimap.el
lisp/gnus/nnir.el
lisp/gnus/pop3.el

index 58d1c0dc8da6a0cfcf1e6a071147b389a4b32545..59b3ae87d80491ed5bb76b27a8f6f022b2f6af47 100644 (file)
@@ -1,3 +1,90 @@
+2010-03-23  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-art.el (canlock-verify): Autoload it for Emacs 21.
+
+       * message.el (ecomplete-setup): Autoload it for Emacs <23.
+
+       * mml-sec.el (mml-secure-cache-passphrase): Default to t that is
+       password-cache's default if it is not bound.
+       (mml-secure-passphrase-cache-expiry): Default to 16 that is
+       password-cache-expiry's default if it is not bound.
+
+       * pop3.el (pop3-list): Don't use 3rd arg of `split-string' which is not
+       available in Emacs 21.
+
+2010-03-23  Teodor Zlatanov  <tzz@lifelogs.com>
+
+       * auth-source.el (auth-sources): Fix up definition so extra parameters
+       are always inline.
+
+2010-03-22  Martin Stjernholm  <mast@lysator.liu.se>
+
+       * nnimap.el (nnimap-verify-uidvalidity): Fixed bug where uidvalidity
+       wasn't updated after mismatch.  Clear cached mailbox info correctly
+       when uidvalidity changes.
+       (nnimap-group-prefixed-name): New function to avoid some code
+       duplication.
+       (nnimap-verify-uidvalidity, nnimap-group-overview-filename)
+       (nnimap-request-group): Use it.
+       (nnimap-retrieve-groups, nnimap-verify-uidvalidity)
+       (nnimap-update-unseen): Significantly improved speed of Gnus startup
+       with many imap folders.  This is done by caching the group status from
+       the imap server persistently in a group parameter `imap-status'. (This
+       was cached before too if `nnimap-retrieve-groups-asynchronous' was set,
+       but not persistently, so every Gnus startup was still very slow.)
+
+2010-03-20  Teodor Zlatanov  <tzz@lifelogs.com>
+
+       * auth-source.el: Set up autoloads.  Bump to 23.2 because of the
+       secrets.el dependency.
+       (auth-sources): Add optional user name.  Add secrets.el configuration
+       choice (unused right now).
+
+2010-03-20  Teodor Zlatanov  <tzz@lifelogs.com>
+
+       * gnus-sum.el (gnus-summary-make-menu-bar): Let
+       `gnus-registry-install-shortcuts' fill in the functions.
+
+       * gnus-registry.el (gnus-summary-misc-menu): Declare to avoid
+       warnings.
+       (gnus-registry-misc-menus): Variable to hold registry mark menus.
+       (gnus-registry-install-shortcuts): Populate and use it in a
+       `gnus-summary-menu-hook' lambda, under "Gnus"->"Registry Marks".
+
+2010-03-20  Martin Stjernholm  <mast@lysator.liu.se>
+
+       * nnimap.el (nnimap-decode-group-name, nnimap-encode-group-name):
+       In-place substitutions for the group name encoding/decoding.
+       (nnimap-find-minmax-uid, nnimap-possibly-change-group)
+       (nnimap-retrieve-headers-progress, nnimap-possibly-change-group)
+       (nnimap-retrieve-headers-progress, nnimap-request-article-part)
+       (nnimap-update-unseen, nnimap-request-list)
+       (nnimap-retrieve-groups, nnimap-request-update-info-internal)
+       (nnimap-request-set-mark, nnimap-split-to-groups)
+       (nnimap-split-articles, nnimap-request-newgroups)
+       (nnimap-request-create-group, nnimap-request-accept-article)
+       (nnimap-request-delete-group, nnimap-request-rename-group)
+       (nnimap-acl-get, nnimap-acl-edit): Use them.  Replace `mbx' with
+       `encoded-mbx' for consistency.
+       (nnimap-close-group): Call `imap-current-mailbox' instead of using the
+       variable `imap-current-mailbox'.
+
+       * gnus-agent.el (gnus-agent-fetch-articles, gnus-agent-fetch-headers)
+       (gnus-agent-regenerate-group): Use `gnus-agent-decoded-group-name'.
+
+2010-03-20  Bojan Petrovic  <bpetrovi@f.bg.ac.rs>
+
+       * pop3.el (pop3-display-message-size-flag): Display message size byte
+       counts during POP3 download.
+       (pop3-movemail): Use it.
+       (pop3-list): Implement listing of available messages.
+
+2010-03-20  Mark Triggs  <mst@dishevelled.net>  (tiny change)
+
+       * nnir.el (nnir-get-article-nov-override-function): New function to
+       override the normal NOV retrieval.
+       (nnir-retrieve-headers): Use it.
+
 2010-03-19  Michael Albinus  <michael.albinus@gmx.de>
 
        * auth-source.el (netrc-machine-user-or-password): Autoload.
index 82c9ea8a44dfe1ebd995f09991158ccf59bd4864..3b0d700a86f3a46d36cf2441bd76d9b3fb85b442 100644 (file)
@@ -35,6 +35,9 @@
 
 (eval-when-compile (require 'cl))
 (autoload 'netrc-machine-user-or-password "netrc")
+(autoload 'secrets-search-items "secrets")
+(autoload 'secrets-get-alias "secrets")
+(autoload 'secrets-get-attribute "secrets")
 
 (defgroup auth-source nil
   "Authentication sources."
@@ -49,7 +52,7 @@
   "List of authentication protocols and their names"
 
   :group 'auth-source
-  :version "23.1" ;; No Gnus
+  :version "23.2" ;; No Gnus
   :type '(repeat :tag "Authentication Protocols"
                 (cons :tag "Protocol Entry"
                       (symbol :tag "Protocol")
@@ -71,7 +74,7 @@
 (defcustom auth-source-do-cache t
   "Whether auth-source should cache information."
   :group 'auth-source
-  :version "23.1" ;; No Gnus
+  :version "23.2" ;; No Gnus
   :type `boolean)
 
 (defcustom auth-source-debug nil
@@ -85,7 +88,7 @@ If the value is t, debug messages are logged with `message'.
 If the value is a function, debug messages are logged by calling
  that function using the same arguments as `message'."
   :group 'auth-source
-  :version "23.1" ;; No Gnus
+  :version "23.2" ;; No Gnus
   :type        `(choice
          :tag "auth-source debugging mode"
          (const :tag "Log using `message' to the *Messages* buffer" t)
@@ -96,19 +99,32 @@ If the value is a function, debug messages are logged by calling
   "Whether auth-source should hide passwords in log messages.
 Only relevant if `auth-source-debug' is not nil."
   :group 'auth-source
-  :version "23.1" ;; No Gnus
+  :version "23.2" ;; No Gnus
   :type `boolean)
 
 (defcustom auth-sources '((:source "~/.authinfo.gpg" :host t :protocol t))
   "List of authentication sources.
 
-Each entry is the authentication type with optional properties."
+Each entry is the authentication type with optional properties.
+
+It's best to customize this with `M-x customize-variable' because the choices
+can get pretty complex."
   :group 'auth-source
-  :version "23.1" ;; No Gnus
+  :version "23.2" ;; No Gnus
   :type `(repeat :tag "Authentication Sources"
                 (list :tag "Source definition"
                       (const :format "" :value :source)
-                      (string :tag "Authentication Source")
+                      (choice :tag "Authentication backend choice"
+                              (string :tag "Authentication Source (file)")
+                              (list :tag "secrets.el (Secret Service API/KWallet/GNOME KeyRing)" 
+                                     (const :format "" :value :secrets)
+                                     (choice :tag "Collection to use"
+                                             (string :tag "Collection name")
+                                             (const :tag "Default" 'default)
+                                             (const :tag "Any" t)
+                                             (const :tag "Temporary" "session")
+                                             (string :tag "Specific session name")
+                                             (const :tag "Fallback" nil))))
                       (const :format "" :value :host)
                       (choice :tag "Host (machine) choice"
                               (const :tag "Any" t)
@@ -118,7 +134,15 @@ Each entry is the authentication type with optional properties."
                       (choice :tag "Protocol"
                               (const :tag "Any" t)
                               (const :tag "Fallback" nil)
-                              ,@auth-source-protocols-customize))))
+                              ,@auth-source-protocols-customize)
+                      (repeat :tag "Extra Parameters" :inline t
+                              (choice :tag "Extra parameter"
+                                      (list :tag "Preferred username" :inline t
+                                            (const :format "" :value :preferred-username)
+                                            (choice :tag "Personality or username"
+                                                    (const :tag "Any" t)
+                                                    (const :tag "Fallback" nil)
+                                                    (string :tag "Specific user name"))))))))
 
 ;; temp for debugging
 ;; (unintern 'auth-source-protocols)
index f385c71069bcf03bbd101e58488c39379ca7e34d..17f1d0cdb1fd34828551f285acdcca273ffb77a7 100644 (file)
@@ -1583,7 +1583,8 @@ downloaded into the agent."
           (setq selected-sets (nreverse selected-sets))
 
           (gnus-make-directory dir)
-          (gnus-message 7 "Fetching articles for %s..." group)
+         (gnus-message 7 "Fetching articles for %s..."
+                       (gnus-agent-decoded-group-name group))
 
           (unwind-protect
               (while (setq articles (pop selected-sets))
@@ -1594,7 +1595,8 @@ downloaded into the agent."
                     (let (article)
                       (while (setq article (pop articles))
                         (gnus-message 10 "Fetching article %s for %s..."
-                                      article group)
+                                     article
+                                     (gnus-agent-decoded-group-name group))
                         (when (or
                                (gnus-backlog-request-article group article
                                                              nntp-server-buffer)
@@ -1942,7 +1944,8 @@ article numbers will be returned."
 
         (if articles
             (progn
-              (gnus-message 7 "Fetching headers for %s..." group)
+             (gnus-message 7 "Fetching headers for %s..."
+                           (gnus-agent-decoded-group-name group))
 
               ;; Fetch them.
               (gnus-make-directory (nnheader-translate-file-chars
@@ -3904,7 +3907,7 @@ If REREAD is not nil, downloaded articles are marked as unread."
                     (sit-for 1)
                     t)))))
   (when group
-    (gnus-message 5 "Regenerating in %s" group)
+    (gnus-message 5 "Regenerating in %s" (gnus-agent-decoded-group-name group))
     (let* ((gnus-command-method (or gnus-command-method
                                    (gnus-find-method-for-group group)))
           (file (gnus-agent-article-name ".overview" group))
@@ -3981,7 +3984,8 @@ If REREAD is not nil, downloaded articles are marked as unread."
                      (or (not nov-arts)
                          (> (car downloaded) (car nov-arts))))
                 ;; This entry is missing from the overview file
-                (gnus-message 3 "Regenerating NOV %s %d..." group
+                (gnus-message 3 "Regenerating NOV %s %d..."
+                              (gnus-agent-decoded-group-name group)
                               (car downloaded))
                 (let ((file (concat dir (number-to-string (car downloaded)))))
                   (mm-with-unibyte-buffer
index 1a66404f841037e0d09c00b29c2795a8b14a5596..b3b156f69dc36a308edf4a410f7211260d18a55b 100644 (file)
@@ -4192,6 +4192,8 @@ If variable `gnus-use-long-file-name' is non-nil, it is
                  (put-text-property (match-end 0) (point-max)
                                     'face eface)))))))))
 
+(autoload 'canlock-verify "canlock" nil t) ;; for Emacs 21.
+
 (defun article-verify-cancel-lock ()
   "Verify Cancel-Lock header."
   (interactive)
index e77b66e150d54a51879df4591359e4e262145af6..db10440116bf80660f0456bc26e2a86e580f8955 100644 (file)
@@ -60,6 +60,7 @@
 (require 'gnus-sum)
 (require 'gnus-util)
 (require 'nnmail)
+(require 'easymenu)
 
 (defvar gnus-adaptive-word-syntax-table)
 
@@ -137,6 +138,10 @@ references.'"
                 (const :tag "Always Install" t)
                 (const :tag "Ask Me" ask)))
 
+(defvar gnus-summary-misc-menu) ;; Avoid byte compiler warning.
+
+(defvar gnus-registry-misc-menus nil)  ; ugly way to keep the menus
+
 (defcustom gnus-registry-clean-empty t
   "Whether the empty registry entries should be deleted.
 Registry entries are considered empty when they have no groups
@@ -764,7 +769,8 @@ FUNCTION should take two parameters, a mark symbol and the cell value."
   "Install the keyboard shortcuts and menus for the registry.
 Uses `gnus-registry-marks' to find what shortcuts to install."
   (let (keys-plist)
-    (gnus-registry-do-marks 
+    (setq gnus-registry-misc-menus nil)
+    (gnus-registry-do-marks
      :char
      (lambda (mark data)
        (let ((function-format
@@ -813,19 +819,34 @@ Uses `gnus-registry-marks' to find what shortcuts to install."
                    ;; all this just to get the mark, I must be doing it wrong
                    (intern ,(symbol-name mark))
                    articles ,remove t)
+                  (gnus-message
+                   9 
+                   "Applying mark %s to %d articles"
+                   ,(symbol-name mark) (length articles))
                   (dolist (article articles)
                     (gnus-summary-update-article 
-                     article 
+                     article
                      (assoc article (gnus-data-list nil)))))))
             (push (intern function-name) keys-plist)
-            (push shortcut keys-plist)
-            (gnus-message 
+            (push shortcut keys-plist)      
+            (push (vector (format "%s %s"
+                                  (upcase-initials variant-name)
+                                  (symbol-name mark))
+                          (intern function-name) t)
+                  gnus-registry-misc-menus)
+            (gnus-message
              9 
              "Defined mark handling function %s" 
              function-name))))))
     (gnus-define-keys-1
-     '(gnus-registry-mark-map "M" gnus-summary-mark-map) 
-     keys-plist)))
+     '(gnus-registry-mark-map "M" gnus-summary-mark-map)
+     keys-plist)
+    (add-hook 'gnus-summary-menu-hook
+             (lambda ()
+               (easy-menu-add-item 
+                gnus-summary-misc-menu
+                nil 
+                (cons "Registry Marks" gnus-registry-misc-menus))))))
 
 ;;; use like this:
 ;;; (defalias 'gnus-user-format-function-M 
index 2464b132839d5cf4394a951c9a1954c19b04beb4..608224e436d61d75d4bb45d001e89ff738e7fd9b 100644 (file)
@@ -2635,17 +2635,6 @@ gnus-summary-show-article-from-menu-as-charset-%s" cs))))
         ["Set expirable mark" gnus-summary-mark-as-expirable t]
         ["Set bookmark" gnus-summary-set-bookmark t]
         ["Remove bookmark" gnus-summary-remove-bookmark t])
-       ("Registry Mark"
-        ["Important"     gnus-registry-set-article-Important-mark    t]
-        ["Not Important" gnus-registry-remove-article-Important-mark t]
-        ["Work"          gnus-registry-set-article-Work-mark         t]
-        ["Not Work"      gnus-registry-remove-article-Work-mark      t]
-        ["Later"         gnus-registry-set-article-Later-mark        t]
-        ["Not Later"     gnus-registry-remove-article-Later-mark     t]
-        ["Personal"      gnus-registry-set-article-Personal-mark     t]
-        ["Not Personal"  gnus-registry-remove-article-Personal-mark  t]
-        ["To Do"         gnus-registry-set-article-To-Do-mark        t]
-        ["Not To Do"     gnus-registry-remove-article-To-Do-mark     t])
        ("Limit to"
         ["Marks..." gnus-summary-limit-to-marks t]
         ["Subject..." gnus-summary-limit-to-subject t]
@@ -2691,6 +2680,7 @@ gnus-summary-show-article-from-menu-as-charset-%s" cs))))
           gnus-newsgroup-process-stack]
          ["Save" gnus-summary-save-process-mark t]
          ["Run command on marked..." gnus-summary-universal-argument t]))
+       ("Registry Marks")
        ("Scroll article"
         ["Page forward" gnus-summary-next-page
          ,@(if (featurep 'xemacs) '(t)
index abdc163bb16ebbfeadee6ed2d4f607b8e700ed61..03a4a40a66f0bcb1e26fbad796518418a8d24eca 100644 (file)
@@ -2850,6 +2850,8 @@ See also `message-forbidden-properties'."
          (inhibit-read-only t))
       (remove-text-properties begin end message-forbidden-properties))))
 
+(autoload 'ecomplete-setup "ecomplete") ;; for Emacs <23.
+
 ;;;###autoload
 (define-derived-mode message-mode text-mode "Message"
   "Major mode for editing mail and news to be sent.
index e394593ec122b89a937824fd34e03f3406cad4eb..35155b89ac2e00638d588446d02a191e982dfb2e 100644 (file)
@@ -105,12 +105,18 @@ details."
   :group 'message
   :type 'boolean)
 
-(defcustom mml-secure-cache-passphrase password-cache
+(defcustom mml-secure-cache-passphrase
+  (if (boundp 'password-cache)
+      password-cache
+    t)
   "If t, cache passphrase."
   :group 'message
   :type 'boolean)
 
-(defcustom mml-secure-passphrase-cache-expiry password-cache-expiry
+(defcustom mml-secure-passphrase-cache-expiry
+  (if (boundp 'password-cache-expiry)
+      password-cache-expiry
+    16)
   "How many seconds the passphrase is cached.
 Whether the passphrase is cached at all is controlled by
 `mml-secure-cache-passphrase'."
index b939f50e0fcd42764230caefc79ec22cdf6f44d4..c76169cb2b7e23b72af4b18f3be82017cf33ee9a 100644 (file)
@@ -501,6 +501,20 @@ See also `nnimap-log'."
 
 ;; Utility functions:
 
+(defsubst nnimap-decode-group-name (group)
+  (and group
+       (gnus-group-decoded-name group)))
+
+(defsubst nnimap-encode-group-name (group)
+  (and group
+       (mm-encode-coding-string group (gnus-group-name-charset nil group))))
+
+(defun nnimap-group-prefixed-name (group &optional server)
+  (gnus-group-prefixed-name group
+                           (gnus-server-to-method
+                            (format "nnimap:%s"
+                                    (or server nnimap-current-server)))))
+
 (defsubst nnimap-get-server-buffer (server)
   "Return buffer for SERVER, if nil use current server."
   (cadr (assoc (or server nnimap-current-server) nnimap-server-buffer-alist)))
@@ -521,9 +535,7 @@ If SERVER is nil, uses the current server."
 
 (defun nnimap-verify-uidvalidity (group server)
   "Verify stored uidvalidity match current one in GROUP on SERVER."
-  (let* ((gnusgroup (gnus-group-prefixed-name
-                    group (gnus-server-to-method
-                           (format "nnimap:%s" server))))
+  (let* ((gnusgroup (nnimap-group-prefixed-name group server))
         (new-uidvalidity (imap-mailbox-get 'uidvalidity))
         (old-uidvalidity (gnus-group-get-parameter gnusgroup 'uidvalidity))
         (dir (file-name-as-directory (expand-file-name nnimap-directory)))
@@ -544,10 +556,18 @@ If SERVER is nil, uses the current server."
     (if old-uidvalidity
        (if (not (equal old-uidvalidity new-uidvalidity))
            ;; uidvalidity clash
-           (gnus-delete-file file)
-         (gnus-group-set-parameter gnusgroup 'uidvalidity new-uidvalidity)
+           (progn
+             (gnus-group-set-parameter gnusgroup 'uidvalidity new-uidvalidity)
+             (gnus-group-remove-parameter gnusgroup 'imap-status)
+             (gnus-sethash (gnus-group-prefixed-name group server)
+                           nil nnimap-mailbox-info)
+             (gnus-delete-file file))
          t)
       (gnus-group-add-parameter gnusgroup (cons 'uidvalidity new-uidvalidity))
+      (gnus-group-remove-parameter gnusgroup 'imap-status)
+      (gnus-sethash                    ; Maybe not necessary here.
+       (gnus-group-prefixed-name group server)
+       nil nnimap-mailbox-info)
       t)))
 
 (defun nnimap-before-find-minmax-bugworkaround ()
@@ -563,36 +583,39 @@ If SERVER is nil, uses the current server."
   "Find lowest and highest active article number in GROUP.
 If EXAMINE is non-nil the group is selected read-only."
   (with-current-buffer nnimap-server-buffer
-    (when (or (string= group (imap-current-mailbox))
-             (imap-mailbox-select group examine))
-      (let (minuid maxuid)
-       (when (> (imap-mailbox-get 'exists) 0)
-         (imap-fetch-safe '("1,*" . "1,*:*") "UID" nil 'nouidfetch)
-         (imap-message-map (lambda (uid Uid)
-                             (setq minuid (if minuid (min minuid uid) uid)
-                                   maxuid (if maxuid (max maxuid uid) uid)))
-                           'UID))
-       (list (imap-mailbox-get 'exists) minuid maxuid)))))
+    (let ((decoded-group (nnimap-decode-group-name group)))
+      (when (or (string= decoded-group (imap-current-mailbox))
+               (imap-mailbox-select decoded-group examine))
+       (let (minuid maxuid)
+         (when (> (imap-mailbox-get 'exists) 0)
+           (imap-fetch-safe '("1,*" . "1,*:*") "UID" nil 'nouidfetch)
+           (imap-message-map (lambda (uid Uid)
+                               (setq minuid (if minuid (min minuid uid) uid)
+                                     maxuid (if maxuid (max maxuid uid) uid)))
+                             'UID))
+         (list (imap-mailbox-get 'exists) minuid maxuid))))))
 
 (defun nnimap-possibly-change-group (group &optional server)
   "Make GROUP the current group, and SERVER the current server."
   (when (nnimap-possibly-change-server server)
-    (with-current-buffer nnimap-server-buffer
-      (if (or (null group) (imap-current-mailbox-p group))
-         imap-current-mailbox
-       (if (imap-mailbox-select group)
-           (if (or (nnimap-verify-uidvalidity
-                    group (or server nnimap-current-server))
-                   (zerop (imap-mailbox-get 'exists group))
-                   t ;; for OGnus to see if ignoring uidvalidity
-                   ;; changes has any bad effects.
-                   (yes-or-no-p
-                    (format
-                     "nnimap: Group %s is not uidvalid.  Continue? " group)))
-               imap-current-mailbox
-             (imap-mailbox-unselect)
-             (error "nnimap: Group %s is not uid-valid" group))
-         (nnheader-report 'nnimap (imap-error-text)))))))
+    (let ((decoded-group (nnimap-decode-group-name group)))
+      (with-current-buffer nnimap-server-buffer
+       (if (or (null group) (imap-current-mailbox-p decoded-group))
+           imap-current-mailbox        ; Note: utf-7 encoded.
+         (if (imap-mailbox-select decoded-group)
+             (if (or (nnimap-verify-uidvalidity
+                      group (or server nnimap-current-server))
+                     (zerop (imap-mailbox-get 'exists decoded-group))
+                     t ;; for OGnus to see if ignoring uidvalidity
+                     ;; changes has any bad effects.
+                     (yes-or-no-p
+                      (format
+                       "nnimap: Group %s is not uidvalid.  Continue? "
+                       decoded-group)))
+                 imap-current-mailbox  ; Note: utf-7 encoded.
+               (imap-mailbox-unselect)
+               (error "nnimap: Group %s is not uid-valid" decoded-group))
+           (nnheader-report 'nnimap (imap-error-text))))))))
 
 (defun nnimap-replace-whitespace (string)
   "Return STRING with all whitespace replaced with space."
@@ -618,7 +641,7 @@ If EXAMINE is non-nil the group is selected read-only."
     (let (headers lines chars uid mbx)
       (with-current-buffer nnimap-server-buffer
        (setq uid imap-current-message
-             mbx imap-current-mailbox
+             mbx (nnimap-encode-group-name (imap-current-mailbox))
              headers (if (imap-capability 'IMAP4rev1)
                           ;; xxx don't just use car? alist doesn't contain
                           ;; anything else now, but it might...
@@ -665,9 +688,7 @@ If EXAMINE is non-nil the group is selected read-only."
   "Make file name for GROUP on SERVER."
   (let* ((dir (file-name-as-directory (expand-file-name nnimap-directory)))
         (uidvalidity (gnus-group-get-parameter
-                      (gnus-group-prefixed-name
-                       group (gnus-server-to-method
-                              (format "nnimap:%s" server)))
+                      (nnimap-group-prefixed-name group server)
                       'uidvalidity))
         (name (nnheader-translate-file-chars
                (concat nnimap-nov-file-name
@@ -964,8 +985,10 @@ function is generally only called when Gnus is shutting down."
                     article)))
       (when article
        (gnus-message 10 "nnimap: Fetching (part of) article %d from %s..."
-                     article (or group imap-current-mailbox
-                                 gnus-newsgroup-name))
+                     article (or (nnimap-decode-group-name group)
+                                 (imap-current-mailbox)
+                                 (nnimap-decode-group-name
+                                  gnus-newsgroup-name)))
        (if (not nnheader-callback-function)
            (with-current-buffer (or to-buffer nntp-server-buffer)
              (erase-buffer)
@@ -979,11 +1002,15 @@ function is generally only called when Gnus is shutting down."
              (nnheader-ms-strip-cr)
              (gnus-message
               10 "nnimap: Fetching (part of) article %d from %s...done"
-              article (or group imap-current-mailbox gnus-newsgroup-name))
+              article (or (nnimap-decode-group-name group)
+                          (imap-current-mailbox)
+                          (nnimap-decode-group-name gnus-newsgroup-name)))
              (if (bobp)
                  (nnheader-report 'nnimap "No such article %d in %s: %s"
-                                  article (or group imap-current-mailbox
-                                              gnus-newsgroup-name)
+                                  article (or (nnimap-decode-group-name group)
+                                              (imap-current-mailbox)
+                                              (nnimap-decode-group-name
+                                               gnus-newsgroup-name))
                                   (imap-error-text nnimap-server-buffer))
                (cons group article)))
          (add-hook 'imap-fetch-data-hook
@@ -1020,8 +1047,7 @@ function is generally only called when Gnus is shutting down."
 (deffoo nnimap-request-group (group &optional server fast)
   (nnimap-request-update-info-internal
    group
-   (gnus-get-info (gnus-group-prefixed-name
-                  group (gnus-server-to-method (format "nnimap:%s" server))))
+   (gnus-get-info (nnimap-group-prefixed-name group server))
    server)
   (when (nnimap-possibly-change-group group server)
     (nnimap-before-find-minmax-bugworkaround)
@@ -1044,8 +1070,8 @@ function is generally only called when Gnus is shutting down."
    (let ((old (gnus-gethash-safe (gnus-group-prefixed-name group server)
                                 nnimap-mailbox-info)))
      (list (nth 0 old) (nth 1 old)
-          (imap-mailbox-status group 'unseen nnimap-server-buffer)
-          (nth 3 old)))
+          (imap-mailbox-status (nnimap-decode-group-name group)
+                               'unseen nnimap-server-buffer)))
    nnimap-mailbox-info))
 
 (defun nnimap-close-group (group &optional server)
@@ -1060,7 +1086,7 @@ function is generally only called when Gnus is shutting down."
                    (imap-mailbox-close nnimap-close-asynchronous))))
        (ask (if (and (imap-search "DELETED")
                      (gnus-y-or-n-p (format "Expunge articles in group `%s'? "
-                                            imap-current-mailbox)))
+                                            (imap-current-mailbox))))
                 (progn
                   (imap-mailbox-expunge nnimap-close-asynchronous)
                   (unless nnimap-dont-close
@@ -1089,11 +1115,12 @@ function is generally only called when Gnus is shutting down."
        (dolist (mbx (funcall nnimap-request-list-method
                              (cdr pattern) (car pattern)))
          (or (member "\\NoSelect" (imap-mailbox-get 'list-flags mbx))
-             (let ((info (nnimap-find-minmax-uid mbx 'examine)))
+             (let* ((encoded-mbx (nnimap-encode-group-name mbx))
+                    (info (nnimap-find-minmax-uid encoded-mbx 'examine)))
                (when info
                  (with-current-buffer nntp-server-buffer
                    (insert (format "\"%s\" %d %d y\n"
-                                   mbx (or (nth 2 info) 0)
+                                   encoded-mbx (or (nth 2 info) 0)
                                    (max 1 (or (nth 1 info) 1)))))))))))
     (gnus-message 5 "nnimap: Generating active list%s...done"
                  (if (> (length server) 0) (concat " for " server) ""))
@@ -1143,73 +1170,88 @@ function is generally only called when Gnus is shutting down."
     (with-current-buffer nntp-server-buffer
       (erase-buffer)
       (nnimap-before-find-minmax-bugworkaround)
-      (let (asyncgroups slowgroups)
+      (let (asyncgroups slowgroups decoded-group)
        (if (null nnimap-retrieve-groups-asynchronous)
            (setq slowgroups groups)
          (dolist (group groups)
-           (gnus-message 9 "nnimap: Quickly checking mailbox %s" group)
-           (add-to-list (if (gnus-gethash-safe
-                             (gnus-group-prefixed-name group server)
-                             nnimap-mailbox-info)
+           (setq decoded-group (nnimap-decode-group-name group))
+           (gnus-message 9 "nnimap: Quickly checking mailbox %s"
+                         decoded-group)
+           (add-to-list (if (gnus-group-get-parameter
+                             (nnimap-group-prefixed-name group)
+                             'imap-status)
                             'asyncgroups
                           'slowgroups)
                         (list group (imap-mailbox-status-asynch
-                                     group '(uidvalidity uidnext unseen)
+                                     decoded-group
+                                     '(uidvalidity uidnext unseen)
                                      nnimap-server-buffer))))
          (dolist (asyncgroup asyncgroups)
-           (let ((group (nth 0 asyncgroup))
-                 (tag   (nth 1 asyncgroup))
-                 new old)
+           (let* ((group (nth 0 asyncgroup))
+                  (tag   (nth 1 asyncgroup))
+                  (gnusgroup (nnimap-group-prefixed-name group))
+                  (saved-uidvalidity (gnus-group-get-parameter gnusgroup
+                                                               'uidvalidity))
+                  (saved-imap-status (gnus-group-get-parameter gnusgroup
+                                                               'imap-status))
+                  (saved-info (and saved-imap-status
+                                   (split-string saved-imap-status " "))))
+             (setq decoded-group (nnimap-decode-group-name group))
              (when (imap-ok-p (imap-wait-for-tag tag nnimap-server-buffer))
-               (if (or (not (string=
-                             (nth 0 (gnus-gethash (gnus-group-prefixed-name
-                                                   group server)
-                                                  nnimap-mailbox-info))
-                             (imap-mailbox-get 'uidvalidity group
+               (if (or (not (equal
+                             saved-uidvalidity
+                             (imap-mailbox-get 'uidvalidity decoded-group
                                                nnimap-server-buffer)))
-                       (not (string=
-                             (nth 1 (gnus-gethash (gnus-group-prefixed-name
-                                                   group server)
-                                                  nnimap-mailbox-info))
-                             (imap-mailbox-get 'uidnext group
+                       (not (equal
+                             (nth 0 saved-info)
+                             (imap-mailbox-get 'uidnext decoded-group
                                                nnimap-server-buffer))))
                    (push (list group) slowgroups)
-                 (insert (nth 3 (gnus-gethash (gnus-group-prefixed-name
-                                               group server)
-                                              nnimap-mailbox-info))))))))
+                 (gnus-sethash
+                  (gnus-group-prefixed-name group server)
+                  (list (imap-mailbox-get 'uidvalidity
+                                          decoded-group nnimap-server-buffer)
+                        (imap-mailbox-get 'uidnext
+                                          decoded-group nnimap-server-buffer)
+                        (imap-mailbox-get 'unseen
+                                          decoded-group nnimap-server-buffer))
+                  nnimap-mailbox-info)
+                 (insert (format "\"%s\" %s %s y\n" group
+                                 (nth 2 saved-info)
+                                 (nth 1 saved-info))))))))
        (dolist (group slowgroups)
          (if nnimap-retrieve-groups-asynchronous
              (setq group (car group)))
-         (gnus-message 7 "nnimap: Mailbox %s modified" group)
-         (imap-mailbox-put 'uidnext nil group nnimap-server-buffer)
-         (or (member "\\NoSelect" (imap-mailbox-get 'list-flags group
+         (setq decoded-group (nnimap-decode-group-name group))
+         (gnus-message 7 "nnimap: Mailbox %s modified" decoded-group)
+         (or (member "\\NoSelect" (imap-mailbox-get 'list-flags decoded-group
                                                     nnimap-server-buffer))
-             (let* ((info (nnimap-find-minmax-uid group 'examine))
-                    (str (format "\"%s\" %d %d y\n" group
-                                 (or (nth 2 info) 0)
-                                 (max 1 (or (nth 1 info) 1)))))
-               (when (> (or (imap-mailbox-get 'recent group
+             (let* ((gnusgroup (nnimap-group-prefixed-name group))
+                    (status (imap-mailbox-status
+                             decoded-group '(uidvalidity uidnext unseen)
+                             nnimap-server-buffer))
+                    (info (nnimap-find-minmax-uid group 'examine))
+                    (min-uid (max 1 (or (nth 1 info) 1)))
+                    (max-uid (or (nth 2 info) 0)))
+               (when (> (or (imap-mailbox-get 'recent decoded-group
                                               nnimap-server-buffer) 0)
                         0)
-                 (push (list (cons group 0)) nnmail-split-history))
-               (insert str)
-               (when nnimap-retrieve-groups-asynchronous
-                 (gnus-sethash
-                  (gnus-group-prefixed-name group server)
-                  (list (or (imap-mailbox-get
-                             'uidvalidity group nnimap-server-buffer)
-                            (imap-mailbox-status
-                             group 'uidvalidity nnimap-server-buffer))
-                        (or (imap-mailbox-get
-                             'uidnext group nnimap-server-buffer)
-                            (imap-mailbox-status
-                             group 'uidnext nnimap-server-buffer))
-                        (or (imap-mailbox-get
-                             'unseen group nnimap-server-buffer)
-                            (imap-mailbox-status
-                             group 'unseen nnimap-server-buffer))
-                        str)
-                  nnimap-mailbox-info)))))))
+                 (push (list (cons decoded-group 0)) nnmail-split-history))
+               (insert (format "\"%s\" %d %d y\n" group max-uid min-uid))
+               (gnus-sethash
+                (gnus-group-prefixed-name group server)
+                status
+                nnimap-mailbox-info)
+               (if (not (equal (nth 0 status)
+                               (gnus-group-get-parameter gnusgroup
+                                                         'uidvalidity)))
+                   (nnimap-verify-uidvalidity group nnimap-current-server))
+               ;; The imap-status parameter is a string on the form
+               ;; "<uidnext> <min-uid> <max-uid>".
+               (gnus-group-add-parameter
+                gnusgroup
+                (cons 'imap-status
+                      (format "%s %s %s" (nth 1 status) min-uid max-uid))))))))
     (gnus-message 5 "nnimap: Checking mailboxes...done")
     'active))
 
@@ -1218,7 +1260,7 @@ function is generally only called when Gnus is shutting down."
     (when info ;; xxx what does this mean? should we create a info?
       (with-current-buffer nnimap-server-buffer
        (gnus-message 5 "nnimap: Updating info for %s..."
-                     (gnus-info-group info))
+                     (nnimap-decode-group-name (gnus-info-group info)))
 
        (when (nnimap-mark-permanent-p 'read)
          (let (seen unseen)
@@ -1264,7 +1306,7 @@ function is generally only called when Gnus is shutting down."
           t))
 
        (gnus-message 5 "nnimap: Updating info for %s...done"
-                     (gnus-info-group info))
+                     (nnimap-decode-group-name (gnus-info-group info)))
 
        info))))
 
@@ -1277,7 +1319,8 @@ function is generally only called when Gnus is shutting down."
   (when (nnimap-possibly-change-group group server)
     (with-current-buffer nnimap-server-buffer
       (let (action)
-       (gnus-message 7 "nnimap: Setting marks in %s..." group)
+       (gnus-message 7 "nnimap: Setting marks in %s..."
+                     (nnimap-decode-group-name group))
        (while (setq action (pop actions))
          (let ((range (nth 0 action))
                (what  (nth 1 action))
@@ -1318,7 +1361,8 @@ function is generally only called when Gnus is shutting down."
                     (imap-message-flags-set
                      (imap-range-to-message-set range)
                      (nnimap-mark-to-flag marks nil t)))))))
-       (gnus-message 7 "nnimap: Setting marks in %s...done" group))))
+       (gnus-message 7 "nnimap: Setting marks in %s...done"
+                     (nnimap-decode-group-name group)))))
   nil)
 
 (defun nnimap-split-fancy ()
@@ -1329,6 +1373,7 @@ function is generally only called when Gnus is shutting down."
 (defun nnimap-split-to-groups (rules)
   ;; tries to match all rules in nnimap-split-rule against content of
   ;; nntp-server-buffer, returns a list of groups that matched.
+  ;; Note: This function takes and returns decoded group names.
   (with-current-buffer nntp-server-buffer
     ;; Fold continuation lines.
     (goto-char (point-min))
@@ -1381,12 +1426,16 @@ function is generally only called when Gnus is shutting down."
     (list nnimap-split-inbox)))
 
 (defun nnimap-split-articles (&optional group server)
+  ;; Note: Assumes decoded group names in nnimap-split-inbox,
+  ;; nnimap-split-rule, nnimap-split-fancy, and nnmail-split-history.
   (when (nnimap-possibly-change-server server)
     (with-current-buffer nnimap-server-buffer
-      (let (rule inbox removeorig (inboxes (nnimap-split-find-inbox server)))
+      (let (rule inbox removeorig
+           (inboxes (nnimap-split-find-inbox server)))
        ;; iterate over inboxes
        (while (and (setq inbox (pop inboxes))
-                   (nnimap-possibly-change-group inbox)) ;; SELECT
+                   (nnimap-possibly-change-group
+                    (nnimap-encode-group-name inbox))) ;; SELECT
          ;; find split rule for this server / inbox
          (when (setq rule (nnimap-split-find-rule server inbox))
            ;; iterate over articles
@@ -1415,7 +1464,7 @@ function is generally only called when Gnus is shutting down."
                               (and (setq msgid
                                          (nnmail-fetch-field "message-id"))
                                    (nnmail-cache-insert msgid
-                                                        to-group
+                                                        (nnimap-encode-group-name to-group)
                                                         (nnmail-fetch-field "subject"))))))
                         ;; Add the group-art list to the history list.
                         (push (list (cons to-group 0)) nnmail-split-history))
@@ -1458,10 +1507,11 @@ function is generally only called when Gnus is shutting down."
                  (if (string= (downcase mailbox) "\\noselect")
                      (throw 'found t)))
                nil)
-             (let ((info (nnimap-find-minmax-uid mbx 'examine)))
+             (let* ((encoded-mbx (nnimap-encode-group-name mbx))
+                    (info (nnimap-find-minmax-uid encoded-mbx 'examine)))
                (when info
                  (insert (format "\"%s\" %d %d y\n"
-                                 mbx (or (nth 2 info) 0)
+                                 encoded-mbx (or (nth 2 info) 0)
                                  (max 1 (or (nth 1 info) 1)))))))))
       (gnus-message 5 "nnimap: Listing subscribed mailboxes%s%s...done"
                    (if (> (length server) 0) " on " "") server))
@@ -1469,10 +1519,11 @@ function is generally only called when Gnus is shutting down."
 
 (deffoo nnimap-request-create-group (group &optional server args)
   (when (nnimap-possibly-change-server server)
-    (or (imap-mailbox-status group 'uidvalidity nnimap-server-buffer)
-       (imap-mailbox-create group nnimap-server-buffer)
-       (nnheader-report 'nnimap "%S"
-                        (imap-error-text nnimap-server-buffer)))))
+    (let ((decoded-group (nnimap-decode-group-name group)))
+      (or (imap-mailbox-status decoded-group 'uidvalidity nnimap-server-buffer)
+         (imap-mailbox-create decoded-group nnimap-server-buffer)
+         (nnheader-report 'nnimap "%S"
+                          (imap-error-text nnimap-server-buffer))))))
 
 (defun nnimap-time-substract (time1 time2)
   "Return TIME for TIME1 - TIME2."
@@ -1603,7 +1654,8 @@ function is generally only called when Gnus is shutting down."
                          nnimap-current-move-group)
                         (imap-message-copy (number-to-string
                                             nnimap-current-move-article)
-                                           group 'dontcreate nil
+                                           (nnimap-decode-group-name group)
+                                           'dontcreate nil
                                            nnimap-server-buffer))
                  (with-current-buffer (current-buffer)
                    (goto-char (point-min))
@@ -1623,13 +1675,15 @@ function is generally only called when Gnus is shutting down."
                  ;; this 'or' is for Cyrus server bug
                  (or (null (imap-current-mailbox nnimap-server-buffer))
                      (imap-mailbox-unselect nnimap-server-buffer))
-                 (imap-message-append group (current-buffer) nil nil
+                 (imap-message-append (nnimap-decode-group-name group)
+                                      (current-buffer) nil nil
                                       nnimap-server-buffer)))
          (cons group (nth 1 uid))
        (nnheader-report 'nnimap (imap-error-text nnimap-server-buffer))))))
 
 (deffoo nnimap-request-delete-group (group force &optional server)
   (when (nnimap-possibly-change-server server)
+    (setq group (nnimap-decode-group-name group))
     (when (string= group (imap-current-mailbox nnimap-server-buffer))
       (imap-mailbox-unselect nnimap-server-buffer))
     (with-current-buffer nnimap-server-buffer
@@ -1641,7 +1695,9 @@ function is generally only called when Gnus is shutting down."
 
 (deffoo nnimap-request-rename-group (group new-name &optional server)
   (when (nnimap-possibly-change-server server)
-    (imap-mailbox-rename group new-name nnimap-server-buffer)))
+    (imap-mailbox-rename (nnimap-decode-group-name group)
+                        (nnimap-decode-group-name new-name)
+                        nnimap-server-buffer)))
 
 (defun nnimap-expunge (mailbox server)
   (when (nnimap-possibly-change-group mailbox server)
@@ -1650,7 +1706,8 @@ function is generally only called when Gnus is shutting down."
 (defun nnimap-acl-get (mailbox server)
   (when (nnimap-possibly-change-server server)
     (and (imap-capability 'ACL nnimap-server-buffer)
-        (imap-mailbox-acl-get mailbox nnimap-server-buffer))))
+        (imap-mailbox-acl-get (nnimap-decode-group-name mailbox)
+                              nnimap-server-buffer))))
 
 (defun nnimap-acl-edit (mailbox method old-acls new-acls)
   (when (nnimap-possibly-change-server (cadr method))
@@ -1660,7 +1717,8 @@ function is generally only called when Gnus is shutting down."
       ;; delete all removed identifiers
       (mapc (lambda (old-acl)
              (unless (assoc (car old-acl) new-acls)
-               (or (imap-mailbox-acl-delete (car old-acl) mailbox)
+               (or (imap-mailbox-acl-delete (car old-acl)
+                                            (nnimap-decode-group-name mailbox))
                    (error "Can't delete ACL for %s" (car old-acl)))))
            old-acls)
       ;; set all changed acl's
@@ -1669,7 +1727,8 @@ function is generally only called when Gnus is shutting down."
                    (old-rights (cdr (assoc (car new-acl) old-acls))))
                (unless (and old-rights new-rights
                             (string= old-rights new-rights))
-                 (or (imap-mailbox-acl-set (car new-acl) new-rights mailbox)
+                 (or (imap-mailbox-acl-set (car new-acl) new-rights
+                                           (nnimap-decode-group-name mailbox))
                      (error "Can't set ACL for %s to %s" (car new-acl)
                             new-rights)))))
            new-acls)
index 02685c7594c8dbdce1bd4a1cdd0ffb870da9e2ff..5475506746a212d2111b03c54d3324c95a0eabe5 100644 (file)
 (defvar nnir-imap-search-argument-history ()
   "The history for querying search options in nnir")
 
+(defvar nnir-get-article-nov-override-function nil
+  "If non-nil, a function that will be passed each search result.  This
+should return a message's headers in NOV format.
+
+If this variable is nil, or if the provided function returns nil for a search
+result, `gnus-retrieve-headers' will be called instead.")
+
+
 ;;; Developer Extension Variable:
 
 (defvar nnir-engines
@@ -779,25 +787,31 @@ and show thread that contains this article."
        (nnir-possibly-change-server server)
         (let ((gnus-override-method
               (gnus-server-to-method server)))
-         (case (setq foo (gnus-retrieve-headers (list artno) artfullgroup nil))
-           (nov
-            (goto-char (point-min))
-            (setq novitem (nnheader-parse-nov))
-            (unless novitem
-              (pop-to-buffer nntp-server-buffer)
-              (error
-               "nnheader-parse-nov returned nil for article %s in group %s"
-               artno artfullgroup)))
-           (headers
-            (goto-char (point-min))
-            (setq novitem (nnheader-parse-head))
-            (unless novitem
-              (pop-to-buffer nntp-server-buffer)
-              (error
-               "nnheader-parse-head returned nil for article %s in group %s"
-               artno artfullgroup)))
-           (t (error "Unknown header type %s while requesting article %s of group %s"
-                     foo artno artfullgroup))))
+         ;; if nnir-get-article-nov-override-function is set, use it
+         (if nnir-get-article-nov-override-function
+             (setq novitem (funcall nnir-get-article-nov-override-function
+                                    artitem))
+         ;; else, set novitem through nnheader-parse-nov/nnheader-parse-head
+           (case (setq foo (gnus-retrieve-headers (list artno) 
+                                                  artfullgroup nil))
+             (nov
+              (goto-char (point-min))
+              (setq novitem (nnheader-parse-nov))
+              (unless novitem
+                (pop-to-buffer nntp-server-buffer)
+                (error
+                 "nnheader-parse-nov returned nil for article %s in group %s"
+                 artno artfullgroup)))
+             (headers
+              (goto-char (point-min))
+              (setq novitem (nnheader-parse-head))
+              (unless novitem
+                (pop-to-buffer nntp-server-buffer)
+                (error
+                 "nnheader-parse-head returned nil for article %s in group %s"
+                 artno artfullgroup)))
+             (t (error "Unknown header type %s while requesting article %s of group %s"
+                       foo artno artfullgroup)))))
        ;; replace article number in original group with article number
         ;; in nnir group
         (mail-header-set-number novitem art)
index b3012b4b19892a82e31f614ec4ce59f0260cb6c9..20f7ba34b3cd5556118700f0cdb1c0c9d93880c5 100644 (file)
@@ -98,6 +98,12 @@ thing can fall apart and leave you with a corrupt mailbox."
   :type 'boolean
   :group 'pop3)
 
+(defcustom pop3-display-message-size-flag t
+  "*If non-nil, display the size of the message that is being fetched."
+  :version "22.1" ;; Oort Gnus
+  :type 'boolean
+  :group 'pop3) 
+
 (defvar pop3-timestamp nil
   "Timestamp returned when initially connected to the POP server.
 Used for APOP authentication.")
@@ -135,6 +141,7 @@ Shorter values mean quicker response, but are more CPU intensive.")
         (crashbuf (get-buffer-create " *pop3-retr*"))
         (n 1)
         message-count
+        message-sizes
         (pop3-password pop3-password))
     ;; for debugging only
     (if pop3-debug (switch-to-buffer (process-buffer process)))
@@ -149,10 +156,18 @@ Shorter values mean quicker response, but are more CPU intensive.")
           (pop3-pass process))
          (t (error "Invalid POP3 authentication scheme")))
     (setq message-count (car (pop3-stat process)))
+    (when (and pop3-display-message-size-flag
+              (> message-count 0))
+      (setq message-sizes (pop3-list process)))
     (unwind-protect
        (while (<= n message-count)
-         (message "Retrieving message %d of %d from %s..."
-                  n message-count pop3-mailhost)
+         (if pop3-display-message-size-flag
+             (message "Retrieving message %d of %d from %s... (%.1fk)"
+                      n message-count pop3-mailhost
+                      (/ (cdr (assoc n message-sizes))
+                         1024.0))
+           (message "Retrieving message %d of %d from %s..."
+                    n message-count pop3-mailhost))      
          (pop3-retr process n crashbuf)
          (save-excursion
            (set-buffer crashbuf)
@@ -451,8 +466,28 @@ If NOW, use that time instead."
     ))
 
 (defun pop3-list (process &optional msg)
-  "Scan listing of available messages.
-This function currently does nothing.")
+  "If MSG is nil, return an alist of (MESSAGE-ID . SIZE) pairs.
+Otherwise, return the size of the message-id MSG"
+  (pop3-send-command process (if msg 
+                                (format "LIST %d" msg)
+                              "LIST"))
+  (let ((response (pop3-read-response process t)))
+    (if msg
+       (string-to-number (nth 2 (split-string response " ")))
+      (let ((start pop3-read-point) end)
+       (save-excursion
+         (set-buffer (process-buffer process))
+         (while (not (re-search-forward "^\\.\r\n" nil t))
+           (pop3-accept-process-output process)
+           (goto-char start))
+         (setq pop3-read-point (point-marker))
+         (goto-char (match-beginning 0))
+         (setq end (point-marker))
+         (mapcar #'(lambda (s) (let ((split (split-string s " ")))
+                                 (cons (string-to-number (nth 0 split))
+                                       (string-to-number (nth 1 split)))))
+                 (delete "" (split-string (buffer-substring start end)
+                                          "\r\n"))))))))
 
 (defun pop3-retr (process msg crashbuf)
   "Retrieve message-id MSG to buffer CRASHBUF."