* elmo.el (elmo-folder-list-importants): Rewirte. Use global mark
[elisp/wanderlust.git] / elmo / elmo-dop.el
1 ;;; elmo-dop.el -- Modules for Disconnected Operations on 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 'elmo-vars)
34 (require 'elmo-msgdb)
35 (require 'elmo-util)
36
37 ;; global variable.
38 (defvar elmo-dop-queue nil
39   "A list of (folder-name function-to-be-called argument-list).
40 Automatically loaded/saved.")
41
42 (defvar elmo-dop-folder (concat "+" (expand-file-name "dop"
43                                                       elmo-msgdb-dir))
44   "A folder for `elmo-folder-append-messages' disconnected operations.")
45
46 (defmacro elmo-make-dop-queue (fname method arguments)
47   "Make a dop queue."
48   (` (vector (, fname) (, method) (, arguments))))
49
50 (defmacro elmo-dop-queue-fname (queue)
51   "Return the folder name string of the QUEUE."
52   (` (aref (, queue) 0)))
53
54 (defmacro elmo-dop-queue-method (queue)
55   "Return the method symbol of the QUEUE."
56   (` (aref (, queue) 1)))
57
58 (defmacro elmo-dop-queue-arguments (queue)
59   "Return the arguments of the QUEUE."
60   (` (aref (, queue) 2)))
61
62 (defun elmo-dop-queue-append (fname method arguments)
63   "Append to disconnected operation queue."
64   (let ((queue (elmo-make-dop-queue fname method arguments)))
65     (setq elmo-dop-queue (nconc elmo-dop-queue (list queue)))))
66
67 (defun elmo-dop-queue-flush (&optional force)
68   "Flush disconnected operations.
69 If optional argument FORCE is non-nil, try flushing all operation queues
70 even an operation concerns the unplugged folder."
71   (elmo-dop-queue-merge)
72   (let ((queue elmo-dop-queue)
73         (count 0)
74         len)
75     (while queue
76       (if (or force (elmo-folder-plugged-p (elmo-make-folder (caar queue))))
77           (setq count (1+ count)))
78       (setq queue (cdr queue)))
79     (when (> count 0)
80       (if (elmo-y-or-n-p
81            (format "%d pending operation(s) exists.  Perform now? " count)
82            (not elmo-dop-flush-confirm) t)
83           (progn
84             (message "")
85             (sit-for 0)
86             (let ((queue elmo-dop-queue)
87                   (performed 0)
88                   (i 0)
89                   (num (length elmo-dop-queue))
90                   folder func failure)
91               (while queue
92                 ;; now perform pending processes.
93                 (setq failure nil)
94                 (setq i (+ 1 i))
95                 (message "Flushing queue....%d/%d." i num)
96                 (condition-case err
97                     (apply (elmo-dop-queue-method (car queue))
98                            (elmo-dop-queue-fname (car queue))
99                            (elmo-dop-queue-arguments queue))
100                   (quit  (setq failure t))
101                   (error (setq failure err)))
102                 (if failure
103                     ();
104                   (setq elmo-dop-queue (delq (car queue) elmo-dop-queue))
105                   (setq performed (+ 1 performed)))
106                 (setq queue (cdr queue)))
107               (message "%d/%d operation(s) are performed successfully."
108                        performed num)
109               (sit-for 0) ; 
110               (elmo-dop-queue-save)))
111         (if (elmo-y-or-n-p "Clear all pending operations? "
112                            (not elmo-dop-flush-confirm) t)
113             (progn
114               (setq elmo-dop-queue nil)
115               (message "All pending operations are cleared.")
116               (elmo-dop-queue-save))
117           (message "")))
118       count)))
119
120 (defvar elmo-dop-merge-funcs nil)
121 (defun elmo-dop-queue-merge ()
122   (let ((queue elmo-dop-queue)
123         new-queue match-queue que)
124     (while (setq que (car queue))
125       (if (and
126            (member (cadr que) elmo-dop-merge-funcs)
127            (setq match-queue
128                  (car (delete nil
129                               (mapcar
130                                (lambda (new-queue)
131                                  (if (and
132                                       (string= (car que) (car new-queue))
133                                       (string= (cadr que) (cadr new-queue)))
134                                      new-queue))
135                                new-queue)))))
136           (setcar (cddr match-queue)
137                   (append (nth 2 match-queue) (nth 2 que)))
138         (setq new-queue (append new-queue (list que))))
139       (setq queue (cdr queue)))
140     (setq elmo-dop-queue new-queue)))
141
142
143 ;;; Execution is delayed.
144
145
146 ;;; Offline append:
147 ;; If appended message is local file or cached, it is saved in
148 ;; .elmo/dop/1 2 3 4 ...
149 ;; then msgdb-path/append file is created and contain message number list.
150 ;; ex. (1 3 5)
151
152 (defun elmo-folder-append-buffer-dop (folder unread &optional number)
153   )
154
155 (defun elmo-folder-delete-messages-dop (folder numbers)
156   )
157
158 (defun elmo-folder-encache-dop (folder numbers)
159   )
160
161 (defun elmo-create-folder-dop (folder)
162   )
163
164 ;;; Execute as subsutitute for plugged operation.
165 (defun elmo-folder-status-dop (folder)
166   (let* ((number-alist (elmo-msgdb-number-load
167                         (elmo-folder-msgdb-path folder)))
168          (number-list (mapcar 'car number-alist))
169          (i 0)
170          max-num)
171     ;; number of messages which are queued as append should be added
172     ;; to max-num and length.
173     (setq max-num
174           (or (nth (max (- (length number-list) 1) 0) number-list)
175               0))
176     (cons max-num number-list)))
177
178 (require 'product)
179 (product-provide (provide 'elmo-dop) (require 'elmo-version))
180
181 ;;; elmo-dop.el ends here