1 ;;; elmo-multi.el -- Multiple Folder Interface for ELMO.
3 ;; Copyright (C) 1998,1999,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.
36 (defun elmo-multi-msgdb (msgdb base)
37 (list (mapcar (function
39 (elmo-msgdb-overview-entity-set-number
42 (elmo-msgdb-overview-entity-get-number x)))))
52 (cdr x)))) (nth 2 msgdb))))
54 (defun elmo-multi-msgdb-create-as-numlist (spec numlist new-mark already-mark
55 seen-mark important-mark
58 (let* ((flds (cdr spec))
59 overview number-alist mark-alist entity
64 (setq one-list-list (elmo-multi-get-intlist-list numlist))
66 (while (< cur-number (length flds))
71 (elmo-msgdb-create-as-numlist (nth cur-number flds)
72 (nth cur-number one-list-list)
74 seen-mark important-mark
76 (* elmo-multi-divide-number (1+ cur-number)))))
77 (setq cur-number (1+ cur-number)))
78 (elmo-msgdb-sort-by-date ret-val))))
80 ;; returns append-msgdb
81 (defun elmo-multi-delete-crossposts (already-msgdb append-msgdb)
82 (let* ((number-alist (elmo-msgdb-get-number-alist append-msgdb))
83 (dummy (copy-sequence (append
85 (elmo-msgdb-get-number-alist already-msgdb))))
91 (setq dummy (delq (car cur) dummy))
92 (if (setq same (rassoc (cdr (car cur)) dummy)) ;; same message id is remained
93 (unless (= (/ (car (car cur)) elmo-multi-divide-number)
94 (/ (car same) elmo-multi-divide-number))
95 ;; base is also same...delete it!
96 (setq to-be-deleted (append to-be-deleted (list (car cur))))))
98 (setq overview (elmo-delete-if
102 (elmo-msgdb-overview-entity-get-number x)
104 (elmo-msgdb-get-overview append-msgdb)))
105 (setq mark-alist (elmo-delete-if
109 (car x) to-be-deleted)))
110 (elmo-msgdb-get-mark-alist append-msgdb)))
111 ;; keep number-alist untouched for folder diff!!
112 (cons (and to-be-deleted (length to-be-deleted))
113 (list overview number-alist mark-alist))))
115 (defun elmo-multi-msgdb-create (spec numlist new-mark already-mark
116 seen-mark important-mark seen-list)
118 (let* ((flds (cdr spec))
119 overview number-alist mark-alist entity
124 (setq one-list-list (elmo-multi-get-intlist-list numlist))
126 (while (< cur-number (length flds))
131 (elmo-msgdb-create (nth cur-number flds)
132 (nth cur-number one-list-list)
133 new-mark already-mark
134 seen-mark important-mark
136 (* elmo-multi-divide-number (1+ cur-number)))))
137 (setq cur-number (1+ cur-number)))
138 (elmo-msgdb-sort-by-date ret-val))))
140 (defun elmo-multi-list-folders (spec &optional hierarchy)
144 (defun elmo-multi-append-msg (spec string)
145 (error "Cannot append messages to multi folder"))
147 (defun elmo-multi-read-msg (spec number outbuf)
148 (let* ((flds (cdr spec))
149 (folder (nth (- (/ number elmo-multi-divide-number) 1) flds))
150 (number (% number elmo-multi-divide-number)))
151 (elmo-call-func folder "read-msg" number outbuf)))
153 (defun elmo-multi-delete-msgs (spec msgs)
154 (let ((flds (cdr spec))
157 (setq one-list-list (elmo-multi-get-intlist-list msgs))
158 (while (< cur-number (length flds))
159 (elmo-delete-msgs (nth cur-number flds)
160 (nth cur-number one-list-list))
161 (setq cur-number (+ 1 cur-number)))
164 (defun elmo-multi-folder-diff (spec folder &optional number-list)
165 (let ((flds (cdr spec))
167 (elmo-multi-split-number-alist
168 (elmo-msgdb-number-load (elmo-msgdb-expand-path spec))))
174 (setq diffs (nconc diffs (list (elmo-folder-diff
177 (nth count num-alist-list))))))
178 (setq count (+ 1 count))
179 (setq flds (cdr flds)))
181 (and (car (car diffs))
182 (setq unsync (+ unsync (car (car diffs)))))
183 (setq messages (+ messages (cdr (car diffs))))
184 (setq diffs (cdr diffs)))
185 (elmo-folder-set-info-hashtb folder
187 (cons unsync messages)))
189 (defun elmo-multi-split-mark-alist (mark-alist)
191 (alist (sort (copy-sequence mark-alist)
192 (lambda (pair1 pair2)
193 (< (car pair1)(car pair2)))))
196 (setq cur-number (+ cur-number 1))
200 (/ (- (car (car alist))
201 (* elmo-multi-divide-number cur-number))
202 elmo-multi-divide-number)))
203 (setq one-alist (nconc
206 (list (% (car (car alist))
207 (* elmo-multi-divide-number cur-number))
208 (cadr (car alist))))))
209 (setq alist (cdr alist)))
210 (setq result (nconc result (list one-alist))))
213 (defun elmo-multi-split-number-alist (number-alist)
214 (let ((alist (sort (copy-sequence number-alist)
215 (lambda (pair1 pair2)
216 (< (car pair1)(car pair2)))))
220 (setq cur-number (+ cur-number 1))
224 (/ (- (setq num (car (car alist)))
225 (* elmo-multi-divide-number cur-number))
226 elmo-multi-divide-number)))
227 (setq one-alist (nconc
231 (% num (* elmo-multi-divide-number cur-number))
232 (cdr (car alist))))))
233 (setq alist (cdr alist)))
234 (setq split (nconc split (list one-alist))))
237 (defun elmo-multi-list-folder-unread (spec number-alist mark-alist
239 (let ((folders (cdr spec))
241 (split-mark-alist (elmo-multi-split-mark-alist mark-alist))
242 (split-number-alist (elmo-multi-split-number-alist number-alist))
245 (setq cur-number (+ cur-number 1)
252 (* elmo-multi-divide-number cur-number) x)))
253 (elmo-list-folder-unread (car folders)
254 (car split-number-alist)
255 (car split-mark-alist)
257 split-number-alist (cdr split-number-alist)
258 split-mark-alist (cdr split-mark-alist)
259 folders (cdr folders)))
262 (defun elmo-multi-list-folder-important (spec number-alist)
263 (let ((folders (cdr spec))
265 (split-number-alist (elmo-multi-split-number-alist number-alist))
268 (setq cur-number (+ cur-number 1)
274 (+ (* elmo-multi-divide-number cur-number) x)))
275 (elmo-list-folder-important
277 (car split-number-alist))))
278 folders (cdr folders)))
281 (defun elmo-multi-list-folder (spec)
282 (let* ((flds (cdr spec))
284 (killed (and elmo-use-killed-list
285 (elmo-msgdb-killed-list-load
286 (elmo-msgdb-expand-path spec))))
289 (setq cur-number (+ cur-number 1))
290 (setq numbers (append
296 (* elmo-multi-divide-number cur-number) x)))
297 (elmo-list-folder (car flds)))))
298 (setq flds (cdr flds)))
299 (elmo-living-messages numbers killed)))
301 (defun elmo-multi-folder-exists-p (spec)
302 (let* ((flds (cdr spec)))
305 (unless (elmo-folder-exists-p (car flds))
307 (setq flds (cdr flds)))
310 (defun elmo-multi-folder-creatable-p (spec)
311 (let* ((flds (cdr spec)))
314 (when (and (elmo-call-func (car flds) "folder-creatable-p")
315 (not (elmo-folder-exists-p (car flds))))
316 ;; If folder already exists, don't to `creatable'.
317 ;; Because this function is called, when folder doesn't exists.
318 (throw 'creatable t))
319 (setq flds (cdr flds)))
322 (defun elmo-multi-create-folder (spec)
323 (let* ((flds (cdr spec)))
326 (unless (or (elmo-folder-exists-p (car flds))
327 (elmo-create-folder (car flds)))
329 (setq flds (cdr flds)))
332 (defun elmo-multi-search (spec condition &optional numlist)
333 (let* ((flds (cdr spec))
335 numlist-list cur-numlist ; for filtered search.
339 (elmo-multi-get-intlist-list numlist t)))
341 (setq cur-number (+ cur-number 1))
343 (setq cur-numlist (car numlist-list))
344 (if (null cur-numlist)
345 ;; t means filter all.
346 (setq cur-numlist t)))
347 (setq ret-val (append
355 (* elmo-multi-divide-number cur-number) x)))
357 (car flds) "search" condition)))))
359 (setq numlist-list (cdr numlist-list)))
360 (setq flds (cdr flds)))
363 (defun elmo-multi-use-cache-p (spec number)
364 (elmo-call-func (nth (- (/ number elmo-multi-divide-number) 1)
367 (% number elmo-multi-divide-number)))
369 (defun elmo-multi-local-file-p (spec number)
370 (elmo-call-func (nth (- (/ number elmo-multi-divide-number) 1)
373 (% number elmo-multi-divide-number)))
375 (defun elmo-multi-commit (spec)
376 (mapcar 'elmo-commit (cdr spec)))
378 (defun elmo-multi-plugged-p (spec)
379 (let* ((flds (cdr spec)))
382 (unless (elmo-folder-plugged-p (car flds))
383 (throw 'plugged nil))
384 (setq flds (cdr flds)))
387 (defun elmo-multi-set-plugged (spec plugged add)
388 (let* ((flds (cdr spec)))
390 (elmo-folder-set-plugged (car flds) plugged add)
391 (setq flds (cdr flds)))))
393 (defun elmo-multi-get-msg-filename (spec number &optional loc-alist)
394 (elmo-call-func (nth (- (/ number elmo-multi-divide-number) 1)
397 (% number elmo-multi-divide-number)
400 (defun elmo-multi-sync-number-alist (spec number-alist)
401 (let ((folder-list (cdr spec))
403 (elmo-multi-split-number-alist number-alist))
405 append-alist result-alist)
409 (elmo-call-func (nth (- multi-base 1) (cdr spec)) ;; folder name
411 (nth (- multi-base 1) number-alist-list)))
416 (+ (* elmo-multi-divide-number multi-base) (car x)))))
418 (setq result-alist (nconc result-alist append-alist))
419 (setq folder-list (cdr folder-list)))
423 (product-provide (provide 'elmo-multi) (require 'elmo-version))
425 ;;; elmo-multi.el ends here