* elmo-map.el (elmo-folder-pack-numbers): Rewrite.
[elisp/wanderlust.git] / elmo / elmo-msgdb.el
index 6e7efb5..4ea7e10 100644 (file)
@@ -58,7 +58,6 @@
   :type '(string :tag "Mark")
   :group 'elmo)
 
-;; Not implemented yet.
 (defcustom elmo-msgdb-answered-cached-mark "&"
   "Mark for answered and cached message."
   :type '(string :tag "Mark")
@@ -69,7 +68,7 @@
   :type '(string :tag "Mark")
   :group 'elmo)
 
-(defcustom elmo-msgdb-important-mark"$"
+(defcustom elmo-msgdb-important-mark "$"
   "Mark for important message."
   :type '(string :tag "Mark")
   :group 'elmo)
 ;; elmo-flag-table-get
 ;; elmo-flag-table-save
 
-;; elmo-msgdb-append-entity
-;; msgdb entity flag-table
+;; elmo-msgdb-append-entity MSGDB ENTITY MARK-OR-FLAGS
 
 ;; ENTITY elmo-msgdb-make-entity ARGS
 ;; VALUE elmo-msgdb-entity-field ENTITY
@@ -190,6 +188,37 @@ If argument is a string, use it as a path to load message entities."
              (elmo-msgdb-overview-load msgdb-or-path)
            (elmo-msgdb-get-overview msgdb-or-path))))
 
+(defsubst elmo-msgdb-mark-to-flags (mark)
+  (append
+   (and (string= mark elmo-msgdb-new-mark)
+       '(new))
+   (and (string= mark elmo-msgdb-important-mark)
+       '(important))
+   (and (member mark (elmo-msgdb-unread-marks))
+       '(unread))
+   (and (member mark (elmo-msgdb-answered-marks))
+       '(answered))
+   (and (not (member mark (elmo-msgdb-uncached-marks)))
+       '(cached))))
+
+(defsubst elmo-msgdb-flags-to-mark (flags cached use-cache)
+  (cond ((memq 'new flags)
+        elmo-msgdb-new-mark)
+       ((memq 'important flags)
+        elmo-msgdb-important-mark)
+       ((memq 'answered flags)
+        (if cached
+            elmo-msgdb-answered-cached-mark
+          elmo-msgdb-answered-uncached-mark))
+       ((memq 'unread flags)
+        (if cached
+            elmo-msgdb-unread-cached-mark
+          elmo-msgdb-unread-uncached-mark))
+       (t
+        (if (or cached (not use-cache))
+            nil
+          elmo-msgdb-read-uncached-mark))))
+
 (defsubst elmo-msgdb-get-mark (msgdb number)
   "Get mark string from MSGDB which corresponds to the message with NUMBER."
   (cadr (elmo-get-hash-val (format "#%d" number)
@@ -367,6 +396,28 @@ FLAG is a symbol which is one of the following:
                  elmo-msgdb-unread-uncached-mark
                  elmo-msgdb-read-uncached-mark))))
 
+(defun elmo-msgdb-append-entity (msgdb entity &optional mark)
+  (when entity
+    (let ((number (elmo-msgdb-overview-entity-get-number entity))
+         (message-id (elmo-msgdb-overview-entity-get-id entity)))
+      (elmo-msgdb-set-overview
+       msgdb
+       (nconc (elmo-msgdb-get-overview msgdb)
+             (list entity)))
+      (elmo-msgdb-set-number-alist
+       msgdb
+       (nconc (elmo-msgdb-get-number-alist msgdb)
+             (list (cons number message-id))))
+      (when mark
+       (elmo-msgdb-set-mark-alist
+        msgdb
+        (nconc (elmo-msgdb-get-mark-alist msgdb)
+               (list (list number mark)))))
+      (elmo-msgdb-make-index
+       msgdb
+       (list entity)
+       (list (list number mark))))))
+
 (defsubst elmo-msgdb-get-number (msgdb message-id)
   "Get number of the message which corrensponds to MESSAGE-ID from MSGDB."
   (elmo-msgdb-overview-entity-get-number
@@ -394,16 +445,30 @@ FLAG is a symbol which is one of the following:
         (elmo-msgdb-overview-get-entity
          number msgdb)))))
 
-(defsubst elmo-msgdb-append (msgdb msgdb-append)
-  (list
-   (nconc (car msgdb) (car msgdb-append))
-   (nconc (cadr msgdb) (cadr msgdb-append))
-   (nconc (caddr msgdb) (caddr msgdb-append))
-   (elmo-msgdb-make-index-return
-    msgdb
-    (elmo-msgdb-get-overview msgdb-append)
-    (elmo-msgdb-get-mark-alist msgdb-append))
-   (nth 4 msgdb)))
+(defun elmo-msgdb-append (msgdb msgdb-append)
+  "Return a list of messages which have duplicated message-id."
+  (let (duplicates)
+    (elmo-msgdb-set-overview
+     msgdb
+     (nconc (elmo-msgdb-get-overview msgdb)
+           (elmo-msgdb-get-overview msgdb-append)))
+    (elmo-msgdb-set-number-alist
+     msgdb
+     (nconc (elmo-msgdb-get-number-alist msgdb)
+           (elmo-msgdb-get-number-alist msgdb-append)))
+    (elmo-msgdb-set-mark-alist
+     msgdb
+     (nconc (elmo-msgdb-get-mark-alist msgdb)
+           (elmo-msgdb-get-mark-alist msgdb-append)))
+    (setq duplicates (elmo-msgdb-make-index
+                     msgdb
+                     (elmo-msgdb-get-overview msgdb-append)
+                     (elmo-msgdb-get-mark-alist msgdb-append)))
+    (elmo-msgdb-set-path
+     msgdb
+     (or (elmo-msgdb-get-path msgdb)
+        (elmo-msgdb-get-path msgdb-append)))
+    duplicates))
 
 (defun elmo-msgdb-merge (folder msgdb-merge)
   "Return a list of messages which have duplicated message-id."
@@ -436,13 +501,13 @@ FLAG is a symbol which is one of the following:
 
 (defsubst elmo-msgdb-clear (&optional msgdb)
   (if msgdb
-      (list
-       (setcar msgdb nil)
-       (setcar (cdr msgdb) nil)
-       (setcar (cddr msgdb) nil)
-       (setcar (nthcdr 3 msgdb) nil)
-       (setcar (nthcdr 4 msgdb) nil))
-    (list nil nil nil nil nil)))
+      (progn
+       (elmo-msgdb-set-overview msgdb nil)
+       (elmo-msgdb-set-number-alist msgdb nil)
+       (elmo-msgdb-set-mark-alist msgdb nil)
+       (elmo-msgdb-set-index msgdb nil)
+       msgdb)
+    (elmo-make-msgdb)))
 
 (defun elmo-msgdb-delete-msgs (msgdb msgs)
   "Delete MSGS from MSGDB
@@ -466,18 +531,20 @@ content of MSGDB is changed."
       ;;
       (when index (elmo-msgdb-clear-index msgdb ov-entity))
       (setq msgs (cdr msgs)))
-    (setcar msgdb overview)
-    (setcar (cdr msgdb) number-alist)
-    (setcar (cddr msgdb) mark-alist)
-    (setcar (nthcdr 3 msgdb) index)
+    (elmo-msgdb-set-overview msgdb overview)
+    (elmo-msgdb-set-number-alist msgdb number-alist)
+    (elmo-msgdb-set-mark-alist msgdb mark-alist)
+    (elmo-msgdb-set-index msgdb index)
     t)) ;return value
 
 (defun elmo-msgdb-sort-by-date (msgdb)
   (message "Sorting...")
   (let ((overview (elmo-msgdb-get-overview msgdb)))
-    (setq overview (elmo-msgdb-overview-sort-by-date overview))
+    (elmo-msgdb-set-overview
+     msgdb
+     (elmo-msgdb-overview-sort-by-date overview))
     (message "Sorting...done")
-    (list overview (nth 1 msgdb)(nth 2 msgdb))))
+    msgdb))
 
 ;;;
 (defsubst elmo-msgdb-append-element (list element)
@@ -1017,7 +1084,7 @@ Return CONDITION itself if no entity exists in msgdb."
                (references (aref (cdr entity) 1))
                (size (aref (cdr entity) 7))
                (t (cdr (assoc (symbol-name field) (aref (cdr entity) 8)))))))
-        (if decode
+        (if (and decode (memq field '(from subject)))
             (elmo-msgdb-get-decoded-cache field-value)
           field-value))))