X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=elmo%2Felmo.el;h=5d602566d0993bff5bed133607c221f8434486fc;hb=16b8dcb951d32d536cd4b065dd4a2a53e118d261;hp=17ee59cdf34c8ce5d73f6264ad29a3cba795c776;hpb=15584a2bfa1f523df1d8f689642ab36e8873a7ca;p=elisp%2Fwanderlust.git diff --git a/elmo/elmo.el b/elmo/elmo.el index 17ee59c..5d60256 100644 --- a/elmo/elmo.el +++ b/elmo/elmo.el @@ -230,8 +230,11 @@ If second optional IN-MSGDB is non-nil, only messages in the msgdb are listed.") (setq list (elmo-msgdb-list-messages (elmo-folder-msgdb folder)))) (if visible-only (elmo-living-messages list killed-list) - (elmo-uniq-list - (nconc (elmo-number-set-to-number-list killed-list) list))))) + (if in-msgdb + (elmo-uniq-list + (nconc (elmo-number-set-to-number-list killed-list) list) + #'delq) + list)))) (luna-define-generic elmo-folder-list-unreads (folder) "Return a list of unread message numbers contained in FOLDER.") @@ -377,6 +380,10 @@ If IS-LOCAL is non-nil, only the local flag is updated.") FOLDER is the ELMO folder structure. If IS-LOCAL is non-nil, only the local flag is updated.") +(luna-define-generic elmo-folder-next-message-number (folder) + "The next message number that will be assigned to a new message. +FOLDER is the ELMO folder structure.") + (luna-define-generic elmo-folder-append-buffer (folder &optional flag number) "Append current buffer as a new message. @@ -952,6 +959,10 @@ Return a cons cell of (NUMBER-CROSSPOSTS . NEW-FLAG-ALIST).") (luna-define-method elmo-folder-contains-type ((folder elmo-folder) type) (eq (elmo-folder-type-internal folder) type)) +(luna-define-method elmo-folder-next-message-number ((folder elmo-folder)) + (+ 1 (elmo-max-of-list (or (elmo-folder-list-messages folder) + '(0))))) + (luna-define-method elmo-folder-append-messages ((folder elmo-folder) src-folder numbers @@ -1133,20 +1144,11 @@ ENTITY is the message-entity to get the parent.") Return a list of numbers (`new' `unread' `answered')") (luna-define-method elmo-folder-count-flags ((folder elmo-folder)) - (let ((new 0) - (unreads 0) - (answered 0) - flags) - (dolist (number (elmo-folder-list-messages folder 'visible 'in-msgdb)) - (setq flags (elmo-message-flags folder number)) - (cond - ((memq 'new flags) - (incf new)) - ((memq 'unread flags) - (incf unreads)) - ((memq 'answered flags) - (incf answered)))) - (list new unreads answered))) + (let* ((flag-count (elmo-msgdb-flag-count (elmo-folder-msgdb folder))) + (new (or (cdr (assq 'new flag-count)) 0)) + (unread (or (cdr (assq 'unread flag-count)) 0)) + (answered(or (cdr (assq 'answered flag-count)) 0))) + (list new (- unread new) answered))) (defun elmo-message-set-flag (folder number flag &optional is-local) "Set message flag. @@ -1201,8 +1203,6 @@ NUMBER is a number of the message. FIELD is a symbol of the field.") (luna-define-method elmo-message-field ((folder elmo-folder) number field) - (when (zerop (elmo-folder-length folder)) - (error "Cannot treat this folder correctly.")) (elmo-message-entity-field (elmo-message-entity folder number) field)) (luna-define-method elmo-message-use-cache-p ((folder elmo-folder) number) @@ -1392,17 +1392,21 @@ FIELD is a symbol of the field.") (or result (and err (signal (car err) (cdr err)))))) -(defun elmo-folder-kill-messages-before (folder msg) +(defun elmo-folder-kill-messages-range (folder beg end) (elmo-folder-set-killed-list-internal folder - (list (cons 1 msg)))) + (nconc + (elmo-folder-killed-list-internal folder) + (list (cons beg end))))) (defun elmo-folder-kill-messages (folder numbers) "Kill(hide) messages in the FOLDER with NUMBERS." - (elmo-folder-set-killed-list-internal - folder - (elmo-number-set-append-list (elmo-folder-killed-list-internal - folder) numbers))) + (let ((msgdb (elmo-folder-msgdb folder)) + (killed (elmo-folder-killed-list-internal folder))) + (dolist (number numbers) + (elmo-number-set-append killed number) + (elmo-msgdb-unset-flag msgdb number 'all)) + (elmo-folder-set-killed-list-internal folder killed))) (luna-define-method elmo-folder-clear ((folder elmo-folder) @@ -1461,9 +1465,10 @@ If update process is interrupted, return nil.") (when (and (not (eq (length (car diff)) (length new-list))) (setq diff-2 (elmo-list-diff (car diff) new-list))) - (elmo-folder-kill-messages-before folder - (nth (- (length (car diff-2)) 1) - (car diff-2)))) + (elmo-folder-kill-messages-range + folder + (car (car diff-2)) + (nth (- (length (car diff-2)) 1) (car diff-2)))) (setq delete-list (cadr diff)) (if (or (equal diff '(nil nil)) (equal diff '(nil))