(let () (define ((patch environment) form) ((eval form (->environment environment)))) ((patch '(edwin imail file-folder)) '(lambda () (define-method close-resource ((folder ) no-defer?) no-defer? (save-resource folder) (discard-folder-cache folder)) (define-method %append-message ((message ) (url )) (let ((exists? (url-exists? url))) (let ((folder (get-memoized-resource url))) (if folder (let ((message (make-message-copy message folder))) (without-interrupts (lambda () (let* ((messages (file-folder-messages folder)) (n (vector-length messages)) (n* (fix:+ n 1)) (messages* (vector-grow messages n*))) (attach-message! message folder n) (vector-set! messages* n message) (set-file-folder-messages! folder messages*) (object-modified! folder 'INCREASE-LENGTH n n*))))) (let ((type (if exists? (url-file-folder-type url) (prompt-for-file-folder-type url)))) (if (not exists?) (create-file-folder-file url type)) (append-message-to-file message url type)))) (not exists?))) (define-method save-resource ((folder )) (and (let ((status (folder-sync-status folder))) (or (memq status '(CACHE-MODIFIED PERSISTENT-DELETED)) (and (eq? status 'BOTH-MODIFIED) (imail-ui:prompt-for-yes-or-no? "Disk file has changed since last read. Save anyway")))) (begin (synchronize-file-folder-write folder write-file-folder) #t))) (define-method discard-folder-cache ((folder )) (discard-file-folder-messages folder) (discard-file-folder-xstring folder)))) ((patch '(edwin imail file-folder rmail-folder)) '(lambda () (define-method write-file-folder ((folder ) pathname) (call-with-binary-output-file pathname (lambda (port) (write-rmail-file-header (rmail-folder-header-fields folder) port) (for-each-vector-element (file-folder-messages folder) (lambda (message) (write-rmail-message message port))) (output-port/synchronize-output port)))))) ((patch '(edwin imail file-folder umail-folder)) '(lambda () (define-method write-file-folder ((folder ) pathname) (call-with-binary-output-file pathname (lambda (port) (for-each-vector-element (file-folder-messages folder) (lambda (message) (write-umail-message message #t port))) (output-port/synchronize-output port)))))))