(elmo-progress-start): Avoid updating `elmo-progress-counter' when a query
[elisp/wanderlust.git] / elmo / elmo-msgdb.el
index 901eee7..0d43d20 100644 (file)
@@ -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
 
                                        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)
+                        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)
@@ -201,14 +219,14 @@ VALUE is the field value (raw)."
 
 (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
@@ -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))