1 ;;; gnus-cache.el --- cache interface for Gnus
2 ;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
3 ;; Free Software Foundation, Inc.
5 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
8 ;; This file is part of GNU Emacs.
10 ;; GNU Emacs 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)
15 ;; GNU Emacs 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.
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.
29 (eval-when-compile (require 'cl))
38 (defcustom gnus-cache-active-file
39 (expand-file-name "active" gnus-cache-directory)
40 "*The cache active file."
44 (defcustom gnus-cache-enter-articles '(ticked dormant)
45 "Classes of articles to enter into the cache."
47 :type '(set (const ticked) (const dormant) (const unread) (const read)))
49 (defcustom gnus-cache-remove-articles '(read)
50 "Classes of articles to remove from the cache."
52 :type '(set (const ticked) (const dormant) (const unread) (const read)))
54 (defcustom gnus-cacheable-groups nil
55 "*Groups that match this regexp will be cached.
57 If you only want to cache your nntp groups, you could set this
58 variable to \"^nntp\".
60 If a group matches both gnus-cacheable-groups and gnus-uncacheable-groups
63 :type '(choice (const :tag "off" nil)
66 (defcustom gnus-uncacheable-groups nil
67 "*Groups that match this regexp will not be cached.
69 If you want to avoid caching your nnml groups, you could set this
70 variable to \"^nnml\".
72 If a group matches both gnus-cacheable-groups and gnus-uncacheable-groups
75 :type '(choice (const :tag "off" nil)
78 (defvar gnus-cache-overview-coding-system 'raw-text
79 "Coding system used on Gnus cache files.")
81 (defvar gnus-cache-coding-system 'raw-text
82 "Coding system used on Gnus cache files.")
86 ;;; Internal variables.
88 (defvar gnus-cache-removable-articles nil)
89 (defvar gnus-cache-buffer nil)
90 (defvar gnus-cache-active-hashtb nil)
91 (defvar gnus-cache-active-altered nil)
94 (autoload 'nnml-generate-nov-databases-1 "nnml")
95 (autoload 'nnvirtual-find-group-art "nnvirtual"))
99 ;;; Functions called from Gnus.
101 (defun gnus-cache-open ()
102 "Initialize the cache."
103 (when (or (file-exists-p gnus-cache-directory)
105 (not (eq gnus-use-cache 'passive))))
106 (gnus-cache-read-active)))
108 ;; Complexities of byte-compiling make this kludge necessary. Eeek.
110 (gnus-add-shutdown 'gnus-cache-close 'gnus))
112 (defun gnus-cache-close ()
113 "Shut down the cache."
114 (gnus-cache-write-active)
115 (gnus-cache-save-buffers)
116 (setq gnus-cache-active-hashtb nil))
118 (defun gnus-cache-save-buffers ()
119 ;; save the overview buffer if it exists and has been modified
120 ;; delete empty cache subdirectories
121 (when gnus-cache-buffer
122 (let ((buffer (cdr gnus-cache-buffer))
123 (overview-file (gnus-cache-file-name
124 (car gnus-cache-buffer) ".overview")))
125 ;; write the overview only if it was modified