+(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-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 (case flag
+ (read "seen")
+ (unread "unseen")
+ (important "flagged")
+ (answered "answered")
+ (new "new")
+ (any "or answered or unseen flagged")
+ (digest "or unseen flagged")
+ (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
+ session
+ (elmo-imap4-folder-mailbox-internal folder))
+ (elmo-imap4-response-value
+ (elmo-imap4-send-command-wait
+ session
+ (format (if elmo-imap4-use-uid "uid search %s"
+ "search %s") criteria))
+ 'search))
+ ;; List flagged messages in the msgdb.
+ (elmo-msgdb-list-flagged (elmo-folder-msgdb folder) flag))))
+