(defvar elmo-imap4-disuse-server-flag-mailbox-regexp "^#mh" ; UW imapd
"Regexp to match IMAP4 mailbox names whose message flags on server should be ignored.
-(Except `\\Deleted' flag).")
+\(Except `\\Deleted' flag\).")
(defvar elmo-imap4-overview-fetch-chop-length 200
"*Number of overviews to fetch in one request.")
(defvar elmo-imap4-use-select-to-update-status nil
"*Some imapd have to send select command to update status.
-(ex. UW imapd 4.5-BETA?). For these imapd, you must set this variable t.")
+\(ex. UW imapd 4.5-BETA?\). For these imapd, you must set this variable t.")
(defvar elmo-imap4-use-modified-utf7 nil
"*Use mofidied UTF-7 (rfc2060) encoding for IMAP4 folder name.")
(defvar elmo-imap4-extra-namespace-alist
'(("^\\({.*/nntp}\\).*$" . ".")) ; Default is for UW's remote nntp mailbox...
- "Extra namespace alist.
+ "Extra namespace alist.
A list of cons cell like: (REGEXP . DELIMITER).
REGEXP should have a grouping for namespace prefix.")
;;
(when (elmo-imap4-response-bye-p 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)"))
+ (when elmo-imap4-parsing
+ (message "Waiting for IMAP response...")
+ (accept-process-output (elmo-network-session-process-internal
+ session))
+ (message "Waiting for IMAP response...done"))
(setq elmo-imap4-parsing t)
(elmo-imap4-debug "<-(%s)- %s" tag command)
(while (setq token (car command-args))
(elmo-imap4-response-bye-p elmo-imap4-current-response)
(when (elmo-imap4-response-garbage-p
elmo-imap4-current-response)
- (message "Garbage response: %s"
+ (message "Garbage response: %s"
(elmo-imap4-response-value
elmo-imap4-current-response
'garbage))
(with-current-buffer (elmo-network-session-buffer session)
(setq elmo-imap4-fetch-callback nil)
(setq elmo-imap4-fetch-callback-data nil))
- (elmo-imap4-send-command-wait session "check"))
+ (elmo-imap4-send-command session "check"))
(defun elmo-imap4-atom-p (string)
"Return t if STRING is an atom defined in rfc2060."
(mapcar
(lambda (entry)
(if (and (eq 'list (car entry))
- (not (member "\\NoSelect" (nth 1 (nth 1 entry)))))
+ (not (elmo-string-member-ignore-case "\\Noselect" (nth 1 (nth 1 entry)))))
(car (nth 1 entry))))
response)))
(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)))))))
+ (error "%s"
+ (or (elmo-imap4-response-error-text response)
+ (format "Select %s failed" mailbox)))))))
(and result response))))
(defun elmo-imap4-check-validity (spec validity-file)
;;
;; app-data:
-;; cons of list
-;; 0: new-mark 1: already-mark 2: seen-mark 3: important-mark
-;; 4: seen-list
-;; and result of use-flag-p.
+;; cons of flag-table and result of use-flag-p.
(defsubst elmo-imap4-fetch-callback-1-subr (entity flags app-data)
"A msgdb entity callback function."
(let* ((use-flag (cdr app-data))
(app-data (car app-data))
- (seen (member (car entity) (nth 4 app-data)))
mark)
- (if (member "\\Flagged" flags)
- (elmo-msgdb-global-mark-set (car entity) (nth 3 app-data)))
+ (if (elmo-string-member-ignore-case "\\Flagged" flags)
+ (elmo-msgdb-global-mark-set (car entity)
+ elmo-msgdb-important-mark))
(if (setq mark (elmo-msgdb-global-mark-get (car entity)))
- (unless (member "\\Seen" flags)
+ (unless (elmo-string-member-ignore-case "\\Seen" flags)
(setq elmo-imap4-seen-messages
(cons
(elmo-msgdb-overview-entity-get-number entity)
elmo-imap4-seen-messages)))
(setq mark (or (if (elmo-file-cache-status
(elmo-file-cache-get (car entity)))
- (if (or seen
- (and use-flag
- (member "\\Seen" flags)))
- nil
- (nth 1 app-data))
- (if (or seen
- (and use-flag
- (member "\\Seen" flags)))
- (if elmo-imap4-use-cache
- (nth 2 app-data))
- (nth 0 app-data))))))
+ ;; cached.
+ (if (elmo-string-member-ignore-case
+ "\\Answered" flags)
+ elmo-msgdb-answered-cached-mark
+ (if (and use-flag
+ (member "\\Seen" flags))
+ nil
+ elmo-msgdb-unread-cached-mark))
+ (if (elmo-string-member-ignore-case "\\Answered" flags)
+ elmo-msgdb-answered-uncached-mark
+ (if (and use-flag
+ (elmo-string-member-ignore-case
+ "\\Seen" flags))
+ (if elmo-imap4-use-cache
+ elmo-msgdb-read-uncached-mark)
+ elmo-msgdb-new-mark))))))
(setq elmo-imap4-current-msgdb
(elmo-msgdb-append
elmo-imap4-current-msgdb
(setq mailbox "inbox"))
(if (eq (string-to-char mailbox) ?/)
(setq mailbox (substring mailbox 1 (length mailbox))))
- (expand-file-name
- mailbox
+ ;; don't use expand-file-name (e.g. %~/something)
+ (concat
(expand-file-name
(or (elmo-net-folder-user-internal folder) "nobody")
(expand-file-name (or (elmo-net-folder-server-internal folder)
"nowhere")
(expand-file-name
"imap"
- elmo-msgdb-directory)))))))
+ elmo-msgdb-directory)))
+ "/" mailbox))))
(luna-define-method elmo-folder-status-plugged ((folder
elmo-imap4-folder))
((folder elmo-imap4-folder))
(elmo-imap4-list folder "flagged"))
+(luna-define-method elmo-folder-list-answereds-plugged
+ ((folder elmo-imap4-folder))
+ (elmo-imap4-list folder "answered"))
+
+(defun elmo-imap4-folder-list-any-plugged (folder)
+ (elmo-imap4-list folder "or answered or unseen flagged"))
+
+(defun elmo-imap4-folder-list-digest-plugged (folder)
+ (elmo-imap4-list folder "or unseen flagged"))
+
(luna-define-method elmo-folder-use-flag-p ((folder elmo-imap4-folder))
(not (string-match elmo-imap4-disuse-server-flag-mailbox-regexp
(elmo-imap4-folder-mailbox-internal folder))))
(luna-define-method elmo-folder-writable-p ((folder elmo-imap4-folder))
t)
-(luna-define-method elmo-folder-delete :before ((folder elmo-imap4-folder))
- (let ((session (elmo-imap4-get-session folder))
- msgs)
- (when (elmo-imap4-folder-mailbox-internal folder)
- (when (setq msgs (elmo-folder-list-messages folder))
- (elmo-folder-delete-messages folder msgs))
- (elmo-imap4-send-command-wait session "close")
- (elmo-imap4-send-command-wait
- session
- (list "delete "
- (elmo-imap4-mailbox
- (elmo-imap4-folder-mailbox-internal folder)))))))
+(luna-define-method elmo-folder-delete ((folder elmo-imap4-folder))
+ (let ((msgs (and (elmo-folder-exists-p folder)
+ (elmo-folder-list-messages folder))))
+ (when (yes-or-no-p (format "%sDelete msgdb and substance of \"%s\"? "
+ (if (> (length msgs) 0)
+ (format "%d msg(s) exists. " (length msgs))
+ "")
+ (elmo-folder-name-internal folder)))
+ (let ((session (elmo-imap4-get-session folder)))
+ (when (elmo-imap4-folder-mailbox-internal folder)
+ (when msgs (elmo-folder-delete-messages folder msgs))
+ (elmo-imap4-send-command-wait session "close")
+ (elmo-imap4-send-command-wait
+ session
+ (list "delete "
+ (elmo-imap4-mailbox
+ (elmo-imap4-folder-mailbox-internal folder))))))
+ (elmo-msgdb-delete-path folder)
+ t)))
(luna-define-method elmo-folder-rename-internal ((folder elmo-imap4-folder)
new-folder)
(luna-define-method elmo-folder-delete-messages-plugged
((folder elmo-imap4-folder) numbers)
(let ((session (elmo-imap4-get-session folder)))
- (elmo-imap4-set-flag folder numbers "\\Deleted")
- (elmo-imap4-send-command-wait session "expunge")))
+ (elmo-imap4-session-select-mailbox
+ session
+ (elmo-imap4-folder-mailbox-internal folder))
+ (unless (elmo-imap4-set-flag folder numbers "\\Deleted")
+ (error "Failed to set deleted flag"))
+ (elmo-imap4-send-command session "expunge")))
(defmacro elmo-imap4-detect-search-charset (string)
(` (with-temp-buffer
(defun elmo-imap4-search-internal-primitive (folder session filter from-msgs)
(let ((search-key (elmo-filter-key filter))
(imap-search-keys '("bcc" "body" "cc" "from" "subject" "to"
- "larger" "smaller"))
+ "larger" "smaller" "mark"))
(total 0)
(length (length from-msgs))
charset set-list end results)
numbers)))
(mapcar '(lambda (x) (delete x numbers)) rest)
numbers))
+ ((string= "flag" search-key)
+ (cond
+ ((string= "unread" (elmo-filter-value filter))
+ (elmo-folder-list-unreads folder))
+ ((string= "important" (elmo-filter-value filter))
+ (elmo-folder-list-importants folder))
+ ((string= "answered" (elmo-filter-value filter))
+ (elmo-folder-list-answereds folder))
+ ((string= "digest" (elmo-filter-value filter))
+ (elmo-imap4-folder-list-digest-plugged folder))
+ ((string= "any" (elmo-filter-value filter))
+ (elmo-imap4-folder-list-any-plugged folder))))
((or (string= "since" search-key)
(string= "before" search-key))
(setq search-key (concat "sent" search-key)
(luna-call-next-method)))
(luna-define-method elmo-folder-msgdb-create-plugged
- ((folder elmo-imap4-folder) numbers &rest args)
+ ((folder elmo-imap4-folder) numbers flag-table)
(when numbers
(let ((session (elmo-imap4-get-session folder))
(headers
elmo-msgdb-extra-fields))
(total 0)
(length (length numbers))
+ print-length print-depth
rfc2060 set-list)
(setq rfc2060 (memq 'imap4rev1
(elmo-imap4-session-capability-internal
(setq elmo-imap4-current-msgdb nil
elmo-imap4-seen-messages nil
elmo-imap4-fetch-callback 'elmo-imap4-fetch-callback-1
- elmo-imap4-fetch-callback-data (cons args
+ elmo-imap4-fetch-callback-data (cons flag-table
(elmo-folder-use-flag-p
folder)))
(while set-list
((folder elmo-imap4-folder) numbers)
(elmo-imap4-set-flag folder numbers "\\Seen"))
+(luna-define-method elmo-folder-unmark-answered-plugged
+ ((folder elmo-imap4-folder) numbers)
+ (elmo-imap4-set-flag folder numbers "\\Answered" 'remove))
+
+(luna-define-method elmo-folder-mark-as-answered-plugged
+ ((folder elmo-imap4-folder) numbers)
+ (elmo-imap4-set-flag folder numbers "\\Answered"))
+
(luna-define-method elmo-message-use-cache-p ((folder elmo-imap4-folder)
number)
elmo-imap4-use-cache)
(elmo-imap4-session-set-current-mailbox-internal session nil)
(if (elmo-imap4-response-bye-p response)
(elmo-imap4-process-bye session)
- (error (or
- (elmo-imap4-response-error-text response)
- (format "Select %s failed" mailbox)))))
+ (error "%s"
+ (or (elmo-imap4-response-error-text response)
+ (format "Select %s failed" mailbox)))))
(message "Selecting %s...done"
(elmo-folder-name-internal folder))
(elmo-folder-set-msgdb-internal
(elmo-imap4-folder-mailbox-internal folder)))))
(luna-define-method elmo-folder-append-buffer
- ((folder elmo-imap4-folder) unread &optional number)
+ ((folder elmo-imap4-folder) &optional flag number)
(if (elmo-folder-plugged-p folder)
(let ((session (elmo-imap4-get-session folder))
send-buffer result)
"append "
(elmo-imap4-mailbox (elmo-imap4-folder-mailbox-internal
folder))
- (if unread " () " " (\\Seen) ")
+ (cond
+ ((eq flag 'read) " (\\Seen) ")
+ ((eq flag 'answered) " (\\Answered)")
+ (t " () "))
(elmo-imap4-buffer-literal send-buffer))))
(kill-buffer send-buffer))
result)
;; Unplugged
(if elmo-enable-disconnected-operation
- (elmo-folder-append-buffer-dop folder unread number)
+ (elmo-folder-append-buffer-dop folder flag number)
(error "Unplugged"))))
(eval-when-compile
(elmo-net-folder-user-internal (, folder2)))))))
(luna-define-method elmo-folder-append-messages :around
- ((folder elmo-imap4-folder) src-folder numbers unread-marks
- &optional same-number)
+ ((folder elmo-imap4-folder) src-folder numbers &optional same-number)
(if (and (eq (elmo-folder-type-internal src-folder) 'imap4)
(elmo-imap4-identical-system-p folder src-folder)
(elmo-folder-plugged-p folder))
(goto-char (point-min))
(std11-field-body (symbol-name field)))))
-
+(luna-define-method elmo-folder-search-requires-msgdb-p ((folder
+ elmo-imap4-folder)
+ condition)
+ nil)
(require 'product)
(product-provide (provide 'elmo-imap4) (require 'elmo-version))