X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=elmo%2Felmo-filter.el;h=d387f8e3aa26704b310d6e66034b9b99f2284046;hb=e8f6cc2436c2228767296baf753025cd39482f86;hp=11b4cbd36966470fffe79793451e07a0f5f5aabf;hpb=c54b1f19671dcedaa71e2016b23fdab27cdf960d;p=elisp%2Fwanderlust.git diff --git a/elmo/elmo-filter.el b/elmo/elmo-filter.el index 11b4cbd..d387f8e 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,23 +47,54 @@ 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-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 (elmo-replace-string-as-filename (elmo-folder-name-internal folder)) (expand-file-name "filter" elmo-msgdb-directory))) +(luna-define-method elmo-folder-search-requires-msgdb-p ((folder + elmo-filter-folder) + condition) + (elmo-folder-search-requires-msgdb-p + (elmo-filter-folder-target-internal folder) condition)) + (luna-define-method elmo-folder-newsgroups ((folder elmo-filter-folder)) (elmo-folder-newsgroups (elmo-filter-folder-target-internal folder))) @@ -75,7 +106,7 @@ (luna-define-method elmo-folder-get-primitive-list ((folder elmo-filter-folder)) - (list (elmo-filter-folder-target-internal folder))) + (elmo-folder-get-primitive-list (elmo-filter-folder-target-internal folder))) (luna-define-method elmo-folder-contains-type ((folder elmo-filter-folder) type) @@ -84,57 +115,43 @@ 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)) + (new-msgdb (elmo-make-msgdb)) + message-id entity) + (elmo-folder-check target-folder) (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-message-entity target-folder number)) + (when entity + (elmo-msgdb-append-entity + new-msgdb entity + (elmo-message-flags target-folder 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-bodystructure ((folder + elmo-filter-folder) + number strategy) + (elmo-message-fetch-bodystructure + (elmo-filter-folder-target-internal folder) + number strategy)) (luna-define-method elmo-message-fetch ((folder elmo-filter-folder) number strategy @@ -160,49 +177,6 @@ ;; 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))) - -(luna-define-method elmo-folder-list-importants-internal - ((folder elmo-filter-folder) - important-mark) - (elmo-filter-folder-list-importants-internal folder important-mark)) - (luna-define-method elmo-folder-list-subfolders ((folder elmo-filter-folder) &optional one-level) (let* ((target (elmo-filter-folder-target-internal folder)) @@ -219,17 +193,27 @@ (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 (cdr diff)) + ;; new unread unread + (list (car diff) (nth 1 diff) (nth 1 diff)) + (cons (car diff) (car 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 @@ -250,11 +234,13 @@ (luna-define-method elmo-folder-search ((folder elmo-filter-folder) condition &optional numbers) ;; search from messages in this folder - (elmo-list-filter - numbers - (elmo-folder-search (elmo-filter-folder-target-internal folder) - condition - (elmo-folder-list-messages folder)))) + (let ((result (elmo-folder-search + (elmo-filter-folder-target-internal folder) + condition + (elmo-folder-list-messages folder)))) + (if numbers + (elmo-list-filter numbers result) + result))) (luna-define-method elmo-message-use-cache-p ((folder elmo-filter-folder) number) @@ -277,26 +263,23 @@ (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-set-flag :before ((folder elmo-filter-folder) + numbers + flag + &optional is-local) + (elmo-folder-set-flag (elmo-filter-folder-target-internal folder) + numbers flag is-local)) + +(luna-define-method elmo-folder-unset-flag :before ((folder elmo-filter-folder) + numbers + flag + &optional is-local) + (elmo-folder-unset-flag (elmo-filter-folder-target-internal folder) + numbers flag is-local)) + +(luna-define-method elmo-message-folder ((folder elmo-filter-folder) + number) + (elmo-message-folder (elmo-filter-folder-target-internal folder) number)) (require 'product) (product-provide (provide 'elmo-filter) (require 'elmo-version))