* elmo-archive.el (elmo-archive-field-condition-match)
[elisp/wanderlust.git] / elmo / elmo-multi.el
index 12eb2c4..122a6df 100644 (file)
 
 (defmacro elmo-multi-real-folder-number (folder number)
   "Returns a cons cell of real FOLDER and NUMBER."
-  (` (cons (nth (-
-                (/ (, number)
-                   (elmo-multi-folder-divide-number-internal (, folder)))
-                1) (elmo-multi-folder-children-internal (, folder)))
-          (% (, number) (elmo-multi-folder-divide-number-internal
-                         (, folder))))))
+  `(cons (nth (-
+              (/ ,number
+                 (elmo-multi-folder-divide-number-internal ,folder))
+              1) (elmo-multi-folder-children-internal ,folder))
+        (% ,number (elmo-multi-folder-divide-number-internal
+                    ,folder))))
 
 (luna-define-method elmo-folder-initialize ((folder
                                             elmo-multi-folder)
    (elmo-define-signal-filter (folder sender)
      (memq sender (elmo-multi-folder-children-internal folder))))
   (elmo-connect-signal
-   nil 'cache-changed folder
-   (elmo-define-signal-handler (folder child number)
-     (elmo-emit-signal
-      'flag-changed folder
-      (car (elmo-multi-map-numbers folder child (list number)))))
+   nil 'status-changed folder
+   (elmo-define-signal-handler (folder child numbers)
+     (elmo-emit-signal 'status-changed folder
+                      (elmo-multi-map-numbers folder child numbers)))
    (elmo-define-signal-filter (folder sender)
      (memq sender (elmo-multi-folder-children-internal folder))))
   (elmo-connect-signal
   (dolist (fld (elmo-multi-folder-children-internal folder))
     (elmo-folder-open-internal fld)))
 
+(luna-define-method elmo-folder-open-internal-p ((folder elmo-multi-folder))
+  (let (open)
+    (dolist (fld (elmo-multi-folder-children-internal folder))
+      (setq open (and open (elmo-folder-open-internal-p fld))))))
+
 (luna-define-method elmo-folder-check ((folder elmo-multi-folder))
   (dolist (fld (elmo-multi-folder-children-internal folder))
     (elmo-folder-check fld)))
   (dolist (fld (elmo-multi-folder-children-internal folder))
     (elmo-folder-close fld)))
 
+(luna-define-method elmo-message-killed-p ((folder elmo-multi-folder) number)
+  (let ((pair (elmo-multi-real-folder-number folder number)))
+    (elmo-message-killed-p (car pair) (cdr pair))))
+
 (luna-define-method elmo-folder-synchronize ((folder elmo-multi-folder)
                                             &optional
                                             disable-killed
            (nconc
             numbers
             (mapcar
-             (function
-              (lambda (x)
-                (+
-                 (* (elmo-multi-folder-divide-number-internal
-                     folder) cur-number) x)))
+             (lambda (x)
+               (+
+                (* (elmo-multi-folder-divide-number-internal
+                    folder) cur-number) x))
              list)))
       (setq flds (cdr flds)))
     numbers))
       (setq cur-number (+ cur-number 1))
       (setq matches (append matches
                            (mapcar
-                            (function
-                             (lambda (x)
-                               (+
-                                (* (elmo-multi-folder-divide-number-internal
-                                    folder)
-                                   cur-number)
-                                x)))
+                            (lambda (x)
+                              (+
+                               (* (elmo-multi-folder-divide-number-internal
+                                   folder)
+                                  cur-number)
+                               x))
                             (elmo-folder-search
                              (car flds) condition))))
       (setq flds (cdr flds)))
            (nconc
             numbers
             (mapcar
-             (function
-              (lambda (x)
-                (+
-                 (* (elmo-multi-folder-divide-number-internal folder)
-                    cur-number) x)))
+             (lambda (x)
+               (+
+                (* (elmo-multi-folder-divide-number-internal folder)
+                   cur-number) x))
              (elmo-folder-list-flagged child flag in-msgdb)))))
     numbers))
 
          (setq flag-alist (cons pair flag-alist)))))
     flag-alist))
 
+(luna-define-method elmo-folder-recover-messages ((folder elmo-multi-folder)
+                                                 numbers)
+  (dolist (element (elmo-multi-split-numbers folder numbers))
+    (when (cdr element)
+      (elmo-folder-recover-messages (car element) (cdr element)))))
+
+(defun elmo-folder-append-messages-multi-* (dst-folder
+                                           src-folder
+                                           numbers
+                                           same-number)
+  (if same-number
+      (elmo-folder-append-messages dst-folder src-folder numbers same-number
+                                  'elmo-folder-append-messages-multi-*)
+    (let ((divider (elmo-multi-folder-divide-number-internal src-folder))
+         (cur-number 0)
+         succeeds)
+      (dolist (element (elmo-multi-split-numbers src-folder numbers))
+       (setq cur-number (+ cur-number 1))
+       (when (cdr element)
+         (setq succeeds
+               (nconc
+                succeeds
+                (mapcar
+                 (lambda (x)
+                   (+ (* divider cur-number) x))
+                 (elmo-folder-append-messages
+                  dst-folder (car element) (cdr element)))))))
+      succeeds)))
+
 (require 'product)
 (product-provide (provide 'elmo-multi) (require 'elmo-version))