X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=elmo%2Felmo-localdir.el;h=46b7ebe7e619afceac9ba60d45b6758c25b534c5;hb=3a4e0ede6f7ecdb73d3c636c5a2fef6d64e8b00a;hp=3d6adabbf12468b478f84c754f3ad5216e5eef5d;hpb=ecddb8da25e68fd2bbdcb0529676d32bc5f974e9;p=elisp%2Fwanderlust.git diff --git a/elmo/elmo-localdir.el b/elmo/elmo-localdir.el index 3d6adab..46b7ebe 100644 --- a/elmo/elmo-localdir.el +++ b/elmo/elmo-localdir.el @@ -32,130 +32,103 @@ ;;; Code: ;; -(eval-when-compile (require 'cl)) -(require 'elmo-msgdb) -(require 'elmo) - -(defcustom elmo-localdir-folder-path "~/Mail" - "*Local mail directory (MH format) path." - :type 'directory - :group 'elmo) - -(defvar elmo-localdir-lockfile-list nil) - -;;; ELMO Local directory folder -(eval-and-compile - (luna-define-class elmo-localdir-folder (elmo-folder) - (dir-name directory)) - (luna-define-internal-accessors 'elmo-localdir-folder)) - -;;; elmo-localdir specific methods. -(luna-define-generic elmo-localdir-folder-path (folder) - "Return local directory path of the FOLDER.") - -(luna-define-generic elmo-localdir-folder-name (folder name) - "Return directory NAME for FOLDER.") - -(luna-define-method elmo-localdir-folder-path ((folder elmo-localdir-folder)) - elmo-localdir-folder-path) - -(luna-define-method elmo-localdir-folder-name ((folder elmo-localdir-folder) - name) - name) - -(luna-define-method elmo-folder-initialize ((folder - elmo-localdir-folder) - name) - (elmo-localdir-folder-set-dir-name-internal folder name) - (if (file-name-absolute-p name) - (elmo-localdir-folder-set-directory-internal - folder - (expand-file-name name)) - (elmo-localdir-folder-set-directory-internal - folder - (expand-file-name - (elmo-localdir-folder-name folder name) - (elmo-localdir-folder-path folder)))) - folder) - -;; open, check, commit, and close are generic. - -(luna-define-method elmo-folder-exists-p ((folder elmo-localdir-folder)) - (file-directory-p (elmo-localdir-folder-directory-internal folder))) - -(luna-define-method elmo-folder-expand-msgdb-path ((folder - elmo-localdir-folder)) - (expand-file-name - (mapconcat - 'identity - (mapcar - 'elmo-replace-string-as-filename - (split-string (elmo-localdir-folder-dir-name-internal folder) - "/")) - "/") - (expand-file-name ;;"localdir" - (symbol-name (elmo-folder-type-internal folder)) - elmo-msgdb-dir))) - -(luna-define-method elmo-message-file-name ((folder - elmo-localdir-folder) - number) - (expand-file-name (int-to-string number) - (elmo-localdir-folder-directory-internal folder))) - -(luna-define-method elmo-folder-message-file-number-p ((folder - elmo-localdir-folder)) - t) - -(luna-define-method elmo-folder-message-file-directory ((folder - elmo-localdir-folder)) - (elmo-localdir-folder-directory-internal folder)) +(require 'emu) +(require 'std11) -(luna-define-method elmo-folder-message-make-temp-file-p - ((folder elmo-localdir-folder)) - t) +(eval-when-compile + (require 'elmo-cache)) +(require 'elmo-msgdb) -(luna-define-method elmo-folder-message-make-temp-files ((folder - elmo-localdir-folder) - numbers - &optional - start-number) - (let ((temp-dir (elmo-folder-make-temp-dir folder)) - (cur-number (or start-number 0))) - (dolist (number numbers) - (elmo-add-name-to-file - (expand-file-name - (int-to-string number) - (elmo-localdir-folder-directory-internal folder)) - (expand-file-name - (int-to-string (if start-number cur-number number)) - temp-dir)) - (incf cur-number)) - temp-dir)) +(defsubst elmo-localdir-get-folder-directory (spec) + (if (file-name-absolute-p (nth 1 spec)) + (nth 1 spec) ; already full path. + (expand-file-name (nth 1 spec) + (cond ((eq (car spec) 'localnews) + elmo-localnews-folder-path) + (t + elmo-localdir-folder-path))))) + +(defun elmo-localdir-msgdb-expand-path (spec) + (let ((fld-name (nth 1 spec))) + (expand-file-name fld-name + (expand-file-name "localdir" + elmo-msgdb-dir)))) + +(defun elmo-localdir-number-to-filename (spec dir number &optional loc-alist) + (expand-file-name (int-to-string number) dir)) + +(if (boundp 'nemacs-version) + (defsubst elmo-localdir-insert-header (file) + "Insert the header of the article (Does not work on nemacs)." + (as-binary-input-file + (insert-file-contents file))) + (defsubst elmo-localdir-insert-header (file) + "Insert the header of the article." + (let ((beg 0) + insert-file-contents-pre-hook ; To avoid autoconv-xmas... + insert-file-contents-post-hook + format-alist) + (when (file-exists-p file) + ;; Read until header separator is found. + (while (and (eq elmo-localdir-header-chop-length + (nth 1 + (as-binary-input-file + (insert-file-contents + file nil beg + (incf beg elmo-localdir-header-chop-length))))) + (prog1 (not (search-forward "\n\n" nil t)) + (goto-char (point-max))))))))) + + +(defsubst elmo-localdir-msgdb-create-overview-entity-from-file (number file) + (save-excursion + (let ((tmp-buffer (get-buffer-create " *ELMO LocalDir Temp*")) + insert-file-contents-pre-hook ; To avoid autoconv-xmas... + insert-file-contents-post-hook header-end + (attrib (file-attributes file)) + ret-val size mtime) + (set-buffer tmp-buffer) + (erase-buffer) + (if (not (file-exists-p file)) + () + (setq size (nth 7 attrib)) + (setq mtime (timezone-make-date-arpa-standard + (current-time-string (nth 5 attrib)) (current-time-zone))) + ;; insert header from file. + (catch 'done + (condition-case nil + (elmo-localdir-insert-header file) + (error (throw 'done nil))) + (goto-char (point-min)) + (setq header-end + (if (re-search-forward "\\(^--.*$\\)\\|\\(\n\n\\)" nil t) + (point) + (point-max))) + (narrow-to-region (point-min) header-end) + (setq ret-val (elmo-msgdb-create-overview-from-buffer number size mtime)) + (kill-buffer tmp-buffer)) + ret-val + )))) (defun elmo-localdir-msgdb-create-entity (dir number) - (elmo-msgdb-create-overview-entity-from-file + (elmo-localdir-msgdb-create-overview-entity-from-file number (expand-file-name (int-to-string number) dir))) -(luna-define-method elmo-folder-msgdb-create ((folder elmo-localdir-folder) - numbers - new-mark - already-mark - seen-mark - important-mark - seen-list) - (when numbers - (let ((dir (elmo-localdir-folder-directory-internal folder)) +(defun elmo-localdir-msgdb-create-as-numlist (spec numlist new-mark + already-mark seen-mark + important-mark seen-list) + (when numlist + (let ((dir (elmo-localdir-get-folder-directory spec)) overview number-alist mark-alist entity message-id num seen gmark (i 0) - (len (length numbers))) + (len (length numlist))) (message "Creating msgdb...") - (while numbers + (while numlist (setq entity (elmo-localdir-msgdb-create-entity - dir (car numbers))) + dir (car numlist))) (if (null entity) () (setq num (elmo-msgdb-overview-entity-get-number entity)) @@ -169,7 +142,7 @@ message-id)) (setq seen (member message-id seen-list)) (if (setq gmark (or (elmo-msgdb-global-mark-get message-id) - (if (elmo-file-cache-exists-p message-id) ; XXX + (if (elmo-cache-exists-p message-id) ; XXX (if seen nil already-mark) @@ -184,136 +157,197 @@ (when (> len elmo-display-progress-threshold) (setq i (1+ i)) (elmo-display-progress - 'elmo-localdir-msgdb-create-as-numbers "Creating msgdb..." + 'elmo-localdir-msgdb-create-as-numlist "Creating msgdb..." (/ (* i 100) len))) - (setq numbers (cdr numbers))) + (setq numlist (cdr numlist))) (message "Creating msgdb...done") (list overview number-alist mark-alist)))) -(luna-define-method elmo-folder-list-subfolders ((folder elmo-localdir-folder) - &optional one-level) - (elmo-mapcar-list-of-list - (lambda (x) (concat (elmo-folder-prefix-internal folder) x)) - (elmo-list-subdirectories - (elmo-localdir-folder-path folder) - (or (elmo-localdir-folder-dir-name-internal folder) "") - one-level))) - -(defsubst elmo-localdir-list-subr (folder &optional nonsort) - (let ((flist (mapcar 'string-to-int - (directory-files - (elmo-localdir-folder-directory-internal folder) - nil "^[0-9]+$" t))) - (killed (elmo-msgdb-killed-list-load (elmo-folder-msgdb-path folder)))) +(defalias 'elmo-localdir-msgdb-create 'elmo-localdir-msgdb-create-as-numlist) + +(defvar elmo-localdir-list-folders-spec-string "+") +(defvar elmo-localdir-list-folders-filter-regexp "^\\(\\.\\.?\\|[0-9]+\\)$") + +(defun elmo-localdir-list-folders (spec &optional hierarchy) + (let ((folder (concat elmo-localdir-list-folders-spec-string (nth 1 spec)))) + (elmo-localdir-list-folders-subr folder hierarchy))) + +(defun elmo-localdir-list-folders-subr (folder &optional hierarchy) + (let ((case-fold-search t) + (w32-get-true-file-link-count t) ; for Meadow + folders curdir dirent relpath abspath attr + subprefix subfolder) + (condition-case () + (progn + (setq curdir + (expand-file-name (nth 1 (elmo-folder-get-spec folder)) + elmo-localdir-folder-path)) + (if (string-match "^[+=$.]$" folder) ; localdir, archive, localnews + (setq subprefix folder) + (setq subprefix (concat folder elmo-path-sep)) + ;; include parent + (setq folders (list folder))) + (setq dirent (directory-files curdir)) + (catch 'done + (while dirent + (setq relpath (car dirent)) + (setq dirent (cdr dirent)) + (setq abspath (expand-file-name relpath curdir)) + (and + (not (string-match + elmo-localdir-list-folders-filter-regexp + relpath)) + (eq (nth 0 (setq attr (file-attributes abspath))) t) + (if (eq hierarchy 'check) + (throw 'done (nconc folders t)) + t) + (setq subfolder (concat subprefix relpath)) + (setq folders (nconc folders + (if (and hierarchy + (if elmo-have-link-count + (< 2 (nth 1 attr)) + (cdr + (elmo-localdir-list-folders-subr + subfolder 'check)))) + (list (list subfolder)) + (list subfolder)))) + (or + hierarchy + (and elmo-have-link-count (>= 2 (nth 1 attr))) + (setq folders + (nconc folders (cdr (elmo-localdir-list-folders-subr + subfolder hierarchy)))))))) + folders) + (file-error folders)))) + +(defsubst elmo-localdir-list-folder-subr (spec &optional nonsort) + (let* ((dir (elmo-localdir-get-folder-directory spec)) + (flist (mapcar 'string-to-int + (directory-files dir nil "^[0-9]+$" t))) + (killed (and elmo-use-killed-list + (elmo-msgdb-killed-list-load + (elmo-msgdb-expand-path spec)))) + numbers) (if nonsort (cons (or (elmo-max-of-list flist) 0) (if killed (- (length flist) (elmo-msgdb-killed-list-length killed)) (length flist))) - (sort flist '<)))) - -(luna-define-method elmo-folder-append-buffer ((folder elmo-localdir-folder) - unread - &optional number) - (let ((filename (elmo-message-file-name - folder - (or number - (1+ (car (elmo-folder-status folder))))))) - (if (file-writable-p filename) - (write-region-as-binary - (point-min) (point-max) filename nil 'no-msg)) - t)) - -(luna-define-method elmo-folder-append-messages :around ((folder elmo-localdir-folder) - src-folder numbers - unread-marks - &optional same-number) - (if (elmo-folder-message-file-p src-folder) - (let ((dir (elmo-localdir-folder-directory-internal folder)) - (succeeds numbers) - (next-num (1+ (car (elmo-folder-status folder))))) - (while numbers - (elmo-copy-file - (elmo-message-file-name src-folder (car numbers)) - (expand-file-name - (int-to-string - (if same-number (car numbers) next-num)) - dir)) - (if (and (setq numbers (cdr numbers)) - (not same-number)) - (setq next-num - (if (elmo-localdir-locked-p) - ;; MDA is running. - (1+ (car (elmo-folder-status folder))) - (1+ next-num))))) - succeeds) - (luna-call-next-method))) - -(luna-define-method elmo-folder-delete-messages ((folder elmo-localdir-folder) - numbers) - (dolist (number numbers) - (elmo-localdir-delete-message folder number)) - t) - -(defun elmo-localdir-delete-message (folder number) - "Delete message in the FOLDER with NUMBER." - (let ((filename (elmo-message-file-name folder number))) - (when (and (string-match "[0-9]+" filename) ; for safety. - (file-exists-p filename) - (file-writable-p filename) - (not (file-directory-p filename))) - (delete-file filename) - t))) - -(luna-define-method elmo-message-fetch ((folder elmo-localdir-folder) - number strategy - &optional section outbuf unseen) - ;; strategy, section, unseen is ignored. - (if outbuf - (with-current-buffer outbuf - (erase-buffer) - (when (file-exists-p (elmo-message-file-name folder number)) - (insert-file-contents-as-binary - (elmo-message-file-name folder number)) - (elmo-delete-cr-buffer)) - t) - (with-temp-buffer - (when (file-exists-p (elmo-message-file-name folder number)) - (insert-file-contents-as-binary (elmo-message-file-name folder number)) - (elmo-delete-cr-buffer)) - (buffer-string)))) - -(luna-define-method elmo-folder-list-messages-internal - ((folder elmo-localdir-folder) &optional nohide) - (elmo-localdir-list-subr folder)) - -(luna-define-method elmo-folder-status ((folder elmo-localdir-folder)) - (elmo-localdir-list-subr folder t)) - -(luna-define-method elmo-folder-creatable-p ((folder elmo-localdir-folder)) + (setq numbers (sort flist '<)) + (elmo-living-messages numbers killed)))) + +(defun elmo-localdir-append-msg (spec string &optional msg no-see) + (let ((dir (elmo-localdir-get-folder-directory spec)) + (tmp-buffer (get-buffer-create " *ELMO Temp buffer*")) + (next-num (or msg + (1+ (car (elmo-localdir-max-of-folder spec))))) + filename) + (save-excursion + (set-buffer tmp-buffer) + (erase-buffer) + (setq filename (expand-file-name (int-to-string + next-num) + dir)) + (unwind-protect + (if (file-writable-p filename) + (progn + (insert string) + (as-binary-output-file + (write-region (point-min) (point-max) filename nil 'no-msg)) + t) + nil + ) + (kill-buffer tmp-buffer))))) + +(defun elmo-localdir-delete-msg (spec number) + (let (file + (dir (elmo-localdir-get-folder-directory spec)) + (number (int-to-string number))) + (setq file (expand-file-name number dir)) + (if (and (string-match "[0-9]+" number) ; for safety. + (file-exists-p file) + (file-writable-p file) + (not (file-directory-p file))) + (progn (delete-file file) + t)))) + +(defun elmo-localdir-read-msg (spec number outbuf &optional msgdb unread) + (save-excursion + (let* ((number (int-to-string number)) + (dir (elmo-localdir-get-folder-directory spec)) + (file (expand-file-name number dir))) + (set-buffer outbuf) + (erase-buffer) + (when (file-exists-p file) + (as-binary-input-file (insert-file-contents file)) + (elmo-delete-cr-get-content-type))))) + +(defun elmo-localdir-delete-msgs (spec msgs) + (mapcar '(lambda (msg) (elmo-localdir-delete-msg spec msg)) + msgs)) + +(defun elmo-localdir-list-folder (spec &optional nohide); called by elmo-localdir-search() + (elmo-localdir-list-folder-subr spec)) + +(defun elmo-localdir-max-of-folder (spec) + (elmo-localdir-list-folder-subr spec t)) + +(defun elmo-localdir-check-validity (spec validity-file) + (let* ((dir (elmo-localdir-get-folder-directory spec)) + (cur-val (nth 5 (file-attributes dir))) + (file-val (read + (or (elmo-get-file-string validity-file) + "nil")))) + (cond + ((or (null cur-val) (null file-val)) nil) + ((> (car cur-val) (car file-val)) nil) + ((= (car cur-val) (car file-val)) + (if (> (cadr cur-val) (cadr file-val)) nil t)) ; t if same + (t t)))) + +(defun elmo-localdir-sync-validity (spec validity-file) + (save-excursion + (let* ((dir (elmo-localdir-get-folder-directory spec)) + (tmp-buffer (get-buffer-create " *ELMO TMP*")) + (number-file (expand-file-name elmo-msgdb-number-filename dir))) + (set-buffer tmp-buffer) + (erase-buffer) + (prin1 (nth 5 (file-attributes dir)) tmp-buffer) + (princ "\n" tmp-buffer) + (if (file-writable-p validity-file) + (write-region (point-min) (point-max) + validity-file nil 'no-msg) + (message (format "%s is not writable." number-file))) + (kill-buffer tmp-buffer)))) + +(defun elmo-localdir-folder-exists-p (spec) + (file-directory-p (elmo-localdir-get-folder-directory spec))) + +(defun elmo-localdir-folder-creatable-p (spec) t) -(luna-define-method elmo-folder-create ((folder elmo-localdir-folder)) - (let ((dir (elmo-localdir-folder-directory-internal folder))) - (if (file-directory-p dir) - () - (if (file-exists-p dir) - (error "Create folder failed") - (elmo-make-directory dir)) - t))) - -(luna-define-method elmo-folder-delete ((folder elmo-localdir-folder)) - (let ((dir (elmo-localdir-folder-directory-internal folder))) +(defun elmo-localdir-create-folder (spec) + (save-excursion + (let ((dir (elmo-localdir-get-folder-directory spec))) + (if (file-directory-p dir) + () + (if (file-exists-p dir) + (error "Create folder failed") + (elmo-make-directory dir)) + t + )))) + +(defun elmo-localdir-delete-folder (spec) + (let* ((dir (elmo-localdir-get-folder-directory spec))) (if (not (file-directory-p dir)) (error "No such directory: %s" dir) (elmo-delete-directory dir t) t))) -(luna-define-method elmo-folder-rename-internal ((folder elmo-localdir-folder) - new-folder) - (let* ((old (elmo-localdir-folder-directory-internal folder)) - (new (elmo-localdir-folder-directory-internal folder)) +(defun elmo-localdir-rename-folder (old-spec new-spec) + (let* ((old (elmo-localdir-get-folder-directory old-spec)) + (new (elmo-localdir-get-folder-directory new-spec)) (new-dir (directory-file-name (file-name-directory new)))) (if (not (file-directory-p old)) (error "No such directory: %s" old) @@ -324,48 +358,128 @@ (rename-file old new) t)))) -(defsubst elmo-localdir-field-condition-match (folder condition - number number-list) - (elmo-file-field-condition-match - (expand-file-name (int-to-string number) - (elmo-localdir-folder-directory-internal folder)) - condition number number-list)) - -(luna-define-method elmo-folder-search ((folder elmo-localdir-folder) - condition &optional numbers) - (let* ((msgs (or numbers (elmo-folder-list-messages folder))) +(defsubst elmo-localdir-field-primitive-condition-match (spec + condition + number + number-list) + (let (result) + (goto-char (point-min)) + (cond + ((string= (elmo-filter-key condition) "last") + (setq result (<= (length (memq number number-list)) + (string-to-int (elmo-filter-value condition))))) + ((string= (elmo-filter-key condition) "first") + (setq result (< (- (length number-list) + (length (memq number number-list))) + (string-to-int (elmo-filter-value condition))))) + (t + (elmo-set-work-buf + (as-binary-input-file (insert-file-contents + (expand-file-name + (int-to-string number) + (elmo-localdir-get-folder-directory spec)))) + (elmo-set-buffer-multibyte default-enable-multibyte-characters) + ;; Should consider charset? + (decode-mime-charset-region (point-min)(point-max) elmo-mime-charset) + (setq result + (elmo-buffer-field-primitive-condition-match + condition number number-list))))) + (if (eq (elmo-filter-type condition) 'unmatch) + (setq result (not result))) + result)) + +(defun elmo-localdir-field-condition-match (spec condition number number-list) + (cond + ((vectorp condition) + (elmo-localdir-field-primitive-condition-match + spec condition number number-list)) + ((eq (car condition) 'and) + (and (elmo-localdir-field-condition-match + spec (nth 1 condition) number number-list) + (elmo-localdir-field-condition-match + spec (nth 2 condition) number number-list))) + ((eq (car condition) 'or) + (or (elmo-localdir-field-condition-match + spec (nth 1 condition) number number-list) + (elmo-localdir-field-condition-match + spec (nth 2 condition) number number-list))))) + +(defun elmo-localdir-search (spec condition &optional from-msgs) + (let* ((msgs (or from-msgs (elmo-localdir-list-folder spec))) (num (length msgs)) (i 0) - number-list case-fold-search ret-val) - (setq number-list msgs) + last cur number-list case-fold-search ret-val) + (cond + ;; short cut. + ((and (vectorp condition) + (string= (elmo-filter-key condition) "last")) + (nthcdr (max (- (length msgs) + (string-to-int (elmo-filter-value condition))) + 0) + msgs)) + ((and (vectorp condition) + (string= (elmo-filter-key condition) "first")) + (let ((rest (nthcdr (string-to-int (elmo-filter-value condition) ) + msgs))) + (mapcar '(lambda (x) + (delete x msgs)) rest)) + msgs) + (t + (setq number-list msgs) + (while msgs + (if (elmo-localdir-field-condition-match spec condition + (car msgs) number-list) + (setq ret-val (cons (car msgs) ret-val))) + (when (> num elmo-display-progress-threshold) + (setq i (1+ i)) + (setq cur (/ (* i 100) num)) + (unless (eq cur last) + (elmo-display-progress + 'elmo-localdir-search "Searching..." + cur) + (setq last cur))) + (setq msgs (cdr msgs))) + (nreverse ret-val))))) + +;;; (localdir, maildir, localnews) -> localdir +(defun elmo-localdir-copy-msgs (dst-spec msgs src-spec + &optional loc-alist same-number) + (let ((dst-dir + (elmo-localdir-get-folder-directory dst-spec)) + (next-num (1+ (car (elmo-localdir-max-of-folder dst-spec))))) (while msgs - (if (elmo-localdir-field-condition-match folder condition - (car msgs) number-list) - (setq ret-val (cons (car msgs) ret-val))) - (when (> num elmo-display-progress-threshold) - (setq i (1+ i)) - (elmo-display-progress - 'elmo-localdir-search "Searching..." - (/ (* i 100) num))) - (setq msgs (cdr msgs))) - (nreverse ret-val))) - -(luna-define-method elmo-folder-pack-numbers ((folder elmo-localdir-folder)) - (let* ((dir (elmo-localdir-folder-directory-internal folder)) - (msgdb (elmo-folder-msgdb folder)) - (onum-alist (elmo-msgdb-get-number-alist msgdb)) - (omark-alist (elmo-msgdb-get-mark-alist (elmo-folder-msgdb msgdb))) - (new-number 1) ; first ordinal position in localdir - flist onum mark new-mark-alist total) + (elmo-copy-file + ;; src file + (elmo-call-func src-spec "get-msg-filename" (car msgs) loc-alist) + ;; dst file + (expand-file-name (int-to-string + (if same-number (car msgs) next-num)) + dst-dir)) + (if (and (setq msgs (cdr msgs)) + (not same-number)) + (setq next-num + (if (and (eq (car dst-spec) 'localdir) + (elmo-localdir-locked-p)) + ;; MDA is running. + (1+ (car (elmo-localdir-max-of-folder dst-spec))) + (1+ next-num))))) + t)) + +(defun elmo-localdir-pack-number (spec msgdb arg) + (let ((dir (elmo-localdir-get-folder-directory spec)) + (onum-alist (elmo-msgdb-get-number-alist msgdb)) + (omark-alist (elmo-msgdb-get-mark-alist msgdb)) + (new-number 1) ; first ordinal position in localdir + flist onum mark new-mark-alist total) (setq flist (if elmo-pack-number-check-strict - (elmo-folder-list-messages folder) ; allow localnews + (elmo-call-func spec "list-folder") ; allow localnews (mapcar 'car onum-alist))) (setq total (length flist)) (while flist (when (> total elmo-display-progress-threshold) (elmo-display-progress - 'elmo-folder-pack-numbers "Packing..." + 'elmo-localdir-pack-number "Packing..." (/ (* new-number 100) total))) (setq onum (car flist)) (when (not (eq onum new-number)) ; why \=() is wrong.. @@ -388,23 +502,23 @@ (setq new-number (1+ new-number)) (setq flist (cdr flist))) (message "Packing...done") - (elmo-folder-set-msgdb-internal - folder - (list (elmo-msgdb-get-overview msgdb) - onum-alist - new-mark-alist - ;; remake hash table - (elmo-msgdb-make-overview-hashtb - (elmo-msgdb-get-overview msgdb)))))) - -(luna-define-method elmo-folder-message-file-p ((folder elmo-localdir-folder)) + (list (elmo-msgdb-get-overview msgdb) + onum-alist + new-mark-alist + (elmo-msgdb-get-location msgdb) + ;; remake hash table + (elmo-msgdb-make-overview-hashtb (elmo-msgdb-get-overview msgdb))))) + +(defun elmo-localdir-use-cache-p (spec number) + nil) + +(defun elmo-localdir-local-file-p (spec number) t) -(luna-define-method elmo-message-file-name ((folder elmo-localdir-folder) - number) +(defun elmo-localdir-get-msg-filename (spec number &optional loc-alist) (expand-file-name (int-to-string number) - (elmo-localdir-folder-directory-internal folder))) + (elmo-localdir-get-folder-directory spec))) (defun elmo-localdir-locked-p () (if elmo-localdir-lockfile-list @@ -415,6 +529,15 @@ (throw 'found t)) (setq lock (cdr lock))))))) +(defalias 'elmo-localdir-sync-number-alist + 'elmo-generic-sync-number-alist) +(defalias 'elmo-localdir-list-folder-unread + 'elmo-generic-list-folder-unread) +(defalias 'elmo-localdir-list-folder-important + 'elmo-generic-list-folder-important) +(defalias 'elmo-localdir-commit 'elmo-generic-commit) +(defalias 'elmo-localdir-folder-diff 'elmo-generic-folder-diff) + (require 'product) (product-provide (provide 'elmo-localdir) (require 'elmo-version))