* elmo.el (elmo-folder-synchronize): Fix description of the return value.
[elisp/wanderlust.git] / elmo / elmo-nmz.el
index 1b210ff..6db859f 100644 (file)
@@ -33,7 +33,8 @@
 (require 'mime-edit)
 
 (defcustom elmo-nmz-default-index-path "~/Mail"
-  "*Default index path for namazu."
+  "*Default index path for namazu.
+If the value is a list, all elements are used as index paths for namazu."
   :type 'directory
   :group 'elmo)
 
@@ -47,7 +48,7 @@
   :type 'symbol
   :group 'elmo)
 
-(defcustom elmo-nmz-args '("--all" "--list" "--early")
+(defcustom elmo-nmz-args '("--all" "--list" "--late")
   "*Argument list for namazu to list matched files."
   :type '(repeat string)
   :group 'elmo)
 (defcustom elmo-nmz-index-alias-alist nil
   "*Alist of ALIAS and INDEX-PATH."
   :type '(repeat (cons (string :tag "Alias Name")
-                      (directory :tag "Index Path")))
+                      (choice (directory :tag "Index Path")
+                              (repeat (directory :tag "Index Path")))))
   :group 'elmo)
 
+(defvar elmo-nmz-use-drive-letter (if (memq system-type
+                                           '(OS/2 emx windows-nt)) t nil)
+  "*If non-nil, do a drive letter conversion (e.g. /a|/ => a:/).")
+
 ;;; "namazu search"
 (eval-and-compile
   (luna-define-class elmo-nmz-folder
   (expand-file-name
    (elmo-replace-string-as-filename
     (elmo-folder-name-internal folder))
-   (expand-file-name "nmz" elmo-msgdb-dir)))
+   (expand-file-name "nmz" elmo-msgdb-directory)))
 
-(defun elmo-nmz-msgdb-create-entity (folder number)
+(defun elmo-nmz-msgdb-create-entity (msgdb folder number)
   "Create msgdb entity for the message in the FOLDER with NUMBER."
-  (let ((location (elmo-map-message-location folder number))
+  (let ((location (expand-file-name (elmo-map-message-location folder number)))
        entity uid)
-    (setq entity (elmo-msgdb-create-overview-entity-from-file number location))
-    (unless (or (> (length (elmo-msgdb-overview-entity-get-to entity)) 0)
-               (> (length (elmo-msgdb-overview-entity-get-cc entity)) 0)
-               (not (string= (elmo-msgdb-overview-entity-get-subject entity)
+    (setq entity (elmo-msgdb-create-message-entity-from-file
+                 (elmo-msgdb-message-entity-handler msgdb) number location))
+    (unless (or (> (length (elmo-message-entity-field entity 'to)) 0)
+               (> (length (elmo-message-entity-field entity 'cc)) 0)
+               (not (string= (elmo-message-entity-field entity 'subject)
                              elmo-no-subject)))
-      (elmo-msgdb-overview-entity-set-subject entity location)
+      (elmo-message-entity-set-field entity 'subject location)
       (setq uid (nth 2 (file-attributes location)))
-      (elmo-msgdb-overview-entity-set-from entity
-                                          (concat
-                                           (user-full-name uid)
-                                           " <"(user-login-name uid) "@"
-                                           (system-name) ">")))
+      (elmo-message-entity-set-field entity 'from
+                                    (concat
+                                     (user-full-name uid)
+                                     " <"(user-login-name uid) "@"
+                                     (system-name) ">")))
     entity))
 
 (luna-define-method elmo-folder-msgdb-create ((folder elmo-nmz-folder)
-                                             numlist new-mark
-                                             already-mark seen-mark
-                                             important-mark
-                                             seen-list)
-  (let* (overview number-alist mark-alist entity
-                 i percent num pair)
+                                             numlist flag-table)
+  (let ((new-msgdb (elmo-make-msgdb))
+       entity mark i percent num)
     (setq num (length numlist))
     (setq i 0)
     (message "Creating msgdb...")
     (while numlist
       (setq entity
            (elmo-nmz-msgdb-create-entity
-            folder (car numlist)))
+            new-msgdb folder (car numlist)))
       (when entity
-       (setq overview
-             (elmo-msgdb-append-element
-              overview entity))
-       (setq number-alist
-             (elmo-msgdb-number-add number-alist
-                                    (elmo-msgdb-overview-entity-get-number
-                                     entity)
-                                    (elmo-msgdb-overview-entity-get-id
-                                     entity)))
-       (setq mark-alist
-             (elmo-msgdb-mark-append
-              mark-alist
-              (elmo-msgdb-overview-entity-get-number
-               entity)
-              (or (elmo-msgdb-global-mark-get
-                   (elmo-msgdb-overview-entity-get-id
-                    entity))
-                  new-mark))))
+       (elmo-msgdb-append-entity new-msgdb entity '(new unread)))
       (when (> num elmo-display-progress-threshold)
        (setq i (1+ i))
        (setq percent (/ (* i 100) num))
         'elmo-folder-msgdb-create "Creating msgdb..."
         percent))
       (setq numlist (cdr numlist)))
-    (message "Creating msgdb...done.")
-    (list overview number-alist mark-alist)))
+    (message "Creating msgdb...done")
+    new-msgdb))
 
 (luna-define-method elmo-folder-message-file-p ((folder elmo-nmz-folder))
   t)
   ((folder elmo-nmz-folder))
   t)
 
-(luna-define-method elmo-folder-diff ((folder elmo-nmz-folder)
-                                     &optional numbers)
+(luna-define-method elmo-folder-diff ((folder elmo-nmz-folder))
   (cons nil nil))
 
 (luna-define-method elmo-folder-message-make-temp-files ((folder
                                                         numbers
                                                         &optional
                                                         start-number)
-  (let ((temp-dir (elmo-folder-make-temp-dir folder))
+  (let ((temp-dir (elmo-folder-make-temporary-directory folder))
        (cur-number (if start-number 0)))
     (dolist (number numbers)
-      (elmo-add-name-to-file
+      (elmo-copy-file
        (elmo-message-file-name folder number)
        (expand-file-name
        (int-to-string (if start-number (incf cur-number) number))
                                            location strategy
                                            &optional section unseen)
   (when (file-exists-p location)
-    (insert-file-contents-as-binary location)
-    (unless (or (std11-field-body "To")
-               (std11-field-body "Cc")
-               (std11-field-body "Subject"))
-      (let (charset guess uid)
-       (erase-buffer)
-       (set-buffer-multibyte t)
-       (insert-file-contents location)
-       (setq charset (detect-mime-charset-region (point-min)
-                                                 (point-max)))
-       (goto-char (point-min))
-       (setq guess (mime-find-file-type location))
-       (setq uid (nth 2 (file-attributes location)))
-       (insert "From: " (concat (user-full-name uid)
-                                " <"(user-login-name uid) "@"
-                                (system-name) ">") "\n")
-       (insert "Subject: " location "\n")
-       (insert "Content-Type: "
-               (concat (nth 0 guess) "/" (nth 1 guess))
-               "; charset=" (upcase (symbol-name charset))
-               "\nMIME-Version: 1.0\n\n")
-       (encode-mime-charset-region (point-min) (point-max) charset)
-       (set-buffer-multibyte nil)))))
+    (prog1
+       (insert-file-contents-as-binary (expand-file-name location))
+      (unless (or (std11-field-body "To")
+                 (std11-field-body "Cc")
+                 (std11-field-body "Subject"))
+       (let (charset guess uid)
+         (erase-buffer)
+         (set-buffer-multibyte t)
+         (insert-file-contents (expand-file-name location))
+         (setq charset (detect-mime-charset-region (point-min)
+                                                   (point-max)))
+         (goto-char (point-min))
+         (setq guess (mime-find-file-type location))
+         (setq uid (nth 2 (file-attributes location)))
+         (insert "From: " (concat (user-full-name uid)
+                                  " <"(user-login-name uid) "@"
+                                  (system-name) ">") "\n")
+         (insert "Subject: " location "\n")
+         (insert "Content-Type: "
+                 (concat (nth 0 guess) "/" (nth 1 guess))
+                 "; charset=" (upcase (symbol-name charset))
+                 "\nMIME-Version: 1.0\n\n")
+         (encode-mime-charset-region (point-min) (point-max) charset)
+         (set-buffer-multibyte nil))))))
 
 (luna-define-method elmo-map-folder-list-message-locations
   ((folder elmo-nmz-folder))
                     (list
                      (encode-mime-charset-string
                       (elmo-nmz-folder-pattern-internal folder)
-                      elmo-nmz-charset)
-                     (expand-file-name
-                      (elmo-nmz-folder-index-path-internal folder)))))
+                      elmo-nmz-charset))
+                    (if (listp (elmo-nmz-folder-index-path-internal folder))
+                        (mapcar
+                         'expand-file-name
+                         (elmo-nmz-folder-index-path-internal folder))
+                      (list
+                       (expand-file-name
+                        (elmo-nmz-folder-index-path-internal folder))))))
       (goto-char (point-min))
       (while (not (eobp))
        (beginning-of-line)
+       ;; convert url to file path.
+       (when (looking-at "^file://")
+         (replace-match ""))
+       (when (and elmo-nmz-use-drive-letter
+                  (looking-at "^/\\([A-Za-z]\\)|/"))
+         (replace-match "\\1:/")
+         (beginning-of-line))
        (setq bol (point))
        (end-of-line)
        (setq locations (cons (buffer-substring bol (point)) locations))
        (forward-line 1))
-      locations)))
+      (nreverse locations))))
 
 (luna-define-method elmo-folder-exists-p ((folder elmo-nmz-folder))
   t)
 
-(luna-define-method elmo-folder-search ((folder elmo-nmz-folder)
-                                       condition &optional from-msgs)
-  (let* ((msgs (or from-msgs (elmo-folder-list-messages folder)))
-        (orig msgs)
-        (i 0)
-        case-fold-search matches
-        percent num
-        (num (length msgs)))
-    (while msgs
-      (if (elmo-file-field-condition-match
-          (elmo-map-message-location folder (car msgs))
-          condition
-          (car msgs)
-          orig)
-         (setq matches (cons (car msgs) matches)))
-       (setq i (1+ i))
-       (setq percent (/ (* i 100) num))
-       (elmo-display-progress
-       'elmo-nmz-search "Searching..."
-       percent)
-       (setq msgs (cdr msgs)))
-    matches))
-
-;;; To override elmo-map-folder methods.
-(luna-define-method elmo-folder-list-unreads-internal
-  ((folder elmo-nmz-folder) unread-marks &optional mark-alist)
-  t)
-
-(luna-define-method elmo-folder-unmark-important ((folder elmo-nmz-folder)
-                                                 numbers)
-  t)
-
-(luna-define-method elmo-folder-mark-as-important ((folder elmo-nmz-folder)
-                                                  numbers)
-  t)
-
-(luna-define-method elmo-folder-unmark-read ((folder elmo-nmz-folder) numbers)
-  t)
-
-(luna-define-method elmo-folder-mark-as-read ((folder elmo-nmz-folder) numbers)
-  t)
-
 (require 'product)
 (product-provide (provide 'elmo-nmz) (require 'elmo-version))