* elmo-nntp.el (elmo-nntp-folder-list-subfolders): Don't omit
[elisp/wanderlust.git] / elmo / elmo-nntp.el
index 0c22db6..6abe77f 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.")
       (decode-coding-string string elmo-nntp-group-coding-system)
     string))
 
+;; For debugging.
+(defvar elmo-nntp-debug nil
+  "Non-nil forces NNTP folder as debug mode.
+Debug information is inserted in the buffer \"*NNTP DEBUG*\"")
+
+;;; Debug
+(defsubst elmo-nntp-debug (message &rest args)
+  (if elmo-nntp-debug
+      (let ((biff (string-match "BIFF-" (buffer-name)))
+           pos)
+       (with-current-buffer (get-buffer-create (concat "*NNTP DEBUG*"
+                                                       (if biff "BIFF")))
+         (goto-char (point-max))
+         (setq pos (point))
+         (insert (apply 'format message args) "\n")))))
+
 ;;; ELMO NNTP folder
 (eval-and-compile
   (luna-define-class elmo-nntp-folder (elmo-net-folder)
@@ -287,13 +303,17 @@ Don't cache if nil.")
       (elmo-nntp-send-command session
                              (format "authinfo user %s"
                                      (elmo-network-session-user-internal
-                                      session)))
+                                      session))
+                             nil
+                             'no-log)
       (or (elmo-nntp-read-response session)
          (signal 'elmo-authenticate-error '(authinfo)))
       (elmo-nntp-send-command
        session
        (format "authinfo pass %s"
-              (elmo-get-passwd (elmo-network-session-password-key session))))
+              (elmo-get-passwd (elmo-network-session-password-key session)))
+       nil
+       'no-log)
       (or (elmo-nntp-read-response session)
          (signal 'elmo-authenticate-error '(authinfo))))))
 
@@ -305,19 +325,21 @@ Don't cache if nil.")
   (save-excursion
     (set-buffer (process-buffer process))
     (goto-char (point-max))
-    (insert output)))
+    (insert output)
+    (elmo-nntp-debug "RECEIVED: %s\n" output)))
 
 (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)
+(defun elmo-nntp-send-command (session command &optional noerase no-log)
   (with-current-buffer (elmo-network-session-buffer session)
     (unless noerase
       (erase-buffer)
       (goto-char (point-min)))
     (setq elmo-nntp-read-point (point))
+    (elmo-nntp-debug "SEND: %s\n" (if no-log "<NO LOGGING>" command))
     (process-send-string (elmo-network-session-process-internal
                          session) command)
     (process-send-string (elmo-network-session-process-internal
@@ -432,7 +454,6 @@ Don't cache if nil.")
          (erase-buffer)
          (insert (nth 3 elmo-nntp-list-folders-cache))
          (goto-char (point-min))
-         (debug)
          (or (string= group "")
              (and group
                   (keep-lines (concat "^" (regexp-quote group) "\\."))))
@@ -458,7 +479,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)
+       response ret-val top-ng username append-serv use-list-active start)
     (with-temp-buffer
       (set-buffer-multibyte nil)
       (if (and (elmo-nntp-folder-group-internal folder)
@@ -558,8 +579,16 @@ Don't cache if nil.")
        (when (> len elmo-display-progress-threshold)
          (elmo-display-progress
           'elmo-nntp-list-folders "Parsing active..." 100))))
-    (unless (string= (elmo-net-folder-server-internal folder)
-                    elmo-nntp-default-server)
+
+    (setq username (elmo-net-folder-user-internal folder))
+    (when (and username
+              elmo-nntp-default-user
+              (string= username elmo-nntp-default-user))
+      (setq username nil))
+
+    (when (or username ; XXX: ad-hoc fix against username includes "@"
+             (not (string= (elmo-net-folder-server-internal folder)
+                           elmo-nntp-default-server)))
       (setq append-serv (concat "@" (elmo-net-folder-server-internal
                                     folder))))
     (unless (eq (elmo-net-folder-port-internal folder) elmo-nntp-default-port)
@@ -576,16 +605,15 @@ Don't cache if nil.")
     (mapcar '(lambda (fld)
               (if (consp fld)
                   (list (concat "-" (elmo-nntp-decode-group-string (car fld))
-                                (and (elmo-net-folder-user-internal folder)
+                                (and username
                                      (concat
                                       ":"
-                                      (elmo-net-folder-user-internal folder)))
+                                      username))
                                 (and append-serv
                                      (concat append-serv))))
                 (concat "-" (elmo-nntp-decode-group-string fld)
-                        (and (elmo-net-folder-user-internal folder)
-                             (concat ":" (elmo-net-folder-user-internal
-                                          folder)))
+                        (and username
+                             (concat ":" username))
                         (and append-serv
                              (concat append-serv)))))
            ret-val)))
@@ -1049,7 +1077,7 @@ Don't cache if nil.")
       (if (not (string-match
                "^2" (setq response (elmo-nntp-read-raw-response
                                     session))))
-         (error (concat "NNTP error: " response))))))
+         (error "NNTP error: %s" response)))))
 
 (defsubst elmo-nntp-send-data-line (session line)
   "Send LINE to SESSION."
@@ -1088,16 +1116,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.
@@ -1167,6 +1192,8 @@ Returns a list of cons cells like (NUMBER . VALUE)"
        (if from-msgs
            (elmo-list-filter from-msgs result)
          result)))
+     ((string= "body" search-key)
+      nil)
      (t
       (let ((val (elmo-filter-value condition))
            (negative (eq (elmo-filter-type condition) 'unmatch))
@@ -1215,7 +1242,8 @@ Returns a list of cons cells like (NUMBER . VALUE)"
 
 (luna-define-method elmo-folder-search :around ((folder elmo-nntp-folder)
                                                condition &optional from-msgs)
-  (if (elmo-folder-plugged-p folder)
+  (if (and (elmo-folder-plugged-p folder)
+          (not (string= "body" (elmo-filter-key condition))))
       (elmo-nntp-search-internal folder condition from-msgs)
     (luna-call-next-method)))
 
@@ -1273,11 +1301,11 @@ Returns a list of cons cells like (NUMBER . VALUE)"
                (postfix (elmo-nntp-folder-postfix user server port type)))
            (if (not (string= postfix ""))
                (save-excursion
-                 (replace-regexp "^\\(211 [0-9]+ [0-9]+ [0-9]+ [^ \n]+\\).*$"
-                                 (concat "\\1"
-                                         (elmo-replace-in-string
-                                          postfix
-                                          "\\\\" "\\\\\\\\\\\\\\\\"))))))
+                 (while (re-search-forward "^\\(211 [0-9]+ [0-9]+ [0-9]+ [^ \n]+\\)\\(.*\\)$" nil t)
+                   (replace-match (concat (match-string 1)
+                                          (elmo-replace-in-string
+                                           postfix
+                                           "\\\\" "\\\\\\\\\\\\\\\\")))))))
          (let (len min max group)
            (while (not (eobp))
              (condition-case ()
@@ -1466,9 +1494,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)