Working branch `elmo-lunafy' is created.
[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 ;;; "namazu search"
55 (eval-and-compile
56   (luna-define-class elmo-nmz-folder
57                      (elmo-map-folder) (pattern index-path))
58   (luna-define-internal-accessors 'elmo-nmz-folder))
59
60 (luna-define-method elmo-folder-initialize ((folder
61                                              elmo-nmz-folder)
62                                             name)
63   (with-temp-buffer
64     (insert "[" name)
65     (goto-char (point-min))
66     (forward-sexp)
67     (elmo-nmz-folder-set-pattern-internal folder
68                                           (buffer-substring
69                                            (+ 1 (point-min))
70                                            (- (point) 1)))
71     (elmo-nmz-folder-set-index-path-internal folder
72                                              (buffer-substring (point)
73                                                                (point-max)))
74     (if (eq (length (elmo-nmz-folder-index-path-internal folder)) 0)
75         (elmo-nmz-folder-set-index-path-internal folder
76                                                  elmo-nmz-default-index-path))
77     folder))
78
79 (luna-define-method elmo-folder-expand-msgdb-path ((folder
80                                                     elmo-nmz-folder))
81   (expand-file-name
82    (elmo-replace-string-as-filename
83     (elmo-folder-name-internal folder))
84    (expand-file-name "nmz" elmo-msgdb-dir)))
85                      
86 (defun elmo-nmz-msgdb-create-entity (folder number)
87   "Create msgdb entity for the message in the FOLDER with NUMBER."
88   (elmo-msgdb-create-overview-entity-from-file
89    number
90    (elmo-map-message-location folder number)))
91
92 (luna-define-method elmo-folder-msgdb-create ((folder elmo-nmz-folder)
93                                               numlist new-mark
94                                               already-mark seen-mark
95                                               important-mark
96                                               seen-list)
97   (let* (overview number-alist mark-alist entity
98                   i percent num pair)
99     (setq num (length numlist))
100     (setq i 0)
101     (message "Creating msgdb...")
102     (while numlist
103       (setq entity
104             (elmo-nmz-msgdb-create-entity
105              folder (car numlist)))
106       (when entity
107         (setq overview
108               (elmo-msgdb-append-element
109                overview entity))
110         (setq number-alist
111               (elmo-msgdb-number-add number-alist
112                                      (elmo-msgdb-overview-entity-get-number
113                                       entity)
114                                      (elmo-msgdb-overview-entity-get-id
115                                       entity)))
116         (setq mark-alist
117               (elmo-msgdb-mark-append
118                mark-alist
119                (elmo-msgdb-overview-entity-get-number
120                 entity)
121                (or (elmo-msgdb-global-mark-get
122                     (elmo-msgdb-overview-entity-get-id
123                      entity))
124                    new-mark))))
125       (when (> num elmo-display-progress-threshold)
126         (setq i (1+ i))
127         (setq percent (/ (* i 100) num))
128         (elmo-display-progress
129          'elmo-folder-msgdb-create "Creating msgdb..."
130          percent))
131       (setq numlist (cdr numlist)))
132     (message "Creating msgdb...done.")
133     (list overview number-alist mark-alist)))
134
135 (luna-define-method elmo-folder-message-file-p ((folder elmo-nmz-folder))
136   t)
137
138 (luna-define-method elmo-message-file-name ((folder elmo-nmz-folder)
139                                             number)
140   (elmo-map-message-location folder number))
141
142 (luna-define-method elmo-folder-message-make-temp-file-p
143   ((folder elmo-nmz-folder))
144   t)
145
146 (luna-define-method elmo-folder-diff ((folder elmo-nmz-folder)
147                                       &optional numbers)
148   (cons nil nil))
149
150 (luna-define-method elmo-folder-message-make-temp-files ((folder
151                                                           elmo-nmz-folder)
152                                                          numbers
153                                                          &optional
154                                                          start-number)
155   (let ((temp-dir (elmo-folder-make-temp-dir folder))
156         (cur-number (if start-number 0)))
157     (dolist (number numbers)
158       (elmo-add-name-to-file
159        (elmo-message-file-name folder number)
160        (expand-file-name
161         (int-to-string (if start-number (incf cur-number) number))
162         temp-dir)))
163     temp-dir))
164
165 (luna-define-method elmo-map-message-fetch ((folder elmo-nmz-folder)
166                                             location strategy &optional
167                                             section outbuf unseen)
168   (if outbuf
169       (with-current-buffer outbuf
170         (erase-buffer)
171         (when (file-exists-p location)
172           (insert-file-contents-as-binary location)
173           (elmo-delete-cr-buffer)
174           t))
175     (with-temp-buffer
176       (insert-file-contents-as-binary location)
177       (elmo-delete-cr-buffer)
178       (buffer-string))))
179
180 (luna-define-method elmo-map-folder-list-message-locations
181   ((folder elmo-nmz-folder))
182   (let (bol locations)
183     (with-temp-buffer
184       (apply 'call-process elmo-nmz-prog nil t t
185              (append elmo-nmz-args
186                      (list
187                       (encode-mime-charset-string
188                        (elmo-nmz-folder-pattern-internal folder)
189                        elmo-nmz-charset)
190                       (expand-file-name
191                        (elmo-nmz-folder-index-path-internal folder)))))
192       (goto-char (point-min))
193       (while (not (eobp))
194         (beginning-of-line)
195         (setq bol (point))
196         (end-of-line)
197         (setq locations (cons (buffer-substring bol (point)) locations))
198         (forward-line 1))
199       locations)))
200
201 (luna-define-method elmo-folder-exists-p ((folder elmo-nmz-folder))
202   t)
203
204 (luna-define-method elmo-folder-search ((folder elmo-nmz-folder)
205                                         condition &optional from-msgs)
206   (let* ((msgs (or from-msgs (elmo-folder-list-messages folder)))
207          (orig msgs)
208          (i 0)
209          case-fold-search matches
210          percent num
211          (num (length msgs)))
212     (while msgs
213       (if (elmo-file-field-condition-match
214            (elmo-map-message-location folder (car msgs))
215            condition
216            (car msgs)
217            orig)
218           (setq matches (cons (car msgs) matches)))
219        (setq i (1+ i))
220        (setq percent (/ (* i 100) num))
221        (elmo-display-progress
222         'elmo-nmz-search "Searching..."
223         percent)
224        (setq msgs (cdr msgs)))
225     matches))
226
227 ;;; To override elmo-map-folder methods.
228 (luna-define-method elmo-folder-list-unreads-internal
229   ((folder elmo-nmz-folder) unread-marks)
230   t)
231
232 (luna-define-method elmo-folder-list-importants-internal
233   ((folder elmo-nmz-folder) important-mark)
234   t)
235
236 (luna-define-method elmo-folder-unmark-important ((folder elmo-nmz-folder)
237                                                   numbers)
238   t)
239
240 (luna-define-method elmo-folder-mark-as-important ((folder elmo-nmz-folder)
241                                                    numbers)
242   t)
243
244 (luna-define-method elmo-folder-unmark-read ((folder elmo-nmz-folder) numbers)
245   t)
246
247 (luna-define-method elmo-folder-mark-as-read ((folder elmo-nmz-folder) numbers)
248   t)
249   
250 (require 'product)
251 (product-provide (provide 'elmo-nmz) (require 'elmo-version))
252
253 ;;; elmo-nmz.el ends here