* modb-standard.el (modb-standard-economize-entity-size): Changed
[elisp/wanderlust.git] / elmo / modb-entity.el
index 43aa235..b5fede0 100644 (file)
   :type 'symbol
   :group 'elmo)
 
+(defcustom elmo-msgdb-prefer-in-reply-to-for-parent nil
+  "*Non-nil to prefer In-Reply-To header for finding parent message on thread,
+rather than References header."
+  :type 'boolean
+  :group 'elmo)
+
 (defvar modb-entity-default-cache-internal nil)
 
 (defun elmo-message-entity-handler (&optional entity)
   "Get modb entity handler instance which corresponds to the ENTITY."
   (if (and entity
+          (car-safe entity)
+          (not (eq (car entity) t))
           (not (stringp (car entity))))
       (car entity)
     (or modb-entity-default-cache-internal
@@ -205,16 +213,21 @@ Header region is supposed to be narrowed.")
        extra field-body charset size)
     (save-excursion
       (setq entity (modb-legacy-make-message-entity args))
-      (elmo-set-buffer-multibyte default-enable-multibyte-characters)
+      (set-buffer-multibyte default-enable-multibyte-characters)
       (setq message-id (elmo-msgdb-get-message-id-from-buffer))
       (and (setq charset (cdr (assoc "charset" (mime-read-Content-Type))))
           (setq charset (intern-soft charset))
           (setq default-mime-charset charset))
       (setq references
-           (or (elmo-msgdb-get-last-message-id
-                (elmo-field-body "in-reply-to"))
-               (elmo-msgdb-get-last-message-id
-                (elmo-field-body "references")))
+           (if elmo-msgdb-prefer-in-reply-to-for-parent
+               (or (elmo-msgdb-get-last-message-id
+                    (elmo-field-body "in-reply-to"))
+                   (elmo-msgdb-get-last-message-id
+                    (elmo-field-body "references")))
+             (or (elmo-msgdb-get-last-message-id
+                  (elmo-field-body "references"))
+                 (elmo-msgdb-get-last-message-id
+                  (elmo-field-body "in-reply-to"))))
            from (elmo-replace-in-string
                  (elmo-mime-string (or (elmo-field-body "from")
                                        elmo-no-from))
@@ -223,7 +236,7 @@ Header region is supposed to be narrowed.")
                     (elmo-mime-string (or (elmo-field-body "subject")
                                           elmo-no-subject))
                     "\t" " ")
-           date (std11-unfold-string (elmo-field-body "date"))
+           date (elmo-unfold-field-body "date")
            to   (mapconcat 'identity (elmo-multiple-field-body "to") ",")
            cc   (mapconcat 'identity (elmo-multiple-field-body "cc") ","))
       (unless (elmo-msgdb-message-entity-field handler entity 'size)
@@ -299,7 +312,8 @@ Header region is supposed to be narrowed.")
   ((handler modb-legacy-entity-handler) condition entity flags numbers)
   (cond
    ((vectorp condition)
-    (elmo-msgdb-match-condition-primitive condition entity flags numbers))
+    (elmo-msgdb-match-condition-primitive handler condition
+                                         entity flags numbers))
    ((eq (car condition) 'and)
     (let ((lhs (elmo-msgdb-message-match-condition handler
                                                   (nth 1 condition)
@@ -337,7 +351,11 @@ Header region is supposed to be narrowed.")
                                             entity flags numbers)))))))
 
 ;;
-(defun elmo-msgdb-match-condition-primitive (condition entity flags numbers)
+(defun elmo-msgdb-match-condition-primitive (handler
+                                            condition
+                                            entity
+                                            flags
+                                            numbers)
   (catch 'unresolved
     (let ((key (elmo-filter-key condition))
          (case-fold-search t)
@@ -346,8 +364,7 @@ Header region is supposed to be narrowed.")
        ((string= key "last")
        (setq result (<= (length (memq
                                  (elmo-msgdb-message-entity-number
-                                  (elmo-message-entity-handler entity)
-                                  entity)
+                                  handler entity)
                                  numbers))
                         (string-to-int (elmo-filter-value condition)))))
        ((string= key "first")
@@ -355,8 +372,7 @@ Header region is supposed to be narrowed.")
                         (length numbers)
                         (length (memq
                                  (elmo-msgdb-message-entity-number
-                                  (elmo-message-entity-handler entity)
-                                  entity)
+                                  handler entity)
                                  numbers)))
                        (string-to-int (elmo-filter-value condition)))))
        ((string= key "flag")
@@ -379,33 +395,28 @@ Header region is supposed to be narrowed.")
        (setq result (string-match
                      (elmo-filter-value condition)
                      (elmo-msgdb-message-entity-field
-                      (elmo-message-entity-handler entity)
-                      entity 'from t))))
+                      handler entity 'from t))))
        ((string= key "subject")
        (setq result (string-match
                      (elmo-filter-value condition)
                      (elmo-msgdb-message-entity-field
-                      (elmo-message-entity-handler entity)
-                      entity 'subject t))))
+                      handler entity 'subject t))))
        ((string= key "to")
        (setq result (string-match
                      (elmo-filter-value condition)
                      (elmo-msgdb-message-entity-field
-                      (elmo-message-entity-handler entity)
-                      entity 'to))))
+                      handler entity 'to))))
        ((string= key "cc")
        (setq result (string-match
                      (elmo-filter-value condition)
                      (elmo-msgdb-message-entity-field
-                      (elmo-message-entity-handler entity)
-                      entity 'cc))))
+                      handler entity 'cc))))
        ((or (string= key "since")
            (string= key "before"))
        (let ((field-date (elmo-date-make-sortable-string
                           (timezone-fix-time
                            (elmo-msgdb-message-entity-field
-                            (elmo-message-entity-handler entity)
-                            entity 'date)
+                            handler entity 'date)
                            (current-time-zone) nil)))
              (specified-date
               (elmo-date-make-sortable-string
@@ -416,9 +427,9 @@ Header region is supposed to be narrowed.")
                               (string< specified-date field-date))
                         (string< field-date specified-date)))))
        ((member key elmo-msgdb-extra-fields)
-       (let ((extval (elmo-msgdb-message-entity-field
-                      (elmo-message-entity-handler entity)
-                      entity (intern key))))
+       (let ((extval (elmo-msgdb-message-entity-field handler
+                                                      entity
+                                                      (intern key))))
          (when (stringp extval)
            (setq result (string-match
                          (elmo-filter-value condition)