* test-dist.el (test-elmo-modules-trailing-whitespace)
[elisp/wanderlust.git] / elmo / modb.el
index adab8db..6574e63 100644 (file)
 (require 'modb-entity)
 
 (eval-and-compile
-  (luna-define-class modb-generic () (location         ; location for save.
+  (luna-define-class modb-generic () (location        ; location for save.
                                      message-modified ; message is modified.
                                      flag-modified    ; flag is modified.
+                                     mime-charset     ; for encode & decode.
                                      ))
   (luna-define-internal-accessors 'modb-generic))
 
@@ -67,6 +68,9 @@ Return a list of messages which have duplicated message-id.")
 (luna-define-generic elmo-msgdb-length (msgdb)
   "Return number of messages in the MSGDB")
 
+(luna-define-generic elmo-msgdb-flag-available-p (msgdb flag)
+  "Return non-nil when FLAG is available.")
+
 (luna-define-generic elmo-msgdb-flags (msgdb number)
   "Return a list of flag which corresponds to the message with NUMBER.")
 
@@ -80,7 +84,7 @@ FLAG is a symbol which is one of the following:
   `important' ... Message which is important.
   `answered'  ... Message which is answered.
   `cached'    ... Message which is cached.
-'sugar' falg:
+'sugar' flag:
   `read'      ... Message which is already read.
   `uncached'  ... Message which is not cached.")
 
@@ -94,7 +98,7 @@ FLAG is a symbol which is one of the following:
   `important' ... Message which is important.
   `answered'  ... Message which is answered.
   `cached'    ... Message which is cached.
-'sugar' falg:
+'sugar' flag:
   `read'      ... Message which is already read.
   `uncached'  ... Message which is not cached.
   `all'       ... Remove all flags.")
@@ -131,6 +135,10 @@ Return CONDITION itself if no entity exists in msgdb.")
   "Append a ENTITY with FLAGS into the MSGDB.
 Return non-nil if message-id of entity is duplicated.")
 
+(luna-define-generic elmo-msgdb-update-entity (msgdb entity values)
+  "Update a ENTITY with VALUES into the MSGDB.
+VALUES is an alist of field-name and field-value.")
+
 (luna-define-generic elmo-msgdb-delete-messages (msgdb numbers)
   "Delete messages which are contained NUMBERS from MSGDB.
 Return non-nil if messages is deleted successfully.")
@@ -141,12 +149,32 @@ Return non-nil if messages is deleted successfully.")
 PREDICATE is called with two entities and APP-DATA.
 Should return non-nil if the first entity is \"less\" than the second.")
 
+(luna-define-generic elmo-msgdb-message-number (msgdb message-id)
+  "Get message number from MSGDB which corresponds to MESSAGE-ID.")
+
+(luna-define-method elmo-msgdb-message-number ((msgdb modb-generic)
+                                              message-id)
+  (elmo-message-entity-number
+   (elmo-msgdb-message-entity msgdb message-id)))
+
 (luna-define-generic elmo-msgdb-message-entity (msgdb 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 MSGDB.
 A string is for message-id of the message.")
 
+(luna-define-generic elmo-msgdb-message-field (msgdb number field
+                                                    &optional type)
+  "Get message field value in the MSGDB.
+NUMBER is a number of the message.
+FIELD is a symbol of the field.
+If optional argument TYPE is specified, return converted value.")
+
+(luna-define-method elmo-msgdb-message-field ((msgdb modb-generic)
+                                             number field &optional type)
+  (elmo-message-entity-field (elmo-msgdb-message-entity msgdb number)
+                            field type))
+
 (luna-define-generic elmo-msgdb-message-entity-handler (msgdb)
   "Get modb entity handler instance which corresponds to the MSGDB.")
 
@@ -191,14 +219,51 @@ A string is for message-id of the message.")
                                                &optional numbers)
   (let ((entity (elmo-msgdb-message-entity msgdb number)))
     (if entity
-       (elmo-msgdb-message-match-condition
-        (elmo-msgdb-message-entity-handler msgdb)
+       (elmo-condition-match
         condition
-        entity
-        (elmo-msgdb-flags msgdb number)
-        (or numbers (elmo-msgdb-list-messages msgdb)))
+        #'elmo-msgdb-match-condition-primitive
+        (list msgdb number entity
+              (or numbers (elmo-msgdb-list-messages msgdb))))
       condition)))
 
+(defun elmo-msgdb-match-condition-primitive (condition msgdb number entity
+                                                      population)
+  (let ((key (elmo-filter-key condition))
+       (case-fold-search t))
+    (cond
+     ((string= key "last")
+      (<= (length (memq number population))
+         (string-to-number (elmo-filter-value condition))))
+     ((string= key "first")
+      (< (- (length population)
+           (length (memq number population)))
+        (string-to-number (elmo-filter-value condition))))
+     ((string= key "flag")
+      (let ((flags (elmo-msgdb-flags msgdb number)))
+       (cond ((string= (elmo-filter-value condition) "any")
+              (and flags (not (equal flags '(cached)))))
+             ((string= (elmo-filter-value condition) "digest")
+              (catch 'found
+                (dolist (flag flags)
+                  (when (or (memq flag elmo-digest-flags)
+                            (elmo-global-flag-p flag))
+                    (throw 'found t)))))
+             ((string= (elmo-filter-value condition) "read")
+              (not (memq 'read flags)))
+             (t
+              (memq (intern (elmo-filter-value condition)) flags)))))
+     (t
+      (elmo-msgdb-message-match-condition (elmo-message-entity-handler entity)
+                                         condition entity)))))
+
+(luna-define-method elmo-msgdb-update-entity ((msgdb modb-generic)
+                                             entity values)
+  (when (elmo-msgdb-message-entity-update-fields
+        (elmo-message-entity-handler entity)
+        entity values)
+    (modb-generic-set-message-modified-internal msgdb t)
+    t))
+
 (luna-define-method elmo-msgdb-message-entity-handler ((msgdb modb-generic))
   (or modb-entity-default-cache-internal
       (setq modb-entity-default-cache-internal