X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=elmo%2Felmo.el;h=b61152c00cb2ca8f294164dda0df74eeabe22e38;hb=bd1c7daca8de303dd5766cb7831e964cfe3a03c5;hp=dd04160ff1679633fb357871a5fe79cfc54dfc2a;hpb=caa80b8afcc119fd2b7c4b6f74afbd604fe31e90;p=elisp%2Fwanderlust.git diff --git a/elmo/elmo.el b/elmo/elmo.el index dd04160..b61152c 100644 --- a/elmo/elmo.el +++ b/elmo/elmo.el @@ -192,10 +192,8 @@ If optional KEEP-KILLED is non-nil, killed-list is not cleared.") (luna-define-generic elmo-folder-use-flag-p (folder) "Returns t if FOLDER treats unread/important flag itself.") -(luna-define-generic elmo-folder-diff (folder &optional numbers) +(luna-define-generic elmo-folder-diff (folder) "Get diff of FOLDER. -If optional NUMBERS is set, it is used as current NUMBERS. -Otherwise, saved status for folder is used for comparison. Return value is cons cell or list: - a cons cell (new . all) - a list (new unread all)") @@ -681,8 +679,7 @@ Return a cons cell of (NUMBER-CROSSPOSTS . NEW-MARK-ALIST).") (elmo-msgdb-get-number-alist (elmo-folder-msgdb folder))) (elmo-folder-set-info-max-by-numdb folder - (elmo-msgdb-get-number-alist - (elmo-folder-msgdb folder))) + (elmo-folder-list-messages folder nil 'in-msgdb)) (elmo-folder-set-message-modified-internal folder nil) (elmo-msgdb-killed-list-save (elmo-folder-msgdb-path folder) @@ -886,12 +883,12 @@ NUMBERS is a list of message numbers, messages are searched from the list." (list new unread numbers max) elmo-folder-info-hashtb))) -(defun elmo-folder-set-info-max-by-numdb (folder msgdb-number) +(defun elmo-folder-set-info-max-by-numdb (folder numbers) "Set FOLDER info by MSGDB-NUMBER in msgdb." - (let ((num-db (sort (mapcar 'car msgdb-number) '<))) + (let ((numbers (sort numbers '<))) (elmo-folder-set-info-hashtb folder - (or (nth (max 0 (1- (length num-db))) num-db) 0) + (or (nth (max 0 (1- (length numbers))) numbers) 0) nil ;;(length num-db) ))) @@ -945,10 +942,7 @@ NUMBERS is a list of message numbers, messages are searched from the list." append-list delete-list diff) (cons (if (equal in-folder in-db) 0 - (setq diff (elmo-list-diff - in-folder in-db - nil - )) + (setq diff (elmo-list-diff in-folder in-db nil)) (setq append-list (car diff)) (setq delete-list (cadr diff)) (if append-list @@ -958,11 +952,10 @@ NUMBERS is a list of message numbers, messages are searched from the list." 0))) (length in-folder)))) -(luna-define-method elmo-folder-diff ((folder elmo-folder) - &optional numbers) - (elmo-generic-folder-diff folder numbers)) +(luna-define-method elmo-folder-diff ((folder elmo-folder)) + (elmo-generic-folder-diff folder)) -(defun elmo-generic-folder-diff (folder numbers) +(defun elmo-generic-folder-diff (folder) (if (elmo-string-match-member (elmo-folder-name-internal folder) elmo-strict-diff-folder-list) (elmo-strict-folder-diff folder) @@ -971,19 +964,15 @@ NUMBERS is a list of message numbers, messages are searched from the list." (in-db t) unsync messages in-db-max) - (if numbers - (setq in-db-max (or (nth (max 0 (1- (length numbers))) numbers) - 0)) - (if (not cached-in-db-max) - (let ((number-list (mapcar 'car - (elmo-msgdb-number-load - (elmo-folder-msgdb-path folder))))) - ;; No info-cache. - (setq in-db (sort number-list '<)) - (setq in-db-max (or (nth (max 0 (1- (length in-db))) in-db) - 0)) - (elmo-folder-set-info-hashtb folder in-db-max nil)) - (setq in-db-max cached-in-db-max))) + (if (not cached-in-db-max) + (let ((number-list (elmo-folder-list-messages folder + nil 'in-msgdb))) + ;; No info-cache. + (setq in-db (sort number-list '<)) + (setq in-db-max (or (nth (max 0 (1- (length in-db))) in-db) + 0)) + (elmo-folder-set-info-hashtb folder in-db-max nil)) + (setq in-db-max cached-in-db-max)) (setq unsync (if (and in-db (car in-folder)) (- (car in-folder) in-db-max) (if (and in-folder (null in-db)) @@ -1019,15 +1008,19 @@ NUMBERS is a list of message numbers, messages are searched from the list." (defun elmo-generic-folder-append-messages (folder src-folder numbers same-number) - (let (unseen table flag mark - succeed-numbers failure cache id) + (let ((src-msgdb-exists (not (zerop (elmo-folder-length src-folder)))) + unseen table flag mark + succeed-numbers failure cache id) (setq table (elmo-flag-table-load (elmo-folder-msgdb-path folder))) (with-temp-buffer (set-buffer-multibyte nil) (while numbers (setq failure nil - id (elmo-message-field src-folder (car numbers) 'message-id) - mark (elmo-message-mark src-folder (car numbers)) + id (and src-msgdb-exists + (elmo-message-field src-folder (car numbers) + 'message-id)) + mark (and src-msgdb-exists + (elmo-message-mark src-folder (car numbers))) flag (and id (cond ((null mark) 'read) @@ -1133,11 +1126,14 @@ Return non-nil when message is accessible." (elmo-folder-local-p folder) (elmo-msgdb-get-cached (elmo-folder-msgdb folder) number))) -(defun elmo-message-set-cached (folder number cached) +(luna-define-generic elmo-message-set-cached (folder number cached) "Set cache status of the message in the msgdb. FOLDER is the ELMO folder structure. NUMBER is a number of the message. -If CACHED is t, message is set as cached." +If CACHED is t, message is set as cached.") + +(luna-define-method elmo-message-set-cached ((folder elmo-folder) + number cached) (when (elmo-msgdb-set-cached (elmo-folder-msgdb folder) number cached @@ -1250,6 +1246,8 @@ FOLDER is the ELMO folder structure. NUMBER is a number of the message.") (luna-define-method elmo-message-mark ((folder elmo-folder) number) + (when (zerop (elmo-folder-length folder)) + (error "Cannot treat this folder correctly.")) (elmo-msgdb-get-mark (elmo-folder-msgdb folder) number)) (luna-define-generic elmo-message-field (folder number field) @@ -1259,6 +1257,8 @@ 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-msgdb-get-field (elmo-folder-msgdb folder) number field)) (luna-define-method elmo-message-use-cache-p ((folder elmo-folder) number) @@ -1568,15 +1568,18 @@ If update process is interrupted, return nil.") "Return number of messages in the FOLDER.") (luna-define-method elmo-folder-length ((folder elmo-folder)) - (elmo-msgdb-length (elmo-folder-msgdb folder))) + (if (elmo-folder-msgdb-internal folder) + (elmo-msgdb-length (elmo-folder-msgdb folder)) + 0)) (defun elmo-msgdb-load (folder &optional silent) (unless silent (message "Loading msgdb for %s..." (elmo-folder-name-internal folder))) (let ((msgdb (elmo-load-msgdb (elmo-folder-msgdb-path folder)))) - (elmo-folder-set-info-max-by-numdb folder - (elmo-msgdb-get-number-alist msgdb)) - + (elmo-folder-set-info-max-by-numdb + folder + (mapcar 'elmo-msgdb-overview-entity-get-number + (elmo-msgdb-get-overview msgdb))) (unless silent (message "Loading msgdb for %s...done" (elmo-folder-name-internal folder)))