* elmo-pipe.el (elmo-pipe-drain): If `copy' is non-nil, bind
[elisp/wanderlust.git] / elmo / elmo-pipe.el
1 ;;; elmo-pipe.el --- PIPE 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
34 ;;; ELMO pipe folder
35 (eval-and-compile
36   (luna-define-class elmo-pipe-folder (elmo-folder)
37                      (src dst copy))
38   (luna-define-internal-accessors 'elmo-pipe-folder))
39
40 (luna-define-method elmo-folder-initialize ((folder elmo-pipe-folder)
41                                             name)
42   (when (string-match "^\\([^|]*\\)|\\(:?\\)\\(.*\\)$" name)
43     (elmo-pipe-folder-set-src-internal folder
44                                        (elmo-make-folder
45                                         (elmo-match-string 1 name)))
46     (elmo-pipe-folder-set-dst-internal folder
47                                        (elmo-make-folder
48                                         (elmo-match-string 3 name)))
49     (elmo-pipe-folder-set-copy-internal folder
50                                         (string= ":" (elmo-match-string 2 name))))
51   folder)
52
53 (luna-define-method elmo-folder-get-primitive-list ((folder elmo-pipe-folder))
54   (elmo-flatten
55    (mapcar
56     'elmo-folder-get-primitive-list
57     (list (elmo-pipe-folder-src-internal folder)
58           (elmo-pipe-folder-dst-internal folder)))))
59
60 (luna-define-method elmo-folder-contains-type ((folder elmo-pipe-folder)
61                                                type)
62   (or (elmo-folder-contains-type (elmo-pipe-folder-src-internal folder) type)
63       (elmo-folder-contains-type (elmo-pipe-folder-dst-internal folder) type)))
64
65 (luna-define-method elmo-folder-msgdb-create ((folder elmo-pipe-folder)
66                                               numlist new-mark already-mark
67                                               seen-mark important-mark
68                                               seen-list)
69   (elmo-folder-msgdb-create (elmo-pipe-folder-dst-internal folder)
70                             numlist new-mark already-mark
71                             seen-mark important-mark seen-list))
72
73 (luna-define-method elmo-folder-append-messages ((folder elmo-pipe-folder)
74                                                  src-folder numbers
75                                                  unread-marks
76                                                  &optional same-number)
77   (elmo-folder-append-messages (elmo-pipe-folder-dst-internal folder)
78                                src-folder numbers
79                                unread-marks
80                                same-number))
81
82 (luna-define-method elmo-folder-append-buffer ((folder elmo-pipe-folder)
83                                                unread &optional number)
84   (elmo-folder-append-buffer (elmo-pipe-folder-dst-internal folder)
85                              unread number))
86
87 (luna-define-method elmo-message-fetch ((folder elmo-pipe-folder)
88                                         number strategy
89                                         &optional section outbuf unseen)
90   (elmo-message-fetch (elmo-pipe-folder-dst-internal folder)
91                       number strategy section outbuf unseen))
92
93 (luna-define-method elmo-folder-delete-messages ((folder elmo-pipe-folder)
94                                                  numbers)
95   (elmo-folder-delete-messages (elmo-pipe-folder-dst-internal folder)
96                                numbers))
97
98 (defvar elmo-pipe-drained-hook nil "A hook called when the pipe is flushed.")
99
100 (defun elmo-pipe-drain (src dst copy)
101   "Move all messages of SRC to DST."
102   (let ((elmo-inhibit-number-mapping (not copy)) ; No need to use UIDL
103         msgs len)
104     (message "Checking %s..." (elmo-folder-name-internal src))
105     ;; Warnnig: some function requires msgdb
106     ;;  but elmo-folder-open-internal do not load msgdb.
107     (elmo-folder-open-internal src)
108     (elmo-folder-set-killed-list-internal
109      src
110      (elmo-msgdb-killed-list-load (elmo-folder-msgdb-path src)))
111     (setq msgs (elmo-folder-list-messages src)
112           len (length msgs))
113     (when (> len elmo-display-progress-threshold)
114       (elmo-progress-set 'elmo-folder-move-messages
115                          len "Moving messages..."))
116     (unwind-protect
117         (elmo-folder-move-messages src msgs dst
118                                    nil nil copy)
119       (elmo-progress-clear 'elmo-folder-move-messages))
120     (if (and copy msgs)
121         (progn
122           (elmo-msgdb-append-to-killed-list src msgs)
123           ;; for save killed-list instead of elmo-folder-close-internal
124           (elmo-msgdb-killed-list-save
125            (elmo-folder-msgdb-path src)
126            (elmo-folder-killed-list-internal src)))))
127   ;; Don't save msgdb here.
128   ;; Because summary view of original folder is not updated yet.
129   (elmo-folder-close-internal src)
130   (elmo-folder-set-killed-list-internal src nil)
131   (run-hooks 'elmo-pipe-drained-hook))
132
133 (luna-define-method elmo-folder-open-internal ((folder elmo-pipe-folder))
134   (elmo-folder-open-internal (elmo-pipe-folder-dst-internal folder))
135   (let ((src-folder (elmo-pipe-folder-src-internal folder))
136         (dst-folder (elmo-pipe-folder-dst-internal folder))
137         (copy (elmo-pipe-folder-copy-internal folder)))
138     (when (and (elmo-folder-plugged-p src-folder)
139                (elmo-folder-plugged-p dst-folder))
140       (elmo-pipe-drain src-folder dst-folder copy))))
141
142 (luna-define-method elmo-folder-close-internal ((folder elmo-pipe-folder))
143   (elmo-folder-close-internal(elmo-pipe-folder-dst-internal folder)))
144
145 (luna-define-method elmo-folder-list-messages-internal
146   ((folder elmo-pipe-folder) &optional nohide)
147   (elmo-folder-list-messages-internal (elmo-pipe-folder-dst-internal
148                                        folder) nohide))
149
150 (luna-define-method elmo-folder-list-unreads-internal
151   ((folder elmo-pipe-folder) unread-marks &optional mark-alist)
152   (elmo-folder-list-unreads-internal (elmo-pipe-folder-dst-internal folder)
153                                      unread-marks mark-alist))
154
155 (luna-define-method elmo-folder-list-importants-internal
156   ((folder elmo-pipe-folder) important-mark)
157   (elmo-folder-list-importants-internal (elmo-pipe-folder-dst-internal folder)
158                                         important-mark))
159
160 (luna-define-method elmo-folder-status ((folder elmo-pipe-folder))
161   (elmo-folder-open-internal (elmo-pipe-folder-src-internal folder))
162   (elmo-folder-open-internal (elmo-pipe-folder-dst-internal folder))
163   (let* ((elmo-inhibit-number-mapping t)
164          (src-length (length (elmo-folder-list-messages
165                               (elmo-pipe-folder-src-internal folder))))
166          (dst-list (elmo-folder-list-messages
167                     (elmo-pipe-folder-dst-internal folder))))
168     (prog1 (cons (+ src-length (elmo-max-of-list dst-list))
169                  (+ src-length (length dst-list)))
170       ;; No save.
171       (elmo-folder-close-internal (elmo-pipe-folder-src-internal folder))
172       (elmo-folder-close-internal (elmo-pipe-folder-dst-internal folder)))))
173
174 (luna-define-method elmo-folder-exists-p ((folder elmo-pipe-folder))
175   (and (elmo-folder-exists-p (elmo-pipe-folder-src-internal folder))
176        (elmo-folder-exists-p (elmo-pipe-folder-dst-internal folder))))
177
178 (luna-define-method elmo-folder-expand-msgdb-path ((folder
179                                                     elmo-pipe-folder))
180   ;; Share with destination...OK?
181   (elmo-folder-expand-msgdb-path (elmo-pipe-folder-dst-internal folder)))
182
183 (luna-define-method elmo-folder-newsgroups ((folder elmo-pipe-folder))
184   (elmo-folder-newsgroups (elmo-pipe-folder-src-internal folder)))
185
186 (luna-define-method elmo-folder-creatable-p ((folder elmo-pipe-folder))
187   (and (elmo-folder-creatable-p (elmo-pipe-folder-src-internal folder))
188        (elmo-folder-creatable-p (elmo-pipe-folder-dst-internal folder))))
189
190 (luna-define-method elmo-folder-writable-p ((folder elmo-pipe-folder))
191   (elmo-folder-writable-p (elmo-pipe-folder-dst-internal folder)))
192
193 (luna-define-method elmo-folder-create ((folder elmo-pipe-folder))
194   (if (and (not (elmo-folder-exists-p (elmo-pipe-folder-src-internal folder)))
195            (elmo-folder-creatable-p (elmo-pipe-folder-src-internal folder)))
196       (elmo-folder-create (elmo-pipe-folder-src-internal folder)))
197   (if (and (not (elmo-folder-exists-p (elmo-pipe-folder-dst-internal folder)))
198            (elmo-folder-creatable-p (elmo-pipe-folder-dst-internal folder)))
199       (elmo-folder-create (elmo-pipe-folder-dst-internal folder))))
200
201 (luna-define-method elmo-folder-search ((folder elmo-pipe-folder)
202                                         condition &optional numlist)
203   (elmo-folder-search (elmo-pipe-folder-dst-internal folder)
204                       condition numlist))
205
206 (luna-define-method elmo-message-use-cache-p ((folder elmo-pipe-folder) number)
207   (elmo-message-use-cache-p (elmo-pipe-folder-dst-internal folder) number))
208
209 (luna-define-method elmo-folder-check ((folder elmo-pipe-folder))
210   (elmo-folder-close-internal folder)
211   (elmo-folder-open-internal folder))
212
213 (luna-define-method elmo-folder-plugged-p ((folder elmo-pipe-folder))
214   (and (elmo-folder-plugged-p (elmo-pipe-folder-src-internal folder))
215        (elmo-folder-plugged-p (elmo-pipe-folder-dst-internal folder))))
216
217 (luna-define-method elmo-folder-message-file-p ((folder elmo-pipe-folder))
218   (elmo-folder-message-file-p (elmo-pipe-folder-dst-internal folder)))
219
220 (luna-define-method elmo-message-file-p ((folder elmo-pipe-folder) number)
221   (elmo-message-file-p (elmo-pipe-folder-dst-internal folder) number))
222
223 (luna-define-method elmo-message-file-name ((folder elmo-pipe-folder) number)
224   (elmo-message-file-name (elmo-pipe-folder-dst-internal folder) number))
225
226 (luna-define-method elmo-folder-message-file-number-p ((folder
227                                                         elmo-pipe-folder))
228   (elmo-folder-message-file-number-p (elmo-pipe-folder-dst-internal folder)))
229
230 (luna-define-method elmo-folder-message-file-directory ((folder
231                                                          elmo-pipe-folder))
232   (elmo-folder-message-file-directory
233    (elmo-pipe-folder-dst-internal folder)))
234
235 (luna-define-method elmo-folder-message-make-temp-file-p
236   ((folder elmo-pipe-folder))
237   (elmo-folder-message-make-temp-file-p
238    (elmo-pipe-folder-dst-internal folder)))
239
240 (luna-define-method elmo-folder-message-make-temp-files ((folder
241                                                           elmo-pipe-folder)
242                                                          numbers
243                                                          &optional
244                                                          start-number)
245   (elmo-folder-message-make-temp-files
246    (elmo-pipe-folder-dst-internal folder) numbers start-number))
247
248 (luna-define-method elmo-folder-mark-as-read ((folder elmo-pipe-folder)
249                                               numbers)
250   (elmo-folder-mark-as-read (elmo-pipe-folder-dst-internal folder)
251                             numbers))
252
253 (luna-define-method elmo-folder-unmark-read ((folder elmo-pipe-folder)
254                                               numbers)
255   (elmo-folder-unmark-read (elmo-pipe-folder-dst-internal folder)
256                            numbers))
257
258 (luna-define-method elmo-folder-unmark-important ((folder elmo-pipe-folder)
259                                                   numbers)
260   (elmo-folder-unmark-important (elmo-pipe-folder-dst-internal folder)
261                                 numbers))
262
263 (luna-define-method elmo-folder-mark-as-important ((folder elmo-pipe-folder)
264                                                    numbers)
265   (elmo-folder-mark-as-important (elmo-pipe-folder-dst-internal folder)
266                                  numbers))
267
268 (luna-define-method elmo-folder-pack-numbers ((folder elmo-pipe-folder))
269   (elmo-folder-pack-numbers (elmo-pipe-folder-dst-internal folder)))
270
271 (require 'product)
272 (product-provide (provide 'elmo-pipe) (require 'elmo-version))
273
274 ;;; elmo-pipe.el ends here