(elmo-message-field): Define.
[elisp/wanderlust.git] / elmo / elmo-maildir.el
index 017ad3f..fd41839 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
@@ -300,31 +306,25 @@ LOCATION."
      mark))
   t)
 
-(luna-define-method elmo-map-folder-flag-as-important ((folder elmo-maildir-folder)
-                                                      locs)
-  (elmo-maildir-set-mark-msgs folder locs ?F))
-  
-(luna-define-method elmo-map-folder-unflag-important ((folder elmo-maildir-folder)
-                                                     locs)
-  (elmo-maildir-delete-mark-msgs folder locs ?F))
-
-(luna-define-method elmo-map-folder-flag-as-read ((folder elmo-maildir-folder)
-                                                 locs)
-  (elmo-maildir-set-mark-msgs folder locs ?S))
-
-(luna-define-method elmo-map-folder-unflag-read ((folder elmo-maildir-folder)
-                                                locs)
-  (elmo-maildir-delete-mark-msgs folder locs ?S))
-
-(luna-define-method elmo-map-folder-flag-as-answered ((folder
-                                                      elmo-maildir-folder)
-                                                     locs)
-  (elmo-maildir-set-mark-msgs folder locs ?R))
-
-(luna-define-method elmo-map-folder-unflag-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)
@@ -393,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)
@@ -406,11 +406,15 @@ file name for maildir directories."
          (as-binary-output-file
           (write-region (point-min) (point-max) filename nil 'no-msg))
          ;; add link from new.
-         (elmo-add-name-to-file
+         ;; Some filesystem (like AFS) does not have hard-link.
+         ;; So we use elmo-copy-file instead of elmo-add-name-to-file here.
+         (elmo-copy-file
           filename
           (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))))
@@ -449,7 +453,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)
@@ -458,7 +462,9 @@ file name for maildir directories."
          (elmo-copy-file
           (elmo-message-file-name src-folder number)
           filename)
-         (elmo-add-name-to-file
+         ;; Some filesystem (like AFS) does not have hard-link.
+         ;; So we use elmo-copy-file instead of elmo-add-name-to-file here.
+         (elmo-copy-file
           filename
           (expand-file-name
            (concat "new/" (file-name-nondirectory filename))
@@ -470,7 +476,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)))
 
@@ -482,7 +488,8 @@ file name for maildir directories."
       (if (and file
               (file-writable-p file)
               (not (file-directory-p file)))
-         (delete-file file)))))
+         (delete-file file))))
+  t)
 
 (luna-define-method elmo-map-message-fetch ((folder elmo-maildir-folder)
                                            location strategy