X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=elmo%2Felmo-multi.el;h=5903b1c495e17241f93050e7b08bb04331834cc8;hb=298179ef92e7400bdab05f509725ebfb9672b038;hp=314bc490e07d8ad0182e1bc2712833841aaaeb33;hpb=c1e70a9ddc4f3c6a051665cc9d6c0bb27c263bc2;p=elisp%2Fwanderlust.git diff --git a/elmo/elmo-multi.el b/elmo/elmo-multi.el index 314bc49..5903b1c 100644 --- a/elmo/elmo-multi.el +++ b/elmo/elmo-multi.el @@ -88,9 +88,18 @@ &optional disable-killed ignore-msgdb - no-check) - (dolist (fld (elmo-multi-folder-children-internal folder)) - (elmo-folder-synchronize fld disable-killed ignore-msgdb no-check)) + no-check + mask) + (if mask + (dolist (element (elmo-multi-split-numbers folder mask)) + (when (cdr element) + (elmo-folder-synchronize (car element) + disable-killed + ignore-msgdb + no-check + (cdr element)))) + (dolist (fld (elmo-multi-folder-children-internal folder)) + (elmo-folder-synchronize fld disable-killed ignore-msgdb no-check))) 0) (luna-define-method elmo-folder-expand-msgdb-path ((folder @@ -101,14 +110,10 @@ elmo-msgdb-directory))) (luna-define-method elmo-folder-newsgroups ((folder elmo-multi-folder)) - (delq nil - (elmo-flatten - (mapcar - 'elmo-folder-newsgroups - (elmo-flatten - (mapcar - 'elmo-folder-get-primitive-list - (elmo-multi-folder-children-internal folder))))))) + (apply #'nconc + (mapcar + 'elmo-folder-newsgroups + (elmo-multi-folder-children-internal folder)))) (luna-define-method elmo-folder-get-primitive-list ((folder elmo-multi-folder)) (elmo-flatten @@ -149,6 +154,16 @@ (car pair) (elmo-message-entity (car pair) (cdr pair)) ignore-cache))) +(luna-define-method elmo-message-number ((folder elmo-multi-folder) + message-id) + (let ((children (elmo-multi-folder-children-internal folder)) + match) + (while children + (when (setq match (elmo-message-number (car children) message-id)) + (setq children nil)) + (setq children (cdr children))) + match)) + (luna-define-method elmo-message-entity ((folder elmo-multi-folder) key) (cond ((numberp key) @@ -185,18 +200,25 @@ (let ((pair (elmo-multi-real-folder-number folder number))) (elmo-message-field (car pair) (cdr pair) field))) +(luna-define-method elmo-message-flag-available-p ((folder + elmo-multi-folder) number + flag) + (let ((pair (elmo-multi-real-folder-number folder number))) + (elmo-message-flag-available-p (car pair) (cdr pair) flag))) + (luna-define-method elmo-message-flags ((folder elmo-multi-folder) number) (let ((pair (elmo-multi-real-folder-number folder number))) (elmo-message-flags (car pair) (cdr pair)))) (defun elmo-multi-split-numbers (folder numlist &optional as-is) (let ((numbers (sort numlist '<)) + (folders (elmo-multi-folder-children-internal folder)) (divider (elmo-multi-folder-divide-number-internal folder)) (cur-number 0) one-list numbers-list) (while numbers + (setq one-list (list (nth cur-number folders))) (setq cur-number (+ cur-number 1)) - (setq one-list nil) (while (and numbers (eq 0 (/ (- (car numbers) @@ -225,27 +247,17 @@ (luna-define-method elmo-folder-delete-messages ((folder elmo-multi-folder) numbers) - (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)) + (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) - (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-detach-messages (nth cur-number flds) - (nth cur-number one-list-list)) - (setq cur-number (+ 1 cur-number))) - t)) + (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)) @@ -272,51 +284,6 @@ (cons news alls) (list news unreads alls)))) -(luna-define-method elmo-folder-list-unreads ((folder elmo-multi-folder)) - (let ((cur-number 0) - unreads) - (dolist (child (elmo-multi-folder-children-internal folder)) - (setq cur-number (+ cur-number 1)) - (setq unreads - (nconc - unreads - (mapcar (lambda (x) - (+ x (* cur-number - (elmo-multi-folder-divide-number-internal - folder)))) - (elmo-folder-list-unreads child))))) - unreads)) - -(luna-define-method elmo-folder-list-answereds ((folder elmo-multi-folder)) - (let ((cur-number 0) - answereds) - (dolist (child (elmo-multi-folder-children-internal folder)) - (setq cur-number (+ cur-number 1)) - (setq answereds - (nconc - answereds - (mapcar (lambda (x) - (+ x (* cur-number - (elmo-multi-folder-divide-number-internal - folder)))) - (elmo-folder-list-answereds child))))) - answereds)) - -(luna-define-method elmo-folder-list-importants ((folder elmo-multi-folder)) - (let ((cur-number 0) - importants) - (dolist (child (elmo-multi-folder-children-internal folder)) - (setq cur-number (+ cur-number 1)) - (setq importants - (nconc - importants - (mapcar (lambda (x) - (+ x (* cur-number - (elmo-multi-folder-divide-number-internal - folder)))) - (elmo-folder-list-importants child))))) - importants)) - (luna-define-method elmo-folder-list-messages ((folder elmo-multi-folder) &optional visible-only in-msgdb) (let* ((flds (elmo-multi-folder-children-internal folder)) @@ -447,61 +414,22 @@ (setq msg-list (cdr msg-list))) ret-val)) -(luna-define-method elmo-folder-flag-as-important ((folder - elmo-multi-folder) - numbers - &optional - is-local) - (dolist (folder-numbers (elmo-multi-make-folder-numbers-list folder numbers)) - (elmo-folder-flag-as-important (car folder-numbers) - (cdr folder-numbers) - is-local))) - -(luna-define-method elmo-folder-unflag-important ((folder - elmo-multi-folder) - numbers - &optional - is-local) - (dolist (folder-numbers (elmo-multi-make-folder-numbers-list folder numbers)) - (elmo-folder-unflag-important (car folder-numbers) - (cdr folder-numbers) - is-local))) - -(luna-define-method elmo-folder-flag-as-read ((folder - elmo-multi-folder) - numbers - &optional is-local) - (dolist (folder-numbers (elmo-multi-make-folder-numbers-list folder numbers)) - (elmo-folder-flag-as-read (car folder-numbers) - (cdr folder-numbers) - is-local))) - -(luna-define-method elmo-folder-unflag-read ((folder - elmo-multi-folder) - numbers - &optional is-local) - (dolist (folder-numbers (elmo-multi-make-folder-numbers-list folder numbers)) - (elmo-folder-unflag-read (car folder-numbers) - (cdr folder-numbers) - is-local))) - -(luna-define-method elmo-folder-flag-as-answered ((folder - elmo-multi-folder) - numbers - &optional is-local) - (dolist (folder-numbers (elmo-multi-make-folder-numbers-list folder numbers)) - (elmo-folder-flag-as-answered (car folder-numbers) - (cdr folder-numbers) - is-local))) - -(luna-define-method elmo-folder-unflag-answered ((folder - elmo-multi-folder) - numbers - &optional is-local) - (dolist (folder-numbers (elmo-multi-make-folder-numbers-list folder numbers)) - (elmo-folder-unflag-answered (car folder-numbers) - (cdr folder-numbers) - is-local))) +(luna-define-method elmo-folder-set-flag ((folder elmo-multi-folder) + numbers + flag + &optional is-local) + (dolist (pair (elmo-multi-make-folder-numbers-list folder numbers)) + (elmo-folder-set-flag (car pair) (cdr pair) flag is-local)) + (elmo-folder-notify-event folder 'flag-changed numbers)) + +(luna-define-method elmo-folder-unset-flag ((folder elmo-multi-folder) + numbers + flag + &optional is-local) + (dolist (pair (elmo-multi-make-folder-numbers-list folder numbers)) + (ignore-errors + (elmo-folder-unset-flag (car pair) (cdr pair) flag is-local))) + (elmo-folder-notify-event folder 'flag-changed numbers)) (luna-define-method elmo-folder-list-flagged ((folder elmo-multi-folder) flag @@ -533,16 +461,13 @@ sum)) (luna-define-method elmo-folder-count-flags ((folder elmo-multi-folder)) - (let ((new 0) - (unreads 0) - (answered 0) - flags) + (let (flag-alist element) (dolist (child (elmo-multi-folder-children-internal folder)) - (setq flags (elmo-folder-count-flags child)) - (setq new (+ new (nth 0 flags))) - (setq unreads (+ unreads (nth 1 flags))) - (setq answered (+ answered (nth 2 flags)))) - (list new unreads answered))) + (dolist (pair (elmo-folder-count-flags child)) + (if (setq element (assq (car pair) flag-alist)) + (setcdr element (+ (cdr element) (cdr pair))) + (setq flag-alist (cons pair flag-alist))))) + flag-alist)) (require 'product) (product-provide (provide 'elmo-multi) (require 'elmo-version))