+NUMBER is a number of the message.
+If CACHED is t, message is set as cached.")
+
+(luna-define-method elmo-message-set-cached ((folder elmo-folder)
+ number cached)
+ (if cached
+ (elmo-msgdb-set-flag (elmo-folder-msgdb folder) number 'cached)
+ (elmo-msgdb-unset-flag (elmo-folder-msgdb folder) number 'cached)))
+
+(defun elmo-message-copy-entity (entity)
+ (elmo-msgdb-copy-message-entity (elmo-message-entity-handler entity)
+ entity))
+
+(luna-define-generic elmo-message-entity (folder key)
+ "Return the message-entity structure which matches to the KEY.
+KEY is a number or a string.
+A number is for message number in the FOLDER.
+A string is for message-id of the message.")
+
+(luna-define-method elmo-message-entity ((folder elmo-folder) key)
+ (elmo-msgdb-message-entity (elmo-folder-msgdb folder) key))
+
+(luna-define-generic elmo-message-entity-parent (folder entity)
+ "Return the parent message-entity structure in the FOLDER.
+ENTITY is the message-entity to get the parent.")
+
+(luna-define-method elmo-message-entity-parent ((folder elmo-folder) entity)
+ (elmo-msgdb-get-parent-entity entity (elmo-folder-msgdb folder)))
+
+(put 'elmo-folder-do-each-message-entity 'lisp-indent-function '1)
+(def-edebug-spec elmo-folder-do-each-message-entity
+ ((symbolp form &rest form) &rest form))
+
+(defsubst elmo-folder-list-message-entities (folder)
+ ;; List all message entities in the FOLDER.
+ (mapcar
+ (lambda (number) (elmo-message-entity folder number))
+ (elmo-folder-list-messages folder nil t))) ; XXX killed-list is not used.
+
+(defmacro elmo-folder-do-each-message-entity (spec &rest form)
+ "Iterator for message entity in the folder.
+\(elmo-folder-do-each-message-entity \(entity folder\)
+ ... do the process using entity...
+\)"
+ `(dolist (,(car spec) (elmo-folder-list-message-entities ,(car (cdr spec))))
+ ,@form))
+
+(defmacro elmo-message-entity-number (entity)
+ `(elmo-msgdb-message-entity-number (elmo-message-entity-handler ,entity)
+ ,entity))
+
+(defmacro elmo-message-entity-set-number (entity number)
+ `(elmo-msgdb-message-entity-set-number (elmo-message-entity-handler ,entity)
+ ,entity
+ ,number))
+
+(defun elmo-message-entity-field (entity field &optional decode)
+ "Get message entity field value.
+ENTITY is the message entity structure obtained by `elmo-message-entity'.
+FIELD is the symbol of the field name.
+if optional DECODE is non-nil, returned value is decoded."
+ (elmo-msgdb-message-entity-field
+ (elmo-message-entity-handler entity)
+ entity field decode))
+
+(defun elmo-message-entity-set-field (entity field value)
+ "Set message entity field value.
+ENTITY is the message entity structure.
+FIELD is the symbol of the field name.
+VALUE is the field value (raw)."
+ (elmo-msgdb-message-entity-set-field
+ (elmo-message-entity-handler entity)
+ entity field value))
+
+(luna-define-generic elmo-folder-count-flags (folder)
+ "Count flagged message number in the msgdb of the FOLDER.
+Return a list of numbers (`new' `unread' `answered')")
+
+(luna-define-method elmo-folder-count-flags ((folder elmo-folder))
+ (let ((new 0)
+ (unreads 0)
+ (answered 0)
+ flags)
+ (dolist (number (elmo-folder-list-messages folder 'visible 'in-msgdb))
+ (setq flags (elmo-message-flags folder number))
+ (cond
+ ((memq 'new flags)
+ (incf new))
+ ((memq 'unread flags)
+ (incf unreads))
+ ((memq 'answered flags)
+ (incf answered))))
+ (list new unreads answered)))
+
+(luna-define-generic elmo-message-flags (folder number)
+ "Return a list of flags.
+FOLDER is a ELMO folder structure.
+NUMBER is a number of the message.")
+
+(luna-define-method elmo-message-flags ((folder elmo-folder) number)
+ (elmo-msgdb-flags (elmo-folder-msgdb folder) number))
+
+(defsubst elmo-message-flagged-p (folder number flag)
+ "Return non-nil if the message is set FLAG.
+FOLDER is a ELMO folder structure.
+NUMBER is a message number to test."
+ (let ((cur-flags (elmo-message-flags folder number)))
+ (case flag
+ (read
+ (not (memq 'unread cur-flags)))
+ (t
+ (memq flag cur-flags)))))
+
+(defun elmo-message-set-flag (folder number flag &optional is-local)
+ "Set message flag.
+FOLDER is a ELMO folder structure.
+NUMBER is a message number to set flag.
+
+FLAG is a symbol which is one of the following:
+ `unread' (set the message as unread)
+ `answered' (set the message as answered)
+ `important' (set the message as important)
+'sugar' flag:
+ `read' (remove new and unread flags)
+If optional IS-LOCAL is non-nil, update only local (not server) status."
+ ;; XXX Transitional implementation.
+ (case flag
+ (unread
+ (elmo-folder-unflag-read folder (list number) is-local))
+ (read
+ (elmo-folder-flag-as-read folder (list number) is-local))
+ (answered
+ (elmo-folder-flag-as-answered folder (list number) is-local))
+ (important
+ (elmo-folder-flag-as-important folder (list number) is-local))))
+
+(defun elmo-message-unset-flag (folder number flag &optional is-local)
+ "Unset message flag.
+FOLDER is a ELMO folder structure.
+NUMBER is a message number to set flag.
+
+FLAG is a symbol which is one of the following:
+ `unread' (remove unread and new flag)
+ `answered' (remove answered flag)
+ `important' (remove important flag)
+'sugar' flag:
+ `read' (set unread flag)
+If optional IS-LOCAL is non-nil, update only local (not server) status."
+ ;; XXX Transitional implementation.
+ (case flag
+ (unread
+ (elmo-folder-flag-as-read folder (list number) is-local))
+ (read
+ (elmo-folder-unflag-read folder (list number) is-local))
+ (answered
+ (elmo-folder-unflag-answered folder (list number) is-local))
+ (important
+ (elmo-folder-unflag-important folder (list number) is-local))))
+
+(luna-define-generic elmo-message-field (folder number field)