Function: gnus-cache-possibly-enter-article

gnus-cache-possibly-enter-article is an autoloaded and byte-compiled function defined in gnus-cache.el.gz.

Signature

(gnus-cache-possibly-enter-article GROUP ARTICLE TICKED DORMANT UNREAD &optional FORCE)

Source Code

;; Defined in /usr/src/emacs/lisp/gnus/gnus-cache.el.gz
(defun gnus-cache-possibly-enter-article
  (group article ticked dormant unread &optional force)
  (when (and (or force (not (eq gnus-use-cache 'passive)))
	     (numberp article)
	     (> article 0))		; This might be a dummy article.
    (let ((number article)
	  file headers lines-chars
	  (file-name-coding-system nnmail-pathname-coding-system))
      ;; If this is a virtual group, we find the real group.
      (when (gnus-virtual-group-p group)
	(let ((result (if (gnus-nnselect-group-p group)
			  (with-current-buffer gnus-summary-buffer
			    (cons (nnselect-article-group article)
				  (nnselect-article-number article)))
			(nnvirtual-find-group-art
			 (gnus-group-real-name group) article))))
	  (setq group (car result)
		number (cdr result))))
      (when (and number
		 (> number 0)		; Reffed article.
		 (or force
		     (and (gnus-cache-fully-p group)
			  (gnus-cache-member-of-class
			   gnus-cache-enter-articles ticked dormant unread)))
		 (not (file-exists-p (setq file (gnus-cache-file-name
						 group number)))))
	;; Possibly create the cache directory.
	(gnus-make-directory (file-name-directory file))
	;; Save the article in the cache.
	(if (file-exists-p file)
	    t				; The article already is saved.
	  (with-current-buffer nntp-server-buffer
	    (require 'gnus-art)
	    (let ((gnus-use-cache nil)
		  (gnus-article-decode-hook nil))
	      (gnus-request-article-this-buffer number group))
	    (when (> (buffer-size) 0)
	      (let ((coding-system-for-write gnus-cache-coding-system))
		(gnus-write-buffer file)
		(gnus-cache-update-file-total-fetched-for group file))
	      (setq lines-chars (nnheader-get-lines-and-char))
	      (nnheader-remove-body)
	      (setq headers (nnheader-parse-head t))
	      (setf (mail-header-number headers) number)
	      (setf (mail-header-lines headers) (car lines-chars))
	      (setf (mail-header-chars headers) (cadr lines-chars))
	      (gnus-cache-change-buffer group)
	      (set-buffer (cdr gnus-cache-buffer))
	      (goto-char (point-max))
	      (forward-line -1)
	      (while (condition-case ()
			 (when (not (bobp))
			   (> (read (current-buffer)) number))
		       (error
			;; The line was malformed, so we just remove it!!
			(gnus-delete-line)
			t))
		(forward-line -1))
	      (if (bobp)
		  (if (not (eobp))
		      (progn
			(beginning-of-line)
			(when (< (read (current-buffer)) number)
			  (forward-line 1)))
		    (beginning-of-line))
		(forward-line 1))
	      (beginning-of-line)
	      (nnheader-insert-nov headers)
	      ;; Update the active info.
	      (set-buffer gnus-summary-buffer)
	      (gnus-cache-possibly-update-active group (cons number number))
	      (setq gnus-newsgroup-cached
		    (gnus-add-to-sorted-list gnus-newsgroup-cached article))
	      (gnus-summary-update-secondary-mark article))
	    t))))))