+(defun elmo-filter-connect-signals (folder target)
+ (elmo-connect-signal
+ target 'flag-changing folder
+ (elmo-define-signal-handler (folder target number old-flags new-flags)
+ (elmo-filter-add-flag-count folder number old-flags -1)
+ (elmo-filter-add-flag-count folder number new-flags)
+ (elmo-emit-signal 'flag-changing folder number old-flags new-flags))
+ (elmo-define-signal-filter (folder target number)
+ (memq number (elmo-folder-list-messages folder nil t))))
+ (elmo-connect-signal
+ target 'flag-changed folder
+ (elmo-define-signal-handler (folder target numbers)
+ (let ((filterd (elmo-list-filter
+ (elmo-folder-list-messages folder nil t)
+ numbers)))
+ (when filterd
+ (elmo-emit-signal 'flag-changed folder filterd)))))
+ (elmo-connect-signal
+ target 'cache-changed folder
+ (elmo-define-signal-handler (folder target number)
+ (elmo-emit-signal 'cache-changed folder number))
+ (elmo-define-signal-filter (folder target number)
+ (memq number (elmo-folder-list-messages folder nil t)))))
+
+(defun elmo-filter-number-list-load (dir)
+ (elmo-object-load
+ (expand-file-name elmo-filter-number-filename dir)))
+
+(defun elmo-filter-number-list-save (dir number-list)
+ (elmo-object-save
+ (expand-file-name elmo-filter-number-filename dir)
+ number-list))
+
+(defun elmo-filter-folder-number-list (folder)
+ (or (elmo-filter-folder-number-list-internal folder)
+ (elmo-filter-folder-set-number-list-internal
+ folder
+ (elmo-filter-number-list-load (elmo-folder-msgdb-path folder)))))
+
+(defsubst elmo-filter-folder-countup-message-flags (folder numbers
+ &optional delta)
+ (let ((flag-count (elmo-filter-folder-flag-count-internal folder))
+ (delta (or delta 1))
+ elem)
+ (dolist (number numbers)
+ (dolist (flag (elmo-message-flags folder number))
+ (if (setq elem (assq flag flag-count))
+ (setcdr elem (+ (cdr elem) delta))
+ (setq flag-count (cons (cons flag delta) flag-count)))))
+ (elmo-filter-folder-set-flag-count-internal folder flag-count)))
+
+(defun elmo-filter-add-flag-count (folder number flags &optional delta)
+ (let ((flag-count (elmo-filter-folder-flag-count-internal folder))
+ (delta (or delta 1))
+ elem)
+ (dolist (flag flags)
+ (if (setq elem (assq flag flag-count))
+ (setcdr elem (+ (cdr elem) delta))
+ (setq flag-count (cons (cons flag delta) flag-count))))
+ (elmo-filter-folder-set-flag-count-internal folder flag-count)))
+
+(defun elmo-filter-folder-flag-count (folder)
+ (or (elmo-filter-folder-flag-count-internal folder)
+ (elmo-filter-folder-countup-message-flags
+ folder
+ (elmo-folder-list-messages folder t t))))
+
+(defun elmo-filter-folder-copy-flag-count (flag-counts)
+ (mapcar (lambda (pair) (cons (car pair) (cdr pair))) flag-counts))
+
+(luna-define-method elmo-folder-open :after ((folder elmo-filter-folder)
+ &optional load-msgdb)
+ (when load-msgdb
+ (elmo-filter-folder-number-list folder)
+ (elmo-filter-folder-flag-count folder)
+ (elmo-folder-msgdb (elmo-filter-folder-target-internal folder))))
+