Output alists with dotted pair notation in .dir-locals.el
[emacs.git] / lisp / gnus / nnagent.el
blob1b2b13ebe4de1ebe965ef31510e9cb14084719f6
1 ;;; nnagent.el --- offline backend for Gnus
3 ;; Copyright (C) 1997-2018 Free Software Foundation, Inc.
5 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
6 ;; Keywords: news, mail
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 3 of the License, or
13 ;; (at your option) any later version.
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. If not, see <https://www.gnu.org/licenses/>.
23 ;;; Commentary:
25 ;;; Code:
27 (require 'nnheader)
28 (require 'nnoo)
29 (require 'gnus-agent)
30 (require 'nnml)
32 (nnoo-declare nnagent
33 nnml)
37 (defconst nnagent-version "nnagent 1.0")
39 (defvoo nnagent-directory nil
40 "Internal variable."
41 nnml-directory)
43 (defvoo nnagent-active-file nil
44 "Internal variable."
45 nnml-active-file)
47 (defvoo nnagent-newsgroups-file nil
48 "Internal variable."
49 nnml-newsgroups-file)
51 (defvoo nnagent-get-new-mail nil
52 "Internal variable."
53 nnml-get-new-mail)
55 ;;; Interface functions.
57 (nnoo-define-basics nnagent)
59 (defun nnagent-server (server)
60 (and server (format "%s+%s" (car gnus-command-method) server)))
62 (deffoo nnagent-open-server (server &optional defs)
63 (setq defs
64 `((nnagent-directory ,(gnus-agent-directory))
65 (nnagent-active-file ,(gnus-agent-lib-file "active"))
66 (nnagent-newsgroups-file ,(gnus-agent-lib-file "newsgroups"))
67 (nnagent-get-new-mail nil)))
68 (nnoo-change-server 'nnagent
69 (nnagent-server server)
70 defs)
71 (let ((dir (gnus-agent-directory))
72 err)
73 (cond
74 ((not (condition-case arg
75 (file-exists-p dir)
76 (ftp-error (setq err (format "%s" arg)))))
77 (nnagent-close-server)
78 (nnheader-report
79 'nnagent (or err
80 (format "No such file or directory: %s" dir))))
81 ((not (file-directory-p (file-truename dir)))
82 (nnagent-close-server)
83 (nnheader-report 'nnagent "Not a directory: %s" dir))
85 (nnheader-report 'nnagent "Opened server %s using directory %s"
86 server dir)
87 t))))
89 (deffoo nnagent-retrieve-groups (groups &optional server)
90 (save-excursion
91 (cond
92 ((file-exists-p (gnus-agent-lib-file "groups"))
93 (nnmail-find-file (gnus-agent-lib-file "groups"))
94 'groups)
95 ((file-exists-p (gnus-agent-lib-file "active"))
96 (nnmail-find-file (gnus-agent-lib-file "active"))
97 'active)
98 (t nil))))
100 (defun nnagent-request-type (group article)
101 (unless (stringp article)
102 (let ((gnus-agent nil))
103 (if (not (gnus-check-backend-function
104 'request-type (car gnus-command-method)))
105 'unknown
106 (funcall (gnus-get-function gnus-command-method 'request-type)
107 (gnus-group-real-name group) article)))))
109 (deffoo nnagent-request-newgroups (date server)
110 nil)
112 (deffoo nnagent-request-update-info (group info &optional server)
113 nil)
115 (deffoo nnagent-request-post (&optional server)
116 (gnus-agent-insert-meta-information 'news gnus-command-method)
117 (gnus-request-accept-article "nndraft:queue" nil t t))
119 (deffoo nnagent-request-set-mark (group action server)
120 (mm-with-unibyte-buffer
121 (insert "(gnus-agent-synchronize-group-flags \""
122 group
123 "\" '")
124 (gnus-pp action)
125 (insert " \""
126 (gnus-method-to-server gnus-command-method)
127 "\"")
128 (insert ")\n")
129 (let ((coding-system-for-write nnheader-file-coding-system))
130 (write-region (point-min) (point-max) (gnus-agent-lib-file "flags")
131 t 'silent)))
132 ;; Also set the marks for the original back end that keeps marks in
133 ;; the local system.
134 (let ((gnus-agent nil))
135 (when (and (memq (car gnus-command-method) '(nntp))
136 (gnus-check-backend-function 'request-set-mark
137 (car gnus-command-method)))
138 (funcall (gnus-get-function gnus-command-method 'request-set-mark)
139 group action server)))
140 nil)
142 (deffoo nnagent-retrieve-headers (articles &optional group server fetch-old)
143 (let ((file (gnus-agent-article-name ".overview" group))
144 arts n first)
145 (save-excursion
146 (gnus-agent-load-alist group)
147 (setq arts (gnus-sorted-difference
148 articles (mapcar 'car gnus-agent-article-alist)))
149 ;; Assume that articles with smaller numbers than the first one
150 ;; Agent knows are gone.
151 (setq first (caar gnus-agent-article-alist))
152 (when first
153 (while (and arts (< (car arts) first))
154 (pop arts)))
155 (set-buffer nntp-server-buffer)
156 (erase-buffer)
157 (let ((file-name-coding-system nnmail-pathname-coding-system))
158 (nnheader-insert-nov-file file (car articles)))
159 (goto-char (point-min))
160 (gnus-parse-without-error
161 (while (and arts (not (eobp)))
162 (setq n (read (current-buffer)))
163 (when (> n (car arts))
164 (beginning-of-line))
165 (while (and arts (> n (car arts)))
166 (insert (format
167 "%d\t[Undownloaded article %d]\tGnus Agent\t\t\t\n"
168 (car arts) (car arts)))
169 (pop arts))
170 (when (and arts (= n (car arts)))
171 (pop arts))
172 (forward-line 1)))
173 (while arts
174 (insert (format
175 "%d\t[Undownloaded article %d]\tGnus Agent\t\t\t\n"
176 (car arts) (car arts)))
177 (pop arts))
178 (if (and fetch-old
179 (not (numberp fetch-old)))
180 t ; Don't remove anything.
181 (nnheader-nov-delete-outside-range
182 (if fetch-old (max 1 (- (car articles) fetch-old))
183 (car articles))
184 (car (last articles)))
186 'nov)))
188 (deffoo nnagent-request-expire-articles (articles group &optional server force)
189 articles)
191 (deffoo nnagent-request-group (group &optional server dont-check info)
192 (nnoo-parent-function 'nnagent 'nnml-request-group
193 (list group (nnagent-server server) dont-check info)))
195 (deffoo nnagent-close-group (group &optional server)
196 (nnoo-parent-function 'nnagent 'nnml-close-group
197 (list group (nnagent-server server))))
199 (deffoo nnagent-request-accept-article (group &optional server last)
200 (nnoo-parent-function 'nnagent 'nnml-request-accept-article
201 (list group (nnagent-server server) last)))
203 (deffoo nnagent-request-article (id &optional group server buffer)
204 (nnoo-parent-function 'nnagent 'nnml-request-article
205 (list id group (nnagent-server server) buffer)))
207 (deffoo nnagent-request-create-group (group &optional server args)
208 (nnoo-parent-function 'nnagent 'nnml-request-create-group
209 (list group (nnagent-server server) args)))
211 (deffoo nnagent-request-delete-group (group &optional force server)
212 (nnoo-parent-function 'nnagent 'nnml-request-delete-group
213 (list group force (nnagent-server server))))
215 (deffoo nnagent-request-list (&optional server)
216 (nnoo-parent-function 'nnagent 'nnml-request-list
217 (list (nnagent-server server))))
219 (deffoo nnagent-request-list-newsgroups (&optional server)
220 (nnoo-parent-function 'nnagent 'nnml-request-list-newsgroups
221 (list (nnagent-server server))))
223 (deffoo nnagent-request-move-article
224 (article group server accept-form &optional last move-is-internal)
225 (nnoo-parent-function 'nnagent 'nnml-request-move-article
226 (list article group (nnagent-server server)
227 accept-form last move-is-internal)))
229 (deffoo nnagent-request-rename-group (group new-name &optional server)
230 (nnoo-parent-function 'nnagent 'nnml-request-rename-group
231 (list group new-name (nnagent-server server))))
233 (deffoo nnagent-request-scan (&optional group server)
234 (nnoo-parent-function 'nnagent 'nnml-request-scan
235 (list group (nnagent-server server))))
237 (deffoo nnagent-set-status (article name value &optional group server)
238 (nnoo-parent-function 'nnagent 'nnml-set-status
239 (list article name value group (nnagent-server server))))
241 (deffoo nnagent-server-opened (&optional server)
242 (nnoo-parent-function 'nnagent 'nnml-server-opened
243 (list (nnagent-server server))))
245 (deffoo nnagent-status-message (&optional server)
246 (nnoo-parent-function 'nnagent 'nnml-status-message
247 (list (nnagent-server server))))
249 (deffoo nnagent-request-regenerate (server)
250 (nnoo-parent-function 'nnagent 'nnml-request-regenerate
251 (list (nnagent-server server))))
253 (deffoo nnagent-retrieve-group-data-early (server infos)
254 nil)
256 ;; Use nnml functions for just about everything.
257 (nnoo-import nnagent
258 (nnml))
261 ;;; Internal functions.
263 (provide 'nnagent)
265 ;;; nnagent.el ends here