Fixed docstring.
[elisp/wanderlust.git] / elmo / elmo-nntp.el
index 2ef9232..d18689d 100644 (file)
@@ -49,7 +49,7 @@
 
 (defvar elmo-nntp-max-number-precedes-list-active nil
   "Non-nil means max number of msgdb is set as the max number of `list active'.
-(Needed for inn 2.3 or later?).")
+\(Needed for inn 2.3 or later?\).")
 
 (defvar elmo-nntp-group-coding-system nil
   "A coding system for newsgroup string.")
@@ -254,7 +254,8 @@ Don't cache if nil.")
 
 (luna-define-method elmo-network-initialize-session ((session
                                                      elmo-nntp-session))
-  (let ((process (elmo-network-session-process-internal session)))
+  (let ((process (elmo-network-session-process-internal session))
+       response)
     (set-process-filter (elmo-network-session-process-internal session)
                        'elmo-nntp-process-filter)
     (with-current-buffer (elmo-network-session-buffer session)
@@ -263,11 +264,12 @@ Don't cache if nil.")
       (while (and (memq (process-status process) '(open run))
                  (goto-char (point-max))
                  (forward-line -1)
-                 (not (looking-at "^[3-5][0-9][0-9]")))
+                 (not (looking-at "^[2-5][0-9][0-9]")))
        (accept-process-output process 1))
       (setq elmo-nntp-read-point (point))
-      (or (elmo-nntp-read-response session t)
-         (error "Cannot open network"))
+      (setq response (elmo-nntp-read-response session t t))
+      (unless (car response)
+         (signal 'elmo-open-error (list (cdr response))))
       (if elmo-nntp-send-mode-reader
          (elmo-nntp-send-mode-reader session))
       (when (eq (elmo-network-stream-type-symbol
@@ -308,7 +310,7 @@ Don't cache if nil.")
 (defun elmo-nntp-send-mode-reader (session)
   (elmo-nntp-send-command session "mode reader")
   (if (null (elmo-nntp-read-response session t))
-      (error "Mode reader failed")))
+      (message "Mode reader failed")))
 
 (defun elmo-nntp-send-command (session command &optional noerase)
   (with-current-buffer (elmo-network-session-buffer session)
@@ -321,7 +323,7 @@ Don't cache if nil.")
     (process-send-string (elmo-network-session-process-internal
                          session) "\r\n")))
 
-(defun elmo-nntp-read-response (session &optional not-command)
+(defun elmo-nntp-read-response (session &optional not-command error-msg)
   (with-current-buffer (elmo-network-session-buffer session)
     (let ((process (elmo-network-session-process-internal session))
          (case-fold-search nil)
@@ -337,14 +339,14 @@ Don't cache if nil.")
        (setq response-string
              (buffer-substring elmo-nntp-read-point (- match-end 2)))
        (goto-char elmo-nntp-read-point)
-       (if (looking-at "[234][0-9]+ .*$")
+       (if (looking-at "[23][0-9]+ .*$")
            (progn (setq response-continue nil)
                   (setq elmo-nntp-read-point match-end)
                   (setq response
                         (if response
                             (concat response "\n" response-string)
                           response-string)))
-         (if (looking-at "[^234][0-9]+ .*$")
+         (if (looking-at "[^23][0-9]+ .*$")
              (progn (setq response-continue nil)
                     (setq elmo-nntp-read-point match-end)
                     (setq response nil))
@@ -356,7 +358,9 @@ Don't cache if nil.")
                      (concat response "\n" response-string)
                    response-string)))
          (setq elmo-nntp-read-point match-end)))
-      response)))
+      (if error-msg
+         (cons response response-string)
+       response))))
 
 (defun elmo-nntp-read-raw-response (session)
   (with-current-buffer (elmo-network-session-buffer session)
@@ -405,7 +409,7 @@ Don't cache if nil.")
                                                      (and response group))
        response))))
 
-(defun elmo-nntp-list-folders-get-cache (folder buf)
+(defun elmo-nntp-list-folders-get-cache (group server buf)
   (when (and elmo-nntp-list-folders-use-cache
             elmo-nntp-list-folders-cache
             (string-match (concat "^"
@@ -413,18 +417,24 @@ Don't cache if nil.")
                                    (or
                                     (nth 1 elmo-nntp-list-folders-cache)
                                     "")))
-                          (or folder "")))
+                          (or group ""))
+            (string-match (concat "^"
+                                  (regexp-quote
+                                   (or
+                                    (nth 2 elmo-nntp-list-folders-cache)
+                                    "")))
+                          (or server "")))
     (let* ((cache-time (car elmo-nntp-list-folders-cache)))
       (unless (elmo-time-expire cache-time
                                elmo-nntp-list-folders-use-cache)
        (save-excursion
          (set-buffer buf)
          (erase-buffer)
-         (insert (nth 2 elmo-nntp-list-folders-cache))
+         (insert (nth 3 elmo-nntp-list-folders-cache))
          (goto-char (point-min))
-         (or (string= folder "")
-             (and folder
-                  (keep-lines (concat "^" (regexp-quote folder) "\\."))))
+         (or (string= group "")
+             (and group
+                  (keep-lines (concat "^" (regexp-quote group) "\\."))))
          t
          )))))
 
@@ -446,6 +456,7 @@ Don't cache if nil.")
 
 (defun elmo-nntp-folder-list-subfolders (folder one-level)
   (let ((session (elmo-nntp-get-session folder))
+       (case-fold-search nil)
        response ret-val top-ng append-serv use-list-active start)
     (with-temp-buffer
       (set-buffer-multibyte nil)
@@ -457,6 +468,7 @@ Don't cache if nil.")
          (setq ret-val (list (elmo-nntp-folder-group-internal folder))))
       (unless (setq response (elmo-nntp-list-folders-get-cache
                              (elmo-nntp-folder-group-internal folder)
+                             (elmo-net-folder-server-internal folder)
                              (current-buffer)))
        (when (setq use-list-active (elmo-nntp-list-active-p session))
          (elmo-nntp-send-command
@@ -476,6 +488,7 @@ Don't cache if nil.")
                  (setq elmo-nntp-list-folders-cache
                        (list (current-time)
                              (elmo-nntp-folder-group-internal folder)
+                             (elmo-net-folder-server-internal folder)
                              response)))
                (erase-buffer)
                (insert response))
@@ -488,7 +501,7 @@ Don't cache if nil.")
              (error "NNTP List folders failed"))
          (when elmo-nntp-list-folders-use-cache
            (setq elmo-nntp-list-folders-cache
-                 (list (current-time) nil response)))
+                 (list (current-time) nil nil response)))
          (erase-buffer)
          (setq start nil)
          (while (string-match (concat "^"
@@ -590,9 +603,9 @@ Don't cache if nil.")
      (goto-char (point-min))
      (read (current-buffer)))))
 
-(luna-define-method elmo-folder-list-messages-internal ((folder
-                                                        elmo-nntp-folder)
-                                                       &optional nohide)
+(luna-define-method elmo-folder-list-messages-plugged ((folder
+                                                       elmo-nntp-folder)
+                                                      &optional nohide)
   (let ((session (elmo-nntp-get-session folder))
        (group   (elmo-nntp-folder-group-internal folder))
        response numbers use-listgroup)
@@ -1074,16 +1087,13 @@ Don't cache if nil.")
     (elmo-folder-set-killed-list-internal folder killed-list))
   t)
 
-(luna-define-method elmo-folder-exists-p ((folder elmo-nntp-folder))
+(luna-define-method elmo-folder-exists-p-plugged ((folder elmo-nntp-folder))
   (let ((session (elmo-nntp-get-session folder)))
-    (if (elmo-folder-plugged-p folder)
-       (progn
          (elmo-nntp-send-command
           session
           (format "group %s"
                   (elmo-nntp-folder-group-internal folder)))
-         (elmo-nntp-read-response session))
-      t)))
+    (elmo-nntp-read-response session)))
 
 (defun elmo-nntp-retrieve-field (spec field from-msgs)
   "Retrieve FIELD values from FROM-MSGS.
@@ -1153,6 +1163,9 @@ Returns a list of cons cells like (NUMBER . VALUE)"
        (if from-msgs
            (elmo-list-filter from-msgs result)
          result)))
+     ((string= "body" search-key)
+      (error
+"Search by BODY is not supported (Toggle the plug off to search from caches)"))
      (t
       (let ((val (elmo-filter-value condition))
            (negative (eq (elmo-filter-type condition) 'unmatch))
@@ -1174,27 +1187,37 @@ Returns a list of cons cells like (NUMBER . VALUE)"
            (elmo-list-filter from-msgs result)
          result))))))
 
-(luna-define-method elmo-folder-search ((folder elmo-nntp-folder)
-                                       condition &optional from-msgs)
+(defun elmo-nntp-search-internal (folder condition from-msgs)
   (let (result)
     (cond
      ((vectorp condition)
       (setq result (elmo-nntp-search-primitive
                    folder condition from-msgs)))
      ((eq (car condition) 'and)
-      (setq result (elmo-folder-search folder (nth 1 condition) from-msgs)
+      (setq result (elmo-nntp-search-internal folder
+                                             (nth 1 condition)
+                                             from-msgs)
            result (elmo-list-filter result
-                                    (elmo-folder-search
+                                    (elmo-nntp-search-internal
                                      folder (nth 2 condition)
                                      from-msgs))))
      ((eq (car condition) 'or)
-      (setq result (elmo-folder-search folder (nth 1 condition) from-msgs)
+      (setq result (elmo-nntp-search-internal folder
+                                             (nth 1 condition)
+                                             from-msgs)
            result (elmo-uniq-list
                    (nconc result
-                          (elmo-folder-search folder (nth 2 condition)
-                                              from-msgs)))
+                          (elmo-nntp-search-internal folder
+                                                     (nth 2 condition)
+                                                     from-msgs)))
            result (sort result '<))))))
 
+(luna-define-method elmo-folder-search :around ((folder elmo-nntp-folder)
+                                               condition &optional from-msgs)
+  (if (elmo-folder-plugged-p folder)
+      (elmo-nntp-search-internal folder condition from-msgs)
+    (luna-call-next-method)))
+
 (defun elmo-nntp-get-folders-info-prepare (folder session-keys)
   (condition-case ()
       (let ((session (elmo-nntp-get-session folder))
@@ -1442,9 +1465,6 @@ Returns a list of cons cells like (NUMBER . VALUE)"
 (luna-define-method elmo-message-use-cache-p ((folder elmo-nntp-folder) number)
   elmo-nntp-use-cache)
 
-(luna-define-method elmo-folder-creatable-p ((folder elmo-nntp-folder))
-  nil)
-
 (defun elmo-nntp-parse-newsgroups (string &optional subscribe-only)
   (let ((nglist (elmo-parse string "[ \t\f\r\n,]*\\([^ \t\f\r\n,]+\\)"))
        ngs)