X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=elmo%2Felmo-msgdb.el;h=0a10cdf7829c577b913d0d5451a7ee5413213307;hb=54482fff6bd6498729682555a0ba3c3cd092a1b5;hp=3d930275d680847ca0fb37bd69c4f50d813b1f92;hpb=b85b9603053821ce0c73cd46acb7802d26855d41;p=elisp%2Fwanderlust.git diff --git a/elmo/elmo-msgdb.el b/elmo/elmo-msgdb.el index 3d93027..0a10cdf 100644 --- a/elmo/elmo-msgdb.el +++ b/elmo/elmo-msgdb.el @@ -41,8 +41,8 @@ ;;; 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 ;; elmo-flag-table-load @@ -71,22 +71,46 @@ ;; elmo-crosspost-alist-load ;; elmo-crosspost-alist-save -;; elmo-msgdb-create-overview-from-buffer NUMBER SIZE TIME -;; elmo-msgdb-create-overview-entity-from-file NUMBER FILE - ;; elmo-folder-get-info ;; elmo-folder-get-info-max ;; elmo-folder-get-info-length ;; elmo-folder-get-info-unread +;;; message entity wrappers +;; +(defsubst elmo-message-entity-number (entity) + (elmo-msgdb-message-entity-number (elmo-message-entity-handler entity) + entity)) + +(defsubst elmo-message-entity-set-number (entity number) + (elmo-msgdb-message-entity-set-number (elmo-message-entity-handler entity) + entity + number)) + +(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 argument TYPE is specified, return converted value." + (elmo-msgdb-message-entity-field (elmo-message-entity-handler entity) + 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." + (elmo-msgdb-message-entity-set-field (elmo-message-entity-handler entity) + entity field value)) + (defconst elmo-msgdb-load-priorities '(legacy standard) "Priority list of modb type for load.") ;;; 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 @@ -94,7 +118,9 @@ (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 @@ -103,27 +129,42 @@ (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-msgdb-message-entity-field msgdb x 'date)) - (timezone-make-date-sortable - (elmo-msgdb-message-entity-field msgdb 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) (setq entity (elmo-message-entity-field entity 'references)) ;; entity is parent-id. @@ -132,7 +173,7 @@ ;;; (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))) @@ -178,14 +219,14 @@ (defun elmo-flag-table-get (flag-table msg-id) (let ((flags (elmo-get-hash-val msg-id flag-table))) - (if flags - (append - (and (elmo-file-cache-exists-p msg-id) - '(cached)) + (append + (and (elmo-file-cache-exists-p msg-id) + '(cached)) + (if flags (elmo-list-delete '(cached read) (copy-sequence flags) - #'delq)) - '(new unread)))) + #'delq) + '(new unread))))) (defun elmo-flag-table-save (dir flag-table) (elmo-object-save @@ -211,13 +252,12 @@ ;; 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) @@ -254,22 +294,6 @@ header separator." (dolist (number (elmo-msgdb-list-flagged msgdb 'new)) (elmo-msgdb-unset-flag msgdb number 'new))) -(defun elmo-msgdb-match-condition (msgdb condition number numbers) - "Check whether the condition of the message is satisfied or not. -MSGDB is the msgdb to search from. -CONDITION is the search condition. -NUMBER is the message number to check. -NUMBERS is the target message number list. -Return CONDITION itself if no entity exists in msgdb." - (let ((entity (elmo-msgdb-message-entity msgdb number))) - (if entity - (elmo-msgdb-match-condition-internal msgdb - condition - entity - (elmo-msgdb-flags msgdb number) - numbers) - condition))) - ;; ;; deleted message handling ;; @@ -362,18 +386,6 @@ Return CONDITION itself if no entity exists in msgdb." elmo-msgdb-directory) alist)) -(defun elmo-msgdb-get-message-id-from-buffer () - (let ((msgid (elmo-field-body "message-id"))) - (if msgid - (if (string-match "<\\(.+\\)>$" msgid) - msgid - (concat "<" msgid ">")) ; Invaild message-id. - ;; no message-id, so put dummy msgid. - (concat "<" (timezone-make-date-sortable - (elmo-field-body "date")) - (nth 1 (eword-extract-address-components - (or (elmo-field-body "from") "nobody"))) ">")))) - (defsubst elmo-folder-get-info (folder &optional hashtb) (elmo-get-hash-val folder (or hashtb elmo-folder-info-hashtb))) @@ -406,6 +418,76 @@ Return CONDITION itself if no entity exists in msgdb." elmo-msgdb-location-filename dir) alist)) +;;; For backward compatibility. +(defsubst elmo-msgdb-overview-entity-get-number (entity) + (elmo-message-entity-number entity)) + +(defsubst elmo-msgdb-overview-entity-set-number (entity number) + (elmo-message-entity-set-number entity number)) + +(defsubst elmo-msgdb-overview-entity-get-references (entity) + (elmo-message-entity-field entity 'references)) + +(defsubst elmo-msgdb-overview-entity-set-references (entity references) + (elmo-message-entity-set-field entity 'references references)) + +(defsubst elmo-msgdb-overview-entity-get-from-no-decode (entity) + (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)) + +(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)) + +(defsubst elmo-msgdb-overview-entity-get-subject-no-decode (entity) + (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 '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 'string)) + +(defsubst elmo-msgdb-overview-entity-get-cc (entity) + (elmo-message-entity-field entity 'cc 'string)) + +(defsubst elmo-msgdb-overview-entity-get-size (entity) + (elmo-message-entity-field entity 'size)) + +(defsubst elmo-msgdb-overview-entity-set-size (entity size) + (elmo-message-entity-set-field entity 'size size)) + +(defsubst elmo-msgdb-overview-entity-get-extra (entity) + ;; Truely obsolete. + ) + +(defsubst elmo-msgdb-overview-entity-set-extra (entity extra) + ;; Truely obsolete. + ) + +(defsubst elmo-msgdb-overview-entity-get-extra-field (entity + field-name) + (elmo-message-entity-field entity (intern field-name))) + +(defsubst elmo-msgdb-overview-entity-set-extra-field (entity + field-name + value) + (elmo-message-entity-set-field entity (intern field-name) value)) + (require 'product) (product-provide (provide 'elmo-msgdb) (require 'elmo-version))