From: Lars Magne Ingebrigtsen Date: Mon, 31 Jan 2011 03:15:42 +0000 (-0800) Subject: Implement the asynchronous data fetching functions for nntp. X-Git-Url: https://cgit.sxemacs.org/?a=commitdiff_plain;h=3ecb468fe961e2ab237028f1864bc9e9fdafb70e;p=gnus Implement the asynchronous data fetching functions for nntp. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 51b03593b..3d3f79fe3 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -4,6 +4,10 @@ 2011-01-31 Lars Ingebrigtsen + * nntp.el (nntp-retrieve-group-data-early) + (nntp-finish-retrieve-group-infos): Implement the asynchronous data + fetching functions. + * gnus-start.el (gnus-read-active-for-groups): Read the active files thoroughly for all backends that have no known groups. This should allow new nnml methods to retrieve mail. diff --git a/lisp/nntp.el b/lisp/nntp.el index b6b6449fc..cae0150dd 100644 --- a/lisp/nntp.el +++ b/lisp/nntp.el @@ -774,6 +774,62 @@ command whose response triggered the error." (nntp-copy-to-buffer nntp-server-buffer (point-min) (point-max)) 'headers))))) +(deffoo nntp-retrieve-group-data-early (server infos) + "Retrieve group info on INFOS." + (nntp-with-open-group nil server + (when (nntp-find-connection-buffer nntp-server-buffer) + ;; The first time this is run, this variable is `try'. So we + ;; try. + (when (eq nntp-server-list-active-group 'try) + (nntp-try-list-active (gnus-group-real-name (gnus-info-group (car infos))))) + (with-current-buffer (nntp-find-connection-buffer nntp-server-buffer) + (erase-buffer) + (let ((nntp-inhibit-erase t) + (command (if nntp-server-list-active-group + "LIST ACTIVE" "GROUP"))) + (dolist (info infos) + (nntp-send-command + nil command (gnus-group-real-name (gnus-info-group info))))) + (length infos))))) + +(deffoo nntp-finish-retrieve-group-infos (server infos count) + (nntp-with-open-group nil server + (let ((buf (nntp-find-connection-buffer nntp-server-buffer)) + (method (gnus-find-method-for-group + (gnus-info-group (car infos)) + (car infos))) + (received 0) + (last-point 1)) + (when buf + (with-current-buffer buf + (while (and (gnus-buffer-live-p buf) + (progn + (goto-char last-point) + ;; Count replies. + (while (re-search-forward "^[0-9]" nil t) + (incf received)) + (setq last-point (point)) + (< received count))) + (nntp-accept-response)) + ;; We now have all the entries. Remove CRs. + (goto-char (point-min)) + (while (search-forward "\r" nil t) + (replace-match "" t t)) + + (if (not nntp-server-list-active-group) + (progn + (nntp-copy-to-buffer nntp-server-buffer + (point-min) (point-max)) + (gnus-groups-to-gnus-format method gnus-active-hashtb t)) + ;; We have read active entries, so we just delete the + ;; superfluous gunk. + (goto-char (point-min)) + (while (re-search-forward "^[.2-5]" nil t) + (delete-region (match-beginning 0) + (progn (forward-line 1) (point)))) + (nntp-copy-to-buffer nntp-server-buffer (point-min) (point-max)) + (gnus-active-to-gnus-format method gnus-active-hashtb nil t))))))) + (deffoo nntp-retrieve-groups (groups &optional server) "Retrieve group info on GROUPS." (nntp-with-open-group