0fc85ef76f25e6f88716db2e800d4a35d9dfeb20
[elisp/wanderlust.git] / elmo / elmo-nmz.el
1 ;;; elmo-nmz.el -- Namazu interface for ELMO.
2
3 ;; Copyright (C) 2000 Yuuichi Teranishi <teranisi@gohome.org>
4
5 ;; Author: Yuuichi Teranishi <teranisi@gohome.org>
6 ;; Keywords: mail, net news
7
8 ;; This file is part of ELMO (Elisp Library for Message Orchestration).
9
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)
13 ;; any later version.
14 ;;
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.
19 ;;
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.
24 ;;
25
26 ;;; Commentary:
27 ;; 
28
29 ;;; Code:
30 ;; 
31 (require 'elmo)
32 (require 'elmo-map)
33
34 (defcustom elmo-nmz-default-index-path "~/Mail"
35   "*Default index path for namazu."
36   :type 'directory
37   :group 'elmo)
38
39 (defcustom elmo-nmz-prog "namazu"
40   "*Program name of namazu."
41   :type 'string
42   :group 'elmo)
43
44 (defcustom elmo-nmz-charset 'iso-2022-jp
45   "*Charset for namazu argument."
46   :type 'symbol
47   :group 'elmo)
48
49 (defcustom elmo-nmz-args '("--all" "--list" "--early")
50   "*Argument list for namazu to list matched files."
51   :type '(repeat string)
52   :group 'elmo)
53
54 (defvar elmo-nmz-content-type-alist '(("\.html?\\'" . "text/html"))
55   "*An alist of (REGEXP . Content-Type) related filename.")
56
57 ;;; "namazu search"
58 (eval-and-compile
59   (luna-define-class elmo-nmz-folder
60                      (elmo-map-folder) (pattern index-path))
61   (luna-define-internal-accessors 'elmo-nmz-folder))
62
63 (luna-define-method elmo-folder-initialize ((folder
64                                              elmo-nmz-folder)
65                                             name)
66   (with-temp-buffer
67     (insert "[" name)
68     (goto-char (point-min))
69     (forward-sexp)
70     (elmo-nmz-folder-set-pattern-internal folder
71                                           (buffer-substring
72                                            (+ 1 (point-min))
73                                            (- (point) 1)))
74     (elmo-nmz-folder-set-index-path-internal folder
75                                              (buffer-substring (point)
76                                                                (point-max)))
77     (if (eq (length (elmo-nmz-folder-index-path-internal folder)) 0)
78         (elmo-nmz-folder-set-index-path-internal folder
79                                                  elmo-nmz-default-index-path))
80     folder))
81
82 (luna-define-method elmo-folder-expand-msgdb-path ((folder
83                                                     elmo-nmz-folder))
84   (expand-file-name
85    (elmo-replace-string-as-filename
86     (elmo-folder-name-internal folder))
87    (expand-file-name "nmz" elmo-msgdb-dir)))
88
89 (defun elmo-nmz-msgdb-create-entity (folder number)
90   "Create msgdb entity for the message in the FOLDER with NUMBER."
91   (elmo-msgdb-create-overview-entity-from-file
92    number
93    (elmo-map-message-location folder number)))
94
95 (luna-define-method elmo-folder-msgdb-create ((folder elmo-nmz-folder)
96                                               numlist new-mark
97                                               already-mark seen-mark
98                                               important-mark
99                                               seen-list)
100   (let* (overview number-alist mark-alist entity
101                   i percent num pair)
102     (setq num (length numlist))
103     (setq i 0)
104     (message "Creating msgdb...")
105     (while numlist
106       (setq entity
107             (elmo-nmz-msgdb-create-entity
108              folder (car numlist)))
109       (when entity
110         (setq overview
111               (elmo-msgdb-append-element
112                overview entity))
113         (setq number-alist
114               (elmo-msgdb-number-add number-alist
115                                      (elmo-msgdb-overview-entity-get-number
116                                       entity)
117                                      (elmo-msgdb-overview-entity-get-id
118                                       entity)))
119         (setq mark-alist
120               (elmo-msgdb-mark-append
121                mark-alist
122                (elmo-msgdb-overview-entity-get-number
123                 entity)
124                (or (elmo-msgdb-global-mark-get
125                     (elmo-msgdb-overview-entity-get-id
126                      entity))
127                    new-mark))))
128       (when (> num elmo-display-progress-threshold)
129         (setq i (1+ i))
130         (setq percent (/ (* i 100) num))
131         (elmo-display-progress
132          'elmo-folder-msgdb-create "Creating msgdb..."
133          percent))
134       (setq numlist (cdr numlist)))
135     (message "Creating msgdb...done.")
136     (list overview number-alist mark-alist)))
137
138 (luna-define-method elmo-folder-message-file-p ((folder elmo-nmz-folder))
139   t)
140
141 (luna-define-method elmo-message-file-name ((folder elmo-nmz-folder)
142                                             number)
143   (elmo-map-message-location folder number))
144
145 (luna-define-method elmo-folder-message-make-temp-file-p
146   ((folder elmo-nmz-folder))
147   t)
148
149 (luna-define-method elmo-folder-diff ((folder elmo-nmz-folder)
150                                       &optional numbers)
151   (cons nil nil))
152
153 (luna-define-method elmo-folder-message-make-temp-files ((folder
154                                                           elmo-nmz-folder)
155                                                          numbers
156                                                          &optional
157                                                          start-number)
158   (let ((temp-dir (elmo-folder-make-temp-dir folder))
159         (cur-number (if start-number 0)))
160     (dolist (number numbers)
161       (elmo-add-name-to-file
162        (elmo-message-file-name folder number)
163        (expand-file-name
164         (int-to-string (if start-number (incf cur-number) number))
165         temp-dir)))
166     temp-dir))
167
168 (luna-define-method elmo-map-message-fetch ((folder elmo-nmz-folder)
169                                             location strategy
170                                             &optional section unseen)
171   (when (file-exists-p location)
172     (insert-file-contents-as-binary location)
173     (unless (or (std11-field-body "To")
174                 (std11-field-body "Resent-To")
175                 (std11-field-body "Cc")
176                 (std11-field-body "Bcc")
177                 (std11-field-body "Newsgroups"))
178       (erase-buffer)
179       (set-buffer-multibyte t)
180       (insert-file-contents location)
181       (goto-char (point-min))
182       (insert "Content-Type: "
183               (or (cdr (elmo-string-matched-assoc
184                         location
185                         elmo-nmz-content-type-alist))
186                   "text/plain")
187               "; charset=ISO-2022-JP\nMIME-Version: 1.0\n\n")
188       (encode-coding-region (point-min) (point-max)
189                             (mime-charset-to-coding-system "ISO-2022-JP"))
190       (set-buffer-multibyte nil))))
191
192 (luna-define-method elmo-map-folder-list-message-locations
193   ((folder elmo-nmz-folder))
194   (let (bol locations)
195     (with-temp-buffer
196       (apply 'call-process elmo-nmz-prog nil t t
197              (append elmo-nmz-args
198                      (list
199                       (encode-mime-charset-string
200                        (elmo-nmz-folder-pattern-internal folder)
201                        elmo-nmz-charset)
202                       (expand-file-name
203                        (elmo-nmz-folder-index-path-internal folder)))))
204       (goto-char (point-min))
205       (while (not (eobp))
206         (beginning-of-line)
207         (setq bol (point))
208         (end-of-line)
209         (setq locations (cons (buffer-substring bol (point)) locations))
210         (forward-line 1))
211       locations)))
212
213 (luna-define-method elmo-folder-exists-p ((folder elmo-nmz-folder))
214   t)
215
216 (luna-define-method elmo-folder-search ((folder elmo-nmz-folder)
217                                         condition &optional from-msgs)
218   (let* ((msgs (or from-msgs (elmo-folder-list-messages folder)))
219          (orig msgs)
220          (i 0)
221          case-fold-search matches
222          percent num
223          (num (length msgs)))
224     (while msgs
225       (if (elmo-file-field-condition-match
226            (elmo-map-message-location folder (car msgs))
227            condition
228            (car msgs)
229            orig)
230           (setq matches (cons (car msgs) matches)))
231        (setq i (1+ i))
232        (setq percent (/ (* i 100) num))
233        (elmo-display-progress
234         'elmo-nmz-search "Searching..."
235         percent)
236        (setq msgs (cdr msgs)))
237     matches))
238
239 ;;; To override elmo-map-folder methods.
240 (luna-define-method elmo-folder-list-unreads-internal
241   ((folder elmo-nmz-folder) unread-marks &optional mark-alist)
242   t)
243
244 (luna-define-method elmo-folder-unmark-important ((folder elmo-nmz-folder)
245                                                   numbers)
246   t)
247
248 (luna-define-method elmo-folder-mark-as-important ((folder elmo-nmz-folder)
249                                                    numbers)
250   t)
251
252 (luna-define-method elmo-folder-unmark-read ((folder elmo-nmz-folder) numbers)
253   t)
254
255 (luna-define-method elmo-folder-mark-as-read ((folder elmo-nmz-folder) numbers)
256   t)
257   
258 (require 'product)
259 (product-provide (provide 'elmo-nmz) (require 'elmo-version))
260
261 ;;; elmo-nmz.el ends here