- (let ((flds (elmo-multi-folder-children-internal folder))
- one-list-list
- (cur-number 0))
- (setq one-list-list (elmo-multi-split-numbers folder numbers))
- (while (< cur-number (length flds))
- (elmo-folder-delete-messages (nth cur-number flds)
- (nth cur-number one-list-list))
- (setq cur-number (+ 1 cur-number)))
- t))
-
-(luna-define-method elmo-folder-diff ((folder elmo-multi-folder)
- &optional numbers)
- (elmo-multi-folder-diff folder numbers))
-
-(defun elmo-multi-folder-diff (folder numbers)
- (let ((flds (elmo-multi-folder-children-internal folder))
- (numbers (mapcar 'car
- (elmo-msgdb-number-load
- (elmo-folder-msgdb-path folder))))
- (killed (elmo-msgdb-killed-list-load (elmo-folder-msgdb-path folder)))
- (count 0)
- (unsync 0)
- (messages 0)
- num-list
- diffs nums)
- ;; If first time, dummy numbers is used as current number list.
- (unless numbers
- (let ((i 0)
- (divider (elmo-multi-folder-divide-number-internal folder)))
- (dolist (folder flds)
- (setq i (+ i 1))
- (setq numbers
- (cons (* i divider) numbers)))))
- (setq num-list
- (elmo-multi-split-numbers folder
- (elmo-uniq-list
- (nconc
- (elmo-number-set-to-number-list killed)
- numbers))))
- (while flds
- (setq nums (elmo-folder-diff (car flds) (car num-list))
- nums (cons (or (elmo-diff-unread nums)
- (elmo-diff-new nums))
- (elmo-diff-all nums)))
- (setq diffs (nconc diffs (list nums)))
- (setq count (+ 1 count))
- (setq num-list (cdr num-list))
- (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-number-alist (folder 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 one-alist nil)
- (while (and alist
- (eq 0
- (/ (- (setq num (car (car alist)))
- (* elmo-multi-divide-number cur-number))
- (elmo-multi-folder-divide-number-internal folder))))
- (setq one-alist (nconc
- one-alist
- (list
- (cons
- (% num (* (elmo-multi-folder-divide-number-internal
- folder) cur-number))
- (cdr (car alist))))))
- (setq alist (cdr alist)))
- (setq split (nconc split (list one-alist))))
- split))
-
-(defun elmo-multi-split-mark-alist (folder mark-alist)
- (let ((cur-number 0)
- (alist (sort (copy-sequence mark-alist)
- (lambda (pair1 pair2)
- (< (car pair1)(car pair2)))))
- one-alist result)
- (while alist
- (setq cur-number (+ cur-number 1))
- (setq one-alist nil)
- (while (and alist
- (eq 0
- (/ (- (car (car alist))
- (* (elmo-multi-folder-divide-number-internal
- folder) cur-number))
- (elmo-multi-folder-divide-number-internal folder))))
- (setq one-alist (nconc
- one-alist
- (list
- (list (% (car (car alist))
- (* (elmo-multi-folder-divide-number-internal
- folder) cur-number))
- (cadr (car alist))))))
- (setq alist (cdr alist)))
- (setq result (nconc result (list one-alist))))
- result))
-
-(luna-define-method elmo-folder-list-unreads-internal
- ((folder elmo-multi-folder) unread-marks &optional mark-alist)
- (elmo-multi-folder-list-unreads-internal folder unread-marks))
-
-(defun elmo-multi-folder-list-unreads-internal (folder unread-marks)
- (let ((folders (elmo-multi-folder-children-internal folder))
- (mark-alists (elmo-multi-split-mark-alist
- folder
- (elmo-msgdb-get-mark-alist
- (elmo-folder-msgdb folder))))
- (cur-number 0)
- unreads
- all-unreads)
- (while folders
- (setq cur-number (+ cur-number 1))
- (unless (listp (setq unreads
- (elmo-folder-list-unreads-internal
- (car folders) unread-marks (car mark-alists))))
- (setq unreads (delq nil
- (mapcar
- (lambda (x)
- (if (member (cadr x) unread-marks)
- (car x)))
- (car mark-alists)))))
- (setq all-unreads
- (nconc all-unreads
- (mapcar
- (lambda (x)
- (+ x
- (* cur-number
- (elmo-multi-folder-divide-number-internal
- folder))))
- unreads)))
- (setq mark-alists (cdr mark-alists)
- folders (cdr folders)))
- all-unreads))
-
-(luna-define-method elmo-folder-list-importants-internal
- ((folder elmo-multi-folder) important-mark)
- (let ((folders (elmo-multi-folder-children-internal folder))
- (mark-alists (elmo-multi-split-mark-alist
- folder
- (elmo-msgdb-get-mark-alist
- (elmo-folder-msgdb folder))))
- (cur-number 0)
- importants
- all-importants)
- (while folders
- (setq cur-number (+ cur-number 1))
- (when (listp (setq importants
- (elmo-folder-list-importants-internal
- (car folders) important-mark)))
- (setq all-importants
- (nconc all-importants
- (mapcar
- (lambda (x)
- (+ x
- (* cur-number
- (elmo-multi-folder-divide-number-internal
- folder))))
- importants))))
- (setq mark-alists (cdr mark-alists)
- folders (cdr folders)))
- all-importants))
-
-(luna-define-method elmo-folder-list-messages-internal
- ((folder elmo-multi-folder) &optional nohide)
+ (dolist (element (elmo-multi-split-numbers folder numbers))
+ (when (cdr element)
+ (elmo-folder-delete-messages (car element) (cdr element))))
+ t)
+
+(luna-define-method elmo-folder-detach-messages ((folder elmo-multi-folder)
+ numbers)
+ (dolist (element (elmo-multi-split-numbers folder numbers))
+ (when (cdr element)
+ (elmo-folder-detach-messages (car element) (cdr element))))
+ t)
+
+(luna-define-method elmo-folder-diff ((folder elmo-multi-folder))
+ (elmo-multi-folder-diff folder))
+
+(defun elmo-multi-folder-diff (folder)
+ (let ((news 0)
+ (unreads 0)
+ (alls 0)
+ diff value)
+ (dolist (child (elmo-multi-folder-children-internal folder))
+ (setq diff (elmo-folder-diff child))
+ (setq news (and news
+ (setq value (elmo-diff-new diff))
+ (+ news value))
+ unreads (and unreads
+ (setq value (elmo-diff-unread diff))
+ (+ unreads value))
+ alls (and alls
+ (setq value (elmo-diff-all diff))
+ (+ alls value))))
+ (if unreads
+ (list news unreads alls)
+ (cons news alls))))
+
+(luna-define-method elmo-folder-list-messages
+ ((folder elmo-multi-folder) &optional visible-only in-msgdb)