;;; 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
;; 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
(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
(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)
(setq entity (elmo-message-entity-field entity 'references))
;; entity is parent-id.
;;;
(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)))
(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
;; 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)
(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
;;
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)))
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))