~ubuntu-branches/ubuntu/saucy/wl/saucy-proposed

« back to all changes in this revision

Viewing changes to elmo/elmo-multi.el

  • Committer: Bazaar Package Importer
  • Author(s): Takuo KITAME
  • Date: 2002-02-20 21:51:16 UTC
  • Revision ID: james.westby@ubuntu.com-20020220215116-htmbfdwsdr25nnhm
Tags: upstream-2.8.1
ImportĀ upstreamĀ versionĀ 2.8.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
;;; elmo-multi.el --- Multiple Folder Interface for ELMO.
 
2
 
 
3
;; Copyright (C) 1998,1999,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
 
 
32
(require 'elmo)
 
33
(require 'luna)
 
34
 
 
35
(defvar elmo-multi-divide-number 100000
 
36
  "*Multi divider number.")
 
37
 
 
38
;;; ELMO Multi folder
 
39
(eval-and-compile
 
40
  (luna-define-class elmo-multi-folder (elmo-folder)
 
41
                     (children divide-number))
 
42
  (luna-define-internal-accessors 'elmo-multi-folder))
 
43
 
 
44
(luna-define-method elmo-folder-initialize ((folder
 
45
                                             elmo-multi-folder)
 
46
                                            name)
 
47
  (while (> (length (car (setq name (elmo-parse-token name ",")))) 0)
 
48
    (elmo-multi-folder-set-children-internal
 
49
     folder
 
50
     (nconc (elmo-multi-folder-children-internal
 
51
             folder)
 
52
            (list (elmo-make-folder (car name)))))
 
53
    (setq name (cdr name))
 
54
    (when (and (> (length name) 0)
 
55
               (eq (aref name 0) ?,))
 
56
      (setq name (substring name 1))))
 
57
  (elmo-multi-folder-set-divide-number-internal
 
58
   folder
 
59
   elmo-multi-divide-number)
 
60
  folder)
 
61
 
 
62
(luna-define-method elmo-folder-open-internal ((folder elmo-multi-folder))
 
63
  (dolist (fld (elmo-multi-folder-children-internal folder))
 
64
    (elmo-folder-open-internal fld)))
 
65
 
 
66
(luna-define-method elmo-folder-check ((folder elmo-multi-folder))
 
67
  (dolist (fld (elmo-multi-folder-children-internal folder))
 
68
    (elmo-folder-check fld)))
 
69
 
 
70
(luna-define-method elmo-folder-close-internal ((folder elmo-multi-folder))
 
71
  (dolist (fld (elmo-multi-folder-children-internal folder))
 
72
    (elmo-folder-close-internal fld)))
 
73
 
 
74
(luna-define-method elmo-folder-expand-msgdb-path ((folder
 
75
                                                    elmo-multi-folder))
 
76
  (expand-file-name (elmo-replace-string-as-filename
 
77
                     (elmo-folder-name-internal folder))
 
78
                    (expand-file-name "multi"
 
79
                                      elmo-msgdb-directory)))
 
80
 
 
81
(luna-define-method elmo-folder-newsgroups ((folder elmo-multi-folder))
 
82
  (delq nil
 
83
        (elmo-flatten
 
84
         (mapcar
 
85
          'elmo-folder-newsgroups
 
86
          (elmo-flatten
 
87
           (mapcar
 
88
            'elmo-folder-get-primitive-list
 
89
            (elmo-multi-folder-children-internal folder)))))))
 
90
 
 
91
(luna-define-method elmo-folder-get-primitive-list ((folder elmo-multi-folder))
 
92
  (elmo-flatten
 
93
   (mapcar
 
94
    'elmo-folder-get-primitive-list
 
95
    (elmo-multi-folder-children-internal folder))))
 
96
 
 
97
(luna-define-method elmo-folder-contains-type ((folder elmo-multi-folder) type)
 
98
  (let ((children (elmo-multi-folder-children-internal folder))
 
99
        match)
 
100
    (while children
 
101
      (when (elmo-folder-contains-type (car children) type)
 
102
        (setq match t)
 
103
        (setq children nil))
 
104
      (setq children (cdr children)))
 
105
    match))
 
106
 
 
107
(luna-define-method elmo-message-folder ((folder elmo-multi-folder)
 
108
                                         number)
 
109
  (nth (- (/ number (elmo-multi-folder-divide-number-internal folder)) 1)
 
110
       (elmo-multi-folder-children-internal folder)))
 
111
 
 
112
(defun elmo-multi-msgdb (msgdb base)
 
113
  (list (mapcar (function
 
114
                 (lambda (x)
 
115
                   (elmo-msgdb-overview-entity-set-number
 
116
                    x
 
117
                    (+ base
 
118
                       (elmo-msgdb-overview-entity-get-number x)))))
 
119
                (nth 0 msgdb))
 
120
        (mapcar (function
 
121
                 (lambda (x) (cons
 
122
                              (+ base (car x))
 
123
                              (cdr x))))
 
124
                (nth 1 msgdb))
 
125
        (mapcar (function
 
126
                 (lambda (x) (cons
 
127
                              (+ base (car x))
 
128
                              (cdr x)))) (nth 2 msgdb))))
 
129
 
 
130
(defun elmo-multi-split-numbers (folder numlist &optional as-is)
 
131
  (let ((numbers (sort numlist '<))
 
132
        (divider (elmo-multi-folder-divide-number-internal folder))
 
133
        (cur-number 0)
 
134
        one-list numbers-list)
 
135
    (while numbers
 
136
      (setq cur-number (+ cur-number 1))
 
137
      (setq one-list nil)
 
138
      (while (and numbers
 
139
                  (eq 0
 
140
                      (/ (- (car numbers)
 
141
                            (* divider cur-number))
 
142
                         divider)))
 
143
        (setq one-list (nconc
 
144
                        one-list
 
145
                        (list
 
146
                         (if as-is
 
147
                             (car numbers)
 
148
                           (% (car numbers)
 
149
                              (* divider cur-number))))))
 
150
        (setq numbers (cdr numbers)))
 
151
      (setq numbers-list (nconc numbers-list (list one-list))))
 
152
    numbers-list))
 
153
 
 
154
(luna-define-method elmo-folder-msgdb-create ((folder elmo-multi-folder)
 
155
                                              numbers new-mark already-mark
 
156
                                              seen-mark important-mark
 
157
                                              seen-list)
 
158
  (let* ((folders (elmo-multi-folder-children-internal folder))
 
159
         overview number-alist mark-alist entity
 
160
         numbers-list
 
161
         cur-number
 
162
         i percent num
 
163
         msgdb)
 
164
    (setq numbers-list (elmo-multi-split-numbers folder numbers))
 
165
    (setq cur-number 0)
 
166
    (while (< cur-number (length folders))
 
167
      (if (nth cur-number numbers-list)
 
168
          (setq msgdb
 
169
                (elmo-msgdb-append
 
170
                 msgdb
 
171
                 (elmo-multi-msgdb
 
172
                  (elmo-folder-msgdb-create (nth cur-number folders)
 
173
                                            (nth cur-number numbers-list)
 
174
                                            new-mark already-mark
 
175
                                            seen-mark important-mark
 
176
                                            seen-list)
 
177
                  (* (elmo-multi-folder-divide-number-internal folder)
 
178
                     (1+ cur-number))))))
 
179
      (setq cur-number (1+ cur-number)))
 
180
    (elmo-msgdb-sort-by-date msgdb)))
 
181
 
 
182
(luna-define-method elmo-folder-process-crosspost ((folder elmo-multi-folder)
 
183
                                                   &optional
 
184
                                                   number-alist)
 
185
  (let ((number-alists (elmo-multi-split-number-alist
 
186
                        folder
 
187
                        (elmo-msgdb-get-number-alist
 
188
                         (elmo-folder-msgdb folder))))
 
189
        (cur-number 1))
 
190
    (dolist (child (elmo-multi-folder-children-internal folder))
 
191
      (elmo-folder-process-crosspost child (car number-alists))
 
192
      (setq cur-number (+ 1 cur-number)
 
193
            number-alists (cdr number-alists)))))
 
194
 
 
195
(defsubst elmo-multi-folder-append-msgdb (folder append-msgdb)
 
196
  (if append-msgdb
 
197
      (let* ((number-alist (elmo-msgdb-get-number-alist append-msgdb))
 
198
             (all-alist (copy-sequence (append
 
199
                                        (elmo-msgdb-get-number-alist
 
200
                                         (elmo-folder-msgdb folder))
 
201
                                        number-alist)))
 
202
             (cur number-alist)
 
203
             overview to-be-deleted
 
204
             mark-alist same)
 
205
        (while cur
 
206
          (setq all-alist (delq (car cur) all-alist))
 
207
          ;; same message id exists.
 
208
          (if (setq same (rassoc (cdr (car cur)) all-alist))
 
209
              (unless (= (/ (car (car cur))
 
210
                            (elmo-multi-folder-divide-number-internal folder))
 
211
                         (/ (car same)
 
212
                            (elmo-multi-folder-divide-number-internal folder)))
 
213
                ;; base is also same...delete it!
 
214
                (setq to-be-deleted
 
215
                      (append to-be-deleted (list (car (car cur)))))))
 
216
          (setq cur (cdr cur)))
 
217
        (cond ((eq (elmo-folder-process-duplicates-internal folder)
 
218
                   'hide)
 
219
               ;; Hide duplicates.
 
220
               (elmo-msgdb-append-to-killed-list folder to-be-deleted)
 
221
               (setq overview (elmo-delete-if
 
222
                               (lambda (x)
 
223
                                 (memq (elmo-msgdb-overview-entity-get-number
 
224
                                        x)
 
225
                                       to-be-deleted))
 
226
                               (elmo-msgdb-get-overview append-msgdb)))
 
227
               ;; Should be mark as read.
 
228
               (elmo-folder-mark-as-read folder to-be-deleted)
 
229
               (elmo-msgdb-set-overview append-msgdb overview))
 
230
              ((eq (elmo-folder-process-duplicates-internal folder)
 
231
                   'read)
 
232
               ;; Mark as read duplicates.
 
233
               (elmo-folder-mark-as-read folder to-be-deleted))
 
234
              (t
 
235
               ;; Do nothing.
 
236
               (setq to-be-deleted nil)))
 
237
        (elmo-folder-set-msgdb-internal folder
 
238
                                        (elmo-msgdb-append
 
239
                                         (elmo-folder-msgdb folder)
 
240
                                         append-msgdb t))
 
241
        (length to-be-deleted))
 
242
    0))
 
243
 
 
244
(luna-define-method elmo-folder-append-msgdb ((folder elmo-multi-folder)
 
245
                                              append-msgdb)
 
246
  (elmo-multi-folder-append-msgdb folder append-msgdb))
 
247
 
 
248
(defmacro elmo-multi-real-folder-number (folder number)
 
249
  "Returns a cons cell of real FOLDER and NUMBER."
 
250
  (` (cons (nth (- 
 
251
                 (/ (, number)
 
252
                    (elmo-multi-folder-divide-number-internal (, folder)))
 
253
                 1) (elmo-multi-folder-children-internal (, folder)))
 
254
           (% (, number) (elmo-multi-folder-divide-number-internal
 
255
                          (, folder))))))
 
256
 
 
257
(defsubst elmo-multi-find-fetch-strategy (folder entity ignore-cache)
 
258
  (if entity
 
259
      (let ((pair (elmo-multi-real-folder-number
 
260
                   folder
 
261
                   (elmo-msgdb-overview-entity-get-number entity)))
 
262
            (new-entity (elmo-msgdb-copy-overview-entity entity)))
 
263
        (setq new-entity
 
264
              (elmo-msgdb-overview-entity-set-number new-entity (cdr pair)))
 
265
        (elmo-find-fetch-strategy (car pair) new-entity ignore-cache))
 
266
    (elmo-make-fetch-strategy 'entire)))
 
267
 
 
268
(luna-define-method elmo-find-fetch-strategy
 
269
  ((folder elmo-multi-folder)
 
270
   entity &optional ignore-cache)
 
271
  (elmo-multi-find-fetch-strategy folder entity ignore-cache))
 
272
 
 
273
(luna-define-method elmo-message-fetch ((folder elmo-multi-folder)
 
274
                                        number strategy
 
275
                                        &optional section outbuf unseen)
 
276
  (let ((pair (elmo-multi-real-folder-number folder number)))
 
277
    (elmo-message-fetch (car pair) (cdr pair) strategy section outbuf unseen)))
 
278
 
 
279
(luna-define-method elmo-folder-delete-messages ((folder elmo-multi-folder)
 
280
                                                 numbers)
 
281
  (let ((flds (elmo-multi-folder-children-internal folder))
 
282
        one-list-list
 
283
        (cur-number 0))
 
284
    (setq one-list-list (elmo-multi-split-numbers folder numbers))
 
285
    (while (< cur-number (length flds))
 
286
      (elmo-folder-delete-messages (nth cur-number flds)
 
287
                                   (nth cur-number one-list-list))
 
288
      (setq cur-number (+ 1 cur-number)))
 
289
    t))
 
290
 
 
291
(luna-define-method elmo-folder-diff ((folder elmo-multi-folder)
 
292
                                      &optional numbers)
 
293
  (elmo-multi-folder-diff folder numbers))
 
294
 
 
295
(defun elmo-multi-folder-diff (folder numbers)
 
296
  (let ((flds (elmo-multi-folder-children-internal folder))
 
297
        (numbers (mapcar 'car
 
298
                         (elmo-msgdb-number-load
 
299
                          (elmo-folder-msgdb-path folder))))
 
300
        (killed (elmo-msgdb-killed-list-load (elmo-folder-msgdb-path folder)))
 
301
        (count 0)
 
302
        (unsync 0)
 
303
        (messages 0)
 
304
        num-list
 
305
        diffs nums)
 
306
    ;; If first time, dummy numbers is used as current number list.
 
307
    (unless numbers
 
308
      (let ((i 0)
 
309
            (divider (elmo-multi-folder-divide-number-internal folder)))
 
310
        (dolist (folder flds)
 
311
          (setq i (+ i 1))
 
312
          (setq numbers
 
313
                (cons (* i divider) numbers)))))
 
314
    (setq num-list
 
315
          (elmo-multi-split-numbers folder
 
316
                                    (elmo-uniq-list
 
317
                                     (nconc
 
318
                                      (elmo-number-set-to-number-list killed)
 
319
                                      numbers))))
 
320
    (while flds
 
321
      (setq nums (elmo-folder-diff (car flds) (car num-list))
 
322
            nums (cons (elmo-diff-unread nums) (elmo-diff-all nums)))
 
323
      (setq diffs (nconc diffs (list nums)))
 
324
      (setq count (+ 1 count))
 
325
      (setq num-list (cdr num-list))
 
326
      (setq flds (cdr flds)))
 
327
    (while diffs
 
328
      (and (car (car diffs))
 
329
           (setq unsync (+ unsync (car (car diffs)))))
 
330
      (setq messages  (+ messages (cdr (car diffs))))
 
331
      (setq diffs (cdr diffs)))
 
332
    (elmo-folder-set-info-hashtb folder nil messages)
 
333
    (cons unsync messages)))
 
334
 
 
335
(defun elmo-multi-split-number-alist (folder number-alist)
 
336
  (let ((alist (sort (copy-sequence number-alist)
 
337
                     (lambda (pair1 pair2)
 
338
                       (< (car pair1)(car pair2)))))
 
339
        (cur-number 0)
 
340
        one-alist split num)
 
341
    (while alist
 
342
      (setq cur-number (+ cur-number 1))
 
343
      (setq one-alist nil)
 
344
      (while (and alist
 
345
                  (eq 0
 
346
                      (/ (- (setq num (car (car alist)))
 
347
                            (* elmo-multi-divide-number cur-number))
 
348
                         (elmo-multi-folder-divide-number-internal folder))))
 
349
        (setq one-alist (nconc
 
350
                         one-alist
 
351
                         (list
 
352
                          (cons
 
353
                           (% num (* (elmo-multi-folder-divide-number-internal
 
354
                                      folder) cur-number))
 
355
                           (cdr (car alist))))))
 
356
        (setq alist (cdr alist)))
 
357
      (setq split (nconc split (list one-alist))))
 
358
    split))
 
359
 
 
360
(defun elmo-multi-split-mark-alist (folder mark-alist)
 
361
  (let ((cur-number 0)
 
362
        (alist (sort (copy-sequence mark-alist)
 
363
                     (lambda (pair1 pair2)
 
364
                       (< (car pair1)(car pair2)))))
 
365
        one-alist result)
 
366
    (while alist
 
367
      (setq cur-number (+ cur-number 1))
 
368
      (setq one-alist nil)
 
369
      (while (and alist
 
370
                  (eq 0
 
371
                      (/ (- (car (car alist))
 
372
                            (* (elmo-multi-folder-divide-number-internal
 
373
                                folder) cur-number))
 
374
                         (elmo-multi-folder-divide-number-internal folder))))
 
375
        (setq one-alist (nconc
 
376
                         one-alist
 
377
                         (list
 
378
                          (list (% (car (car alist))
 
379
                                   (* (elmo-multi-folder-divide-number-internal
 
380
                                       folder) cur-number))
 
381
                                (cadr (car alist))))))
 
382
        (setq alist (cdr alist)))
 
383
      (setq result (nconc result (list one-alist))))
 
384
    result))
 
385
 
 
386
(luna-define-method elmo-folder-list-unreads-internal
 
387
  ((folder elmo-multi-folder) unread-marks &optional mark-alist)
 
388
  (elmo-multi-folder-list-unreads-internal folder unread-marks))
 
389
 
 
390
(defun elmo-multi-folder-list-unreads-internal (folder unread-marks)
 
391
  (let ((folders (elmo-multi-folder-children-internal folder))
 
392
        (mark-alists (elmo-multi-split-mark-alist
 
393
                      folder
 
394
                      (elmo-msgdb-get-mark-alist
 
395
                       (elmo-folder-msgdb folder))))
 
396
        (cur-number 0)
 
397
        unreads
 
398
        all-unreads)
 
399
    (while folders
 
400
      (setq cur-number (+ cur-number 1))
 
401
      (unless (listp (setq unreads
 
402
                           (elmo-folder-list-unreads-internal
 
403
                            (car folders) unread-marks (car mark-alists))))
 
404
        (setq unreads (delq  nil
 
405
                             (mapcar
 
406
                              (lambda (x)
 
407
                                (if (member (cadr x) unread-marks)
 
408
                                    (car x)))
 
409
                              (car mark-alists)))))
 
410
      (setq all-unreads
 
411
            (nconc all-unreads
 
412
                   (mapcar 
 
413
                    (lambda (x)
 
414
                      (+ x
 
415
                         (* cur-number
 
416
                            (elmo-multi-folder-divide-number-internal
 
417
                             folder))))            
 
418
                    unreads)))
 
419
      (setq mark-alists (cdr mark-alists)
 
420
            folders (cdr folders)))
 
421
    all-unreads))
 
422
 
 
423
(luna-define-method elmo-folder-list-importants-internal
 
424
  ((folder elmo-multi-folder) important-mark)
 
425
  (let ((folders (elmo-multi-folder-children-internal folder))
 
426
        (mark-alists (elmo-multi-split-mark-alist
 
427
                      folder
 
428
                      (elmo-msgdb-get-mark-alist
 
429
                       (elmo-folder-msgdb folder))))
 
430
        (cur-number 0)
 
431
        importants
 
432
        all-importants)
 
433
    (while folders
 
434
      (setq cur-number (+ cur-number 1))
 
435
      (when (listp (setq importants
 
436
                         (elmo-folder-list-importants-internal
 
437
                          (car folders) important-mark)))
 
438
        (setq all-importants
 
439
              (nconc all-importants
 
440
                     (mapcar 
 
441
                      (lambda (x)
 
442
                        (+ x
 
443
                           (* cur-number
 
444
                              (elmo-multi-folder-divide-number-internal
 
445
                               folder))))                  
 
446
                      importants))))
 
447
      (setq mark-alists (cdr mark-alists)
 
448
            folders (cdr folders)))
 
449
    all-importants))
 
450
 
 
451
(luna-define-method elmo-folder-list-messages-internal
 
452
  ((folder elmo-multi-folder) &optional nohide)
 
453
  (let* ((flds (elmo-multi-folder-children-internal folder))
 
454
         (cur-number 0)
 
455
         list numbers)
 
456
    (while flds
 
457
      (setq cur-number (+ cur-number 1))
 
458
      (setq list (elmo-folder-list-messages-internal (car flds)))
 
459
      (setq numbers
 
460
            (append
 
461
             numbers
 
462
             (if (listp list)
 
463
                 (mapcar
 
464
                  (function
 
465
                   (lambda (x)
 
466
                     (+
 
467
                      (* (elmo-multi-folder-divide-number-internal
 
468
                          folder) cur-number) x)))
 
469
                  list)
 
470
               ;; Use current list.
 
471
               (elmo-delete-if
 
472
                (lambda (num)
 
473
                  (not
 
474
                   (eq cur-number (/ num
 
475
                                     (elmo-multi-folder-divide-number-internal
 
476
                                      folder)))))
 
477
                (mapcar
 
478
                 'car
 
479
                 (elmo-msgdb-get-number-alist
 
480
                  (elmo-folder-msgdb folder)))))))
 
481
      (setq flds (cdr flds)))
 
482
    numbers))
 
483
 
 
484
(luna-define-method elmo-folder-exists-p ((folder elmo-multi-folder))
 
485
  (let ((flds (elmo-multi-folder-children-internal folder)))
 
486
    (catch 'exists
 
487
      (while flds
 
488
        (unless (elmo-folder-exists-p (car flds))
 
489
          (throw 'exists nil))
 
490
        (setq flds (cdr flds)))
 
491
      t)))
 
492
 
 
493
(luna-define-method elmo-folder-creatable-p ((folder elmo-multi-folder))
 
494
  (let ((flds (elmo-multi-folder-children-internal folder)))
 
495
    (catch 'creatable
 
496
      (while flds
 
497
        (when (and (elmo-folder-creatable-p (car flds))
 
498
                   (not (elmo-folder-exists-p (car flds))))
 
499
          ;; If folder already exists, don't to `creatable'.
 
500
          ;; Because this function is called, when folder doesn't exists.
 
501
          (throw 'creatable t))
 
502
        (setq flds (cdr flds)))
 
503
      nil)))
 
504
 
 
505
(luna-define-method elmo-folder-create ((folder elmo-multi-folder))
 
506
  (let ((flds (elmo-multi-folder-children-internal folder)))
 
507
    (catch 'create
 
508
      (while flds
 
509
        (unless (or (elmo-folder-exists-p (car flds))
 
510
                    (elmo-folder-create (car flds)))
 
511
          (throw 'create nil))
 
512
        (setq flds (cdr flds)))
 
513
      t)))
 
514
 
 
515
(luna-define-method elmo-folder-search ((folder elmo-multi-folder)
 
516
                                        condition &optional numlist)
 
517
  (let* ((flds (elmo-multi-folder-children-internal folder))
 
518
         (cur-number 0)
 
519
         numlist-list cur-numlist ; for filtered search.
 
520
         ret-val)
 
521
    (if numlist
 
522
        (setq numlist-list
 
523
              (elmo-multi-split-numbers folder numlist t)))
 
524
    (while flds
 
525
      (setq cur-number (+ cur-number 1))
 
526
      (when numlist
 
527
        (setq cur-numlist (car numlist-list))
 
528
        (if (null cur-numlist)
 
529
            ;; t means filter all.
 
530
            (setq cur-numlist t)))
 
531
      (setq ret-val (append
 
532
                     ret-val
 
533
                     (elmo-list-filter
 
534
                      cur-numlist
 
535
                      (mapcar
 
536
                       (function
 
537
                        (lambda (x)
 
538
                          (+
 
539
                           (* (elmo-multi-folder-divide-number-internal
 
540
                               folder) cur-number) x)))
 
541
                       (elmo-folder-search
 
542
                        (car flds) condition)))))
 
543
      (when numlist
 
544
        (setq numlist-list (cdr numlist-list)))
 
545
      (setq flds (cdr flds)))
 
546
    ret-val))
 
547
 
 
548
(luna-define-method elmo-message-use-cache-p ((folder elmo-multi-folder)
 
549
                                              number)
 
550
  (let ((pair (elmo-multi-real-folder-number folder number)))
 
551
    (elmo-message-use-cache-p (car pair) (cdr pair))))
 
552
 
 
553
(luna-define-method elmo-message-file-p ((folder elmo-multi-folder) number)
 
554
  (let ((pair (elmo-multi-real-folder-number folder number)))
 
555
    (elmo-message-file-p (car pair) (cdr pair))))
 
556
 
 
557
(luna-define-method elmo-message-file-name ((folder elmo-multi-folder) number)
 
558
  (let ((pair (elmo-multi-real-folder-number folder number)))
 
559
    (elmo-message-file-name (car pair) (cdr pair))))
 
560
 
 
561
(luna-define-method elmo-folder-plugged-p ((folder elmo-multi-folder))
 
562
  (let ((flds (elmo-multi-folder-children-internal folder)))
 
563
    (catch 'plugged
 
564
      (while flds
 
565
        (unless (elmo-folder-plugged-p (car flds))
 
566
          (throw 'plugged nil))
 
567
        (setq flds (cdr flds)))
 
568
      t)))
 
569
 
 
570
(luna-define-method elmo-folder-set-plugged ((folder elmo-multi-folder)
 
571
                                             plugged add)
 
572
  (let ((flds  (elmo-multi-folder-children-internal folder)))
 
573
    (dolist (fld flds)
 
574
      (elmo-folder-set-plugged fld plugged add))))
 
575
 
 
576
(defun elmo-multi-folder-numbers-list-assoc (folder folder-numbers)
 
577
  (let (ent)
 
578
    (while folder-numbers
 
579
      (when (string= (elmo-folder-name-internal (car (car folder-numbers)))
 
580
                     (elmo-folder-name-internal folder))
 
581
        (setq ent (car folder-numbers)
 
582
              folder-numbers nil))
 
583
      (setq folder-numbers (cdr folder-numbers)))
 
584
    ent))
 
585
 
 
586
(defun elmo-multi-make-folder-numbers-list (folder msgs)
 
587
  (let ((msg-list msgs)
 
588
        pair fld-list
 
589
        ret-val)
 
590
    (while msg-list
 
591
      (when (and (numberp (car msg-list))
 
592
                 (> (car msg-list) 0))
 
593
        (setq pair (elmo-multi-real-folder-number folder (car msg-list)))
 
594
        (if (setq fld-list (elmo-multi-folder-numbers-list-assoc
 
595
                            (car pair)
 
596
                            ret-val))
 
597
            (setcdr fld-list (cons (cdr pair) (cdr fld-list)))
 
598
          (setq ret-val (cons (cons (car pair) (list (cdr pair))) ret-val))))
 
599
      (setq msg-list (cdr msg-list)))
 
600
    ret-val))
 
601
 
 
602
(luna-define-method elmo-folder-mark-as-important ((folder elmo-multi-folder)
 
603
                                                   numbers)
 
604
  (dolist (folder-numbers (elmo-multi-make-folder-numbers-list folder numbers))
 
605
    (elmo-folder-mark-as-important (car folder-numbers)
 
606
                                   (cdr folder-numbers)))
 
607
  t)
 
608
 
 
609
(luna-define-method elmo-folder-unmark-important ((folder elmo-multi-folder)
 
610
                                                  numbers)
 
611
  (dolist (folder-numbers (elmo-multi-make-folder-numbers-list folder numbers))
 
612
    (elmo-folder-unmark-important (car folder-numbers)
 
613
                                  (cdr folder-numbers)))
 
614
  t)
 
615
 
 
616
(luna-define-method elmo-folder-mark-as-read ((folder elmo-multi-folder)
 
617
                                              numbers)
 
618
  (dolist (folder-numbers (elmo-multi-make-folder-numbers-list folder numbers))
 
619
    (elmo-folder-mark-as-read (car folder-numbers)
 
620
                              (cdr folder-numbers)))
 
621
  t)
 
622
 
 
623
(luna-define-method elmo-folder-unmark-read ((folder elmo-multi-folder)
 
624
                                             numbers)
 
625
  (dolist (folder-numbers (elmo-multi-make-folder-numbers-list folder numbers))
 
626
    (elmo-folder-unmark-read (car folder-numbers)
 
627
                             (cdr folder-numbers)))
 
628
  t)
 
629
 
 
630
(require 'product)
 
631
(product-provide (provide 'elmo-multi) (require 'elmo-version))
 
632
 
 
633
;;; elmo-multi.el ends here