X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=elmo%2Felmo.el;h=b61152c00cb2ca8f294164dda0df74eeabe22e38;hb=bd1c7daca8de303dd5766cb7831e964cfe3a03c5;hp=7392cdba2bdb237efa30a7980ed723cea60156d7;hpb=10c9f47884508cec3b96340be0b4118938633e51;p=elisp%2Fwanderlust.git diff --git a/elmo/elmo.el b/elmo/elmo.el index 7392cdb..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,26 +1008,29 @@ 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) + (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 - mark (elmo-message-mark src-folder (car numbers)) - flag (cond - ((null mark) nil) - ((member mark (elmo-msgdb-answered-marks)) - 'answered) - ;; - ((not (member mark (elmo-msgdb-unread-marks))) - 'read))) + 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) + ((member mark (elmo-msgdb-answered-marks)) + 'answered) + ;; + ((not (member mark (elmo-msgdb-unread-marks))) + 'read)))) (condition-case nil - (setq cache (elmo-file-cache-get - (elmo-message-field src-folder - (car numbers) - 'message-id)) + (setq cache (elmo-file-cache-get id) failure (not (and @@ -1065,12 +1057,8 @@ NUMBERS is a list of message numbers, messages are searched from the list." (error (setq failure t))) ;; FETCH & APPEND finished (unless failure - (when flag - (elmo-flag-table-set table - (elmo-message-field - src-folder (car numbers) - 'message-id) - flag)) + (when id + (elmo-flag-table-set table id flag)) (setq succeed-numbers (cons (car numbers) succeed-numbers))) (elmo-progress-notify 'elmo-folder-move-messages) (setq numbers (cdr numbers))) @@ -1138,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 @@ -1255,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) @@ -1264,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) @@ -1573,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)))