(elmo-msgdb-get-message-id-from-buffer): Use
[elisp/wanderlust.git] / elmo / elmo-maildir.el
index 4c22d9a..6372aed 100644 (file)
   :type 'directory
   :group 'elmo)
 
+(defconst elmo-maildir-flag-specs '((important ?F)
+                                   (read ?S)
+                                   (unread ?S 'remove)
+                                   (answered ?R)))
+
 ;;; ELMO Maildir folder
 (eval-and-compile
   (luna-define-class elmo-maildir-folder
@@ -126,17 +131,17 @@ LOCATION."
     (elmo-maildir-folder-set-answered-locations-internal folder (nth 3 locs))
     (nth 0 locs)))
 
-(luna-define-method elmo-map-folder-list-unreads
-  ((folder elmo-maildir-folder))
-  (elmo-maildir-folder-unread-locations-internal folder))
-
-(luna-define-method elmo-map-folder-list-importants
-  ((folder elmo-maildir-folder))
-  (elmo-maildir-folder-flagged-locations-internal folder))
-
-(luna-define-method elmo-map-folder-list-answereds
-  ((folder elmo-maildir-folder))
-  (elmo-maildir-folder-answered-locations-internal folder))
+(luna-define-method elmo-map-folder-list-flagged ((folder elmo-maildir-folder)
+                                                 flag)
+  (case flag
+    (unread
+     (elmo-maildir-folder-unread-locations-internal folder))
+    (important
+     (elmo-maildir-folder-flagged-locations-internal folder))
+    (answered
+     (elmo-maildir-folder-answered-locations-internal folder))
+    (otherwise
+     t)))
 
 (luna-define-method elmo-folder-msgdb-create ((folder elmo-maildir-folder)
                                              numbers flag-table)
@@ -152,7 +157,8 @@ LOCATION."
     (dolist (number numbers)
       (setq location (elmo-map-message-location folder number))
       (setq entity
-           (elmo-msgdb-create-overview-entity-from-file
+           (elmo-msgdb-create-message-entity-from-file
+            (elmo-msgdb-message-entity-handler new-msgdb)
             number
             (elmo-maildir-message-file-name folder location)))
       (when entity
@@ -209,6 +215,7 @@ LOCATION."
                    folder))))
        (unless (memq 'unread flags)
          (setq flags (delq 'new flags)))
+       (elmo-global-flags-set flags folder number message-id)
        (elmo-msgdb-append-entity new-msgdb entity flags)
        (when (> len elmo-display-progress-threshold)
          (setq i (1+ i))
@@ -299,31 +306,25 @@ LOCATION."
      mark))
   t)
 
-(luna-define-method elmo-map-folder-mark-as-important ((folder elmo-maildir-folder)
-                                                      locs)
-  (elmo-maildir-set-mark-msgs folder locs ?F))
-  
-(luna-define-method elmo-map-folder-unmark-important ((folder elmo-maildir-folder)
-                                                     locs)
-  (elmo-maildir-delete-mark-msgs folder locs ?F))
-
-(luna-define-method elmo-map-folder-mark-as-read ((folder elmo-maildir-folder)
-                                                 locs)
-  (elmo-maildir-set-mark-msgs folder locs ?S))
-
-(luna-define-method elmo-map-folder-unmark-read ((folder elmo-maildir-folder)
-                                                locs)
-  (elmo-maildir-delete-mark-msgs folder locs ?S))
-
-(luna-define-method elmo-map-folder-mark-as-answered ((folder
-                                                      elmo-maildir-folder)
-                                                     locs)
-  (elmo-maildir-set-mark-msgs folder locs ?R))
-
-(luna-define-method elmo-map-folder-unmark-answered ((folder
-                                                     elmo-maildir-folder)
-                                                    locs)
-  (elmo-maildir-delete-mark-msgs folder locs ?R))
+(defsubst elmo-maildir-set-mark-messages (folder locations mark remove)
+  (when mark
+    (if remove
+       (elmo-maildir-delete-mark-msgs folder locations mark)
+      (elmo-maildir-set-mark-msgs folder locations mark))))
+
+(luna-define-method elmo-map-folder-set-flag ((folder elmo-maildir-folder)
+                                             locations flag)
+  (let ((spec (cdr (assq flag elmo-maildir-flag-specs))))
+    (when spec
+      (elmo-maildir-set-mark-messages folder locations
+                                     (car spec) (nth 1 spec)))))
+
+(luna-define-method elmo-map-folder-unset-flag ((folder elmo-maildir-folder)
+                                               locations flag)
+  (let ((spec (cdr (assq flag elmo-maildir-flag-specs))))
+    (when spec
+      (elmo-maildir-set-mark-messages folder locations
+                                     (car spec) (not (nth 1 spec))))))
 
 (luna-define-method elmo-folder-list-subfolders
   ((folder elmo-maildir-folder) &optional one-level)
@@ -392,7 +393,7 @@ file name for maildir directories."
     filename))
 
 (luna-define-method elmo-folder-append-buffer ((folder elmo-maildir-folder)
-                                              &optional status number)
+                                              &optional flags number)
   (let ((basedir (elmo-maildir-folder-directory-internal folder))
        (src-buf (current-buffer))
        dst-buf filename)
@@ -410,6 +411,8 @@ file name for maildir directories."
           (expand-file-name
            (concat "new/" (file-name-nondirectory filename))
            basedir))
+         (elmo-folder-preserve-flags
+          folder (elmo-msgdb-get-message-id-from-buffer) flags)
          t)
       ;; If an error occured, return nil.
       (error))))
@@ -448,7 +451,7 @@ file name for maildir directories."
   (if (elmo-folder-message-file-p src-folder)
       (let ((src-msgdb-exists (not (zerop (elmo-folder-length src-folder))))
            (dir (elmo-maildir-folder-directory-internal folder))
-           (table (elmo-flag-table-load (elmo-folder-msgdb-path folder)))
+           (table (elmo-folder-flag-table folder))
            (succeeds numbers)
            filename flags id)
        (dolist (number numbers)
@@ -469,7 +472,7 @@ file name for maildir directories."
            (elmo-flag-table-set table id flags))
          (elmo-progress-notify 'elmo-folder-move-messages))
        (when (elmo-folder-persistent-p folder)
-         (elmo-flag-table-save (elmo-folder-msgdb-path folder) table))
+         (elmo-folder-close-flag-table folder))
        succeeds)
     (luna-call-next-method)))