Remove nnml-retrieve-groups that is unnecessary and somewhat problematic
[gnus] / lisp / gnus-async.el
index 35af6bc..d4d3dba 100644 (file)
@@ -1,27 +1,24 @@
 ;;; gnus-async.el --- asynchronous support for Gnus
 
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004,
-;;   2005, 2006 Free Software Foundation, Inc.
+;; Copyright (C) 1996-2015 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Keywords: news
 
 ;; This file is part of GNU Emacs.
 
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Commentary:
 
 (require 'gnus-sum)
 (require 'nntp)
 
-(eval-when-compile
-  (when (featurep 'xemacs)
-    (require 'timer-funcs)))
-
 (defgroup gnus-asynchronous nil
   "Support for asynchronous operations."
   :group 'gnus)
@@ -77,6 +70,14 @@ It should return non-nil if the article is to be prefetched."
   :group 'gnus-asynchronous
   :type 'function)
 
+(defcustom gnus-async-post-fetch-function nil
+  "Function called after an article has been prefetched.
+The function will be called narrowed to the region of the article
+that was fetched."
+  :version "24.1"
+  :group 'gnus-asynchronous
+  :type '(choice (const nil) function))
+
 ;;; Internal variables.
 
 (defvar gnus-async-prefetch-article-buffer " *Async Prefetch Article*")
@@ -144,8 +145,7 @@ It should return non-nil if the article is to be prefetched."
   (when (and (gnus-buffer-live-p summary)
             gnus-asynchronous
             (gnus-group-asynchronous-p group))
-    (save-excursion
-      (set-buffer gnus-summary-buffer)
+    (with-current-buffer gnus-summary-buffer
       (let ((next (caadr (gnus-data-find-list article))))
        (when next
          (if (not (fboundp 'run-with-idle-timer))
@@ -204,8 +204,7 @@ It should return non-nil if the article is to be prefetched."
 
          (when (and do-fetch article)
            ;; We want to fetch some more articles.
-           (save-excursion
-             (set-buffer summary)
+           (with-current-buffer summary
              (let (mark)
                (gnus-async-set-buffer)
                (goto-char (point-max))
@@ -233,12 +232,26 @@ It should return non-nil if the article is to be prefetched."
     (setq gnus-async-current-prefetch-article nil)
     (when arg
       (gnus-async-set-buffer)
+      (save-excursion
+       (save-restriction
+         (narrow-to-region mark (point-max))
+         ;; Put the articles into the agent, if they aren't already.
+         (when (and gnus-agent
+                    (gnus-agent-group-covered-p group))
+           (save-restriction
+             (narrow-to-region mark (point-max))
+             (gnus-agent-store-article article group)))
+         ;; Prefetch images for the groups that want that.
+         (when (fboundp 'gnus-html-prefetch-images)
+           (gnus-html-prefetch-images summary))
+         (when gnus-async-post-fetch-function
+           (funcall gnus-async-post-fetch-function summary))))
       (gnus-async-with-semaphore
        (setq
         gnus-async-article-alist
         (cons (list (intern (format "%s-%d" group article)
                             gnus-async-hashtb)
-                    mark (set-marker (make-marker) (point-max))
+                    mark (point-max-marker)
                     group article)
               gnus-async-article-alist))))
     (if (not (gnus-buffer-live-p summary))
@@ -306,7 +319,8 @@ It should return non-nil if the article is to be prefetched."
     (set-marker (caddr entry) nil))
   (gnus-async-with-semaphore
     (setq gnus-async-article-alist
-         (delq entry gnus-async-article-alist))))
+         (delq entry gnus-async-article-alist))
+    (unintern (car entry) gnus-async-hashtb)))
 
 (defun gnus-async-prefetch-remove-group (group)
   "Remove all articles belonging to GROUP from the prefetch buffer."
@@ -319,11 +333,11 @@ It should return non-nil if the article is to be prefetched."
          (gnus-async-delete-prefetched-entry entry))))))
 
 (defun gnus-async-prefetched-article-entry (group article)
-  "Return the entry for ARTICLE in GROUP iff it has been prefetched."
+  "Return the entry for ARTICLE in GROUP if it has been prefetched."
   (let ((entry (save-excursion
                 (gnus-async-set-buffer)
-                (assq (intern (format "%s-%d" group article)
-                              gnus-async-hashtb)
+                (assq (intern-soft (format "%s-%d" group article)
+                                   gnus-async-hashtb)
                       gnus-async-article-alist))))
     ;; Perhaps something has emptied the buffer?
     (if (and entry
@@ -378,5 +392,4 @@ It should return non-nil if the article is to be prefetched."
 
 (provide 'gnus-async)
 
-;;; arch-tag: fee61de5-3ea2-4de6-8578-2f90ce89391d
 ;;; gnus-async.el ends here