(eval-when-compile (require 'cl))
(require 'gnus)
+(require 'message)
+(require 'gnus-range)
+
+(eval-when-compile
+ (defun gnus-agent-expire (a b c)))
(defcustom gnus-open-server-hook nil
"Hook called just before opening connection to the news server."
:group 'gnus-start
:type 'hook)
-(defvar gnus-server-unopen-status nil
+(defcustom gnus-server-unopen-status nil
"The default status if the server is not able to open.
If the server is covered by Gnus agent, the possible values are
`denied', set the server denied; `offline', set the server offline;
-`nil', ask user. If the server is not covered by Gnus agent, set the
-server denied.")
+nil, ask user. If the server is not covered by Gnus agent, set the
+server denied."
+ :group 'gnus-start
+ :type '(choice (const :tag "Ask" nil)
+ (const :tag "Deny server" denied)
+ (const :tag "Unplugg Agent" offline)))
;;;
;;; Server Communication
(format "Unable to open %s:%s, go offline? "
(car gnus-command-method)
(cadr gnus-command-method)))
- 'offline
+ 'offline
'denied))
'denied)))
;; Return the result from the "open" call.
- (or (eq (cadr elem) 'offline)
- result)))))
+ (cond ((eq (cadr elem) 'offline)
+ ;; I'm avoiding infinite recursion by binding unopen
+ ;; status to denied (The logic of this routine
+ ;; guarantees that I can't get to this point with
+ ;; unopen status already bound to denied).
+ (unless (eq gnus-server-unopen-status 'denied)
+ (let ((gnus-server-unopen-status 'denied))
+ (gnus-open-server gnus-command-method)))
+ t)
+ (t
+ result))))))
(defun gnus-close-server (gnus-command-method)
"Close the connection to GNUS-COMMAND-METHOD."
(defun gnus-status-message (gnus-command-method)
"Return the status message from GNUS-COMMAND-METHOD.
-If GNUS-COMMAND-METHOD is a string, it is interpreted as a group name. The method
+If GNUS-COMMAND-METHOD is a string, it is interpreted as a group name. The method
this group uses will be queried."
(let ((gnus-command-method
(if (stringp gnus-command-method)
(setq gnus-command-method (gnus-server-to-method gnus-command-method)))
(when (gnus-check-backend-function
'request-update-info (car gnus-command-method))
- (funcall (gnus-get-function gnus-command-method 'request-update-info)
- (gnus-group-real-name (gnus-info-group info))
- info (nth 1 gnus-command-method))))
+ (let ((group (gnus-info-group info)))
+ (and (funcall (gnus-get-function gnus-command-method
+ 'request-update-info)
+ (gnus-group-real-name group)
+ info (nth 1 gnus-command-method))
+ ;; If the minimum article number is greater than 1, then all
+ ;; smaller article numbers are known not to exist; we'll
+ ;; artificially add those to the 'read range.
+ (let* ((active (gnus-active group))
+ (min (car active)))
+ (when (> min 1)
+ (let* ((range (if (= min 2) 1 (cons 1 (1- min))))
+ (read (gnus-info-read info))
+ (new-read (gnus-range-add read (list range))))
+ (gnus-info-set-read info new-read)))
+ info)))))
(defun gnus-request-expire-articles (articles group &optional force)
(let* ((gnus-command-method (gnus-find-method-for-group group))
(gnus-get-function gnus-command-method 'request-expire-articles)
articles (gnus-group-real-name group) (nth 1 gnus-command-method)
force)))
- (when (and gnus-agent gnus-agent-cache
- (gnus-sorted-difference articles not-deleted))
- (gnus-agent-expire (gnus-sorted-difference articles not-deleted)
- group 'force))
+ (when (and gnus-agent gnus-agent-cache (gnus-agent-method-p gnus-command-method))
+ (let ((expired-articles (gnus-sorted-difference articles not-deleted)))
+ (when expired-articles
+ (gnus-agent-expire expired-articles group 'force))))
not-deleted))
(defun gnus-request-move-article (article group server accept-function &optional last)
(result (funcall (gnus-get-function gnus-command-method 'request-move-article)
article (gnus-group-real-name group)
(nth 1 gnus-command-method) accept-function last)))
- (when (and result gnus-agent gnus-agent-cache)
- (gnus-agent-expire article group 'force))
+ (when (and result gnus-agent gnus-agent-cache (gnus-agent-method-p gnus-command-method))
+ (gnus-agent-expire (list article) group 'force))
result))
(defun gnus-request-accept-article (group &optional gnus-command-method last