-(static-cond
- ((fboundp 'float)
- ;; Emacs can parse dot symbol.
- (defvar elmo-imap4-rfc822-size "RFC822\.SIZE")
- (defvar elmo-imap4-rfc822-text "RFC822\.TEXT")
- (defvar elmo-imap4-rfc822-header "RFC822\.HEADER")
- (defvar elmo-imap4-rfc822-size "RFC822\.SIZE")
- (defvar elmo-imap4-header-fields "HEADER\.FIELDS")
- (defmacro elmo-imap4-replace-dot-symbols ()) ;; noop
- (defalias 'elmo-imap4-fetch-read 'read)
- )
- (t
- ;;; For Nemacs.
- ;; Cannot parse dot symbol.
- (defvar elmo-imap4-rfc822-size "RFC822_SIZE")
- (defvar elmo-imap4-header-fields "HEADER_FIELDS")
- (defvar elmo-imap4-rfc822-size "RFC822_SIZE")
- (defvar elmo-imap4-rfc822-text "RFC822_TEXT")
- (defvar elmo-imap4-rfc822-header "RFC822_HEADER")
- (defvar elmo-imap4-header-fields "HEADER_FIELDS")
- (defun elmo-imap4-fetch-read (buffer)
- (with-current-buffer buffer
- (let ((beg (point))
- token)
- (when (re-search-forward "[[ ]" nil t)
- (goto-char (match-beginning 0))
- (setq token (buffer-substring beg (point)))
- (cond ((string= token "RFC822.SIZE")
- (intern elmo-imap4-rfc822-size))
- ((string= token "RFC822.HEADER")
- (intern elmo-imap4-rfc822-header))
- ((string= token "RFC822.TEXT")
- (intern elmo-imap4-rfc822-text))
- ((string= token "HEADER\.FIELDS")
- (intern elmo-imap4-header-fields))
- (t (goto-char beg)
- (elmo-read (current-buffer))))))))))
+(defun elmo-imap4-session-flag-available-p (session flag)
+ (case flag
+ ((read unread) (elmo-string-member-ignore-case
+ "\\seen" (elmo-imap4-session-flags-internal session)))
+ (important
+ (elmo-string-member-ignore-case
+ "\\flagged" (elmo-imap4-session-flags-internal session)))
+ (digest
+ (or (elmo-string-member-ignore-case
+ "\\seen" (elmo-imap4-session-flags-internal session))
+ (elmo-string-member-ignore-case
+ "\\flagged" (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-flag-to-imap-search-key (flag)
+ (case flag
+ (read "seen")
+ (unread "unseen")
+ (important "flagged")
+ (answered "answered")
+ (new "new")
+ (t (concat
+ "keyword "
+ (or (car (cdr (assq flag elmo-imap4-flag-specs)))
+ (symbol-name flag))))))
+
+(defun elmo-imap4-flag-to-imap-criteria (flag)
+ (case flag
+ ((any digest)
+ (let ((criteria "flagged")
+ (global-flags (delq 'important (elmo-get-global-flags t t))))
+ (dolist (flag (delete 'new
+ (delete 'cached
+ (copy-sequence
+ (case flag
+ (any
+ elmo-preserved-flags)
+ (digest
+ elmo-digest-flags))))))
+ (setq criteria (concat "or "
+ (elmo-imap4-flag-to-imap-search-key flag)
+ " "
+ criteria)))
+ (while global-flags
+ (setq criteria (concat "or keyword "
+ (symbol-name (car global-flags))
+ " "
+ criteria))
+ (setq global-flags (cdr global-flags)))
+ criteria))
+ (t
+ (elmo-imap4-flag-to-imap-search-key flag))))
+
+(defun elmo-imap4-folder-list-flagged (folder flag)
+ "List flagged message numbers in the FOLDER.
+FLAG is one of the `unread', `read', `important', `answered', `any'."
+ (let ((session (elmo-imap4-get-session folder))
+ (criteria (elmo-imap4-flag-to-imap-criteria flag)))
+ (if (elmo-imap4-session-flag-available-p session flag)
+ (elmo-imap4-list folder criteria)
+ ;; List flagged messages in the msgdb.
+ (elmo-msgdb-list-flagged (elmo-folder-msgdb folder) flag))))
+
+(defvar elmo-imap4-rfc822-size "RFC822\.SIZE")
+(defvar elmo-imap4-rfc822-text "RFC822\.TEXT")
+(defvar elmo-imap4-rfc822-header "RFC822\.HEADER")
+(defvar elmo-imap4-header-fields "HEADER\.FIELDS")