X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=elmo%2Felmo.el;h=bc273b77d199ffd940fe83176613700d0f5ba13a;hb=6444631eeac4bef1933e27202080f62ac536aada;hp=b7be6fb56e53ca7247935350822cb7f250bd1aae;hpb=f28a522e2a489093cd0ee9d8a44d7b286932b384;p=elisp%2Fwanderlust.git diff --git a/elmo/elmo.el b/elmo/elmo.el index b7be6fb..bc273b7 100644 --- a/elmo/elmo.el +++ b/elmo/elmo.el @@ -35,6 +35,7 @@ (require 'elmo-vars) (require 'elmo-util) (require 'elmo-msgdb) +(require 'elmo-signal) (eval-when-compile (require 'cl)) @@ -87,6 +88,19 @@ Otherwise, entire fetching of the message is aborted without confirmation." (elmo-define-error 'elmo-authenticate-error "Login failed" 'elmo-open-error) (elmo-define-error 'elmo-imap4-bye-error "IMAP4 session was terminated" 'elmo-open-error) +;; Event declarations +(elmo-define-signal flag-changing (number old-flags new-flags) + "Notify the changing flag of the messages with NUMBER.") + +(elmo-define-signal flag-changed (numbers) + "Notify the change flag of the messages with NUMBERS.") + +(elmo-define-signal cache-changed (number) + "Notify the change cache status of the message with NUMBER.") + +(elmo-define-signal update-overview (number) + "Notify update overview of the message with NUMBER.") + ;; autoloads (eval-and-compile (autoload 'md5 "md5") @@ -131,7 +145,6 @@ If a folder name begins with PREFIX, use BACKEND." persistent ; non-nil if persistent. process-duplicates ; read or hide biff ; folder for biff - handlers ; list of event handler. )) (luna-define-internal-accessors 'elmo-folder)) @@ -599,12 +612,6 @@ CACHE-PATH is the cache path to be used as a message cache file." ((folder elmo-folder) &optional visible-only) t) -(defun elmo-folder-encache (folder numbers &optional unread) - "Encache messages in the FOLDER with NUMBERS. -If UNREAD is non-nil, messages are not flaged as read." - (dolist (number numbers) - (elmo-message-encache folder number unread))) - (luna-define-generic elmo-message-encache (folder number &optional read) "Encache message in the FOLDER with NUMBER. If READ is non-nil, message is flaged as read.") @@ -969,7 +976,7 @@ If optional argument IF-EXISTS is nil, load on demand. 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)) (setq append-list (car diff)) (setq delete-list (cadr diff)) (if append-list @@ -1173,7 +1180,7 @@ If CACHED is t, message is set as cached.") (if cached (elmo-msgdb-set-flag (elmo-folder-msgdb folder) number 'cached) (elmo-msgdb-unset-flag (elmo-folder-msgdb folder) number 'cached)) - (elmo-folder-notify-event folder 'cache-changed number)) + (elmo-emit-signal 'cache-changed folder number)) (defun elmo-message-copy-entity (entity) (elmo-msgdb-copy-message-entity (elmo-message-entity-handler entity) @@ -1293,13 +1300,17 @@ VALUE is a value to set.") &optional is-local) (when (elmo-folder-msgdb-internal folder) (dolist (number numbers) - (when (elmo-global-flag-p flag) - (let ((message-id (elmo-message-field folder number 'message-id))) - (elmo-global-flag-set flag folder number message-id))) - (elmo-msgdb-set-flag (elmo-folder-msgdb folder) - number - flag)) - (elmo-folder-notify-event folder 'flag-changed numbers))) + (let ((old-flags (elmo-message-flags folder number))) + (when (elmo-global-flag-p flag) + (let ((message-id (elmo-message-field folder number 'message-id))) + (elmo-global-flag-set flag folder number message-id))) + (elmo-msgdb-set-flag (elmo-folder-msgdb folder) number flag) + (elmo-emit-signal 'flag-changing + folder + number + old-flags + (elmo-message-flags folder number)))) + (elmo-emit-signal 'flag-changed folder numbers))) (defun elmo-message-has-global-flag-p (folder number) "Return non-nil when the message in the FOLDER with NUMBER has global flag." @@ -1333,12 +1344,16 @@ If Optional LOCAL is non-nil, don't update server flag." &optional is-local) (when (elmo-folder-msgdb-internal folder) (dolist (number numbers) - (when (elmo-global-flag-p flag) - (elmo-global-flag-detach flag folder number 'always)) - (elmo-msgdb-unset-flag (elmo-folder-msgdb folder) - number - flag)) - (elmo-folder-notify-event folder 'flag-changed numbers))) + (let ((old-flags (elmo-message-flags folder number))) + (when (elmo-global-flag-p flag) + (elmo-global-flag-detach flag folder number 'always)) + (elmo-msgdb-unset-flag (elmo-folder-msgdb folder) number flag) + (elmo-emit-signal 'flag-changing + folder + number + old-flags + (elmo-message-flags folder number)))) + (elmo-emit-signal 'flag-changed folder numbers))) (luna-define-method elmo-folder-process-crosspost ((folder elmo-folder)) ;; Do nothing. @@ -1413,6 +1428,7 @@ If Optional LOCAL is non-nil, don't update server flag." unread section) (with-temp-buffer + (set-buffer-multibyte nil) (when (elmo-message-fetch folder number strategy unread section) (buffer-string)))) @@ -1526,6 +1542,7 @@ If update process is interrupted, return nil.") (elmo-list-diff (elmo-folder-list-messages folder) (elmo-folder-list-messages folder nil 'in-msgdb))) (when diff-new + (setq diff-new (sort diff-new #'<)) (unless disable-killed (setq diff-new (elmo-living-messages diff-new killed-list))) (when mask @@ -1536,7 +1553,7 @@ If update process is interrupted, return nil.") (when (not (eq (length diff-new) (length new-list))) (let* ((diff (elmo-list-diff diff-new new-list)) - (disappeared (car diff))) + (disappeared (sort (car diff) #'<))) (when disappeared (elmo-folder-kill-messages-range folder (car disappeared) @@ -1667,33 +1684,6 @@ Return a hashtable for newsgroups." (elmo-make-directory temp-dir) temp-dir)) -;; Event notification/observer framework -(eval-and-compile - (luna-define-class elmo-event-handler ())) - -(luna-define-generic elmo-event-handler-flag-changed (handler numbers) - "Notify flag of the messages with NUMBERS is changed.") - -(luna-define-generic elmo-event-handler-cache-changed (handler number) - "Called when cache status of the message with NUMBER is changed.") - -(defun elmo-folder-add-handler (folder handler) - (unless (memq handler (elmo-folder-handlers-internal folder)) - (elmo-folder-set-handlers-internal - folder - (cons handler (elmo-folder-handlers-internal folder))))) - -(defun elmo-folder-remove-handler (folder handler) - (elmo-folder-set-handlers-internal - folder - (delq handler (elmo-folder-handlers-internal folder)))) - -(defun elmo-folder-notify-event (folder event &rest args) - (when (elmo-folder-handlers-internal folder) - (let ((message (format "elmo-event-handler-%s" event))) - (dolist (handler (elmo-folder-handlers-internal folder)) - (apply #'luna-send handler message handler args))))) - ;;; (defun elmo-init () "Initialize ELMO module."