comparison lisp/gnus/nnoo.el @ 16:0293115a14e9 r19-15b91

Import from CVS: tag r19-15b91
author cvs
date Mon, 13 Aug 2007 08:49:20 +0200
parents 376386a54a3c
children ec9a17fef872
comparison
equal deleted inserted replaced
15:ad457d5f7d04 16:0293115a14e9
1 ;;; nnoo.el --- OO Gnus Backends 1 ;;; nnoo.el --- OO Gnus Backends
2 ;; Copyright (C) 1996 Free Software Foundation, Inc. 2 ;; Copyright (C) 1996,97 Free Software Foundation, Inc.
3 3
4 ;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no> 4 ;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
5 ;; Keywords: news 5 ;; Keywords: news
6 6
7 ;; This file is part of GNU Emacs. 7 ;; This file is part of GNU Emacs.
23 23
24 ;;; Commentary: 24 ;;; Commentary:
25 25
26 ;;; Code: 26 ;;; Code:
27 27
28 (eval-when-compile (require 'cl)) 28 (require 'nnheader)
29 (require 'cl)
29 30
30 (defvar nnoo-definition-alist nil) 31 (defvar nnoo-definition-alist nil)
31 (defvar nnoo-state-alist nil) 32 (defvar nnoo-state-alist nil)
32 33
33 (defmacro defvoo (var init &optional doc &rest map) 34 (defmacro defvoo (var init &optional doc &rest map)
36 ,(if doc 37 ,(if doc
37 `(defvar ,var ,init ,doc) 38 `(defvar ,var ,init ,doc)
38 `(defvar ,var ,init)) 39 `(defvar ,var ,init))
39 (nnoo-define ',var ',map))) 40 (nnoo-define ',var ',map)))
40 (put 'defvoo 'lisp-indent-function 2) 41 (put 'defvoo 'lisp-indent-function 2)
41 (put 'defvoo 'lisp-indent-hook 2)
42 (put 'defvoo 'edebug-form-spec '(var init &optional doc &rest map)) 42 (put 'defvoo 'edebug-form-spec '(var init &optional doc &rest map))
43 43
44 (defmacro deffoo (func args &rest forms) 44 (defmacro deffoo (func args &rest forms)
45 "The same as `defun', only register FUNC." 45 "The same as `defun', only register FUNC."
46 `(prog1 46 `(prog1
47 (defun ,func ,args ,@forms) 47 (defun ,func ,args ,@forms)
48 (nnoo-register-function ',func))) 48 (nnoo-register-function ',func)))
49 (put 'deffoo 'lisp-indent-function 2) 49 (put 'deffoo 'lisp-indent-function 2)
50 (put 'deffoo 'lisp-indent-hook 2)
51 (put 'deffoo 'edebug-form-spec '(&define name lambda-list def-body)) 50 (put 'deffoo 'edebug-form-spec '(&define name lambda-list def-body))
52 51
53 (defun nnoo-register-function (func) 52 (defun nnoo-register-function (func)
54 (let ((funcs (nthcdr 3 (assoc (nnoo-backend func) 53 (let ((funcs (nthcdr 3 (assoc (nnoo-backend func)
55 nnoo-definition-alist)))) 54 nnoo-definition-alist))))
56 (unless funcs 55 (unless funcs
57 (error "%s belongs to a backend that hasn't been declared" func)) 56 (error "%s belongs to a backend that hasn't been declared" func))
58 (setcar funcs (cons func (car funcs))))) 57 (setcar funcs (cons func (car funcs)))))
59 58
60 (defmacro nnoo-declare (backend &rest parents) 59 (defmacro nnoo-declare (backend &rest parents)
61 `(eval-and-compile 60 `(eval-and-compile
62 (push (list ',backend 61 (push (list ',backend
63 (mapcar (lambda (p) (list p)) ',parents) 62 (mapcar (lambda (p) (list p)) ',parents)
64 nil nil) 63 nil nil)
65 nnoo-definition-alist))) 64 nnoo-definition-alist)
65 (push (list ',backend "*internal-non-initialized-backend*")
66 nnoo-state-alist)))
66 (put 'nnoo-declare 'lisp-indent-function 1) 67 (put 'nnoo-declare 'lisp-indent-function 1)
67 (put 'nnoo-declare 'lisp-indent-hook 1)
68 68
69 (defun nnoo-parents (backend) 69 (defun nnoo-parents (backend)
70 (nth 1 (assoc backend nnoo-definition-alist))) 70 (nth 1 (assoc backend nnoo-definition-alist)))
71 71
72 (defun nnoo-variables (backend) 72 (defun nnoo-variables (backend)
76 (nth 3 (assoc backend nnoo-definition-alist))) 76 (nth 3 (assoc backend nnoo-definition-alist)))
77 77
78 (defmacro nnoo-import (backend &rest imports) 78 (defmacro nnoo-import (backend &rest imports)
79 `(nnoo-import-1 ',backend ',imports)) 79 `(nnoo-import-1 ',backend ',imports))
80 (put 'nnoo-import 'lisp-indent-function 1) 80 (put 'nnoo-import 'lisp-indent-function 1)
81 (put 'nnoo-import 'lisp-indent-hook 1)
82 81
83 (defun nnoo-import-1 (backend imports) 82 (defun nnoo-import-1 (backend imports)
84 (let ((call-function 83 (let ((call-function
85 (if (symbolp (car imports)) (pop imports) 'nnoo-parent-function)) 84 (if (symbolp (car imports)) (pop imports) 'nnoo-parent-function))
86 imp functions function) 85 imp functions function)
89 (or (cdr imp) 88 (or (cdr imp)
90 (nnoo-functions (car imp)))) 89 (nnoo-functions (car imp))))
91 (while functions 90 (while functions
92 (unless (fboundp (setq function 91 (unless (fboundp (setq function
93 (nnoo-symbol backend (nnoo-rest-symbol 92 (nnoo-symbol backend (nnoo-rest-symbol
94 (car functions))))) 93 (car functions)))))
95 (eval `(deffoo ,function (&rest args) 94 (eval `(deffoo ,function (&rest args)
96 (,call-function ',backend ',(car functions) args)))) 95 (,call-function ',backend ',(car functions) args))))
97 (pop functions))))) 96 (pop functions)))))
98 97
99 (defun nnoo-parent-function (backend function args) 98 (defun nnoo-parent-function (backend function args)
110 (apply function args))) 109 (apply function args)))
111 110
112 (defmacro nnoo-map-functions (backend &rest maps) 111 (defmacro nnoo-map-functions (backend &rest maps)
113 `(nnoo-map-functions-1 ',backend ',maps)) 112 `(nnoo-map-functions-1 ',backend ',maps))
114 (put 'nnoo-map-functions 'lisp-indent-function 1) 113 (put 'nnoo-map-functions 'lisp-indent-function 1)
115 (put 'nnoo-map-functions 'lisp-indent-hook 1)
116 114
117 (defun nnoo-map-functions-1 (backend maps) 115 (defun nnoo-map-functions-1 (backend maps)
118 (let (m margs i) 116 (let (m margs i)
119 (while (setq m (pop maps)) 117 (while (setq m (pop maps))
120 (setq i 0 118 (setq i 0
124 (push `(nth ,i args) margs) 122 (push `(nth ,i args) margs)
125 (push (nth i (cdr m)) margs)) 123 (push (nth i (cdr m)) margs))
126 (incf i)) 124 (incf i))
127 (eval `(deffoo ,(nnoo-symbol backend (nnoo-rest-symbol (car m))) 125 (eval `(deffoo ,(nnoo-symbol backend (nnoo-rest-symbol (car m)))
128 (&rest args) 126 (&rest args)
129 (nnoo-parent-function ',backend ',(car m) 127 (nnoo-parent-function ',backend ',(car m)
130 ,(cons 'list (nreverse margs)))))))) 128 ,(cons 'list (nreverse margs))))))))
131 129
132 (defun nnoo-backend (symbol) 130 (defun nnoo-backend (symbol)
133 (string-match "^[^-]+-" (symbol-name symbol)) 131 (string-match "^[^-]+-" (symbol-name symbol))
134 (intern (substring (symbol-name symbol) 0 (1- (match-end 0))))) 132 (intern (substring (symbol-name symbol) 0 (1- (match-end 0)))))
144 (let* ((backend (nnoo-backend var)) 142 (let* ((backend (nnoo-backend var))
145 (def (assq backend nnoo-definition-alist)) 143 (def (assq backend nnoo-definition-alist))
146 (parents (nth 1 def))) 144 (parents (nth 1 def)))
147 (unless def 145 (unless def
148 (error "%s belongs to a backend that hasn't been declared." var)) 146 (error "%s belongs to a backend that hasn't been declared." var))
149 (setcar (nthcdr 2 def) 147 (setcar (nthcdr 2 def)
150 (delq (assq var (nth 2 def)) (nth 2 def))) 148 (delq (assq var (nth 2 def)) (nth 2 def)))
151 (setcar (nthcdr 2 def) 149 (setcar (nthcdr 2 def)
152 (cons (cons var (symbol-value var)) 150 (cons (cons var (symbol-value var))
153 (nth 2 def))) 151 (nth 2 def)))
154 (while map 152 (while map
155 (nconc (assq (nnoo-backend (car map)) parents) 153 (nconc (assq (nnoo-backend (car map)) parents)
156 (list (list (pop map) var)))))) 154 (list (list (pop map) var))))))
157 155
158 (defun nnoo-change-server (backend server defs) 156 (defun nnoo-change-server (backend server defs)
159 (let* ((bstate (cdr (assq backend nnoo-state-alist))) 157 (let* ((bstate (cdr (assq backend nnoo-state-alist)))
160 (sdefs (assq backend nnoo-definition-alist))
161 (current (car bstate)) 158 (current (car bstate))
162 (parents (nnoo-parents backend)) 159 (parents (nnoo-parents backend))
163 state) 160 (bvariables (nnoo-variables backend))
161 state def)
164 (unless bstate 162 (unless bstate
165 (push (setq bstate (list backend nil)) 163 (push (setq bstate (list backend nil))
166 nnoo-state-alist) 164 nnoo-state-alist)
167 (pop bstate)) 165 (pop bstate))
168 (if (equal server current) 166 (if (equal server current)
173 (while state 171 (while state
174 (set (caar state) (cdar state)) 172 (set (caar state) (cdar state))
175 (pop state)) 173 (pop state))
176 (setcar bstate server) 174 (setcar bstate server)
177 (unless (cdr (assoc server (cddr bstate))) 175 (unless (cdr (assoc server (cddr bstate)))
178 (while defs 176 (while (setq def (pop defs))
179 (set (caar defs) (cadar defs)) 177 (unless (assq (car def) bvariables)
180 (pop defs))) 178 (nconc bvariables
179 (list (cons (car def) (and (boundp (car def))
180 (symbol-value (car def)))))))
181 (set (car def) (cadr def))))
181 (while parents 182 (while parents
182 (nnoo-change-server 183 (nnoo-change-server
183 (caar parents) server 184 (caar parents) server
184 (mapcar (lambda (def) (list (car def) (symbol-value (cadr def)))) 185 (mapcar (lambda (def) (list (car def) (symbol-value (cadr def))))
185 (cdar parents))) 186 (cdar parents)))
189 (defun nnoo-push-server (backend current) 190 (defun nnoo-push-server (backend current)
190 (let ((bstate (assq backend nnoo-state-alist)) 191 (let ((bstate (assq backend nnoo-state-alist))
191 (defs (nnoo-variables backend))) 192 (defs (nnoo-variables backend)))
192 ;; Remove the old definition. 193 ;; Remove the old definition.
193 (setcdr (cdr bstate) (delq (assoc current (cddr bstate)) (cddr bstate))) 194 (setcdr (cdr bstate) (delq (assoc current (cddr bstate)) (cddr bstate)))
195 ;; If this is the first time we push the server (i. e., this is
196 ;; the nil server), then we update the default values of
197 ;; all the variables to reflect the current values.
198 (when (equal current "*internal-non-initialized-backend*")
199 (let ((defaults (nnoo-variables backend))
200 def)
201 (while (setq def (pop defaults))
202 (setcdr def (symbol-value (car def))))))
194 (let (state) 203 (let (state)
195 (while defs 204 (while defs
196 (push (cons (caar defs) (symbol-value (caar defs))) 205 (push (cons (caar defs) (symbol-value (caar defs)))
197 state) 206 state)
198 (pop defs)) 207 (pop defs))
231 (and (nnoo-current-server-p backend server) 240 (and (nnoo-current-server-p backend server)
232 nntp-server-buffer 241 nntp-server-buffer
233 (buffer-name nntp-server-buffer))) 242 (buffer-name nntp-server-buffer)))
234 243
235 (defmacro nnoo-define-basics (backend) 244 (defmacro nnoo-define-basics (backend)
245 "Define `close-server', `server-opened' and `status-message'."
236 `(eval-and-compile 246 `(eval-and-compile
237 (nnoo-define-basics-1 ',backend))) 247 (nnoo-define-basics-1 ',backend)))
238 248
239 (defun nnoo-define-basics-1 (backend) 249 (defun nnoo-define-basics-1 (backend)
240 (let ((functions '(close-server server-opened status-message))) 250 (let ((functions '(close-server server-opened status-message)))
241 (while functions 251 (while functions
242 (eval `(deffoo ,(nnoo-symbol backend (car functions)) 252 (eval `(deffoo ,(nnoo-symbol backend (car functions))
243 (&optional server) 253 (&optional server)
244 (,(nnoo-symbol 'nnoo (pop functions)) ',backend server))))) 254 (,(nnoo-symbol 'nnoo (pop functions)) ',backend server)))))
245 (eval `(deffoo ,(nnoo-symbol backend 'open-server) 255 (eval `(deffoo ,(nnoo-symbol backend 'open-server)
246 (server &optional defs) 256 (server &optional defs)
247 (nnoo-change-server ',backend server defs)))) 257 (nnoo-change-server ',backend server defs))))
248 258
259 (defmacro nnoo-define-skeleton (backend)
260 "Define all required backend functions for BACKEND.
261 All functions will return nil and report an error."
262 `(eval-and-compile
263 (nnoo-define-skeleton-1 ',backend)))
264
265 (defun nnoo-define-skeleton-1 (backend)
266 (let ((functions '(retrieve-headers
267 request-close request-article
268 request-group close-group
269 request-list request-post request-list-newsgroups))
270 function fun)
271 (while (setq function (pop functions))
272 (when (not (fboundp (setq fun (nnoo-symbol backend function))))
273 (eval `(deffoo ,fun
274 (&rest args)
275 (nnheader-report ',backend ,(format "%s-%s not implemented"
276 backend function))))))))
249 (provide 'nnoo) 277 (provide 'nnoo)
250 278
251 ;;; nnoo.el ends here. 279 ;;; nnoo.el ends here.