Fix typo.
[elisp/wanderlust.git] / elmo / elmo-multi.el
index d711931..9037ace 100644 (file)
@@ -1,6 +1,6 @@
 ;;; elmo-multi.el -- Multiple Folder Interface for ELMO.
 
-;; Copyright 1998,1999,2000 Yuuichi Teranishi <teranisi@gohome.org>
+;; Copyright (C) 1998,1999,2000 Yuuichi Teranishi <teranisi@gohome.org>
 
 ;; Author: Yuuichi Teranishi <teranisi@gohome.org>
 ;; Keywords: mail, net news
@@ -35,7 +35,7 @@
 
 (defun elmo-multi-msgdb (msgdb base)
   (list (mapcar (function
-                (lambda (x) 
+                (lambda (x)
                   (elmo-msgdb-overview-entity-set-number
                    x
                    (+ base
@@ -64,8 +64,8 @@
       (setq one-list-list (elmo-multi-get-intlist-list numlist))
       (setq cur-number 0)
       (while (< cur-number (length flds))
-       (setq ret-val 
-             (elmo-msgdb-append 
+       (setq ret-val
+             (elmo-msgdb-append
               ret-val
               (elmo-multi-msgdb
                (elmo-msgdb-create-as-numlist (nth cur-number flds)
@@ -80,7 +80,7 @@
 ;; returns append-msgdb
 (defun elmo-multi-delete-crossposts (already-msgdb append-msgdb)
   (let* ((number-alist (elmo-msgdb-get-number-alist append-msgdb))
-        (dummy (copy-sequence (append 
+        (dummy (copy-sequence (append
                                number-alist
                                (elmo-msgdb-get-number-alist already-msgdb))))
         (cur number-alist)
            ;; base is also same...delete it!
            (setq to-be-deleted (append to-be-deleted (list (car cur))))))
       (setq cur (cdr cur)))
-    (setq overview (elmo-delete-if 
+    (setq overview (elmo-delete-if
                    (function
                     (lambda (x)
                       (assq
                        (elmo-msgdb-overview-entity-get-number x)
                        to-be-deleted)))
                    (elmo-msgdb-get-overview append-msgdb)))
-    (setq mark-alist (elmo-delete-if 
+    (setq mark-alist (elmo-delete-if
                      (function
                       (lambda (x)
                         (assq
       (setq one-list-list (elmo-multi-get-intlist-list numlist))
       (setq cur-number 0)
       (while (< cur-number (length flds))
-       (setq ret-val 
-             (elmo-msgdb-append 
+       (setq ret-val
+             (elmo-msgdb-append
               ret-val
               (elmo-multi-msgdb
                (elmo-msgdb-create (nth cur-number flds)
 (defun elmo-multi-append-msg (spec string)
   (error "Cannot append messages to multi folder"))
 
-(defun elmo-multi-read-msg (spec number outbuf)
+(defun elmo-multi-read-msg (spec number outbuf &optional msgdb unread)
   (let* ((flds (cdr spec))
         (folder (nth (- (/ number elmo-multi-divide-number) 1) flds))
         (number (% number elmo-multi-divide-number)))
-    (elmo-call-func folder "read-msg" number outbuf)))
+    (elmo-call-func folder "read-msg" number outbuf msgdb unread)))
 
 (defun elmo-multi-delete-msgs (spec msgs)
   (let ((flds (cdr spec))
        (cur-number 0))
     (setq one-list-list (elmo-multi-get-intlist-list msgs))
     (while (< cur-number (length flds))
-      (elmo-delete-msgs (nth cur-number flds) 
+      (elmo-delete-msgs (nth cur-number flds)
                        (nth cur-number one-list-list))
       (setq cur-number (+ 1 cur-number)))
     t))
 
-(defun elmo-multi-mark-alist-list (mark-alist)
+(defun elmo-multi-folder-diff (spec folder &optional number-list)
+  (let ((flds (cdr spec))
+       (num-alist-list
+        (elmo-multi-split-number-alist
+         (elmo-msgdb-number-load (elmo-msgdb-expand-path spec))))
+       (count 0)
+       (unsync 0)
+       (messages 0)
+       diffs)
+    (while flds
+      (setq diffs (nconc diffs (list (elmo-folder-diff
+                                     (car flds)
+                                     (mapcar 'car
+                                             (nth count num-alist-list))))))
+      (setq count (+ 1 count))
+      (setq flds (cdr flds)))
+    (while diffs
+      (and (car (car diffs))
+          (setq unsync (+ unsync (car (car diffs)))))
+      (setq messages  (+ messages (cdr (car diffs))))
+      (setq diffs (cdr diffs)))
+    (elmo-folder-set-info-hashtb folder
+                                nil messages)
+    (cons unsync messages)))
+
+(defun elmo-multi-split-mark-alist (mark-alist)
   (let ((cur-number 0)
+       (alist (sort (copy-sequence mark-alist)
+                    (lambda (pair1 pair2)
+                      (< (car pair1)(car pair2)))))
        one-alist result)
-    (while mark-alist
+    (while alist
       (setq cur-number (+ cur-number 1))
       (setq one-alist nil)
-      (while (and mark-alist
+      (while (and alist
                  (eq 0
-                     (/ (- (car (car mark-alist))
+                     (/ (- (car (car alist))
                            (* elmo-multi-divide-number cur-number))
                         elmo-multi-divide-number)))
        (setq one-alist (nconc
-                        one-alist 
-                        (list 
-                         (list (% (car (car mark-alist))
+                        one-alist
+                        (list
+                         (list (% (car (car alist))
                                   (* elmo-multi-divide-number cur-number))
-                               (cadr (car mark-alist))))))
-       (setq mark-alist (cdr mark-alist)))
+                               (cadr (car alist))))))
+       (setq alist (cdr alist)))
       (setq result (nconc result (list one-alist))))
     result))
 
-(defun elmo-multi-list-folder-unread (spec mark-alist unread-marks)
-  (let* ((flds (cdr spec))
-        (cur-number 0)
-        mark-alist-list
-        ret-val)
-    (setq mark-alist-list (elmo-multi-mark-alist-list mark-alist))
-    (while flds
+(defun elmo-multi-split-number-alist (number-alist)
+  (let ((alist (sort (copy-sequence number-alist)
+                    (lambda (pair1 pair2)
+                      (< (car pair1)(car pair2)))))
+       (cur-number 0)
+       one-alist split num)
+    (while alist
       (setq cur-number (+ cur-number 1))
-      (setq ret-val (append 
-                    ret-val
-                    (mapcar 
-                     (function
-                      (lambda (x)
-                        (+ 
-                         (* elmo-multi-divide-number cur-number) x)))
-                     (elmo-list-folder-unread (car flds)
-                                              (car mark-alist-list) 
-                                              unread-marks))))
-      (setq mark-alist-list (cdr mark-alist-list))
-      (setq flds (cdr flds)))
-    ret-val))
-
-(defun elmo-multi-list-folder-important (spec overview)
-  (let* ((flds (cdr spec))
-        (cur-number 0)
-        ret-val)
-    (while flds
-      (setq cur-number (+ cur-number 1))
-      (setq ret-val (append 
-                    ret-val
-                    (mapcar 
+      (setq one-alist nil)
+      (while (and alist
+                 (eq 0
+                     (/ (- (setq num (car (car alist)))
+                           (* elmo-multi-divide-number cur-number))
+                        elmo-multi-divide-number)))
+       (setq one-alist (nconc
+                        one-alist
+                        (list
+                         (cons
+                          (% num (* elmo-multi-divide-number cur-number))
+                          (cdr (car alist))))))
+       (setq alist (cdr alist)))
+      (setq split (nconc split (list one-alist))))
+    split))
+
+(defun elmo-multi-list-folder-unread (spec number-alist mark-alist
+                                          unread-marks)
+  (let ((folders (cdr spec))
+       (cur-number 0)
+       (split-mark-alist (elmo-multi-split-mark-alist mark-alist))
+       (split-number-alist (elmo-multi-split-number-alist number-alist))
+       unreads)
+    (while folders
+      (setq cur-number (+ cur-number 1)
+           unreads (append
+                    unreads
+                    (mapcar
                      (function
                       (lambda (x)
-                        (+ 
+                        (+
                          (* elmo-multi-divide-number cur-number) x)))
-                     (elmo-list-folder-important (car flds) overview))))
-      (setq flds (cdr flds)))
-    ret-val))
-
-(defun elmo-multi-list-folder (spec)
+                     (elmo-list-folder-unread (car folders)
+                                              (car split-number-alist)
+                                              (car split-mark-alist)
+                                              unread-marks)))
+           split-number-alist (cdr split-number-alist)
+           split-mark-alist (cdr split-mark-alist)
+           folders (cdr folders)))
+    unreads))
+
+(defun elmo-multi-list-folder-important (spec number-alist)
+  (let ((folders (cdr spec))
+       (cur-number 0)
+       (split-number-alist (elmo-multi-split-number-alist number-alist))
+       importants)
+    (while folders
+      (setq cur-number (+ cur-number 1)
+           importants (nconc
+                       importants
+                       (mapcar
+                        (function
+                         (lambda (x)
+                           (+ (* elmo-multi-divide-number cur-number) x)))
+                        (elmo-list-folder-important
+                         (car folders)
+                         (car split-number-alist))))
+           folders (cdr folders)))
+    importants))
+
+(defun elmo-multi-list-folder (spec &optional nohide)
   (let* ((flds (cdr spec))
         (cur-number 0)
-        ret-val)
+        (killed (and elmo-use-killed-list
+                     (elmo-msgdb-killed-list-load
+                      (elmo-msgdb-expand-path spec))))
+        numbers)
     (while flds
       (setq cur-number (+ cur-number 1))
-      (setq ret-val (append 
-                    ret-val
-                    (mapcar 
+      (setq numbers (append
+                    numbers
+                    (mapcar
                      (function
                       (lambda (x)
-                        (+ 
+                        (+
                          (* elmo-multi-divide-number cur-number) x)))
                      (elmo-list-folder (car flds)))))
       (setq flds (cdr flds)))
-    ret-val))
+    (elmo-living-messages numbers killed)))
 
 (defun elmo-multi-folder-exists-p (spec)
   (let* ((flds (cdr spec)))
        (if (null cur-numlist)
            ;; t means filter all.
            (setq cur-numlist t)))
-      (setq ret-val (append 
+      (setq ret-val (append
                     ret-val
-                    (elmo-list-filter 
+                    (elmo-list-filter
                      cur-numlist
-                     (mapcar 
+                     (mapcar
                       (function
                        (lambda (x)
-                         (+ 
+                         (+
                           (* elmo-multi-divide-number cur-number) x)))
                       (elmo-call-func
                        (car flds) "search" condition)))))
     ret-val))
 
 (defun elmo-multi-use-cache-p (spec number)
-  (elmo-call-func (nth (- (/ number elmo-multi-divide-number) 1) 
+  (elmo-call-func (nth (- (/ number elmo-multi-divide-number) 1)
                       (cdr spec))
-                 "use-cache-p" 
+                 "use-cache-p"
                  (% number elmo-multi-divide-number)))
 
 (defun elmo-multi-local-file-p (spec number)
-  (elmo-call-func (nth (- (/ number elmo-multi-divide-number) 1) 
+  (elmo-call-func (nth (- (/ number elmo-multi-divide-number) 1)
                       (cdr spec))
-                 "local-file-p" 
+                 "local-file-p"
                  (% number elmo-multi-divide-number)))
 
 (defun elmo-multi-commit (spec)
 (defun elmo-multi-sync-number-alist (spec number-alist)
   (let ((folder-list (cdr spec))
        (number-alist-list
-        (elmo-multi-get-number-alist-list number-alist))
+        (elmo-multi-split-number-alist number-alist))
        (multi-base 0)
        append-alist result-alist)
     (while folder-list
       (incf multi-base)
       (setq append-alist
            (elmo-call-func (nth (- multi-base 1) (cdr spec)) ;; folder name
-                           "sync-number-alist" 
+                           "sync-number-alist"
                            (nth (- multi-base 1) number-alist-list)))
-      (mapcar 
+      (mapcar
        (function
        (lambda (x)
-         (setcar x 
+         (setcar x
                  (+ (* elmo-multi-divide-number multi-base) (car x)))))
        append-alist)
       (setq result-alist (nconc result-alist append-alist))
       (setq folder-list (cdr folder-list)))
     result-alist))
 
-(provide 'elmo-multi)
+(require 'product)
+(product-provide (provide 'elmo-multi) (require 'elmo-version))
 
 ;;; elmo-multi.el ends here