(elmo-imap4-flags-to-imap): Preserve argument
[elisp/wanderlust.git] / elmo / elmo-map.el
index aafd7a8..08f23df 100644 (file)
 (luna-define-generic elmo-map-folder-list-message-locations (folder)
   "Return a location list of the FOLDER.")
 
-(luna-define-generic elmo-map-folder-unmark-important (folder locations)
-  "")
-
-(luna-define-generic elmo-map-folder-mark-as-important (folder locations)
-  "")
+(luna-define-generic elmo-map-folder-set-flag (folder locations flag)
+  "Set FLAG to LOCATIONS.")
 
-(luna-define-generic elmo-map-folder-unmark-read (folder locations)
-  "")
-
-(luna-define-generic elmo-map-folder-mark-as-read (folder locations)
-  "")
-
-(luna-define-generic elmo-map-folder-unmark-answered (folder locations)
-  "")
-
-(luna-define-generic elmo-map-folder-mark-as-answered (folder locations)
-  "")
+(luna-define-generic elmo-map-folder-unset-flag (folder locations flag)
+  "Unset FLAG from LOCATIONS.")
 
 (luna-define-generic elmo-map-message-fetch (folder location
                                                    strategy
                                                    unseen)
   "")
 
-(luna-define-generic elmo-map-folder-list-unreads (folder)
-  "")
-
-(luna-define-method elmo-map-folder-list-unreads ((folder elmo-map-folder))
-  t)
-
-(luna-define-generic elmo-map-folder-list-importants (folder)
-  "")
-
-(luna-define-method elmo-map-folder-list-importants ((folder elmo-map-folder))
-  t)
-
-(luna-define-generic elmo-map-folder-list-answereds (folder)
-  "")
-
-(luna-define-method elmo-map-folder-list-answereds ((folder elmo-map-folder))
-  t)
-
 (luna-define-generic elmo-map-folder-delete-messages (folder locations)
   "")
 
   (let ((numbers (mapcar
                  'car
                  (elmo-map-folder-location-alist-internal folder))))
-    (setq numbers (elmo-living-messages numbers (elmo-folder-killed-list-internal folder)))
+    (setq numbers (elmo-living-messages
+                  numbers
+                  (elmo-folder-killed-list-internal folder)))
     (prog1
        (cons (elmo-max-of-list numbers)
              (length numbers))
 (luna-define-method elmo-folder-pack-numbers ((folder elmo-map-folder))
   (let* ((msgdb (elmo-folder-msgdb folder))
         (numbers (sort (elmo-folder-list-messages folder nil 'in-msgdb) '<))
-        (new-msgdb (elmo-make-msgdb))
+        (new-msgdb (elmo-make-msgdb (elmo-folder-msgdb-path folder)))
         (number 1)
         total location entity)
-    (elmo-msgdb-set-path new-msgdb (elmo-folder-msgdb-path folder))
     (setq total (length numbers))
     (elmo-with-progress-display (> total elmo-display-progress-threshold)
        (elmo-folder-pack-numbers total "Packing...")
       (dolist (old-number numbers)
        (setq entity (elmo-msgdb-message-entity msgdb old-number))
-       (elmo-msgdb-overview-entity-set-number entity number)
+       (elmo-message-entity-set-number entity number)
        (elmo-msgdb-append-entity new-msgdb entity
                                  (elmo-msgdb-flags msgdb old-number))
        (setq location
 
 (luna-define-method elmo-folder-open-internal ((folder elmo-map-folder))
   (elmo-map-folder-location-setup
-   folder 
+   folder
    (elmo-msgdb-location-load (elmo-folder-msgdb-path folder)))
   (if (elmo-folder-plugged-p folder)
       (elmo-map-folder-update-locations
 (luna-define-method elmo-folder-close-internal ((folder elmo-map-folder))
   (elmo-map-folder-set-location-alist-internal folder nil)
   (elmo-map-folder-set-location-hash-internal folder nil))
-  
+
 (luna-define-method elmo-folder-check ((folder elmo-map-folder))
   (elmo-map-folder-update-locations
    folder
    (elmo-map-folder-list-message-locations folder)))
 
+(luna-define-method elmo-folder-next-message-number ((folder elmo-map-folder))
+  (1+ (elmo-map-folder-number-max-internal folder)))
+
 (luna-define-method elmo-folder-clear :around ((folder elmo-map-folder)
                                               &optional keep-killed)
   (unless keep-killed
   ((folder elmo-map-folder) &optional nohide)
   (mapcar 'car (elmo-map-folder-location-alist-internal folder)))
 
-(luna-define-method elmo-folder-unmark-important :before ((folder
-                                                          elmo-map-folder)
-                                                         numbers
-                                                         &optional
-                                                         ignore-flags)
-  (unless ignore-flags
-    (elmo-map-folder-unmark-important
-     folder
-     (elmo-map-folder-numbers-to-locations folder numbers))))
-
-(luna-define-method elmo-folder-mark-as-important :before ((folder
-                                                           elmo-map-folder)
-                                                          numbers
-                                                          &optional
-                                                          ignore-flags)
-  (unless ignore-flags
-    (elmo-map-folder-mark-as-important
-     folder
-     (elmo-map-folder-numbers-to-locations folder numbers))))
-
-(luna-define-method elmo-folder-unmark-read :before ((folder elmo-map-folder)
-                                                    numbers
-                                                    &optional ignore-flags)
-  (unless ignore-flags
-    (elmo-map-folder-unmark-read
+(luna-define-method elmo-folder-set-flag :before ((folder elmo-map-folder)
+                                                 numbers
+                                                 flag
+                                                 &optional is-local)
+  (unless is-local
+    (elmo-map-folder-set-flag
      folder
-     (elmo-map-folder-numbers-to-locations folder numbers))))
-
-(luna-define-method elmo-folder-mark-as-read :before ((folder
-                                                      elmo-map-folder)
-                                                     numbers
-                                                     &optional ignore-flags)
-  (unless ignore-flags
-    (elmo-map-folder-mark-as-read
+     (elmo-map-folder-numbers-to-locations folder numbers)
+     flag)))
+
+(luna-define-method elmo-folder-unset-flag :before ((folder elmo-map-folder)
+                                                   numbers
+                                                   flag
+                                                   &optional is-local)
+  (unless is-local
+    (elmo-map-folder-unset-flag
      folder
-     (elmo-map-folder-numbers-to-locations folder numbers))))
-
-(luna-define-method elmo-folder-unmark-answered :before ((folder
-                                                         elmo-map-folder)
-                                                        numbers)
-  (elmo-map-folder-unmark-answered
-   folder
-   (elmo-map-folder-numbers-to-locations folder numbers)))
-
-(luna-define-method elmo-folder-mark-as-answered :before ((folder
-                                                         elmo-map-folder)
-                                                        numbers)
-  (elmo-map-folder-mark-as-answered
-   folder
-   (elmo-map-folder-numbers-to-locations folder numbers)))
+     (elmo-map-folder-numbers-to-locations folder numbers)
+     flag)))
 
 (luna-define-method elmo-message-fetch-internal ((folder elmo-map-folder)
                                                 number strategy
    (elmo-map-message-location folder number)
    strategy section unread))
 
-(luna-define-method elmo-folder-list-unreads :around ((folder elmo-map-folder))
-  (let ((locations (elmo-map-folder-list-unreads folder)))
+(luna-define-method elmo-folder-list-flagged-internal ((folder elmo-map-folder)
+                                                      flag)
+  (let ((locations (elmo-map-folder-list-flagged folder flag)))
     (if (listp locations)
        (elmo-map-folder-locations-to-numbers folder locations)
-      (luna-call-next-method))))
+      t)))
 
-(luna-define-method elmo-folder-list-importants :around ((folder
-                                                         elmo-map-folder))
-  (let ((locations (elmo-map-folder-list-importants folder)))
-    (if (listp locations)
-       (elmo-map-folder-locations-to-numbers folder locations)
-      (luna-call-next-method))))
+(luna-define-generic elmo-map-folder-list-flagged (folder flag)
+  "Return a list of message location in the FOLDER with FLAG.
+Return t if the message list is not available.")
 
-(luna-define-method elmo-folder-list-answereds :around ((folder
-                                                        elmo-map-folder))
-  (let ((locations (elmo-map-folder-list-answereds folder)))
-    (if (listp locations)
-       (elmo-map-folder-locations-to-numbers folder locations)
-      (luna-call-next-method))))
+(luna-define-method elmo-map-folder-list-flagged ((folder elmo-map-folder)
+                                                 flag)
+  t)
 
-(luna-define-method elmo-folder-delete-messages ((folder elmo-map-folder)
-                                                numbers)
+(luna-define-method elmo-folder-delete-messages-internal ((folder
+                                                          elmo-map-folder)
+                                                         numbers)
   (elmo-map-folder-delete-messages
    folder
-   (elmo-map-folder-numbers-to-locations folder numbers))
-  (dolist (number numbers)
-    (elmo-map-folder-set-location-alist-internal
-     folder
-     (delq (elmo-get-hash-val
-           (concat "#" (int-to-string number))
-           (elmo-map-folder-location-hash-internal
-            folder))
-          (elmo-map-folder-location-alist-internal folder))))
-  t) ; success
+   (elmo-map-folder-numbers-to-locations folder numbers)))
+
+(luna-define-method elmo-folder-detach-messages :around ((folder
+                                                         elmo-map-folder)
+                                                        numbers)
+  (when (luna-call-next-method)
+    (dolist (number numbers)
+      (elmo-map-folder-set-location-alist-internal
+       folder
+       (delq (elmo-get-hash-val
+             (concat "#" (int-to-string number))
+             (elmo-map-folder-location-hash-internal
+              folder))
+            (elmo-map-folder-location-alist-internal folder)))
+      (elmo-clear-hash-val (concat "#" (int-to-string number))
+                          (elmo-map-folder-location-hash-internal
+                           folder)))
+    t)) ; success
 
 (require 'product)
 (product-provide (provide 'elmo-map) (require 'elmo-version))