;;; Code:
(eval-when-compile (require 'cl))
+(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 (For STATUS command).")
+
(defvar elmo-imap4-overview-fetch-chop-length 200
"*Number of overviews to fetch in one request.")
(defconst elmo-imap4-literal-threshold 1024
"Limitation of characters that can be used in a quoted string.")
+(defconst elmo-imap4-flag-specs '((important "\\Flagged")
+ (read "\\Seen")
+ (unread "\\Seen" 'remove)
+ (answered "\\Answered")))
+
;; For debugging.
(defvar elmo-imap4-debug nil
"Non-nil forces IMAP4 folder as debug mode.
(luna-define-method mime-imap-location-bodystructure
((location mime-elmo-imap-location))
- (elmo-imap4-fetch-bodystructure
+ (elmo-message-fetch-bodystructure
(mime-elmo-imap-location-folder-internal location)
(mime-elmo-imap-location-number-internal location)
(mime-elmo-imap-location-strategy-internal location)))
(car (nth 1 entry))))
response)))
-(defun elmo-imap4-fetch-bodystructure (folder number strategy)
- "Fetch BODYSTRUCTURE for the message in the FOLDER with NUMBER using STRATEGY."
+(luna-define-method elmo-message-fetch-bodystructure ((folder
+ elmo-imap4-folder)
+ number strategy)
(if (elmo-fetch-strategy-use-cache strategy)
(elmo-object-load
(elmo-file-cache-expand-path
"\\seen" (elmo-imap4-session-flags-internal session))
(elmo-string-member-ignore-case
"\\flagged" (elmo-imap4-session-flags-internal session))))
- (t (elmo-string-member-ignore-case
- (concat "\\" (symbol-name flag))
- (elmo-imap4-session-flags-internal session)))))
+ (answered
+ (elmo-string-member-ignore-case
+ (concat "\\" (symbol-name flag))
+ (elmo-imap4-session-flags-internal session)))
+ (t
+ (member "\\*" (elmo-imap4-session-flags-internal session)))))
(defun elmo-imap4-folder-list-flagged (folder flag)
"List flagged message numbers in the FOLDER.
(read "seen")
(unread "unseen")
(important "flagged")
+ (answered "answered")
+ (new "new")
(any "or answered or unseen flagged")
(digest "or unseen flagged")
- (t (symbol-name flag)))))
+ (t (concat "keyword " (capitalize (symbol-name flag)))))))
+ ;; Add search keywords
+ (when (or (eq flag 'digest)(eq flag 'any))
+ (let ((flags (delq 'important (elmo-get-global-flags t t))))
+ (while flags
+ (setq criteria (concat "or keyword "
+ (symbol-name (car flags))
+ " "
+ criteria))
+ (setq flags (cdr flags)))))
(if (elmo-imap4-session-flag-available-p session flag)
(progn
(elmo-imap4-session-select-mailbox
flag-list
(if use-flag
(append
- (and (elmo-string-member-ignore-case "\\Recent" flags)
+ (and (memq 'new saved-flags)
+ (not (elmo-string-member-ignore-case "\\Seen" flags))
'(new))
(and (elmo-string-member-ignore-case "\\Flagged" flags)
'(important))
(with-temp-buffer
(insert (or (elmo-imap4-response-bodydetail-text element)
""))
- ;; Delete CR.
- (goto-char (point-min))
- (while (search-forward "\r\n" nil t)
- (replace-match "\n"))
+ ;; Replace all CRLF with LF.
+ (elmo-delete-cr-buffer)
(elmo-msgdb-create-message-entity-from-buffer
handler
(elmo-imap4-response-value element 'uid)
(format "uid %d:*" (cdr (car killed)))
"all"))))
-(luna-define-method elmo-folder-list-unreads-plugged
- ((folder elmo-imap4-folder))
- (elmo-imap4-folder-list-flagged folder 'unread))
-
-(luna-define-method elmo-folder-list-importants-plugged
- ((folder elmo-imap4-folder))
- (elmo-imap4-folder-list-flagged folder 'important))
-
-(luna-define-method elmo-folder-list-answereds-plugged
- ((folder elmo-imap4-folder))
- (elmo-imap4-folder-list-flagged folder 'answered))
+(luna-define-method elmo-folder-list-flagged-plugged
+ ((folder elmo-imap4-folder) flag)
+ (elmo-imap4-folder-list-flagged folder flag))
(luna-define-method elmo-folder-use-flag-p ((folder elmo-imap4-folder))
- t)
+ (not (string-match elmo-imap4-disuse-server-flag-mailbox-regexp
+ (elmo-imap4-folder-mailbox-internal folder))))
(luna-define-method elmo-folder-list-subfolders ((folder elmo-imap4-folder)
&optional one-level)
(elmo-imap4-send-command-wait
session
(list "list " (elmo-imap4-mailbox root) " *"))))
+ ;; The response of Courier-imap doesn't contain a specified folder itself.
+ (unless (member root result)
+ (setq result
+ (append result
+ (elmo-imap4-response-get-selectable-mailbox-list
+ (elmo-imap4-send-command-wait
+ session
+ (list "list \"\" " (elmo-imap4-mailbox root)))))))
(when (or (not (string= (elmo-net-folder-user-internal folder)
elmo-imap4-default-user))
(not (eq (elmo-net-folder-auth-internal folder)
(when (or (elmo-string-member-ignore-case
flag
(elmo-imap4-session-flags-internal session))
+ (member "\\*" (elmo-imap4-session-flags-internal session))
(string= flag "\\Deleted")) ; XXX Humm..
(setq set-list (elmo-imap4-make-number-set-list
numbers
'message-id)))
elmo-imap4-current-msgdb))))
-(luna-define-method elmo-folder-unflag-important-plugged
- ((folder elmo-imap4-folder) numbers)
- (elmo-imap4-set-flag folder numbers "\\Flagged" 'remove))
-
-(luna-define-method elmo-folder-flag-as-important-plugged
- ((folder elmo-imap4-folder) numbers)
- (elmo-imap4-set-flag folder numbers "\\Flagged"))
-
-(luna-define-method elmo-folder-unflag-read-plugged
- ((folder elmo-imap4-folder) numbers)
- (elmo-imap4-set-flag folder numbers "\\Seen" 'remove))
-
-(luna-define-method elmo-folder-flag-as-read-plugged
- ((folder elmo-imap4-folder) numbers)
- (elmo-imap4-set-flag folder numbers "\\Seen"))
-
-(luna-define-method elmo-folder-unflag-answered-plugged
- ((folder elmo-imap4-folder) numbers)
- (elmo-imap4-set-flag folder numbers "\\Answered" 'remove))
+(luna-define-method elmo-folder-set-flag-plugged ((folder elmo-imap4-folder)
+ numbers flag)
+ (let ((spec (cdr (assq flag elmo-imap4-flag-specs))))
+ (elmo-imap4-set-flag folder numbers (or (car spec)
+ (capitalize (symbol-name flag)))
+ (nth 1 spec))))
-(luna-define-method elmo-folder-flag-as-answered-plugged
- ((folder elmo-imap4-folder) numbers)
- (elmo-imap4-set-flag folder numbers "\\Answered"))
+(luna-define-method elmo-folder-unset-flag-plugged ((folder elmo-imap4-folder)
+ numbers flag)
+ (let ((spec (cdr (assq flag elmo-imap4-flag-specs))))
+ (elmo-imap4-set-flag folder numbers (or (car spec)
+ (capitalize (symbol-name flag)))
+ (not (nth 1 spec)))))
(luna-define-method elmo-message-use-cache-p ((folder elmo-imap4-folder)
number)
(setq messages (elmo-imap4-response-value response 'messages))
(setq uidnext (elmo-imap4-response-value response 'uidnext))
(setq killed (elmo-msgdb-killed-list-load (elmo-folder-msgdb-path folder)))
- ;;
+ ;;
(when killed
(when (and (consp (car killed))
(eq (car (car killed)) 1))
(and (memq 'answered flags)
'("\\Answered")))
" ")
+ ;; XX KEYWORD flags
") ")
" () ")
(elmo-imap4-buffer-literal send-buffer))))
(string= (elmo-net-folder-user-internal (, folder1))
(elmo-net-folder-user-internal (, folder2)))))))
+(luna-define-method elmo-folder-next-message-number-plugged
+ ((folder elmo-imap4-folder))
+ (let ((session (elmo-imap4-get-session folder))
+ messages new unread response killed uidnext)
+ (with-current-buffer (elmo-network-session-buffer session)
+ (setq elmo-imap4-status-callback nil)
+ (setq elmo-imap4-status-callback-data nil))
+ (if elmo-imap4-use-select-to-update-status
+ (elmo-imap4-session-select-mailbox
+ session
+ (elmo-imap4-folder-mailbox-internal folder)))
+ (setq response
+ (elmo-imap4-send-command-wait session
+ (list
+ "status "
+ (elmo-imap4-mailbox
+ (elmo-imap4-folder-mailbox-internal
+ folder))
+ " (uidnext)"))
+ response (elmo-imap4-response-value response 'status))
+ (elmo-imap4-response-value response 'uidnext)))
+
(luna-define-method elmo-folder-append-messages :around
((folder elmo-imap4-folder) src-folder numbers &optional same-number)
(if (and (eq (elmo-folder-type-internal src-folder) 'imap4)
(with-current-buffer outbuf
(erase-buffer)
(insert response)
+ (elmo-delete-cr-buffer)
t))))
(luna-define-method elmo-message-fetch-plugged ((folder elmo-imap4-folder)
nil)
(autoload 'elmo-global-flags-set "elmo-flag")
+(autoload 'elmo-get-global-flags "elmo-flag")
(require 'product)
(product-provide (provide 'elmo-imap4) (require 'elmo-version))