;; ranges so that the command line is within that length, it should
;; split the request into multiple commands. The client should use
;; literals instead of long quoted strings, in order to keep the command
-;; length down.
+;; length down.
;; For its part, a server should allow for a command line of at least
;; 8000 octets. This provides plenty of leeway for accepting reasonable
;; length commands from clients. The server should send a BAD response
"Use cache in imap4 folder.")
(defvar elmo-imap4-extra-namespace-alist
- '(("^{.*/nntp}.*$" . ".")) ; Default is for UW's remote nntp mailbox...
- "Extra namespace alist. A list of cons cell like: (REGEXP . DELIMITER).")
+ '(("^\\({.*/nntp}\\).*$" . ".")) ; Default is for UW's remote nntp mailbox...
+ "Extra namespace alist.
+A list of cons cell like: (REGEXP . DELIMITER).
+REGEXP should have a grouping for namespace prefix.")
;;
;;; internal variables
;;
; "Send COMMAND to the SESSION and wait for response.
; Returns RESPONSE (parsed lisp object) of IMAP session."
; (elmo-imap4-read-response session
-; (elmo-imap4-send-command
-; session
-; command)))
+; (elmo-imap4-send-command
+; session
+; command)))
(defun elmo-imap4-send-command-wait (session command)
"Send COMMAND to the SESSION.
(if (eq (length prefix) 0)
(progn (setq default-delim delim) nil)
(cons
- (concat "^"
+ (concat "^\\("
(if (string= (downcase prefix) "inbox")
"[Ii][Nn][Bb][Oo][Xx]"
(regexp-quote prefix))
- ".*$")
+ "\\).*$")
delim)))
(elmo-imap4-nth i ns))))))
(if default-delim
(with-current-buffer (elmo-network-session-buffer session)
elmo-imap4-server-namespace)))
elmo-imap4-default-hierarchy-delimiter))
+ ;; Append delimiter when root with namespace.
+ (root (if (and (match-end 1)
+ (string= (substring root (match-end 1))
+ ""))
+ (concat root delim)
+ root))
result append-serv type)
(setq result (elmo-imap4-response-get-selectable-mailbox-list
(elmo-imap4-send-command-wait
session
(list "list " (elmo-imap4-mailbox root) " *"))))
- (unless (string= (elmo-net-folder-user-internal folder)
- elmo-imap4-default-user)
+ (when (or (not (string= (elmo-net-folder-user-internal folder)
+ elmo-imap4-default-user))
+ (not (eq (elmo-net-folder-auth-internal folder)
+ (or elmo-imap4-default-authenticate-type 'clear))))
(setq append-serv (concat ":" (elmo-net-folder-user-internal folder))))
(unless (eq (elmo-net-folder-auth-internal folder)
(or elmo-imap4-default-authenticate-type 'clear))
type)))))
(if one-level
(let ((re-delim (regexp-quote delim))
+ (case-fold-search nil)
folder ret has-child-p)
;; Append delimiter
(when (and root
(elmo-imap4-folder-mailbox-internal folder))
" "
(elmo-imap4-mailbox
- (elmo-imap4-folder-mailbox-internal new-folder))))))
+ (elmo-imap4-folder-mailbox-internal new-folder))))
+ (elmo-imap4-session-set-current-mailbox-internal
+ session (elmo-imap4-folder-mailbox-internal new-folder))))
(defun elmo-imap4-copy-messages (src-folder dst-folder numbers)
(let ((session (elmo-imap4-get-session src-folder))
folder session (nth 2 condition) from-msgs)))
result (sort result '<))))))
-(luna-define-method elmo-folder-search ((folder elmo-imap4-folder)
- condition &optional numbers)
- (save-excursion
- (let ((session (elmo-imap4-get-session folder)))
- (elmo-imap4-session-select-mailbox
- session
- (elmo-imap4-folder-mailbox-internal folder))
- (elmo-imap4-search-internal folder session condition numbers))))
+(luna-define-method elmo-folder-search :around ((folder elmo-imap4-folder)
+ condition &optional numbers)
+ (if (elmo-folder-plugged-p folder)
+ (save-excursion
+ (let ((session (elmo-imap4-get-session folder)))
+ (elmo-imap4-session-select-mailbox
+ session
+ (elmo-imap4-folder-mailbox-internal folder))
+ (elmo-imap4-search-internal folder session condition numbers)))
+ (luna-call-next-method)))
(luna-define-method elmo-folder-msgdb-create-plugged
((folder elmo-imap4-folder) numbers &rest args)
(defsubst elmo-imap4-folder-diff-plugged (folder)
(let ((session (elmo-imap4-get-session folder))
- messages
- response killed)
+ messages new unread response killed)
;;; (elmo-imap4-commit spec)
(with-current-buffer (elmo-network-session-buffer session)
(setq elmo-imap4-status-callback nil)
(setq messages (- messages
(elmo-msgdb-killed-list-length
killed))))
- (list (elmo-imap4-response-value response 'recent)
- (elmo-imap4-response-value response 'unseen)
- messages)))
+ (setq new (elmo-imap4-response-value response 'recent)
+ unread (elmo-imap4-response-value response 'unseen))
+ (if (< unread new) (setq new unread))
+ (list new unread messages)))
(luna-define-method elmo-folder-diff-plugged ((folder elmo-imap4-folder))
(elmo-imap4-folder-diff-plugged folder))
(setq elmo-imap4-display-literal-progress nil))
(unless elmo-inhibit-display-retrieval-progress
(elmo-display-progress 'elmo-imap4-display-literal-progress
- "" 100) ; remove progress bar.
+ "Retrieving..." 100) ; remove progress bar.
(message "Retrieving...done."))
(if (setq response (elmo-imap4-response-bodydetail-text
(elmo-imap4-response-value-all
response 'fetch)))
(with-current-buffer outbuf
(erase-buffer)
- (insert response)))))
+ (insert response)
+ t))))
(luna-define-method elmo-message-fetch-plugged ((folder elmo-imap4-folder)
number strategy