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."
40 (defcustom elmo-nmz-prog "namazu"
41 "*Program name of namazu."
45 (defcustom elmo-nmz-charset 'iso-2022-jp
46 "*Charset for namazu argument."
50 (defcustom elmo-nmz-args '("--all" "--list" "--early")
51 "*Argument list for namazu to list matched files."
52 :type '(repeat string)
55 (defcustom elmo-nmz-index-alias-alist nil
56 "*Alist of ALIAS and INDEX-PATH."
57 :type '(repeat (cons (string :tag "Alias Name")
58 (directory :tag "Index Path")))
63 (luna-define-class elmo-nmz-folder
64 (elmo-map-folder) (pattern index-path))
65 (luna-define-internal-accessors 'elmo-nmz-folder))
67 (luna-define-method elmo-folder-initialize ((folder
72 (goto-char (point-min))
74 (elmo-nmz-folder-set-pattern-internal folder
78 (let ((index (buffer-substring (point) (point-max))))
79 (elmo-nmz-folder-set-index-path-internal
81 (cond ((cdr (assoc index elmo-nmz-index-alias-alist)))
82 ((eq (length index) 0)
83 elmo-nmz-default-index-path)
88 (luna-define-method elmo-folder-expand-msgdb-path ((folder
91 (elmo-replace-string-as-filename
92 (elmo-folder-name-internal folder))
93 (expand-file-name "nmz" elmo-msgdb-dir)))
95 (defun elmo-nmz-msgdb-create-entity (folder number)
96 "Create msgdb entity for the message in the FOLDER with NUMBER."
97 (let ((location (elmo-map-message-location folder number))
99 (setq entity (elmo-msgdb-create-overview-entity-from-file number location))
100 (unless (or (> (length (elmo-msgdb-overview-entity-get-to entity)) 0)
101 (> (length (elmo-msgdb-overview-entity-get-cc entity)) 0)
102 (not (string= (elmo-msgdb-overview-entity-get-subject entity)
104 (elmo-msgdb-overview-entity-set-subject entity location)
105 (setq uid (nth 2 (file-attributes location)))
106 (elmo-msgdb-overview-entity-set-from entity
109 " <"(user-login-name uid) "@"
113 (luna-define-method elmo-folder-msgdb-create ((folder elmo-nmz-folder)
115 already-mark seen-mark
118 (let* (overview number-alist mark-alist entity
120 (setq num (length numlist))
122 (message "Creating msgdb...")
125 (elmo-nmz-msgdb-create-entity
126 folder (car numlist)))
129 (elmo-msgdb-append-element
132 (elmo-msgdb-number-add number-alist
133 (elmo-msgdb-overview-entity-get-number
135 (elmo-msgdb-overview-entity-get-id
138 (elmo-msgdb-mark-append
140 (elmo-msgdb-overview-entity-get-number
142 (or (elmo-msgdb-global-mark-get
143 (elmo-msgdb-overview-entity-get-id
146 (when (> num elmo-display-progress-threshold)
148 (setq percent (/ (* i 100) num))
149 (elmo-display-progress
150 'elmo-folder-msgdb-create "Creating msgdb..."
152 (setq numlist (cdr numlist)))
153 (message "Creating msgdb...done.")
154 (list overview number-alist mark-alist)))
156 (luna-define-method elmo-folder-message-file-p ((folder elmo-nmz-folder))
159 (luna-define-method elmo-message-file-name ((folder elmo-nmz-folder)
161 (elmo-map-message-location folder number))
163 (luna-define-method elmo-folder-message-make-temp-file-p
164 ((folder elmo-nmz-folder))
167 (luna-define-method elmo-folder-diff ((folder elmo-nmz-folder)
171 (luna-define-method elmo-folder-message-make-temp-files ((folder
176 (let ((temp-dir (elmo-folder-make-temp-dir folder))
177 (cur-number (if start-number 0)))
178 (dolist (number numbers)
179 (elmo-add-name-to-file
180 (elmo-message-file-name folder number)
182 (int-to-string (if start-number (incf cur-number) number))
186 (luna-define-method elmo-map-message-fetch ((folder elmo-nmz-folder)
188 &optional section unseen)
189 (when (file-exists-p location)
190 (insert-file-contents-as-binary location)
191 (unless (or (std11-field-body "To")
192 (std11-field-body "Cc")
193 (std11-field-body "Subject"))
194 (let (charset guess uid)
196 (set-buffer-multibyte t)
197 (insert-file-contents location)
198 (setq charset (detect-mime-charset-region (point-min)
200 (goto-char (point-min))
201 (setq guess (mime-find-file-type location))
202 (setq uid (nth 2 (file-attributes location)))
203 (insert "From: " (concat (user-full-name uid)
204 " <"(user-login-name uid) "@"
205 (system-name) ">") "\n")
206 (insert "Subject: " location "\n")
207 (insert "Content-Type: "
208 (concat (nth 0 guess) "/" (nth 1 guess))
209 "; charset=" (upcase (symbol-name charset))
210 "\nMIME-Version: 1.0\n\n")
211 (encode-mime-charset-region (point-min) (point-max) charset)
212 (set-buffer-multibyte nil)))))
214 (luna-define-method elmo-map-folder-list-message-locations
215 ((folder elmo-nmz-folder))
218 (apply 'call-process elmo-nmz-prog nil t t
219 (append elmo-nmz-args
221 (encode-mime-charset-string
222 (elmo-nmz-folder-pattern-internal folder)
225 (elmo-nmz-folder-index-path-internal folder)))))
226 (goto-char (point-min))
231 (setq locations (cons (buffer-substring bol (point)) locations))
235 (luna-define-method elmo-folder-exists-p ((folder elmo-nmz-folder))
238 (luna-define-method elmo-folder-search ((folder elmo-nmz-folder)
239 condition &optional from-msgs)
240 (let* ((msgs (or from-msgs (elmo-folder-list-messages folder)))
243 case-fold-search matches
247 (if (elmo-file-field-condition-match
248 (elmo-map-message-location folder (car msgs))
252 (setq matches (cons (car msgs) matches)))
254 (setq percent (/ (* i 100) num))
255 (elmo-display-progress
256 'elmo-nmz-search "Searching..."
258 (setq msgs (cdr msgs)))
261 ;;; To override elmo-map-folder methods.
262 (luna-define-method elmo-folder-list-unreads-internal
263 ((folder elmo-nmz-folder) unread-marks &optional mark-alist)
266 (luna-define-method elmo-folder-unmark-important ((folder elmo-nmz-folder)
270 (luna-define-method elmo-folder-mark-as-important ((folder elmo-nmz-folder)
274 (luna-define-method elmo-folder-unmark-read ((folder elmo-nmz-folder) numbers)
277 (luna-define-method elmo-folder-mark-as-read ((folder elmo-nmz-folder) numbers)
281 (product-provide (provide 'elmo-nmz) (require 'elmo-version))
283 ;;; elmo-nmz.el ends here