shr: Render td content with shr-descend
[gnus] / lisp / nntp.el
index 46cc0d2..9c9054a 100644 (file)
@@ -34,6 +34,7 @@
 (require 'nnoo)
 (require 'gnus-util)
 (require 'gnus)
+(require 'proto-stream)
 (require 'gnus-group) ;; gnus-group-name-charset
 
 (nnoo-declare nntp)
@@ -305,13 +306,6 @@ update their active files often, this can help.")
 (defvar nntp-async-timer nil)
 (defvar nntp-async-process-list nil)
 
-(defvar nntp-ssl-program
-  "openssl s_client -quiet -ssl3 -connect %s:%p"
-"A string containing commands for SSL connections.
-Within a string, %s is replaced with the server address and %p with
-port number on server.  The program should accept IMAP commands on
-stdin and return responses to stdout.")
-
 (defvar nntp-authinfo-rejected nil
 "A custom error condition used to report 'Authentication Rejected' errors.
 Condition handlers that match just this condition ensure that the nntp
@@ -404,7 +398,8 @@ be restored and the command retried."
       (cond ((looking-at "480")
             (nntp-handle-authinfo process))
            ((looking-at "482")
-            (nnheader-report 'nntp (get 'nntp-authinfo-rejected 'error-message))
+            (nnheader-report 'nntp "%s"
+                             (get 'nntp-authinfo-rejected 'error-message))
             (signal 'nntp-authinfo-rejected nil))
            ((looking-at "^.*\n")
             (delete-region (point) (progn (forward-line 1) (point)))))
@@ -1118,19 +1113,7 @@ command whose response triggered the error."
             nntp-marks-file-name)
     (nntp-possibly-create-directory group server)
     (nntp-open-marks group server)
-    (dolist (action actions)
-      (let ((range (nth 0 action))
-           (what  (nth 1 action))
-           (marks (nth 2 action)))
-       (assert (or (eq what 'add) (eq what 'del)) nil
-               "Unknown request-set-mark action: %s" what)
-       (dolist (mark marks)
-         (setq nntp-marks (gnus-update-alist-soft
-                           mark
-                           (funcall (if (eq what 'add) 'gnus-range-add
-                                      'gnus-remove-from-range)
-                                    (cdr (assoc mark nntp-marks)) range)
-                           nntp-marks)))))
+    (setq nntp-marks (nnheader-update-marks-actions nntp-marks actions))
     (nntp-save-marks group server))
   nil)
 
@@ -1280,11 +1263,28 @@ password contained in '~/.nntp-authinfo'."
                `(lambda ()
                   (nntp-kill-buffer ,pbuffer)))))
         (process
-         (condition-case ()
+         (condition-case err
              (let ((coding-system-for-read nntp-coding-system-for-read)
-                   (coding-system-for-write nntp-coding-system-for-write))
-               (funcall nntp-open-connection-function pbuffer))
-           (error nil)
+                   (coding-system-for-write nntp-coding-system-for-write)
+                   (map '((nntp-open-network-stream network)
+                          (nntp-open-ssl-stream tls)
+                          (nntp-open-tls-stream tls))))
+               (if (assoc nntp-open-connection-function map)
+                   (car (open-protocol-stream
+                         "nntpd" pbuffer nntp-address nntp-port-number
+                         :type (cadr
+                                (assoc nntp-open-connection-function map))
+                         :end-of-command "^\\([2345]\\|[.]\\).*\n"
+                         :capability-command "CAPABILITIES\r\n"
+                         :success "^3"
+                         :starttls-function
+                         (lambda (capabilities)
+                           (if (not (string-match "STARTTLS" capabilities))
+                               nil
+                             "STARTTLS\r\n"))))
+                 (funcall nntp-open-connection-function pbuffer)))
+           (error
+            (nnheader-report 'nntp "%s" err))
            (quit
             (message "Quit opening connection to %s" nntp-address)
             (nntp-kill-buffer pbuffer)
@@ -1312,40 +1312,6 @@ password contained in '~/.nntp-authinfo'."
        (nntp-kill-buffer (process-buffer process))
        nil))))
 
-(defun nntp-open-network-stream (buffer)
-  (open-network-stream "nntpd" buffer nntp-address nntp-port-number))
-
-(autoload 'format-spec "format-spec")
-(autoload 'format-spec-make "format-spec")
-(autoload 'open-tls-stream "tls")
-
-(defun nntp-open-ssl-stream (buffer)
-  (let* ((process-connection-type nil)
-        (proc (start-process "nntpd" buffer
-                             shell-file-name
-                             shell-command-switch
-                             (format-spec nntp-ssl-program
-                                          (format-spec-make
-                                           ?s nntp-address
-                                           ?p nntp-port-number)))))
-    (gnus-set-process-query-on-exit-flag proc nil)
-    (with-current-buffer buffer
-      (let ((nntp-connection-alist (list proc buffer nil)))
-       (nntp-wait-for-string "^\r*20[01]"))
-      (beginning-of-line)
-      (delete-region (point-min) (point))
-      proc)))
-
-(defun nntp-open-tls-stream (buffer)
-  (let ((proc (open-tls-stream "nntpd" buffer nntp-address nntp-port-number)))
-    (gnus-set-process-query-on-exit-flag proc nil)
-    (with-current-buffer buffer
-      (let ((nntp-connection-alist (list proc buffer nil)))
-       (nntp-wait-for-string "^\r*20[01]"))
-      (beginning-of-line)
-      (delete-region (point-min) (point))
-      proc)))
-
 (defun nntp-read-server-type ()
   "Find out what the name of the server we have connected to is."
   ;; Wait for the status string to arrive.
@@ -1446,7 +1412,7 @@ password contained in '~/.nntp-authinfo'."
   (let ((message (buffer-string)))
     (while (string-match "[\r\n]+" message)
       (setq message (replace-match " " t t message)))
-    (nnheader-report 'nntp message)
+    (nnheader-report 'nntp "%s" message)
     message))
 
 (defun nntp-accept-process-output (process)