- ;; XXXX Not implemented yet.
- )
-
-;;; dop spool folder
-(defmacro elmo-dop-spool-folder (folder)
- "Return a spool folder for disconnected operations
-which is corresponded to the FOLDER."
- (` (elmo-make-folder
- (concat "+" (expand-file-name "spool" (elmo-folder-msgdb-path
- (, folder)))))))
-
-(defun elmo-dop-spool-folder-append-buffer (folder)
- "Append current buffer content to the dop spool folder.
-FOLDER is the folder structure.
-Return a message number."
- (setq folder (elmo-dop-spool-folder folder))
- (let ((new-number (1+ (car (elmo-folder-status folder)))))
- (unless (elmo-folder-exists-p folder)
- (elmo-folder-create folder))
- ;; dop folder is a localdir folder.
- (write-region-as-binary (point-min) (point-max)
- (expand-file-name
- (int-to-string new-number)
- (elmo-localdir-folder-directory-internal folder))
- nil 'no-msg)
- new-number))
-
-
-(defun elmo-dop-spool-folder-list-messages (folder)
- "List messages in the dop spool folder.
-FOLDER is the folder structure."
- (setq folder (elmo-dop-spool-folder folder))
- (if (elmo-folder-exists-p folder)
- (elmo-folder-list-messages folder)))
-
-(defun elmo-dop-list-deleting-messages (folder)
- "List messages which are on the deleting queue for the folder.
-FOLDER is the folder structure."
- (let (messages)
- (dolist (queue elmo-dop-queue)
- (if (and (string= (elmo-dop-queue-fname queue)
- (elmo-folder-name-internal folder))
- (eq (elmo-dop-queue-method queue)
- 'elmo-folder-delete-messages-dop-delayed))
- (setq messages (nconc messages
- (mapcar
- 'car
- (car (elmo-dop-queue-arguments queue)))))))))
-
-;;; DOP operations.
-(defsubst elmo-folder-append-buffer-dop (folder unread &optional number)
- (elmo-dop-queue-append
- folder 'elmo-folder-append-buffer-dop-delayed
- (list unread
- (elmo-dop-spool-folder-append-buffer
- folder)
- number)))
-
-(defsubst elmo-folder-delete-messages-dop (folder numbers)
- (elmo-dop-queue-append folder 'elmo-folder-delete-messages-dop-delayed
- (list
- (mapcar
- (lambda (number)
- (cons number (elmo-message-field
- folder number 'message-id)))
- numbers)))
- t)
-
-(defsubst elmo-message-encache-dop (folder number)
- (elmo-dop-queue-append folder 'elmo-message-encache (list number)))
-
-(defsubst elmo-create-folder-dop (folder)
- (elmo-dop-queue-append folder 'elmo-folder-create nil))
-
-(defsubst elmo-folder-mark-as-read-dop (folder numbers)
- (elmo-dop-queue-append folder 'elmo-folder-mark-as-read (list numbers)))
-
-(defsubst elmo-folder-unmark-read-dop (folder numbers)
- (elmo-dop-queue-append folder 'elmo-folder-unmark-read (list numbers)))
-
-(defsubst elmo-folder-mark-as-important-dop (folder numbers)
- (elmo-dop-queue-append folder 'elmo-folder-mark-as-important (list numbers)))
-
-(defsubst elmo-folder-unmark-important-dop (folder numbers)
- (elmo-dop-queue-append folder 'elmo-folder-unmark-important (list numbers)))
-
-;;; Execute as subsutitute for plugged operation.
-(defun elmo-folder-status-dop (folder)
- (let* ((number-alist (elmo-msgdb-number-load
- (elmo-folder-msgdb-path folder)))
- (number-list (mapcar 'car number-alist))
- (spool-folder (elmo-dop-spool-folder folder))
- spool-length
+ (let ((queue elmo-dop-queue)
+ new-queue match-queue que)
+ (while (setq que (car queue))
+ (if (and
+ (member (cadr que) elmo-dop-merge-funcs)
+ (setq match-queue
+ (car (delete nil
+ (mapcar '(lambda (new-queue)
+ (if (and
+ (string= (car que) (car new-queue))
+ (string= (cadr que) (cadr new-queue)))
+ new-queue))
+ new-queue)))))
+ (setcar (cddr match-queue)
+ (append (nth 2 match-queue) (nth 2 que)))
+ (setq new-queue (append new-queue (list que))))
+ (setq queue (cdr queue)))
+ (setq elmo-dop-queue new-queue)))
+
+(defun elmo-dop-queue-load ()
+ (save-excursion
+ (setq elmo-dop-queue
+ (elmo-object-load
+ (expand-file-name elmo-queue-filename
+ elmo-msgdb-dir)))))
+
+(defun elmo-dop-queue-save ()
+ (save-excursion
+ (elmo-object-save
+ (expand-file-name elmo-queue-filename
+ elmo-msgdb-dir)
+ elmo-dop-queue)))
+
+(defun elmo-dop-lock-message (message-id &optional lock-list)
+ (let ((locked (or lock-list
+ (elmo-object-load
+ (expand-file-name
+ elmo-msgdb-lock-list-filename
+ elmo-msgdb-dir)))))
+ (setq locked (cons message-id locked))
+ (elmo-object-save
+ (expand-file-name elmo-msgdb-lock-list-filename
+ elmo-msgdb-dir)
+ locked)))
+
+(defun elmo-dop-unlock-message (message-id &optional lock-list)
+ (let ((locked (or lock-list
+ (elmo-object-load
+ (expand-file-name elmo-msgdb-lock-list-filename
+ elmo-msgdb-dir)))))
+ (setq locked (delete message-id locked))
+ (elmo-object-save
+ (expand-file-name elmo-msgdb-lock-list-filename
+ elmo-msgdb-dir)
+ locked)))
+
+(defun elmo-dop-lock-list-load ()
+ (elmo-object-load
+ (expand-file-name elmo-msgdb-lock-list-filename
+ elmo-msgdb-dir)))
+
+(defun elmo-dop-lock-list-save (lock-list)
+ (elmo-object-save
+ (expand-file-name elmo-msgdb-lock-list-filename
+ elmo-msgdb-dir)
+ lock-list))
+
+(defun elmo-dop-append-list-load (folder &optional resume)
+ (elmo-object-load
+ (expand-file-name (if resume
+ elmo-msgdb-resume-list-filename
+ elmo-msgdb-append-list-filename)
+ (elmo-msgdb-expand-path folder))))
+
+(defun elmo-dop-append-list-save (folder append-list &optional resume)
+ (if append-list
+ (elmo-object-save
+ (expand-file-name (if resume
+ elmo-msgdb-resume-list-filename
+ elmo-msgdb-append-list-filename)
+ (elmo-msgdb-expand-path folder))
+ append-list)
+ (condition-case ()
+ (delete-file (expand-file-name (if resume
+ elmo-msgdb-resume-list-filename
+ elmo-msgdb-append-list-filename)
+ (elmo-msgdb-expand-path folder)))
+ (error))))
+
+(defun elmo-dop-deleting-numbers-to-msgids (alist numbers appended)
+ "returns (new-appended . deleting-msgids)."
+ (let (msgid deleting-msgids)
+ (while numbers
+ (setq msgid (cdr (assq (car numbers) alist)))
+ (if (member msgid appended)
+ (setq appended (delete msgid appended))
+ (setq deleting-msgids (append deleting-msgids (list msgid))))
+ (setq numbers (cdr numbers)))
+ (cons appended deleting-msgids)))
+
+(defun elmo-dop-list-deleted (folder number-alist)
+ "List message numbers to be deleted on FOLDER from NUMBER-ALIST."
+ (elmo-dop-queue-load)
+ (let ((queue elmo-dop-queue)
+ numbers matches nalist)
+ (while queue
+ (if (and (string= (nth 0 (car queue)) folder)
+ (string= (nth 1 (car queue)) "delete-msgids"))
+ (setq numbers
+ (nconc numbers
+ (delq nil (mapcar
+ (lambda (x)
+ (mapcar 'car
+ (elmo-string-rassoc-all
+ x number-alist)))
+ (nth 2 (car queue)))))))
+ (setq queue (cdr queue)))
+ (elmo-uniq-list (elmo-flatten numbers))))
+
+(defun elmo-dop-delete-msgs (folder msgs msgdb)
+ (save-match-data
+ (let ((folder-numbers (elmo-make-folder-numbers-list folder msgs))
+ appended-deleting)
+ (while folder-numbers
+ (if (eq (elmo-folder-get-type (car (car folder-numbers)))
+ 'imap4)
+ (if elmo-enable-disconnected-operation
+ (progn
+ (setq appended-deleting
+ (elmo-dop-deleting-numbers-to-msgids
+ (elmo-msgdb-get-number-alist msgdb)
+ msgs ; virtual number
+ (elmo-dop-append-list-load folder)))
+ (if (cdr appended-deleting)
+ (elmo-dop-queue-append
+ (car (car folder-numbers)) ; real folder
+ "delete-msgids" ;; for secure removal.
+ (cdr appended-deleting)))
+ (elmo-dop-append-list-save folder (car appended-deleting)))
+ (error "Unplugged"))
+ ;; not imap4 folder...delete now!
+ (elmo-call-func (car (car folder-numbers)) "delete-msgs"
+ (cdr (car folder-numbers))))
+ (setq folder-numbers (cdr folder-numbers))))
+ t))
+
+(defun elmo-dop-prefetch-msgs (folder msgs)
+ (save-match-data
+ (elmo-dop-queue-append folder "prefetch-msgs" msgs)))
+
+(defun elmo-dop-list-folder (folder &optional nohide)
+ (if (or (memq (elmo-folder-get-type folder)
+ '(imap4 nntp pop3 filter pipe))
+ (and (elmo-multi-p folder) (not (elmo-folder-local-p folder))))
+ (if elmo-enable-disconnected-operation
+ (let* ((path (elmo-msgdb-expand-path folder))
+ (number-alist (elmo-msgdb-number-load path))
+ (number-list (mapcar 'car number-alist))
+ (append-list (elmo-dop-append-list-load folder))
+ (append-num (length append-list))
+ (killed (and elmo-use-killed-list
+ (elmo-msgdb-killed-list-load path)))
+ alreadies
+ max-num
+ (i 0))
+ (setq killed (nconc (elmo-dop-list-deleted folder number-alist)
+ killed))
+ (while append-list
+ (if (rassoc (car append-list) number-alist)
+ (setq alreadies (append alreadies
+ (list (car append-list)))))
+ (setq append-list (cdr append-list)))
+ (setq append-num (- append-num (length alreadies)))
+ (setq max-num
+ (or (nth (max (- (length number-list) 1) 0)
+ number-list) 0))
+ (while (< i append-num)
+ (setq number-list
+ (append number-list
+ (list (+ max-num i 1))))
+ (setq i (+ 1 i)))
+ (elmo-living-messages number-list killed))
+ (error "Unplugged"))
+ ;; not imap4 folder...list folder
+ (elmo-call-func folder "list-folder")))
+
+(defun elmo-dop-count-appended (folder)
+ (length (elmo-dop-append-list-load folder)))
+
+(defun elmo-dop-call-func-on-msgs (folder func-name msgs msgdb)
+ (let ((append-list (elmo-dop-append-list-load folder))
+ (number-alist (elmo-msgdb-get-number-alist msgdb))
+ matched)
+ (if (eq (elmo-folder-get-type folder) 'imap4)
+ (progn
+;;; (while append-list
+;;; (if (setq matched (car (rassoc (car append-list) number-alist)))
+;;; (setq msgs (delete matched msgs)))
+;;; (setq append-list (cdr append-list)))
+ (if msgs
+ (elmo-dop-queue-append folder func-name msgs)))
+ ;; maildir... XXX hard coding.....
+ (if (not (featurep 'elmo-maildir))
+ (require 'maildir))
+ (funcall (intern (format "elmo-maildir-%s" func-name))
+ (elmo-folder-get-spec folder)
+ msgs msgdb))))
+
+(defun elmo-dop-max-of-folder (folder)
+ (if (eq (elmo-folder-get-type folder) 'imap4)
+ (if elmo-enable-disconnected-operation
+ (let* ((number-alist (elmo-msgdb-number-load
+ (elmo-msgdb-expand-path folder)))
+ (number-list (mapcar 'car number-alist))
+ (append-list (elmo-dop-append-list-load folder))
+ (append-num (length append-list))
+ alreadies
+ (i 0)
+ max-num)
+ (while append-list
+ (if (rassoc (car append-list) number-alist)
+ (setq alreadies (append alreadies
+ (list (car append-list)))))
+ (setq append-list (cdr append-list)))
+ (setq max-num
+ (or (nth (max (- (length number-list) 1) 0) number-list)
+ 0))
+ (cons (- (+ max-num append-num) (length alreadies))
+ (- (+ (length number-list) append-num) (length alreadies))))
+ (error "Unplugged"))
+ ;; not imap4 folder.
+ (elmo-call-func folder "max-of-folder")))
+
+(defun elmo-dop-save-pending-messages (folder)
+ (message (format "Saving queued message in %s..." elmo-lost+found-folder))
+ (let* ((append-list (elmo-dop-append-list-load folder))
+ file-string)
+ (while append-list
+ (when (setq file-string (elmo-get-file-string ; message string
+ (elmo-cache-get-path
+ (car append-list))))
+ (elmo-append-msg elmo-lost+found-folder file-string)
+ (elmo-dop-unlock-message (car append-list)))
+ (setq append-list (cdr append-list))
+ (elmo-dop-append-list-save folder nil)))
+ (message (format "Saving queued message in %s...done"
+ elmo-lost+found-folder)))
+
+(defun elmo-dop-flush-pending-append-operations (folder &optional appends resume)
+ (message "Appending queued messages...")
+ (let* ((append-list (or appends
+ (elmo-dop-append-list-load folder)))
+ (appendings append-list)