Replace deprecated time-stamp-hh:mm:ss by format-time-string
[elisp/wanderlust.git] / elmo / elmo-msgdb.el
index 79b33ad..0a10cdf 100644 (file)
@@ -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
 ;; 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)
@@ -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))