X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=elmo%2Felmo-filter.el;h=923ae8c2a74e98427d9594efbbee951771f39ee8;hb=c2738fdc4e616fb55973a7e285432f60af6c1c57;hp=11b4cbd36966470fffe79793451e07a0f5f5aabf;hpb=9ddac14c0b5daa5f6226bb422c36d16b2ccac5e9;p=elisp%2Fwanderlust.git diff --git a/elmo/elmo-filter.el b/elmo/elmo-filter.el index 11b4cbd..923ae8c 100644 --- a/elmo/elmo-filter.el +++ b/elmo/elmo-filter.el @@ -33,7 +33,7 @@ ;;; ELMO filter folder (eval-and-compile (luna-define-class elmo-filter-folder (elmo-folder) - (condition target)) + (condition target require-msgdb)) (luna-define-internal-accessors 'elmo-filter-folder)) (luna-define-method elmo-folder-initialize ((folder elmo-filter-folder) @@ -47,17 +47,50 @@ folder (elmo-make-folder (elmo-match-string 1 (cdr pair)))) (error "Folder syntax error `%s'" (elmo-folder-name-internal folder))) + (elmo-filter-folder-set-require-msgdb-internal + folder + (elmo-folder-search-requires-msgdb-p + (elmo-filter-folder-target-internal folder) + (elmo-filter-folder-condition-internal folder))) folder)) (luna-define-method elmo-folder-open-internal ((folder elmo-filter-folder)) (elmo-folder-open-internal (elmo-filter-folder-target-internal folder))) +(luna-define-method elmo-folder-msgdb :around ((folder elmo-filter-folder)) + ;; Load target's msgdb if required. + (if (elmo-filter-folder-require-msgdb-internal folder) + (elmo-folder-msgdb (elmo-filter-folder-target-internal folder))) + ;; Load msgdb of itself. + (luna-call-next-method)) + (luna-define-method elmo-folder-check ((folder elmo-filter-folder)) - (elmo-folder-check (elmo-filter-folder-target-internal folder))) + (if (elmo-filter-folder-require-msgdb-internal folder) + (elmo-folder-synchronize (elmo-filter-folder-target-internal folder)))) (luna-define-method elmo-folder-close-internal ((folder elmo-filter-folder)) (elmo-folder-close-internal (elmo-filter-folder-target-internal folder))) +(luna-define-method elmo-folder-close :after ((folder elmo-filter-folder)) + ;; Clear target msgdb if it is used. + (if (elmo-filter-folder-require-msgdb-internal folder) + (elmo-folder-set-msgdb-internal (elmo-filter-folder-target-internal + folder) nil))) + +(luna-define-method elmo-folder-set-message-modified ((folder + elmo-filter-folder) + modified) + (if (elmo-filter-folder-require-msgdb-internal folder) + (elmo-folder-set-message-modified-internal + (elmo-filter-folder-target-internal folder) modified) + (elmo-folder-set-message-modified-internal folder modified))) + +(luna-define-method elmo-folder-commit :around ((folder elmo-filter-folder)) + ;; Save target msgdb if it is used. + (if (elmo-filter-folder-require-msgdb-internal folder) + (elmo-folder-commit (elmo-filter-folder-target-internal folder))) + (luna-call-next-method)) + (luna-define-method elmo-folder-expand-msgdb-path ((folder elmo-filter-folder)) (expand-file-name @@ -84,57 +117,35 @@ type)) (luna-define-method elmo-folder-msgdb-create ((folder elmo-filter-folder) - numlist new-mark already-mark - seen-mark important-mark - seen-list) - (let ((target-folder (elmo-filter-folder-target-internal folder))) - (if (elmo-folder-plugged-p target-folder) - (elmo-folder-msgdb-create target-folder - numlist - new-mark - already-mark - seen-mark important-mark seen-list) - ;; Copy from msgdb of target folder if it is unplugged. - (let ((len (length numlist)) - (msgdb (elmo-folder-msgdb target-folder)) - overview number-alist mark-alist - message-id seen gmark) + numlist flag-table) + (if (elmo-filter-folder-require-msgdb-internal folder) + (let* ((target-folder (elmo-filter-folder-target-internal folder)) + (len (length numlist)) + (msgdb (elmo-folder-msgdb target-folder)) + (new-msgdb (elmo-make-msgdb)) + message-id entity) (when (> len elmo-display-progress-threshold) (elmo-progress-set 'elmo-folder-msgdb-create len "Creating msgdb...")) (unwind-protect (dolist (number numlist) - (let ((entity (elmo-msgdb-overview-get-entity number msgdb))) - (when entity - (setq entity (elmo-msgdb-copy-overview-entity entity) - overview (elmo-msgdb-append-element overview entity) - message-id (elmo-msgdb-overview-entity-get-id entity) - number-alist (elmo-msgdb-number-add number-alist - number - message-id) - seen (member message-id seen-list)) - (if (setq gmark (or (elmo-msgdb-global-mark-get message-id) - (if (elmo-file-cache-exists-p message-id) - (if seen - nil - already-mark) - (if seen - nil ;;seen-mark - new-mark)))) - (setq mark-alist - (elmo-msgdb-mark-append - mark-alist - number - gmark))))) + (setq entity (elmo-msgdb-message-entity msgdb number)) + (when entity + (elmo-msgdb-append-entity new-msgdb entity + (elmo-msgdb-flags msgdb number))) (elmo-progress-notify 'elmo-folder-msgdb-create)) (elmo-progress-clear 'elmo-folder-msgdb-create)) - (list overview number-alist mark-alist))))) + new-msgdb) + ;; Does not require msgdb. + (elmo-folder-msgdb-create + (elmo-filter-folder-target-internal folder) + numlist flag-table))) (luna-define-method elmo-folder-append-buffer ((folder elmo-filter-folder) - unread &optional number) + &optional flag number) (elmo-folder-append-buffer (elmo-filter-folder-target-internal folder) - unread number)) + flag number)) (luna-define-method elmo-message-fetch ((folder elmo-filter-folder) number strategy @@ -160,48 +171,29 @@ ;; not available t))) -(defsubst elmo-filter-folder-list-unreads-internal (folder unread-marks - mark-alist) - (let ((unreads (elmo-folder-list-unreads-internal - (elmo-filter-folder-target-internal folder) - unread-marks - (or mark-alist - (elmo-msgdb-get-mark-alist - (elmo-folder-msgdb folder)))))) - (unless (listp unreads) - (setq unreads - (delq nil - (mapcar - (function - (lambda (x) - (if (member (cadr x) unread-marks) - (car x)))) - (elmo-msgdb-get-mark-alist (elmo-folder-msgdb folder)))))) - (elmo-list-filter - (mapcar 'car (elmo-msgdb-get-number-alist - (elmo-folder-msgdb folder))) - unreads))) - -(luna-define-method elmo-folder-list-unreads-internal - ((folder elmo-filter-folder) - unread-marks &optional mark-alist) - (elmo-filter-folder-list-unreads-internal folder unread-marks mark-alist)) - -(defsubst elmo-filter-folder-list-importants-internal (folder important-mark) - (let ((importants (elmo-folder-list-importants-internal - (elmo-filter-folder-target-internal folder) - important-mark))) - (if (listp importants) - (elmo-list-filter - (mapcar 'car (elmo-msgdb-get-number-alist - (elmo-folder-msgdb folder))) - importants) - t))) +(defsubst elmo-filter-folder-list-unreads (folder) + (elmo-list-filter + (elmo-folder-list-messages folder nil 'in-msgdb) + (elmo-folder-list-unreads + (elmo-filter-folder-target-internal folder)))) + +(luna-define-method elmo-folder-list-unreads :around ((folder + elmo-filter-folder)) + (if (elmo-filter-folder-require-msgdb-internal folder) + (elmo-filter-folder-list-unreads folder) + (luna-call-next-method))) -(luna-define-method elmo-folder-list-importants-internal - ((folder elmo-filter-folder) - important-mark) - (elmo-filter-folder-list-importants-internal folder important-mark)) +(defsubst elmo-filter-folder-list-importants (folder) + (elmo-list-filter + (elmo-folder-list-messages folder nil 'in-msgdb) + (elmo-folder-list-importants + (elmo-filter-folder-target-internal folder)))) + +(luna-define-method elmo-folder-list-importants :around ((folder + elmo-filter-folder)) + (if (elmo-filter-folder-require-msgdb-internal folder) + (elmo-filter-folder-list-importants folder) + (luna-call-next-method))) (luna-define-method elmo-folder-list-subfolders ((folder elmo-filter-folder) &optional one-level) @@ -219,17 +211,26 @@ (lambda (x) (concat prefix x)) (elmo-folder-list-subfolders target one-level)))) -(luna-define-method elmo-folder-diff :around ((folder elmo-filter-folder) - &optional numbers) - (if (not (and (vectorp (elmo-filter-folder-condition-internal - folder)) - (string-match "^last$" - (elmo-filter-key - (elmo-filter-folder-condition-internal - folder))))) - (cons nil (cdr (elmo-folder-diff (elmo-filter-folder-target-internal - folder)))) - (luna-call-next-method))) +(luna-define-method elmo-folder-diff :around ((folder elmo-filter-folder)) + (let ((condition (elmo-filter-folder-condition-internal folder)) + diff) + (if (vectorp condition) + (cond + ((and (string= (elmo-filter-key condition) "flag") + (or (string= (elmo-filter-value condition) "any") + (string= (elmo-filter-value condition) "digest") + (string= (elmo-filter-value condition) "unread"))) + (setq diff (elmo-folder-diff (elmo-filter-folder-target-internal + folder))) + (if (consp diff) + (cons (car diff) (car diff)) + (cons (car diff) (nth 1 diff)))) + ((string= "last" (elmo-filter-key condition)) + (luna-call-next-method)) + (t + (cons nil (cdr (elmo-folder-diff (elmo-filter-folder-target-internal + folder)))))) + (luna-call-next-method)))) (luna-define-method elmo-folder-status ((folder elmo-filter-folder)) (elmo-folder-status @@ -277,26 +278,58 @@ (elmo-message-file-name (elmo-filter-folder-target-internal folder) number)) -(luna-define-method elmo-folder-mark-as-read ((folder elmo-filter-folder) - numbers) - (elmo-folder-mark-as-read (elmo-filter-folder-target-internal folder) - numbers)) - -(luna-define-method elmo-folder-unmark-read ((folder elmo-filter-folder) - numbers) - (elmo-folder-unmark-read (elmo-filter-folder-target-internal folder) - numbers)) - -(luna-define-method elmo-folder-mark-as-important ((folder elmo-filter-folder) - numbers) - (elmo-folder-mark-as-important (elmo-filter-folder-target-internal folder) - numbers)) - -(luna-define-method elmo-folder-unmark-important ((folder elmo-filter-folder) - numbers) - (elmo-folder-unmark-important (elmo-filter-folder-target-internal folder) - numbers)) - +(luna-define-method elmo-folder-flag-as-read :around ((folder + elmo-filter-folder) + numbers + &optional is-local) + (elmo-folder-flag-as-read (elmo-filter-folder-target-internal folder) + numbers is-local) + (luna-call-next-method)) + +(luna-define-method elmo-folder-unflag-read :around ((folder + elmo-filter-folder) + numbers + &optional is-local) + (elmo-folder-unflag-read (elmo-filter-folder-target-internal folder) + numbers is-local) + (luna-call-next-method)) + +(luna-define-method elmo-folder-flag-as-important :around ((folder + elmo-filter-folder) + numbers + &optional + is-local) + (elmo-folder-flag-as-important (elmo-filter-folder-target-internal folder) + numbers is-local) + (luna-call-next-method)) + +(luna-define-method elmo-folder-unflag-important :around ((folder + elmo-filter-folder) + numbers + &optional + is-local) + (elmo-folder-unflag-important (elmo-filter-folder-target-internal folder) + numbers is-local) + (luna-call-next-method)) + +(luna-define-method elmo-folder-flag-as-answered :around ((folder + elmo-filter-folder) + numbers + &optional + is-local) + (elmo-folder-flag-as-answered (elmo-filter-folder-target-internal folder) + numbers is-local) + (luna-call-next-method)) + + +(luna-define-method elmo-folder-unflag-answered :around ((folder + elmo-filter-folder) + numbers + &optional + is-local) + (elmo-folder-unflag-answered (elmo-filter-folder-target-internal folder) + numbers is-local) + (luna-call-next-method)) (require 'product) (product-provide (provide 'elmo-filter) (require 'elmo-version))