X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=elmo%2Felmo-msgdb.el;h=0a10cdf7829c577b913d0d5451a7ee5413213307;hb=54482fff6bd6498729682555a0ba3c3cd092a1b5;hp=6eddd2d73450cab0790a38ca14bb5c9859ce8181;hpb=9beb89bdb330b412ea18fda13d893f584eb4b796;p=elisp%2Fwanderlust.git diff --git a/elmo/elmo-msgdb.el b/elmo/elmo-msgdb.el index 6eddd2d..0a10cdf 100644 --- a/elmo/elmo-msgdb.el +++ b/elmo/elmo-msgdb.el @@ -41,7 +41,7 @@ ;;; MSGDB interface. ;; -;; MSGDB elmo-load-msgdb PATH +;; MSGDB elmo-load-msgdb PATH MIME-CHARSET ;; MSGDB elmo-make-msgdb LOCATION TYPE ;; elmo-msgdb-sort-by-date MSGDB @@ -87,19 +87,19 @@ entity number)) -(defsubst elmo-message-entity-field (entity field &optional decode) +(defsubst elmo-message-entity-field (entity field &optional type) "Get message entity field value. ENTITY is the message entity structure obtained by `elmo-message-entity'. FIELD is the symbol of the field name. -if optional DECODE is non-nil, returned value is decoded." +If optional argument TYPE is specified, return converted value." (elmo-msgdb-message-entity-field (elmo-message-entity-handler entity) - entity field decode)) + entity field type)) (defsubst elmo-message-entity-set-field (entity field value) "Set message entity field value. ENTITY is the message entity structure. FIELD is the symbol of the field name. -VALUE is the field value (raw)." +VALUE is the field value." (elmo-msgdb-message-entity-set-field (elmo-message-entity-handler entity) entity field value)) @@ -108,9 +108,9 @@ VALUE is the field value (raw)." ;;; Helper functions for MSGDB ;; -(defun elmo-load-msgdb (location) +(defun elmo-load-msgdb (location mime-charset) "Load the MSGDB from PATH." - (let ((msgdb (elmo-make-msgdb location elmo-msgdb-default-type)) + (let ((msgdb (elmo-make-msgdb location elmo-msgdb-default-type mime-charset)) priorities loaded temp-modb) (unless (elmo-msgdb-load msgdb) (setq priorities @@ -118,7 +118,9 @@ VALUE is the field value (raw)." (copy-sequence elmo-msgdb-load-priorities))) (while (and priorities (not loaded)) - (setq temp-modb (elmo-make-msgdb location (car priorities)) + (setq temp-modb (elmo-make-msgdb location + (car priorities) + mime-charset) loaded (elmo-msgdb-load temp-modb) priorities (cdr priorities))) (when loaded @@ -127,24 +129,40 @@ VALUE is the field value (raw)." (setq msgdb temp-modb)))) msgdb)) -(defun elmo-make-msgdb (&optional location type) +(defun elmo-make-msgdb (&optional location type mime-charset) "Make a MSGDB." (let* ((type (or type elmo-msgdb-default-type)) (class (intern (format "modb-%s" type)))) (require class) (luna-make-entity class - :location location))) + :location location + :mime-charset mime-charset))) + +(defun elmo-msgdb-extra-fields (&optional non-virtual) + (if non-virtual + (apply + #'nconc + (mapcar + (lambda (extra) + (let ((spec (assq (intern extra) modb-entity-field-extractor-alist))) + (if spec + (let ((real-fields (nth 2 spec))) + (cond ((functionp real-fields) + (funcall real-fields extra)) + ((listp real-fields) + (copy-sequence real-fields)))) + (list extra)))) + elmo-msgdb-extra-fields)) + elmo-msgdb-extra-fields)) (defun elmo-msgdb-sort-by-date (msgdb) (elmo-msgdb-sort-entities msgdb (lambda (x y app-data) (condition-case nil - (string< - (timezone-make-date-sortable - (elmo-message-entity-field x 'date)) - (timezone-make-date-sortable - (elmo-message-entity-field y 'date))) + (elmo-time< + (elmo-message-entity-field x 'date) + (elmo-message-entity-field y 'date)) (error))))) (defsubst elmo-msgdb-get-parent-entity (entity msgdb) @@ -155,7 +173,7 @@ VALUE is the field value (raw)." ;;; (defsubst elmo-msgdb-append-element (list element) (if list -;;; (append list (list element)) +;;; (append list (list element)) (nconc list (list element)) ;; list is nil (list element))) @@ -234,13 +252,12 @@ VALUE is the field value (raw)." ;; Make a table of msgid flag (read, answered) (let ((flag-table (or flag-table (elmo-make-hash (elmo-msgdb-length msgdb)))) - entity) + msg-id) (dolist (number (elmo-msgdb-list-messages msgdb)) - (setq entity (elmo-msgdb-message-entity msgdb number)) - (elmo-flag-table-set - flag-table - (elmo-message-entity-field entity 'message-id) - (elmo-msgdb-flags msgdb number))) + (when (setq msg-id (elmo-msgdb-message-field msgdb number 'message-id)) + (elmo-flag-table-set flag-table + msg-id + (elmo-msgdb-flags msgdb number)))) flag-table)) (defun elmo-multiple-fields-body-list (field-names &optional boundary) @@ -415,34 +432,38 @@ header separator." (elmo-message-entity-set-field entity 'references references)) (defsubst elmo-msgdb-overview-entity-get-from-no-decode (entity) - (elmo-message-entity-field entity 'from)) + (elmo-with-enable-multibyte + (encode-mime-charset-string + (elmo-message-entity-field entity 'from) elmo-mime-charset))) (defsubst elmo-msgdb-overview-entity-get-from (entity) - (elmo-message-entity-field entity 'from t)) + (elmo-message-entity-field entity 'from)) (defsubst elmo-msgdb-overview-entity-set-from (entity from) (elmo-message-entity-set-field entity 'from from)) (defsubst elmo-msgdb-overview-entity-get-subject (entity) - (elmo-message-entity-field entity 'subject t)) + (elmo-message-entity-field entity 'subject)) (defsubst elmo-msgdb-overview-entity-get-subject-no-decode (entity) - (elmo-message-entity-field entity 'subject)) + (elmo-with-enable-multibyte + (encode-mime-charset-string + (elmo-message-entity-field entity 'subject) elmo-mime-charset))) (defsubst elmo-msgdb-overview-entity-set-subject (entity subject) (elmo-message-entity-set-field entity 'subject subject)) (defsubst elmo-msgdb-overview-entity-get-date (entity) - (elmo-message-entity-field entity 'date)) + (elmo-message-entity-field entity 'date 'string)) (defsubst elmo-msgdb-overview-entity-set-date (entity date) (elmo-message-entity-set-field entity 'date date)) (defsubst elmo-msgdb-overview-entity-get-to (entity) - (elmo-message-entity-field entity 'to)) + (elmo-message-entity-field entity 'to 'string)) (defsubst elmo-msgdb-overview-entity-get-cc (entity) - (elmo-message-entity-field entity 'cc)) + (elmo-message-entity-field entity 'cc 'string)) (defsubst elmo-msgdb-overview-entity-get-size (entity) (elmo-message-entity-field entity 'size))