1 ;;; elmo-multi.el -- Multiple Folder Interface for ELMO.
3 ;; Copyright 1998,1999,2000 Yuuichi Teranishi <teranisi@gohome.org>
5 ;; Author: Yuuichi Teranishi <teranisi@gohome.org>
6 ;; Keywords: mail, net news
7 ;; Time-stamp: <00/03/14 19:41:07 teranisi>
9 ;; This file is part of ELMO (Elisp Library for Message Orchestration).
11 ;; This program is free software; you can redistribute it and/or modify
12 ;; it under the terms of the GNU General Public License as published by
13 ;; the Free Software Foundation; either version 2, or (at your option)
16 ;; This program is distributed in the hope that it will be useful,
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 ;; GNU General Public License for more details.
21 ;; You should have received a copy of the GNU General Public License
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
24 ;; Boston, MA 02111-1307, USA.
37 (defun elmo-multi-msgdb (msgdb base)
38 (list (mapcar (function
40 (elmo-msgdb-overview-entity-set-number
43 (elmo-msgdb-overview-entity-get-number x)))))
53 (cdr x)))) (nth 2 msgdb))))
55 (defun elmo-multi-msgdb-create-as-numlist (spec numlist new-mark already-mark
56 seen-mark important-mark
59 (let* ((flds (cdr spec))
60 overview number-alist mark-alist entity
65 (setq one-list-list (elmo-multi-get-intlist-list numlist))
67 (while (< cur-number (length flds))
72 (elmo-msgdb-create-as-numlist (nth cur-number flds)
73 (nth cur-number one-list-list)
75 seen-mark important-mark
77 (* elmo-multi-divide-number (1+ cur-number)))))
78 (setq cur-number (1+ cur-number)))
79 (elmo-msgdb-sort-by-date ret-val))))
81 ;; returns append-msgdb
82 (defun elmo-multi-delete-crossposts (already-msgdb append-msgdb)
83 (let* ((number-alist (elmo-msgdb-get-number-alist append-msgdb))
84 (dummy (copy-sequence (append
86 (elmo-msgdb-get-number-alist already-msgdb))))
92 (setq dummy (delq (car cur) dummy))
93 (if (setq same (rassoc (cdr (car cur)) dummy)) ;; same message id is remained
94 (unless (= (/ (car (car cur)) elmo-multi-divide-number)
95 (/ (car same) elmo-multi-divide-number))
96 ;; base is also same...delete it!
97 (setq to-be-deleted (append to-be-deleted (list (car cur))))))
99 (setq overview (elmo-delete-if
103 (elmo-msgdb-overview-entity-get-number x)
105 (elmo-msgdb-get-overview append-msgdb)))
106 (setq mark-alist (elmo-delete-if
110 (car x) to-be-deleted)))
111 (elmo-msgdb-get-mark-alist append-msgdb)))
112 ;; keep number-alist untouched for folder diff!!
113 (cons (and to-be-deleted (length to-be-deleted))
114 (list overview number-alist mark-alist))))
116 (defun elmo-multi-msgdb-create (spec numlist new-mark already-mark
117 seen-mark important-mark seen-list)
119 (let* ((flds (cdr spec))
120 overview number-alist mark-alist entity
125 (setq one-list-list (elmo-multi-get-intlist-list numlist))
127 (while (< cur-number (length flds))
132 (elmo-msgdb-create (nth cur-number flds)
133 (nth cur-number one-list-list)
134 new-mark already-mark
135 seen-mark important-mark
137 (* elmo-multi-divide-number (1+ cur-number)))))
138 (setq cur-number (1+ cur-number)))
139 (elmo-msgdb-sort-by-date ret-val))))
141 (defun elmo-multi-list-folders (spec &optional hierarchy)
145 (defun elmo-multi-append-msg (spec string)
146 (error "Cannot append messages to multi folder"))
148 (defun elmo-multi-read-msg (spec number outbuf)
149 (let* ((flds (cdr spec))
150 (folder (nth (- (/ number elmo-multi-divide-number) 1) flds))
151 (number (% number elmo-multi-divide-number)))
152 (elmo-call-func folder "read-msg" number outbuf)))
154 (defun elmo-multi-delete-msgs (spec msgs)
155 (let ((flds (cdr spec))
158 (setq one-list-list (elmo-multi-get-intlist-list msgs))
159 (while (< cur-number (length flds))
160 (elmo-delete-msgs (nth cur-number flds)
161 (nth cur-number one-list-list))
162 (setq cur-number (+ 1 cur-number)))
165 (defun elmo-multi-mark-alist-list (mark-alist)
169 (setq cur-number (+ cur-number 1))
171 (while (and mark-alist
173 (/ (- (car (car mark-alist))
174 (* elmo-multi-divide-number cur-number))
175 elmo-multi-divide-number)))
176 (setq one-alist (nconc
179 (list (% (car (car mark-alist))
180 (* elmo-multi-divide-number cur-number))
181 (cadr (car mark-alist))))))
182 (setq mark-alist (cdr mark-alist)))
183 (setq result (nconc result (list one-alist))))
186 (defun elmo-multi-list-folder-unread (spec mark-alist unread-marks)
187 (let* ((flds (cdr spec))
191 (setq mark-alist-list (elmo-multi-mark-alist-list mark-alist))
193 (setq cur-number (+ cur-number 1))
194 (setq ret-val (append
200 (* elmo-multi-divide-number cur-number) x)))
201 (elmo-list-folder-unread (car flds)
202 (car mark-alist-list)
204 (setq mark-alist-list (cdr mark-alist-list))
205 (setq flds (cdr flds)))
208 (defun elmo-multi-list-folder-important (spec overview)
209 (let* ((flds (cdr spec))
213 (setq cur-number (+ cur-number 1))
214 (setq ret-val (append
220 (* elmo-multi-divide-number cur-number) x)))
221 (elmo-list-folder-important (car flds) overview))))
222 (setq flds (cdr flds)))
225 (defun elmo-multi-list-folder (spec)
226 (let* ((flds (cdr spec))
230 (setq cur-number (+ cur-number 1))
231 (setq ret-val (append
237 (* elmo-multi-divide-number cur-number) x)))
238 (elmo-list-folder (car flds)))))
239 (setq flds (cdr flds)))
242 (defun elmo-multi-folder-exists-p (spec)
243 (let* ((flds (cdr spec)))
246 (unless (elmo-folder-exists-p (car flds))
248 (setq flds (cdr flds)))
251 (defun elmo-multi-folder-creatable-p (spec)
252 (let* ((flds (cdr spec)))
255 (when (and (elmo-call-func (car flds) "folder-creatable-p")
256 (not (elmo-folder-exists-p (car flds))))
257 ;; If folder already exists, don't to `creatable'.
258 ;; Because this function is called, when folder doesn't exists.
259 (throw 'creatable t))
260 (setq flds (cdr flds)))
263 (defun elmo-multi-create-folder (spec)
264 (let* ((flds (cdr spec)))
267 (unless (or (elmo-folder-exists-p (car flds))
268 (elmo-create-folder (car flds)))
270 (setq flds (cdr flds)))
273 (defun elmo-multi-search (spec condition &optional numlist)
274 (let* ((flds (cdr spec))
276 numlist-list cur-numlist ; for filtered search.
280 (elmo-multi-get-intlist-list numlist t)))
282 (setq cur-number (+ cur-number 1))
284 (setq cur-numlist (car numlist-list))
285 (if (null cur-numlist)
286 ;; t means filter all.
287 (setq cur-numlist t)))
288 (setq ret-val (append
296 (* elmo-multi-divide-number cur-number) x)))
298 (car flds) "search" condition)))))
300 (setq numlist-list (cdr numlist-list)))
301 (setq flds (cdr flds)))
304 (defun elmo-multi-use-cache-p (spec number)
305 (elmo-call-func (nth (- (/ number elmo-multi-divide-number) 1)
308 (% number elmo-multi-divide-number)))
310 (defun elmo-multi-local-file-p (spec number)
311 (elmo-call-func (nth (- (/ number elmo-multi-divide-number) 1)
314 (% number elmo-multi-divide-number)))
316 (defun elmo-multi-commit (spec)
317 (mapcar 'elmo-commit (cdr spec)))
319 (defun elmo-multi-plugged-p (spec)
320 (let* ((flds (cdr spec)))
323 (unless (elmo-folder-plugged-p (car flds))
324 (throw 'plugged nil))
325 (setq flds (cdr flds)))
328 (defun elmo-multi-set-plugged (spec plugged add)
329 (let* ((flds (cdr spec)))
331 (elmo-folder-set-plugged (car flds) plugged add)
332 (setq flds (cdr flds)))))
334 (defun elmo-multi-get-msg-filename (spec number &optional loc-alist)
335 (elmo-call-func (nth (- (/ number elmo-multi-divide-number) 1)
338 (% number elmo-multi-divide-number)
341 (defun elmo-multi-sync-number-alist (spec number-alist)
342 (let ((folder-list (cdr spec))
344 (elmo-multi-get-number-alist-list number-alist))
346 append-alist result-alist)
350 (elmo-call-func (nth (- multi-base 1) (cdr spec)) ;; folder name
352 (nth (- multi-base 1) number-alist-list)))
357 (+ (* elmo-multi-divide-number multi-base) (car x)))))
359 (setq result-alist (nconc result-alist append-alist))
360 (setq folder-list (cdr folder-list)))
363 (provide 'elmo-multi)
365 ;;; elmo-multi.el ends here