(eval-when-compile (require 'cl))
(require 'luna)
+(require 'modb-entity)
(eval-and-compile
(luna-define-class modb-generic () (location ; location for save.
`answered' ... Message which is answered.
`cached' ... Message which is cached.")
+(luna-define-generic elmo-msgdb-flag-count (msgdb)
+ "Return a list of cons cell as (flag . count).
+The count is number of message which is set flag in the MSGDB.")
+
(luna-define-generic elmo-msgdb-list-messages (msgdb)
"Return a list of message numbers in the MSGDB.")
(luna-define-generic elmo-msgdb-list-flagged (msgdb flag)
"Return a list of message numbers which is set FLAG in the MSGDB.")
-;;; (luna-define-generic elmo-msgdb-search (msgdb condition &optional numbers)
-;;; "Search and return list of message numbers.
-;;; MSGDB is the ELMO msgdb structure.
-;;; CONDITION is a condition structure for searching.
-;;; If optional argument NUMBERS is specified and is a list of message numbers,
-;;; messages are searched from the list.")
+(luna-define-generic elmo-msgdb-search (msgdb condition &optional numbers)
+ "Search and return list of message numbers.
+MSGDB is the ELMO msgdb structure.
+CONDITION is a condition structure for searching.
+If optional argument NUMBERS is specified and is a list of message numbers,
+messages are searched from the list.
+Return t if the condition is unsupported.")
+
+(luna-define-generic elmo-msgdb-match-condition (msgdb condition number
+ &optional numbers)
+ "Check whether the condition of the message is satisfied or not.
+MSGDB is the msgdb to search from.
+CONDITION is the search condition.
+NUMBER is the message number to check.
+If optional argument NUMBERS is specified and is a list of message numbers,
+messages are searched from the list.
+Return CONDITION itself if no entity exists in msgdb.")
(luna-define-generic elmo-msgdb-append-entity (msgdb entity &optional flags)
"Append a ENTITY with FLAGS into the MSGDB.
Return non-nil if message-id of entity is duplicated.")
(luna-define-generic elmo-msgdb-delete-messages (msgdb numbers)
- "Delete messages which are contained NUMBERS from MSGDB.")
+ "Delete messages which are contained NUMBERS from MSGDB.
+Return non-nil if messages is deleted successfully.")
(luna-define-generic elmo-msgdb-sort-entities (msgdb predicate
&optional app-data)
A number is for message number in the MSGDB.
A string is for message-id of the message.")
-;; Message entity handling.
-(defvar modb-cache-internal nil)
-(defun elmo-message-entity-db (entity)
- "Get modb instance which corresponds to the ENTITY."
- (if (or (null (car entity))
- (stringp (car entity)))
- ;; Transitional implementation for modb-legacy.
- (or modb-cache-internal
- (progn
- (require 'modb-legacy)
- (setq modb-cache-internal (luna-make-entity 'modb-legacy))))
- ;; XXX Next generation entity structure...not decided yet.
- (car entity)))
-
-(luna-define-generic elmo-msgdb-make-message-entity (msgdb
- &rest args)
- "Make a message entity for MSGDB.")
-
-(luna-define-generic elmo-msgdb-message-entity-number (msgdb entity)
- "Number of the ENTITY.")
-
-(luna-define-generic elmo-msgdb-message-entity-set-number (msgdb entity number)
- "Set number of the ENTITY.")
-
-(luna-define-generic elmo-msgdb-message-entity-field (msgdb
- entity field
- &optional decode)
- "Retrieve field value of the message entity.
-MSGDB is the msgdb structure.
-ENTITY is the message entity structure.
-FIELD is a symbol of the field.
-If optional DECODE is no-nil, the field value is decoded.")
-
-(luna-define-generic elmo-msgdb-message-entity-set-field (msgdb
- entity field value)
- "Set the field value of the message entity.
-MSGDB is the msgdb structure.
-ENTITY is the message entity structure.
-FIELD is a symbol of the field.
-VALUE is the field value to set.")
-
-(luna-define-generic elmo-msgdb-copy-message-entity (msgdb entity)
- "Copy message entity.
-MSGDB is the msgdb structure.
-ENTITY is the message entity structure.")
-
-(luna-define-generic elmo-msgdb-create-message-entity-from-file (msgdb number
- file)
- "Create message entity from file.
-MSGDB is the msgdb structure.
-NUMBER is the number of the newly created message entity.
-FILE is the message file.")
-
-(luna-define-generic elmo-msgdb-create-message-entity-from-buffer (msgdb
- number
- &rest args)
- "Create message entity from current buffer.
-NUMBER is the number of the newly created message entity.
-Rest of the ARGS is a plist of message entity field for initial value.
-Header region is supposed to be narrowed.")
-
-;; Transitional interface.
-(luna-define-generic elmo-msgdb-match-condition-internal (msgdb
- condition
- entity
- flags
- numbers)
- "Return non-nil when the entity matches the condition.")
+(luna-define-generic elmo-msgdb-message-entity-handler (msgdb)
+ "Get modb entity handler instance which corresponds to the MSGDB.")
;;; generic implement
;;
(luna-define-method elmo-msgdb-length ((msgdb modb-generic))
0)
-(luna-define-method elmo-msgdb-make-message-entity ((msgdb modb-generic)
- args)
- (cons msgdb args))
-
-(luna-define-method elmo-msgdb-message-entity-field ((msgdb modb-generic)
- entity field
- &optional decode)
- (plist-get (cdr entity) (intern (concat ":" (symbol-name field)))))
+(luna-define-method elmo-msgdb-search ((msgdb modb-generic)
+ condition &optional numbers)
+ t)
-(luna-define-method elmo-msgdb-message-entity-number ((msgdb modb-generic)
- entity)
- (plist-get (cdr entity) :number))
+(luna-define-method elmo-msgdb-match-condition ((msgdb modb-generic)
+ condition
+ number
+ &optional numbers)
+ (let ((entity (elmo-msgdb-message-entity msgdb number)))
+ (if entity
+ (elmo-msgdb-message-match-condition
+ (elmo-msgdb-message-entity-handler msgdb)
+ condition
+ entity
+ (elmo-msgdb-flags msgdb number)
+ (or numbers (elmo-msgdb-list-messages msgdb)))
+ condition)))
+
+(luna-define-method elmo-msgdb-message-entity-handler ((msgdb modb-generic))
+ (or modb-entity-default-cache-internal
+ (setq modb-entity-default-cache-internal
+ (luna-make-entity modb-entity-default-handler))))
;; for on demand loading
(provide 'modb-generic)