*** empty log message ***
[gnus] / lisp / nntp.el
index 5439463..6038511 100644 (file)
@@ -79,7 +79,7 @@ telnets to a remote system, logs in and does the same")
 
 (defvoo nntp-rlogin-parameters '("telnet" "-8" "${NNTPSERVER:=news}" "nntp")
   "*Parameters to `nntp-open-login'.
-That function may be used as `nntp-open-server-function'.  In that
+That function may be used as `nntp-open-connection-function'.  In that
 case, this list will be used as the parameter list given to rsh.")
 
 (defvoo nntp-rlogin-user-name nil
@@ -87,7 +87,7 @@ case, this list will be used as the parameter list given to rsh.")
 
 (defvoo nntp-telnet-parameters '("exec" "telnet" "-8" "${NNTPSERVER:=news}" "nntp")
   "*Parameters to `nntp-open-telnet'.
-That function may be used as `nntp-open-server-function'.  In that
+That function may be used as `nntp-open-connection-function'.  In that
 case, this list will be executed as a command after logging in
 via telnet.")
 
@@ -159,6 +159,7 @@ server there that you can connect to.  See also `nntp-open-connection-function'"
 (defvoo nntp-status-string "")
 (defconst nntp-version "nntp 5.0")
 (defvoo nntp-inhibit-erase nil)
+(defvoo nntp-inhibit-output nil)
 
 (defvoo nntp-server-xover 'try)
 (defvoo nntp-server-list-active-group 'try)
@@ -305,6 +306,87 @@ server there that you can connect to.  See also `nntp-open-connection-function'"
        (copy-to-buffer nntp-server-buffer (point-min) (point-max))
        'active))))
 
+(deffoo nntp-retrieve-articles (articles &optional group server)
+  (nntp-possibly-change-group group server)
+  (save-excursion
+    (let ((number (length articles))
+         (count 0)
+         (received 0)
+         (last-point (point-min))
+         (buf (nntp-find-connection-buffer nntp-server-buffer))
+         (nntp-inhibit-erase t)
+         (map (apply 'vector articles))
+         (point 1)
+         article alist)
+      (set-buffer buf)
+      (erase-buffer)
+      ;; Send HEAD command.
+      (while (setq article (pop articles))
+       (nntp-send-command 
+        nil
+        "ARTICLE" (if (numberp article)
+                      (int-to-string article)
+                    ;; `articles' is either a list of article numbers
+                    ;; or a list of article IDs.
+                    article))
+       (incf count)
+       ;; Every 400 requests we have to read the stream in
+       ;; order to avoid deadlocks.
+       (when (or (null articles)       ;All requests have been sent.
+                 (zerop (% count nntp-maximum-request)))
+         (nntp-accept-response)
+         (while (progn
+                  (progn
+                    (set-buffer buf)
+                    (goto-char last-point))
+                  ;; Count replies.
+                  (while (nntp-next-result-arrived-p)
+                    (aset map received (cons (aref map received) (point)))
+                    (incf received))
+                  (setq last-point (point))
+                  (< received count))
+           ;; If number of headers is greater than 100, give
+           ;;  informative messages.
+           (and (numberp nntp-large-newsgroup)
+                (> number nntp-large-newsgroup)
+                (zerop (% received 20))
+                (message "NNTP: Receiving articles... %d%%"
+                         (/ (* received 100) number)))
+           (nntp-accept-response))))
+      (and (numberp nntp-large-newsgroup)
+          (> number nntp-large-newsgroup)
+          (message "NNTP: Receiving headers...done"))
+
+      ;; Now we have all the responses.  We go through the results,
+      ;; washes it and copies it over to the server buffer.
+      (set-buffer nntp-server-buffer)
+      (erase-buffer)
+      (mapcar
+       (lambda (entry)
+        (narrow-to-region
+         (setq point (goto-char (point-max)))
+         (progn
+           (insert-buffer-substring buf last-point (cdr entry))
+           (point-max)))
+        (nntp-decode-text)
+        (widen)
+        (cons (car entry) point))
+       map))))
+
+(defun nntp-next-result-arrived-p ()
+  (let ((point (point)))
+    (cond 
+     ((looking-at "2")
+      (if (re-search-forward "\n.\r?\n" nil t)
+         t
+       (goto-char point)
+       nil))
+     ((looking-at "[34]")
+      (forward-line 1)
+      t)
+     (t
+      nil))))
+
 (defun nntp-try-list-active (group)
   (nntp-list-active-group group)
   (save-excursion
@@ -478,7 +560,8 @@ It will prompt for a password."
 
 (defun nntp-send-command (wait-for &rest strings)
   "Send STRINGS to server and wait until WAIT-FOR returns."
-  (unless nnheader-callback-function
+  (when (and (not nnheader-callback-function)
+            (not nntp-inhibit-output))
     (save-excursion
       (set-buffer nntp-server-buffer)
       (erase-buffer)))
@@ -496,7 +579,8 @@ It will prompt for a password."
 
 (defun nntp-send-command-and-decode (wait-for &rest strings)
   "Send STRINGS to server and wait until WAIT-FOR returns."
-  (unless nnheader-callback-function
+  (when (and (not nnheader-callback-function)
+            (not nntp-inhibit-output))
     (save-excursion
       (set-buffer nntp-server-buffer)
       (erase-buffer)))
@@ -507,7 +591,8 @@ It will prompt for a password."
 
 (defun nntp-send-buffer (wait-for)
   "Send the current buffer to server and wait until WAIT-FOR returns."
-  (unless nnheader-callback-function
+  (when (and (not nnheader-callback-function)
+            (not nntp-inhibit-output))
     (save-excursion
       (set-buffer (nntp-find-connection-buffer nntp-server-buffer))
       (erase-buffer)))
@@ -746,15 +831,13 @@ It will prompt for a password."
   (when group
     (let ((entry (nntp-find-connection-entry nntp-server-buffer)))
       (when (not (equal group (caddr entry)))
-       (nntp-request-group group)
        (save-excursion
-         (set-buffer nntp-server-buffer)
-         (if nnheader-callback-function
-             (progn
-               (goto-char (point-max))
-               (forward-line -1)
-               (gnus-delete-line))
-           (erase-buffer)))))))
+         (set-buffer (process-buffer (car entry)))
+         (erase-buffer)
+         (nntp-send-string (car entry) (concat "GROUP " group))
+         (nntp-wait-for-string "^2.*\n")
+         (setcar (cddr entry) group)
+         (erase-buffer))))))
 
 (defun nntp-decode-text (&optional cr-only)
   "Decode the text in the current buffer."
@@ -896,7 +979,8 @@ It will prompt for a password."
        ;; If `nntp-server-xover' is a string, then we just send this
        ;; command.
        (if wait-for-reply
-           (nntp-send-command-nodelete "\r?\n\\.\r?\n" nntp-server-xover range)
+           (nntp-send-command-nodelete 
+            "\r?\n\\.\r?\n" nntp-server-xover range)
          ;; We do not wait for the reply.
          (nntp-send-command-nodelete "\r?\n\\.\r?\n" nntp-server-xover range))
       (let ((commands nntp-xover-commands))