* mm-decode.el (mm-dissect-singlepart): Check that the decoder exists.
[gnus] / lisp / gnus-async.el
index 434afb6..378b0e0 100644 (file)
@@ -1,7 +1,6 @@
 ;;; gnus-async.el --- asynchronous support for Gnus
 
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-;;   2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+;; Copyright (C) 1996-2012 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Keywords: news
@@ -145,8 +144,7 @@ that was fetched."
   (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))
@@ -205,8 +203,7 @@ that was fetched."
 
          (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))
@@ -228,19 +225,28 @@ that was fetched."
   `(lambda (arg)
      (gnus-async-article-callback arg ,group ,article ,mark ,summary ,next)))
 
+(eval-when-compile
+  (autoload 'gnus-html-prefetch-images "gnus-html"))
+
 (defun gnus-async-article-callback (arg group article mark summary next)
   "Function called when an async article is done being fetched."
   (save-excursion
     (setq gnus-async-current-prefetch-article nil)
     (when arg
       (gnus-async-set-buffer)
-      (when gnus-async-post-fetch-function
-       (save-excursion
-         (save-restriction
-           (narrow-to-region mark (point-max))
-           ;; Prefetch images for the groups that want that.
-           (when (fboundp 'gnus-html-prefetch-images)
-             (gnus-async-post-fetch-function summary))
+      (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
@@ -315,7 +321,8 @@ that was fetched."
     (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."
@@ -331,8 +338,8 @@ that was fetched."
   "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