X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=elmo%2Fmodb-standard.el;h=108288784482902183a49bc3a9980892ec5465e3;hb=99cc40651d424df2e4d5f74d8a2ed391c1878539;hp=77646ba1ddd4e16e74c8d8259a811e84b0143b57;hpb=d73166be44be9fced24d471f553d38c8d59b8afb;p=elisp%2Fwanderlust.git diff --git a/elmo/modb-standard.el b/elmo/modb-standard.el index 77646ba..1082887 100644 --- a/elmo/modb-standard.el +++ b/elmo/modb-standard.el @@ -55,6 +55,7 @@ entity-map ; number, msg-id -> entity mapping. flag-map ; number -> flag-list mapping flag-count ; list of (FLAG . COUNT) + overview-handler ; instance of modb-entity-handler. )) (luna-define-internal-accessors 'modb-standard)) @@ -175,16 +176,15 @@ (modb-standard-key number) (modb-standard-entity-map-internal msgdb)))) (cond - ((and ret (eq (car-safe ret) 'autoload)) - (cdr (cdr ret))) ; message-id. - ((and ret (stringp (car-safe ret))) - ;; Already loaded. - (car ret)) ((null ret) ;; Garbage entity. (elmo-clear-hash-val (modb-standard-key number) (modb-standard-entity-map-internal msgdb)) nil) ; return nil. + ((eq (car-safe ret) 'autoload) + (cdr (cdr ret))) ; message-id. + ((elmo-msgdb-message-entity-field (elmo-message-entity-handler ret) + ret 'message-id)) ; Already loaded. (t (error "Internal error: invalid msgdb status"))))) (defun modb-standard-load-entity (modb path &optional section) @@ -197,7 +197,6 @@ number msgid) (cond ((eq (car objects) 'modb-standard-entity-handler) ;; (standard PARAMETERS ENTITY*) - ;; PARAMETERS is nil (reserved for future extention). (let ((handler (apply #'luna-make-entity (car objects) (car (cdr objects)))) @@ -233,18 +232,38 @@ (dolist (number (or (cdr section) (modb-standard-number-list-internal modb))) (when (setq entity (elmo-msgdb-message-entity modb number)) - (unless (eq (luna-class-name (elmo-message-entity-handler entity)) - (luna-class-name handler)) + (unless (modb-entity-handler-equal-p + handler + (elmo-message-entity-handler entity)) (setq entity (elmo-msgdb-copy-message-entity (elmo-message-entity-handler entity) entity handler))) (setq entities (cons (cdr (cdr entity)) entities)))) (if entities (elmo-object-save filename - (cons (luna-class-name handler) (cons nil entities)) - elmo-mime-charset) + (nconc + (list (luna-class-name handler) + (modb-entity-handler-dump-parameters handler)) + entities)) (ignore-errors (delete-file filename))))) +(defun modb-standard-cleanup-stale-entities (modb path) + (message "Removing stale entities...") + (let* ((entity-regex + (concat "^" modb-standard-entity-filename "-\\([0-9]+\\)")) + (entities (elmo-uniq-list + (mapcar + (lambda (x) (/ x modb-standard-divide-number)) + (modb-standard-number-list-internal modb)))) + (files (mapcar (lambda(x) + (when (string-match entity-regex x) + (string-to-number (match-string 1 x)))) + (directory-files path nil entity-regex)))) + (dolist (entity (car (elmo-list-diff-nonsortable files entities))) + (ignore-errors (delete-file + (expand-file-name + (modb-standard-entity-filename entity) path)))))) + (defun modb-standard-save-entity (modb path) (let ((modified (modb-generic-message-modified-internal modb))) (cond ((listp modified) @@ -476,7 +495,7 @@ (msg-id (elmo-msgdb-message-entity-field (elmo-message-entity-handler entity) entity 'message-id)) duplicate) - (when msg-id + (when (and number msg-id) ;; number-list (modb-standard-set-number-list-internal msgdb @@ -595,12 +614,13 @@ ((numberp key) (modb-standard-key key))) 'autoload))) -(defvar modb-standard-default-entity-handler nil) - (luna-define-method elmo-msgdb-message-entity-handler ((msgdb modb-standard)) - (or modb-standard-default-entity-handler - (setq modb-standard-default-entity-handler - (luna-make-entity 'modb-standard-entity-handler)))) + (or (modb-standard-overview-handler-internal msgdb) + (modb-standard-set-overview-handler-internal + msgdb + (luna-make-entity 'modb-standard-entity-handler + :mime-charset + (modb-generic-mime-charset-internal msgdb))))) (require 'product) (product-provide (provide 'modb-standard) (require 'elmo-version))