+(defsubst elmo-shimbun-headers-cache-header-list (entry)
+ (aref entry 0))
+
+(defsubst elmo-shimbun-headers-cache-set-header-list (entry list)
+ (aset entry 0 list))
+
+(defsubst elmo-shimbun-headers-cache-header-hash (entry)
+ (aref entry 1))
+
+(defsubst elmo-shimbun-headers-cache-set-header-hash (entry hash)
+ (aset entry 1 hash))
+
+(defsubst elmo-shimbun-headers-cache-last-check (entry)
+ (aref entry 2))
+
+(defsubst elmo-shimbun-headers-cache-set-last-check (entry time)
+ (aset entry 2 time))
+
+(defsubst elmo-shimbun-lapse-seconds (time)
+ (let ((now (current-time)))
+ (+ (* (- (car now) (car time)) 65536)
+ (- (nth 1 now) (nth 1 time)))))
+
+(defsubst elmo-shimbun-headers-cache-check-p (cache)
+ (or (null (elmo-shimbun-headers-cache-last-check cache))
+ (and (elmo-shimbun-headers-cache-last-check cache)
+ (> (elmo-shimbun-lapse-seconds
+ (elmo-shimbun-headers-cache-last-check cache))
+ elmo-shimbun-check-interval))))
+
+(defun elmo-shimbun-get-headers (folder)
+ (shimbun-open-group
+ (elmo-shimbun-folder-shimbun-internal folder)
+ (elmo-shimbun-folder-group-internal folder))
+ (let* ((shimbun (elmo-shimbun-folder-shimbun-internal folder))
+ (key (concat (shimbun-server-internal shimbun)
+ "." (shimbun-current-group-internal shimbun)))
+ (elmo-hash-minimum-size 0)
+ entry headers hash done)
+ (if (setq entry (cdr (assoc key elmo-shimbun-headers-cache)))
+ (unless (elmo-shimbun-headers-cache-check-p entry)
+ (elmo-shimbun-folder-set-headers-internal
+ folder
+ (elmo-shimbun-headers-cache-header-list entry))
+ (elmo-shimbun-folder-set-header-hash-internal
+ folder
+ (elmo-shimbun-headers-cache-header-hash entry))
+ (elmo-shimbun-headers-cache-header-list entry)
+ (setq done t)))
+ (unless done
+ (setq headers
+ (elmo-shimbun-folder-set-headers-internal
+ folder (shimbun-headers
+ (elmo-shimbun-folder-shimbun-internal folder))))
+ (setq hash
+ (elmo-shimbun-folder-set-header-hash-internal
+ folder
+ (elmo-make-hash
+ (length (elmo-shimbun-folder-headers-internal folder)))))
+ ;; Set up header hash.
+ (dolist (header (elmo-shimbun-folder-headers-internal folder))
+ (elmo-set-hash-val
+ (shimbun-header-id header) header
+ (elmo-shimbun-folder-header-hash-internal folder)))
+ (if entry
+ (progn
+ (elmo-shimbun-headers-cache-set-header-list entry headers)
+ (elmo-shimbun-headers-cache-set-header-hash entry hash)
+ (elmo-shimbun-headers-cache-set-last-check entry (current-time)))
+ (setq elmo-shimbun-headers-cache
+ (cons (cons key (vector headers hash (current-time)))
+ elmo-shimbun-headers-cache))))))
+