1 ;;; elmo-nmz.el --- Namazu interface for ELMO.
3 ;; Copyright (C) 2000 Yuuichi Teranishi <teranisi@gohome.org>
5 ;; Author: Yuuichi Teranishi <teranisi@gohome.org>
6 ;; Keywords: mail, net news
8 ;; This file is part of ELMO (Elisp Library for Message Orchestration).
10 ;; This program is free software; you can redistribute it and/or modify
11 ;; it under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation; either version 2, or (at your option)
15 ;; This program is distributed in the hope that it will be useful,
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ;; GNU General Public License for more details.
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 ;; Boston, MA 02111-1307, USA.
35 (defcustom elmo-nmz-default-index-path "~/Mail"
36 "*Default index path for namazu.
37 If the value is a list, all elements are used as index paths for namazu."
41 (defcustom elmo-nmz-prog "namazu"
42 "*Program name of namazu."
46 (defcustom elmo-nmz-charset 'iso-2022-jp
47 "*Charset for namazu argument."
51 (defcustom elmo-nmz-args '("--all" "--list" "--early")
52 "*Argument list for namazu to list matched files."
53 :type '(repeat string)
56 (defcustom elmo-nmz-index-alias-alist nil
57 "*Alist of ALIAS and INDEX-PATH."
58 :type '(repeat (cons (string :tag "Alias Name")
59 (choice (directory :tag "Index Path")
60 (repeat (directory :tag "Index Path")))))
65 (luna-define-class elmo-nmz-folder
66 (elmo-map-folder) (pattern index-path))
67 (luna-define-internal-accessors 'elmo-nmz-folder))
69 (luna-define-method elmo-folder-initialize ((folder
74 (goto-char (point-min))
76 (elmo-nmz-folder-set-pattern-internal folder
80 (let ((index (buffer-substring (point) (point-max))))
81 (elmo-nmz-folder-set-index-path-internal
83 (cond ((cdr (assoc index elmo-nmz-index-alias-alist)))
84 ((eq (length index) 0)
85 elmo-nmz-default-index-path)
90 (luna-define-method elmo-folder-expand-msgdb-path ((folder
93 (elmo-replace-string-as-filename
94 (elmo-folder-name-internal folder))
95 (expand-file-name "nmz" elmo-msgdb-directory)))
97 (defun elmo-nmz-msgdb-create-entity (folder number)
98 "Create msgdb entity for the message in the FOLDER with NUMBER."
99 (let ((location (elmo-map-message-location folder number))
101 (setq entity (elmo-msgdb-create-overview-entity-from-file number location))
102 (unless (or (> (length (elmo-msgdb-overview-entity-get-to entity)) 0)
103 (> (length (elmo-msgdb-overview-entity-get-cc entity)) 0)
104 (not (string= (elmo-msgdb-overview-entity-get-subject entity)
106 (elmo-msgdb-overview-entity-set-subject entity location)
107 (setq uid (nth 2 (file-attributes location)))
108 (elmo-msgdb-overview-entity-set-from entity
111 " <"(user-login-name uid) "@"
115 (luna-define-method elmo-folder-msgdb-create ((folder elmo-nmz-folder)
117 already-mark seen-mark
120 (let* (overview number-alist mark-alist entity
122 (setq num (length numlist))
124 (message "Creating msgdb...")
127 (elmo-nmz-msgdb-create-entity
128 folder (car numlist)))
131 (elmo-msgdb-append-element
134 (elmo-msgdb-number-add number-alist
135 (elmo-msgdb-overview-entity-get-number
137 (elmo-msgdb-overview-entity-get-id
140 (elmo-msgdb-mark-append
142 (elmo-msgdb-overview-entity-get-number
144 (or (elmo-msgdb-global-mark-get
145 (elmo-msgdb-overview-entity-get-id
148 (when (> num elmo-display-progress-threshold)
150 (setq percent (/ (* i 100) num))
151 (elmo-display-progress
152 'elmo-folder-msgdb-create "Creating msgdb..."
154 (setq numlist (cdr numlist)))
155 (message "Creating msgdb...done.")
156 (list overview number-alist mark-alist)))
158 (luna-define-method elmo-folder-message-file-p ((folder elmo-nmz-folder))
161 (luna-define-method elmo-message-file-name ((folder elmo-nmz-folder)
163 (elmo-map-message-location folder number))
165 (luna-define-method elmo-folder-message-make-temp-file-p
166 ((folder elmo-nmz-folder))
169 (luna-define-method elmo-folder-diff ((folder elmo-nmz-folder)
173 (luna-define-method elmo-folder-message-make-temp-files ((folder
178 (let ((temp-dir (elmo-folder-make-temporary-directory folder))
179 (cur-number (if start-number 0)))
180 (dolist (number numbers)
182 (elmo-message-file-name folder number)
184 (int-to-string (if start-number (incf cur-number) number))
188 (luna-define-method elmo-map-message-fetch ((folder elmo-nmz-folder)
190 &optional section unseen)
191 (when (file-exists-p location)
193 (insert-file-contents-as-binary location)
194 (unless (or (std11-field-body "To")
195 (std11-field-body "Cc")
196 (std11-field-body "Subject"))
197 (let (charset guess uid)
199 (set-buffer-multibyte t)
200 (insert-file-contents location)
201 (setq charset (detect-mime-charset-region (point-min)
203 (goto-char (point-min))
204 (setq guess (mime-find-file-type location))
205 (setq uid (nth 2 (file-attributes location)))
206 (insert "From: " (concat (user-full-name uid)
207 " <"(user-login-name uid) "@"
208 (system-name) ">") "\n")
209 (insert "Subject: " location "\n")
210 (insert "Content-Type: "
211 (concat (nth 0 guess) "/" (nth 1 guess))
212 "; charset=" (upcase (symbol-name charset))
213 "\nMIME-Version: 1.0\n\n")
214 (encode-mime-charset-region (point-min) (point-max) charset)
215 (set-buffer-multibyte nil))))))
217 (luna-define-method elmo-map-folder-list-message-locations
218 ((folder elmo-nmz-folder))
221 (apply 'call-process elmo-nmz-prog nil t t
222 (append elmo-nmz-args
224 (encode-mime-charset-string
225 (elmo-nmz-folder-pattern-internal folder)
227 (if (listp (elmo-nmz-folder-index-path-internal folder))
230 (elmo-nmz-folder-index-path-internal folder))
233 (elmo-nmz-folder-index-path-internal folder))))))
234 (goto-char (point-min))
237 (setq bol (if (looking-at "^file://") (match-end 0)(point)))
239 (setq locations (cons (buffer-substring bol (point)) locations))
243 (luna-define-method elmo-folder-exists-p ((folder elmo-nmz-folder))
246 (luna-define-method elmo-folder-search ((folder elmo-nmz-folder)
247 condition &optional from-msgs)
248 (let* ((msgs (or from-msgs (elmo-folder-list-messages folder)))
251 case-fold-search matches
255 (if (elmo-file-field-condition-match
256 (elmo-map-message-location folder (car msgs))
260 (setq matches (cons (car msgs) matches)))
262 (setq percent (/ (* i 100) num))
263 (elmo-display-progress
264 'elmo-nmz-search "Searching..."
266 (setq msgs (cdr msgs)))
269 ;;; To override elmo-map-folder methods.
270 (luna-define-method elmo-folder-list-unreads-internal
271 ((folder elmo-nmz-folder) unread-marks &optional mark-alist)
274 (luna-define-method elmo-folder-unmark-important ((folder elmo-nmz-folder)
278 (luna-define-method elmo-folder-mark-as-important ((folder elmo-nmz-folder)
282 (luna-define-method elmo-folder-unmark-read ((folder elmo-nmz-folder) numbers)
285 (luna-define-method elmo-folder-mark-as-read ((folder elmo-nmz-folder) numbers)
289 (product-provide (provide 'elmo-nmz) (require 'elmo-version))
291 ;;; elmo-nmz.el ends here