* wl-acap.el (wl-acap-original-msgdb-directory): Renamed from
[elisp/wanderlust.git] / elmo / elmo-imap4.el
index 0c2be18..f59cddb 100644 (file)
@@ -1,4 +1,4 @@
-;;; elmo-imap4.el -- IMAP4 Interface for ELMO.
+;;; elmo-imap4.el --- IMAP4 Interface for ELMO.
 
 ;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi <teranisi@gohome.org>
 ;; Copyright (C) 1999,2000      Kenichi OKADA <okada@opaopa.org>
@@ -262,10 +262,7 @@ Returns a TAG string which is assigned to the COMMAND."
       ;; (erase-buffer) No need.
       (goto-char (point-min))
       (when (elmo-imap4-response-bye-p elmo-imap4-current-response)
-       (elmo-network-close-session session)
-       (signal 'elmo-imap4-bye-error
-               (list (elmo-imap4-response-error-text
-                      elmo-imap4-current-response))))
+       (elmo-imap4-process-bye session))
       (setq elmo-imap4-current-response nil)
       (if elmo-imap4-parsing
          (error "IMAP process is running. Please wait (or plug again.)"))
@@ -352,6 +349,15 @@ If response is not `+' response, returns nil."
     (elmo-network-session-process-internal session))
    'continue-req))
 
+(defun elmo-imap4-process-bye (session)
+  (with-current-buffer (elmo-network-session-buffer session)
+    (let ((r elmo-imap4-current-response))
+      (setq elmo-imap4-current-response nil)
+      (elmo-network-close-session session)
+      (signal 'elmo-imap4-bye-error
+             (list (concat (elmo-imap4-response-error-text r))
+                   "Try Again")))))
+
 (defun elmo-imap4-accept-continue-req (session)
   "Returns non-nil if `+' (continue-req) response is arrived in SESSION.
 If response is not `+' response, cause an error."
@@ -377,16 +383,11 @@ If response is not `OK' response, causes error with IMAP response text."
     (if (elmo-imap4-response-ok-p response)
        response
       (if (elmo-imap4-response-bye-p response)
-         (progn
-           (elmo-network-close-session session)
-           (signal 'elmo-imap4-bye-error
-                   (list (elmo-imap4-response-error-text response))))
+         (elmo-imap4-process-bye session)
        (error "IMAP error: %s"
               (or (elmo-imap4-response-error-text response)
                   "No `OK' response from server."))))))
 
-
-
 ;;; MIME-ELMO-IMAP Location
 (luna-define-method mime-imap-location-section-body ((location
                                                      mime-elmo-imap-location)
@@ -629,6 +630,7 @@ If optional argument FORCE is non-nil, select mailbox even if current mailbox
 is same as MAILBOX.
 If second optional argument NO-ERROR is non-nil, don't cause an error when
 selecting folder was failed.
+If NO-ERROR is 'notify-bye, only BYE response is reported as error.
 Returns response value if selecting folder succeed. "
   (when (or force
            (not (string=
@@ -651,10 +653,13 @@ Returns response value if selecting folder succeed. "
               session
               (nth 1 (assq 'read-only (assq 'ok response)))))
          (elmo-imap4-session-set-current-mailbox-internal session nil)
-         (unless no-error
-           (error (or
-                   (elmo-imap4-response-error-text response)
-                   (format "Select %s failed" mailbox))))))
+         (if (and (eq no-error 'notify-bye)
+                  (elmo-imap4-response-bye-p response))
+             (elmo-imap4-process-bye session)
+           (unless no-error
+             (error (or
+                     (elmo-imap4-response-error-text response)
+                     (format "Select %s failed" mailbox)))))))
       (and result response))))
 
 (defun elmo-imap4-check-validity (spec validity-file)
@@ -1070,7 +1075,8 @@ If CHOP-LENGTH is not specified, message set is not chopped."
 
 (defun elmo-imap4-server-diff-async-callback-1 (status data)
   (funcall elmo-imap4-server-diff-async-callback
-          (cons (elmo-imap4-response-value status 'unseen)
+          (list (elmo-imap4-response-value status 'recent)
+                (elmo-imap4-response-value status 'unseen)
                 (elmo-imap4-response-value status 'messages))
           data))
 
@@ -1089,7 +1095,7 @@ If CHOP-LENGTH is not specified, message set is not chopped."
                              "status "
                              (elmo-imap4-mailbox
                               (elmo-imap4-folder-mailbox-internal folder))
-                             " (unseen messages)"))))
+                             " (recent unseen messages)"))))
 
 (luna-define-method elmo-server-diff-async ((folder elmo-imap4-folder))
   (let ((session (elmo-imap4-get-session folder)))
@@ -1105,7 +1111,7 @@ If CHOP-LENGTH is not specified, message set is not chopped."
                              "status "
                              (elmo-imap4-mailbox
                               (elmo-imap4-folder-mailbox-internal folder))
-                             " (unseen messages)"))))
+                             " (recent unseen messages)"))))
 
 ;;; IMAP parser.
 
@@ -1734,62 +1740,50 @@ Return nil if no complete line has arrived."
 (luna-define-method elmo-folder-initialize :around ((folder
                                                     elmo-imap4-folder)
                                                    name)
-  (let ((default-user        elmo-imap4-default-user)
-       (default-server      elmo-imap4-default-server)
-       (default-port        elmo-imap4-default-port)
+  (let ((default-user  elmo-imap4-default-user)
+       (default-server elmo-imap4-default-server)
+       (default-port   elmo-imap4-default-port)
        (elmo-network-stream-type-alist
         (if elmo-imap4-stream-type-alist
             (append elmo-imap4-stream-type-alist
                     elmo-network-stream-type-alist)
-          elmo-network-stream-type-alist)))
+          elmo-network-stream-type-alist))
+       parse)
     (when (string-match "\\(.*\\)@\\(.*\\)" default-server)
       ;; case: imap4-default-server is specified like
       ;; "hoge%imap.server@gateway".
       (setq default-user (elmo-match-string 1 default-server))
       (setq default-server (elmo-match-string 2 default-server)))
     (setq name (luna-call-next-method))
-    (when (string-match
-          "^\\([^:@!]*\\)\\(:[^/!]+\\)?\\(/[^/:@!]+\\)?"
-          name)
-      (progn
-       (if (match-beginning 1)
-           (progn
-             (elmo-imap4-folder-set-mailbox-internal
-              folder
-              (elmo-imap4-encode-folder-string
-               (elmo-match-string 1 name)))
-             (if (eq (length (elmo-imap4-folder-mailbox-internal folder))
-                     0)
-                 ;; No information is specified other than folder type.
-                 (elmo-imap4-folder-set-mailbox-internal
-                  folder
-                  (elmo-imap4-encode-folder-string
-                   elmo-imap4-default-mailbox))))
-         (elmo-imap4-folder-set-mailbox-internal
-          folder
-          (elmo-imap4-encode-folder-string
-           elmo-imap4-default-mailbox)))
-       ;; Setup slots for elmo-net-folder.
-       (elmo-net-folder-set-user-internal
-        folder
-        (if (match-beginning 2)
-            (elmo-match-substring 2 name 1)
-          default-user))
-       (elmo-net-folder-set-auth-internal
-        folder
-        (if (match-beginning 3)
-            (intern (elmo-match-substring 3 name 1))
-          (or elmo-imap4-default-authenticate-type 'clear)))
-       (unless (elmo-net-folder-server-internal folder)
-         (elmo-net-folder-set-server-internal folder default-server))
-       (unless (elmo-net-folder-port-internal folder)
-         (elmo-net-folder-set-port-internal folder default-port))
-       (unless (elmo-net-folder-stream-type-internal folder)
-         (elmo-net-folder-set-stream-type-internal
-          folder
-          (elmo-get-network-stream-type
-           elmo-imap4-default-stream-type)))
-       folder))))
+    ;; mailbox
+    (setq parse (elmo-parse-token name ":"))
+    (elmo-imap4-folder-set-mailbox-internal folder
+                                           (elmo-imap4-encode-folder-string
+                                            (if (eq (length (car parse)) 0)
+                                                elmo-imap4-default-mailbox
+                                              (car parse))))
+    ;; user
+    (setq parse (elmo-parse-prefixed-element ?: (cdr parse) "/"))
+    (elmo-net-folder-set-user-internal folder
+                                      (if (eq (length (car parse)) 0)
+                                          default-user
+                                        (car parse)))
+    ;; auth
+    (setq parse (elmo-parse-prefixed-element ?/ (cdr parse)))
+    (elmo-net-folder-set-auth-internal
+     folder
+     (if (eq (length (car parse)) 0)
+        (or elmo-imap4-default-authenticate-type 'clear)
+       (intern (car parse))))
+    (unless (elmo-net-folder-server-internal folder)
+      (elmo-net-folder-set-server-internal folder default-server))
+    (unless (elmo-net-folder-port-internal folder)
+      (elmo-net-folder-set-port-internal folder default-port))
+    (unless (elmo-net-folder-stream-type-internal folder)
+      (elmo-net-folder-set-stream-type-internal
+       folder
+       (elmo-get-network-stream-type elmo-imap4-default-stream-type)))
+    folder))
 
 ;;; ELMO IMAP4 folder
 (luna-define-method elmo-folder-expand-msgdb-path ((folder
@@ -1808,7 +1802,7 @@ Return nil if no complete line has arrived."
                             "nowhere")
                         (expand-file-name
                          "imap"
-                         elmo-msgdb-dir)))))))
+                         elmo-msgdb-directory)))))))
 
 (luna-define-method elmo-folder-status-plugged ((folder
                                                 elmo-imap4-folder))
@@ -1951,7 +1945,7 @@ Return nil if no complete line has arrived."
       (elmo-imap4-session-select-mailbox
        session
        (elmo-imap4-folder-mailbox-internal folder)
-       'force 'no-error))))
+       'force 'notify-bye))))
 
 (luna-define-method elmo-folder-writable-p ((folder elmo-imap4-folder))
   t)
@@ -2259,7 +2253,7 @@ If optional argument REMOVE is non-nil, remove FLAG."
                                         (elmo-imap4-mailbox
                                          (elmo-imap4-folder-mailbox-internal
                                           folder))
-                                        " (unseen messages)")))
+                                        " (recent unseen messages)")))
     (setq response (elmo-imap4-response-value response 'status))
     (setq messages (elmo-imap4-response-value response 'messages))
     (setq killed (elmo-msgdb-killed-list-load (elmo-folder-msgdb-path folder)))
@@ -2267,7 +2261,8 @@ If optional argument REMOVE is non-nil, remove FLAG."
        (setq messages (- messages
                          (elmo-msgdb-killed-list-length
                           killed))))
-    (cons (elmo-imap4-response-value response 'unseen)
+    (list (elmo-imap4-response-value response 'recent)
+         (elmo-imap4-response-value response 'unseen)
          messages)))
 
 (luna-define-method elmo-folder-diff-plugged ((folder elmo-imap4-folder))