(char-after): Uncomment the byte-optimization; don't use `byte-defop-compiler'.
[elisp/gnus.git-] / lisp / gnus-ofsetup.el
1 ;;; gnus-ofsetup.el --- Setup advisor for Offline reading for Mail/News.
2 ;;;
3 ;;; Copyright (C) 1998 Tatsuya Ichikawa
4 ;;; Author: Tatsuya Ichikawa <t-ichi@po.shiojiri.ne.jp>
5 ;;;      Tsukamoto Tetsuo <czkmt@remus.dti.ne.jp>
6 ;;;
7 ;;; This file is part of Semi-gnus.
8 ;;;
9 ;;; GNU Emacs is free software; you can redistribute it and/or modify
10 ;;; it under the terms of the GNU General Public License as published by
11 ;;; the Free Software Foundation; either version 2, or (at your option)
12 ;;; any later version.
13
14 ;;; GNU Emacs is distributed in the hope that it will be useful,
15 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 ;;; GNU General Public License for more details.
18
19 ;;; You should have received a copy of the GNU General Public License
20 ;;; along with GNU Emacs; see the file COPYING.  If not, write to the
21 ;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22 ;;; Boston, MA 02111-1307, USA.
23 ;;;
24 ;;;; Commentary:
25 ;;; How to use.
26 ;;;
27 ;;;      M-x load[RET]gnus-ofsetup
28 ;;;      M-x gnus-setup-for-offline
29 ;;;
30
31 ;;; Code:
32
33 (eval-when-compile (require 'cl))
34
35 (eval-and-compile
36   (defvar gnus-offline-lang
37     (cond ((and (featurep 'meadow)
38                 (string= current-language-environment "Japanese"))
39            "ja_complete")
40           ((and (boundp 'current-language-environment)
41                 (string= current-language-environment "Japanese"))
42            "ja")
43           (t
44            "en"))
45     "This variable decides which language will be used for display."))
46
47 (eval-when-compile
48   (require 'gnus-offline))
49
50 (defvar gnus-offline-setting-file
51   (let ((user (user-login-name))
52         (real-user (user-real-login-name)))
53     (if (string= user real-user)
54         "~/.gnus-offline.el"
55       ;; Seems it is after "su".
56       (let ((file (concat "~" user "/.gnus-offline.el"))
57             (real-file (concat "~" real-user "/.gnus-offline.el")))
58         (cond ((file-exists-p real-file)
59                real-file)
60               ((file-exists-p file)
61                file)
62               (t
63                real-file))))))
64
65 (eval-when-compile
66   (defvar gnus-ofsetup-prepare-for-miee
67     '(;; Spool directory setting - MIEE.
68       (setq mail-spool (or mail-spool "/usr/spool/mail.out"))
69       (setq news-spool (or news-spool "/usr/spool/news.out"))
70       (condition-case nil
71           (progn
72             (if (not (file-exists-p mail-spool))
73                 (make-directory mail-spool t))
74             (if (not (file-exists-p news-spool))
75                 (make-directory news-spool t)))
76         (error
77          (error (gnus-ofsetup-get-message 'prepare-miee-1))))))
78
79   (defvar gnus-ofsetup-update-setting-file
80     '((save-excursion
81         (set-buffer (get-buffer-create "* Setting"))
82         (erase-buffer)
83         (insert ";;\n")
84         (insert ";; This file is created by gnus-ofsetup.el\n")
85         (insert ";; Creation date : " (current-time-string) "\n")
86         (insert ";;\n")
87
88         ;; write Basic setting
89         (insert "(setq gnus-offline-news-fetch-method '"
90                 (prin1-to-string news-method) ")\n")
91         (insert "(setq gnus-offline-mail-fetch-method '"
92                 (prin1-to-string mail-method) ")\n")
93
94         ;; write dialup/hangup program and options.
95         (insert "(setq gnus-offline-dialup-program "
96                 (prin1-to-string dialup-program) ")\n")
97         (if (stringp dialup-program)
98             (insert "(setq gnus-offline-dialup-program-arguments '"
99                     (prin1-to-string dialup-program-arguments) ")\n"))
100         (insert "(setq gnus-offline-hangup-program "
101                 (prin1-to-string hangup-program) ")\n")
102         (if (stringp hangup-program)
103             (insert "(setq gnus-offline-hangup-program-arguments '"
104                     (prin1-to-string hangup-program-arguments) ")\n"))
105
106         (if (integerp interval)
107             (insert "(setq gnus-offline-interval-time "
108                     (prin1-to-string interval) ")\n"))
109
110         ;; write setting about MIEE.
111         (when use-miee
112           (insert "(setq sendmail-to-spool-directory "
113                   (prin1-to-string mail-spool) ")\n")
114           (insert "(setq news-spool-request-post-directory "
115                   (prin1-to-string news-spool) ")\n")
116           (insert "(if (not (boundp 'miee-version))
117     (load \"miee\"))\n")
118           (insert "(setq message-send-news-function 'gnspool-request-post)\n"))
119
120         ;; write setting about nnspool and gnus-agent.
121         (if (eq news-method 'nnspool)
122             (insert "(message-offline-state)\n")
123           (insert "(setq gnus-agent-directory "
124                   (prin1-to-string agent-directory) ")\n"))
125
126         ;; write setting about queue type -- MIEE or nnagent.
127         (insert "(setq gnus-offline-drafts-queue-type '"
128                 (prin1-to-string drafts-queue-type) ")\n")
129         (insert "(setq gnus-offline-MTA-type '"
130                 (prin1-to-string MTA-type) ")\n")
131
132         ;; Offline setting for gnus-nntp-*
133         (insert "(setq gnus-nntp-service nil)\n")
134         (insert "(setq gnus-nntp-server nil)\n")
135
136         ;; Write setting about hooks.
137         (insert (format "%s %s %s\n"
138                         "(add-hook"
139                         "'gnus-group-mode-hook"
140                         "'gnus-offline-processed-by-timer t)"))
141         (insert (format "%s %s %s\n"
142                         "(add-hook"
143                         "'gnus-group-mode-hook"
144                         "'gnus-offline-error-check t)"))
145         (insert (format "%s %s %s\n"
146                         "(add-hook"
147                         "'gnus-after-getting-new-news-hook"
148                         "'gnus-offline-after-get-new-news)"))
149         (when (eq news-method 'nnspool)
150           (insert (format "%s %s %s\n"
151                           "(add-hook"
152                           "'after-getting-news-hook"
153                           "'gnus-offline-nnspool-hangup-line)"))
154           (insert (format "%s %s %s\n"
155                           "(add-hook"
156                           "'gnus-before-startup-hook"
157                           "(lambda () (setq nnmail-spool-file nil)
158            (setq mail-sources nil)))")))
159         (insert (format "%s %s %s\n"
160                         "(add-hook"
161                         "'message-send-hook"
162                         "'gnus-offline-message-add-header)"))
163         (insert "(autoload 'gnus-offline-setup \"gnus-offline\")\n")
164         (insert "(add-hook 'gnus-load-hook 'gnus-offline-setup)\n")
165
166         ;; Write stting about mail-source.el
167         (insert "(setq gnus-offline-mail-source '"
168                 (prin1-to-string mail-source) ")\n")
169         (insert "(setq mail-sources gnus-offline-mail-source)\n")
170         (insert "(require 'read-passwd)\n")
171         (insert "(setq mail-source-read-passwd 'read-pw-read-passwd)\n")
172         (insert (format "%s %s %s\n"
173                         "(add-hook"
174                         "'gnus-setup-news-hook"
175                         "'read-pw-set-mail-source-passwd-cache)"))
176         (if save-passwd
177             (insert "(add-hook 'gnus-setup-news-hook
178           (lambda ()
179             (add-to-list 'gnus-variable-list 'mail-source-password-cache)))\n"))
180
181         ;;
182         (write-region (point-min) (point-max) gnus-offline-setting-file))
183       (kill-buffer "* Setting")))
184
185   (defmacro gnus-ofsetup-prepare (list)
186     (let ((forms (symbol-value list)))
187       `(progn ,@forms))))
188
189 (defvar gnus-ofsetup-resource-en
190   '((prepare-miee-1
191      . "Making directories failed. Set mail/news spool directories properly.")
192     (completing-read-symbol-1 . " (TAB to completion): ")
193     (setup-1 . "Method for offline News reading")
194     (setup-2 . "Agent directory: ")
195     (setup-3 . "Dialup program (give a null string if you do not use): ")
196     (setup-4 . "Dialup program options: ")
197     (setup-5 . "Hangup program (give a null string if you do not use): ")
198     (setup-6 . "Hangup program options: ")
199     (setup-7 . "Select MTA type for sending mail")
200     (setup-8 . "Use MIEE post/send message ")
201     (setup-9 . "News spool directory for sending: ")
202     (setup-10 . "Mail spool directory for sending: ")
203     (setup-11 . "How many e-mail address do you have: ")
204     (setup-12 . "Mail Account name : ")
205     (setup-13 . "Mail server : ")
206     (setup-14 . "Authentification Method (TAB to completion): ")
207     (setup-15 . "Do you use pop3.el to fetch mail? ")
208     (setup-16 . "movemail program name: ")
209     (setup-17 . "movemail options: ")
210     (setup-18 . "Do you save password information to newsrc file? ")
211     (param-news-method-1 . "News Method")
212     (param-news-method-2 . "Gnus Agent")
213     (param-news-method-3 . "nnspool")
214     (param-news-method-4 . "\
215 Method to fetch news articles.")
216     (param-dialup-program-1 . "Dialup Program")
217     (param-dialup-program-2 . "Use program..")
218     (param-dialup-program-3 . "Don't use a program.")
219     (param-dialup-program-4 . "\
220 Program which does dial.")
221     (param-dialup-program-arg-1 . "Dialup Program Arguments")
222     (param-dialup-program-arg-2 . "Argument")
223     (param-dialup-program-arg-3 . "\
224 Program arguments of gnus-offline-dialup-program.")
225     (param-hangup-program-1 . "Hangup Program")
226     (param-hangup-program-2 . "Use program..")
227     (param-hangup-program-3 . "Don't use a program.")
228     (param-hangup-program-4 . "\
229 Program which does hangup.")
230     (param-hangup-program-arg-1 . "Hangup Program Arguments")
231     (param-hangup-program-arg-2 . "Argument")
232     (param-hangup-program-arg-3 . "\
233 Program arguments of gnus-offline-hangup-program.")
234     (param-interval-1 . "Interval between Jobs")
235     (param-interval-2 . "\
236 Interval time(minutes) to do online jobs.
237 If set to 0 , timer call is disabled.")
238     (param-drafts-queue-type-1 . "Drafts Queue Type")
239     (param-drafts-queue-type-2 . "Gnus Draft for queuing.")
240     (param-drafts-queue-type-3 . "I prefer MIEE for queuing.")
241     (param-drafts-queue-type-4 . "\
242 Type of queue used for draft messages.
243
244 If the select method for news is nnspool, you must choose MIEE.
245 MIEE is another library for offline messaging. It isn't part of
246 Semi-gnus. If you want to know about MIEE, see README-offline.{en,ja}.")
247     (param-mail-spool-1 . "Mail Spool Directory for MIEE")
248     (param-news-spool-1 . "News Spool Directory for MIEE")
249     (param-MTA-type-1 . "MTA Type")
250     (param-MTA-type-2 . "Use smtp.el")
251     (param-MTA-type-3 . "Use sendmail")
252     (param-MTA-type-4 . "\
253 Type of MTA used for sending mail.")
254     (param-save-passwd-1 . "Save Password in Startup File")
255     (param-save-passwd-2 . "OK, I'm sure it's safe.")
256     (param-save-passwd-3 . "No way, it's too dangerous!")
257     (param-save-passwd-4 . "\
258 Whether you want your POP passwords written in .newsrc.eld or not.")
259     (param-mail-source-1 . "Mail Sources")
260     (param-mail-source-2 . "\
261 Information of mail sources. Actually, a list of `Mail Source Specifiers'.
262
263 The format of this variable is just the same as `mail-sources' (or
264 `nnmail-spool-file' which seems obsolete).
265
266 `Mail Source Specifiers' can take a lot of keywords. For example,
267 if you want to use movemail instead of pop3.el which comes with
268 Gnus, you can set a specifier using the kerword :program as shown
269 below:
270
271           (pop :program \"movemail -pf po:%u %t %p\")
272
273 If you want to know more about mail source specifiers and keywords,
274 click the button below.")
275     (customize-1 . "Customize the Gnus Offline Parameters, and press ")
276     (customize-2 . "done")
277     (customize-3 . "Push me when done customizing.")
278     (customize-4 . "Parameters")
279     (customize-5 . "\
280 These parameters will be saved in ~/.gnus-offline.el.
281
282 Note: Touching these parameters may require Gnus or even Emacs to be
283 restarted.")
284     (customize-6 . "Push me to learn more.")
285     (customize-done-1 . "(No changes need to be saved)")
286     (customize-done-2
287      . "Invalid parameters. Check the news method and drafts queue type.")))
288
289 (defvar gnus-ofsetup-resource-ja
290   '((prepare-miee-1
291      . "\e$B%G%#%l%/%H%j$,:n$l$^$;$s!#%9%W!<%k$N@_Dj$r@5$7$/$7$F$/$@$5$$!#\e(B")
292     (completing-read-symbol-1 . "(TAB \e$B$GJd40$7$^$9\e(B): ")
293     (setup-1 . "\e$B%*%U%i%$%s$G%K%e!<%9$rFI$`J}K!$rA*$s$G$/$@$5$$\e(B ")
294     (setup-2 . "Gnus Agent \e$B$N%G%#%l%/%H%j\e(B: ")
295     (setup-3
296      . "\e$B%@%$%d%k@\B3%W%m%0%i%`L>\e(B (\e$B;H$o$J$$>l9g$O6uJ8;zNs$rJV$7$F2<$5$$\e(B): ")
297     (setup-4 . "\e$B%@%$%d%k@\B3%W%m%0%i%`$N0z?t\e(B: ")
298     (setup-5
299      . "\e$B%@%$%d%k@ZCG%W%m%0%i%`L>\e(B (\e$B;H$o$J$$>l9g$O6uJ8;zNs$rJV$7$F2<$5$$\e(B): ")
300     (setup-6 . "\e$B%@%$%d%k@ZCG%W%m%0%i%`$N0z?t\e(B: ")
301     (setup-7 . "\e$B%a!<%kAw?.$K;H$&\e(B MTA \e$B$rA*$s$G2<$5$$\e(B ")
302     (setup-8 . "\e$B%a%C%;!<%8$NAw?.$K\e(B MIEE \e$B$r;H$$$^$9$+\e(B? ")
303     (setup-9 . "\e$B%K%e!<%9$N%9%W!<%k%G%#%l%/%H%j\e(B: ")
304     (setup-10 . "\e$B%a!<%k$N%9%W!<%k%G%#%l%/%H%j\e(B: ")
305     (setup-11 . "\e$B%a!<%k%"%+%&%s%H$N?t$rEz$($F$/$@$5$$\e(B: ")
306     (setup-12 . "\e$B%a!<%k$N%"%+%&%s%HL>\e(B: ")
307     (setup-13 . "\e$B$=$N%"%+%&%s%H$N$"$k%a!<%k%5!<%PL>\e(B: ")
308     (setup-14 . "\e$B$=$N%5!<%P$G$NG'>ZJ}<0$O\e(B? (TAB \e$B$GJd40$7$^$9\e(B): ")
309     (setup-15 . "\e$B%a!<%k$N<u?.$K$O\e(B pop3.el \e$B$r;H$$$^$9$+\e(B? ")
310     (setup-16 . "movemail \e$B%W%m%0%i%`$NL>A0\e(B: ")
311     (setup-17 . "movemail \e$B%W%m%0%i%`$KEO$90z?t\e(B: ")
312     (setup-18 . "newsrc \e$B%U%!%$%k$K\e(B POP \e$B%Q%9%o!<%I$rJ]B8$7$^$9$+\e(B? ")
313
314     (param-news-method-4 . "\
315 \e$B%K%e!<%95-;v$r<hF@$9$kJ}K!$G$9!#\e(B")
316     (param-dialup-program-4 . "\
317 \e$B<+F0%@%$%d%k@\B3$K;H$&%W%m%0%i%`!#\e(B")
318     (param-dialup-program-arg-3 . "\
319 \e$B%@%$%d%k@\B3%W%m%0%i%`$KEO$90z?t!#\e(B")
320     (param-hangup-program-4 . "\
321 \e$B<+F0%@%$%d%k@ZCG$K;H$&%W%m%0%i%`!#\e(B")
322     (param-hangup-program-arg-3 . "\
323 \e$B%@%$%d%k@ZCG%W%m%0%i%`$KEO$90z?t!#\e(B")
324     (param-interval-2 . "\
325 \e$BAw<u?.%8%g%V$r9T$&4V3V!#J,C10L$G;XDj$7$^$9!#\e(B
326
327 \e$B$3$l$r\e(B 0 \e$B$K@_Dj$9$k$H<+F0Aw<u?.5!G=$O%*%U$K$J$j$^$9!#\e(B")
328     (param-drafts-queue-type-4 . "\
329 \e$B%I%i%U%H5-;v$rJ]B8$9$k%-%e!<$N<oN`$r;XDj$7$^$9!#\e(B
330
331 \e$B%K%e!<%9$N9VFI<jCJ$,\e(B nnspool \e$B$N>l9g!"\e(BMIEE \e$B$r;XDj$9$kI,MW$,$"$j$^$9!#\e(B
332 MIEE \e$B$O%*%U%i%$%s$G$N%a!<%k\e(B/\e$B%K%e!<%9Aw?.5!G=$rDs6!$9$k%i%$%V%i%j$G$9$,!"\e(B
333 Semi-gnus \e$B$K$OIUB0$7$F$$$^$;$s!#\e(BMIEE \e$B$K$D$$$FCN$j$?$$>l9g$O\e(B
334 README-offline.{en,ja} \e$B$r;2>H$7$F$/$@$5$$!#\e(B")
335     (param-MTA-type-4 . "\
336 MTA \e$B$O%a!<%k$NAw?.$r<u$1;}$D%W%m%0%i%`$G$9!#$=$N<oN`$r;XDj$7$^$9!#\e(B")
337     (param-save-passwd-4 . "\
338 POP \e$B%Q%9%o!<%I$r\e(B .newsrc.eld \e$B$KJ]B8$9$k$+H]$+$r;XDj$7$^$9!#\e(B")
339     (param-mail-source-2 . "\
340 \e$B%a!<%k<hF@@h$d<hF@J}K!$r;XDj$7$^$9!#\e(B
341
342 \e$B$3$N%*%W%7%g%s$N=q<0$O\e(B `mail-sources' \e$B$H$$$&JQ?t$HF1$8$G$"$j!"\e(B
343 `mail source specifier' \e$B$H8F$P$l$k$b$N$N%j%9%H$H$7$F5-=R$7$^$9!#\e(B
344
345 \e$B3F!9$N\e(B `mail source specifier' \e$B$K$O?'!9$J%-!<%o!<%I$r;XDj$9$k$3$H$,\e(B
346 \e$B$G$-$^$9!#Nc$($P%a!<%k$N<hF@$K$O\e(B pop3.el \e$B$NBe$o$j$K30It%W%m%0%i%`\e(B
347 (movemail \e$B$J$I\e(B) \e$B$r;H$$$?$$!"$H$$$&>l9g$K$O!"\e(B:program \e$B$r$$$&%-!<%o!<\e(B
348 \e$B%I$r;XDj$7$F0J2<$NMM$K5-=R$7$^$9!#\e(B
349
350         (pop :program \"movemail -pf po:%u %t %p\")
351
352 mail source specifier \e$B$H$+>e5-$N$h$&$J%-!<%o!<%I$K$D$$$F$b$C$H$h$/\e(B
353 \e$BCN$j$?$$>l9g$O!"0J2<$N%\%?%s$r%/%j%C%/$7$F$/$@$5$$!#\e(B(Info \e$B$N3:Ev2U=j\e(B
354 \e$B$X$N%j%s%/$K$J$C$F$$$^$9!#\e(B)" )
355
356      (customize-1
357       . "Gnus Offline \e$B$N%Q%i%a!<%?!#=*$o$C$?$i1&$N%\%?%s$r2!$7$F$/$@$5$$!#\e(B")
358      (customize-2 . "done")
359      (customize-3 . "\e$B@_Dj$7=*$o$C$?$i%\%/$r2!$7$F$M!#\e(B")
360      (customize-4 . "\e$B%Q%i%a!<%?\e(B")
361      (customize-5 . "\
362 \e$B$3$l$i$N%Q%i%a!<%?$O\e(B ~/.gnus-offline.el \e$B$KJ]B8$5$l$^$9!#\e(B
363
364 \e$BCm0U\e(B: \e$B$3$l$i$N%Q%i%a!<%?$NJQ99$O>l9g$K$h$C$F$O\e(B Gnus (\e$B$5$i$K>l9g$K\e(B
365 \e$B$h$C$F$O\e(B Emacs) \e$B$N:F5/F0$rI,MW$H$9$k$3$H$,$"$j$^$9!#\e(B")
366      (customize-6 . "\e$B$b$C$HCN$j$?$$>l9g$O%\%/$r2!$7$F$M!#\e(B")
367      (customize-done-1 . "(\e$BJ]B8$9$Y$-JQ99$O$"$j$^$;$s\e(B)")
368      (customize-done-2
369       . "\e$B%K%e!<%99VFI<jCJ$H%I%i%U%H5-;v<h$j07$$<jCJ$N@_Dj$r8+D>$7$F$/$@$5$$!#\e(B")
370   ))
371
372 (defvar gnus-ofsetup-resource-ja_complete
373   (append
374    gnus-ofsetup-resource-ja
375    '((param-news-method-1 . "\e$B%K%e!<%99VFIJ}K!\e(B")
376      (param-news-method-2 . "Gnus Agent")
377      (param-news-method-3 . "nnspool")
378      (param-dialup-program-1 . "\e$B%@%$%d%k@\B3%W%m%0%i%`\e(B")
379      (param-dialup-program-2 . "\e$B%W%m%0%i%`$r;H$&\e(B..")
380      (param-dialup-program-3 . "\e$B%W%m%0%i%`$O;XDj$7$J$$\e(B")
381      (param-dialup-program-arg-1 . "\e$B%@%$%d%k@\B3%W%m%0%i%`$N0z?t\e(B")
382      (param-dialup-program-arg-2 . "\e$B0z?t\e(B")
383      (param-hangup-program-1 . "\e$B%@%$%d%k@ZCG%W%m%0%i%`\e(B")
384      (param-hangup-program-2 . "\e$B%W%m%0%i%`$r;H$&\e(B..")
385      (param-hangup-program-3 . "\e$B%W%m%0%i%`$O;XDj$7$J$$\e(B")
386      (param-hangup-program-arg-1 . "\e$B%@%$%d%k@ZCG%W%m%0%i%`$N0z?t\e(B")
387      (param-hangup-program-arg-2 . "\e$B0z?t\e(B")
388      (param-interval-1 . "\e$B<+F0Aw<u?.%8%g%V$N4V3V\e(B")
389      (param-drafts-queue-type-1 . "\e$B%I%i%U%H5-;v$rJ]B8$9$k%-%e!<$N<oN`\e(B")
390      (param-drafts-queue-type-2 . "Gnus Draft \e$B$N5!G=$rMxMQ$9$k\e(B")
391      (param-drafts-queue-type-3 . "MIEE \e$B$N5!G=$rMxMQ$9$k\e(B")
392      (param-mail-spool-1 . "MIEE \e$B$,;H$&%a!<%k$N%9%W!<%k%G%#%l%/%H%j\e(B")
393      (param-news-spool-1 . "MIEE \e$B$,;H$&%K%e!<%9$N%9%W!<%k%G%#%l%/%H%j\e(B")
394      (param-MTA-type-1 . "MTA \e$B$N<oN`\e(B")
395      (param-MTA-type-2 . "smtp.el \e$B$r;H$&\e(B")
396      (param-MTA-type-3 . "sendmail \e$B$r;H$&\e(B")
397      (param-save-passwd-1
398       . "\e$B%U%!%$%k$K\e(B POP \e$B%Q%9%o!<%I$rJ]B8$9$k\e(B")
399      (param-save-passwd-2 . "\e$B0BA4$J$N$GJ]B8$9$k\e(B")
400      (param-save-passwd-3 . "\e$B4m81$@$+$i$d$a$H$/\e(B")
401      (param-mail-source-1 . "\e$B%a!<%k<hF@@h$N>pJs\e(B"))))
402
403 (defun gnus-ofsetup-get-message (symbol &optional lang)
404   (setq lang (or lang gnus-offline-lang))
405   (or
406    (cdr (assq symbol (symbol-value
407                       (intern (format "gnus-ofsetup-resource-%s" lang)))))
408    (cdr (assq symbol gnus-ofsetup-resource-en))))
409
410 (defun gnus-ofsetup-completing-read-symbol (msg &rest syms)
411   (intern
412    (completing-read (concat
413                      msg
414                      (gnus-ofsetup-get-message 'completing-read-symbol-1))
415                     (mapcar
416                      (lambda (sym)
417                        (list (symbol-name sym)))
418                      syms)
419                     nil t nil)))
420
421 (defun gnus-setup-for-offline ()
422   "*Set up Gnus for offline environment."
423   (interactive)
424   (unless (file-exists-p gnus-offline-setting-file)
425     (let (news-method
426           mail-method agent-directory drafts-queue-type news-spool mail-spool
427           use-miee MTA-type dialup-program dialup-program-arguments
428           hangup-program hangup-program-arguments interval
429           num-of-address i mail-source save-passwd)
430       (setq news-method
431             (gnus-ofsetup-completing-read-symbol
432              (gnus-ofsetup-get-message 'setup-1)
433              'nnagent 'nnspool))
434       ;; Setting for gnus-agent.
435       (if (eq news-method 'nnagent)
436           (setq agent-directory
437                 (read-from-minibuffer
438                  (gnus-ofsetup-get-message 'setup-2) "~/News/agent")))
439       (setq mail-method 'nnmail)
440       (setq dialup-program
441             (read-file-name
442              (gnus-ofsetup-get-message 'setup-3)
443              nil nil t))
444       (if (string-match "^[ \t]*$" dialup-program)
445           (setq dialup-program nil)
446         (setq dialup-program-arguments
447               (delete "" (split-string
448                           (read-from-minibuffer
449                            (gnus-ofsetup-get-message 'setup-4))
450                           "[\t ]+"))))
451       (setq hangup-program
452             (read-file-name
453              (gnus-ofsetup-get-message 'setup-5)
454              nil nil t))
455       (if (string-match "^[ \t]*$" hangup-program)
456           (setq hangup-program nil)
457         (setq hangup-program-arguments
458               (delete "" (split-string
459                           (read-from-minibuffer
460                            (gnus-ofsetup-get-message 'setup-6))
461                           "[\t ]+"))))
462       (setq MTA-type (gnus-ofsetup-completing-read-symbol
463                       (gnus-ofsetup-get-message 'setup-7)
464                       'smtp 'sendmail))
465       (if (eq news-method 'nnspool)
466           (setq use-miee t)
467         (setq use-miee (y-or-n-p (gnus-ofsetup-get-message 'setup-8))))
468       (if use-miee
469           (progn
470             ;; Setting for MIEE.
471             (setq news-spool
472                   (read-from-minibuffer
473                    (gnus-ofsetup-get-message 'setup-9)
474                    "/usr/spool/news.out"))
475             (setq mail-spool
476                   (read-from-minibuffer
477                    (gnus-ofsetup-get-message 'setup-10)
478                    "/usr/spool/mail.out"))
479             (setq drafts-queue-type 'miee)
480             (gnus-ofsetup-prepare gnus-ofsetup-prepare-for-miee))
481         ;; Set drafts type gnus-agent.
482         (setq drafts-queue-type 'agent))
483       ;; Set E-Mail Address and pop3 movemail type.
484       (setq num-of-address
485             (read-from-minibuffer (gnus-ofsetup-get-message 'setup-11)))
486       (setq i (string-to-int num-of-address))
487       (while (> i 0)
488         (let ((user (read-from-minibuffer (gnus-ofsetup-get-message 'setup-12)))
489               (server (read-from-minibuffer
490                        (gnus-ofsetup-get-message 'setup-13)))
491               (auth (completing-read
492                      (gnus-ofsetup-get-message 'setup-14)
493                      '(("password") ("apop")) nil t nil))
494               (islisp (y-or-n-p (gnus-ofsetup-get-message 'setup-15)))
495               source)
496           (if (not islisp)
497               (let ((prog (read-file-name (gnus-ofsetup-get-message 'setup-16)
498                                           exec-directory "movemail"))
499                     (args (read-from-minibuffer
500                            (gnus-ofsetup-get-message 'setup-17)
501                            "-pf")))
502                 (setq source `(pop
503                                :user ,user
504                                :server ,server
505                                :program ,(format "%s %s %s %s %s"
506                                                  prog
507                                                  args
508                                                  "po:%u"
509                                                  "%t"
510                                                  "%p"))))
511             (setq source `(pop
512                            :user ,user
513                            :server ,server)))
514           (setq mail-source
515                 (nconc mail-source
516                        (list
517                         (if (string-equal "apop" auth)
518                             (nconc source '(:authentication apop))
519                           source)))))
520         (setq i (1- i)))
521       (setq save-passwd
522             (y-or-n-p (gnus-ofsetup-get-message 'setup-18)))
523       ;;
524       (gnus-ofsetup-prepare gnus-ofsetup-update-setting-file)))
525   (load gnus-offline-setting-file))
526
527 ;; Suppport for customizing gnus-ofsetup parameters.
528
529 (defvar sendmail-to-spool-directory)
530 (defvar news-spool-request-post-directory)
531
532 (defun gnus-ofsetup-find-parameters ()
533   "Return the each current value of gnus-offline parameters."
534   `((news-method
535      (choice :tag ,(gnus-ofsetup-get-message 'param-news-method-1)
536              :value ,gnus-offline-news-fetch-method
537              (const :tag ,(gnus-ofsetup-get-message 'param-news-method-2)
538                     nnagent)
539              (const :tag ,(gnus-ofsetup-get-message 'param-news-method-3)
540                     nnspool))
541      ,(gnus-ofsetup-get-message 'param-news-method-4))
542
543     (dialup-program
544      (choice :tag ,(gnus-ofsetup-get-message 'param-dialup-program-1)
545              :value ,gnus-offline-dialup-program
546              (string :tag ,(gnus-ofsetup-get-message 'param-dialup-program-2))
547              (const :tag ,(gnus-ofsetup-get-message
548                            'param-dialup-program-3) nil))
549      ,(gnus-ofsetup-get-message 'param-dialup-program-4))
550
551     (dialup-program-arguments
552      (repeat :tag ,(gnus-ofsetup-get-message 'param-dialup-program-arg-1)
553              :value ,gnus-offline-dialup-program-arguments
554              (string :tag ,(gnus-ofsetup-get-message
555                             'param-dialup-program-arg-2)))
556      ,(gnus-ofsetup-get-message 'param-dialup-program-arg-3))
557
558     (hangup-program
559      (choice :tag ,(gnus-ofsetup-get-message 'param-hangup-program-1)
560              :value ,gnus-offline-hangup-program
561              (string :tag ,(gnus-ofsetup-get-message 'param-hangup-program-2))
562              (const :tag ,(gnus-ofsetup-get-message 'param-hangup-program-3)
563                     nil))
564      ,(gnus-ofsetup-get-message 'param-hangup-program-4))
565
566     (hangup-program-arguments
567      (repeat :tag ,(gnus-ofsetup-get-message 'param-hangup-program-arg-1)
568              :value ,gnus-offline-hangup-program-arguments
569              (string :tag ,(gnus-ofsetup-get-message
570                             'param-hangup-program-arg-2)))
571      ,(gnus-ofsetup-get-message 'param-hangup-program-arg-3))
572
573     (interval
574      (integer :tag ,(gnus-ofsetup-get-message 'param-interval-1)
575               :value ,gnus-offline-interval-time)
576      ,(gnus-ofsetup-get-message 'param-interval-2))
577
578     (drafts-queue-type
579      (choice :tag ,(gnus-ofsetup-get-message 'param-drafts-queue-type-1)
580              :value ,gnus-offline-drafts-queue-type
581              (const :tag ,(gnus-ofsetup-get-message 'param-drafts-queue-type-2)
582                     agent)
583              (const :tag ,(gnus-ofsetup-get-message 'param-drafts-queue-type-3)
584                     miee))
585      ,(gnus-ofsetup-get-message 'param-drafts-queue-type-4))
586
587     (mail-spool
588      (directory :tag ,(gnus-ofsetup-get-message 'param-mail-spool-1)
589                 :value ,(cond ((and (boundp 'sendmail-to-spool-directory)
590                                     sendmail-to-spool-directory)
591                                sendmail-to-spool-directory)
592                               (t
593                                "/usr/spool/mail.out"))))
594
595     (news-spool
596      (directory :tag ,(gnus-ofsetup-get-message 'param-news-spool-1)
597                 :value ,(cond ((and (boundp 'news-spool-request-post-directory)
598                                     news-spool-request-post-directory)
599                                news-spool-request-post-directory)
600                               (t
601                                "/usr/spool/news.out"))))
602
603     (MTA-type
604      (choice :tag ,(gnus-ofsetup-get-message 'param-MTA-type-1)
605              :value ,gnus-offline-MTA-type
606              (const :tag ,(gnus-ofsetup-get-message 'param-MTA-type-2) smtp)
607              (const :tag ,(gnus-ofsetup-get-message 'param-MTA-type-3)
608                     sendmail))
609      ,(gnus-ofsetup-get-message 'param-MTA-type-4))
610
611     (save-passwd
612      (choice :tag ,(gnus-ofsetup-get-message 'param-save-passwd-1)
613              :value ,(if (memq 'mail-source-password-cache gnus-variable-list)
614                          t
615                          nil)
616              (const :tag ,(gnus-ofsetup-get-message 'param-save-passwd-2) t)
617              (const :tag ,(gnus-ofsetup-get-message 'param-save-passwd-3) nil))
618      ,(gnus-ofsetup-get-message 'param-save-passwd-4))
619
620     (mail-source
621      (sexp :tag ,(gnus-ofsetup-get-message 'param-mail-source-1)
622            :value ,gnus-offline-mail-source)
623      ,(gnus-ofsetup-get-message 'param-mail-source-2))))
624
625 (defvar gnus-ofsetup-params)
626
627 (defun gnus-ofsetup-customize ()
628   "Edit the gnus-offline parameters."
629   (interactive)
630   (let* ((params (gnus-ofsetup-find-parameters))
631          (types (mapcar (lambda (entry)
632                          `(cons :format "%v%h\n"
633                                 :doc ,(nth 2 entry)
634                                 (const :format "" ,(nth 0 entry))
635                                 ,(nth 1 entry)))
636                         params)))
637   (kill-buffer (gnus-get-buffer-create "*Gnus Offline Customize*"))
638   (switch-to-buffer (gnus-get-buffer-create "*Gnus Offline Customize*"))
639   (gnus-custom-mode)
640   (widget-insert (gnus-ofsetup-get-message 'customize-1))
641   (widget-create 'push-button
642                    :tag (gnus-ofsetup-get-message 'customize-2)
643                    :help-echo (gnus-ofsetup-get-message 'customize-3)
644                    :action 'gnus-ofsetup-customize-done)
645   (widget-insert "\n\n")
646   (make-local-variable 'gnus-ofsetup-params)
647   (setq gnus-ofsetup-params
648         (widget-create 'group
649                        `(set :inline t
650                              :greedy t
651                              :tag ,(gnus-ofsetup-get-message 'customize-4)
652                              :format "%t:\n%h%v"
653                              :doc ,(gnus-ofsetup-get-message 'customize-5)
654                              ,@types)))
655
656   (widget-create 'info-link
657                  :help-echo (gnus-ofsetup-get-message 'customize-6)
658                  :tag "<Info> mail sources"
659                  (if (string-match "^ja" gnus-offline-lang)
660                      "(gnus-ja)Mail Sources"
661                    "(gnus)Mail Sources"))
662
663   (use-local-map widget-keymap)
664   (local-set-key "q" 'bury-buffer)
665   (widget-setup)
666   (goto-char (point-min))))
667
668 (defun gnus-ofsetup-customize-done (&rest ignore)
669   "Apply changes and bury the buffer."
670   (interactive)
671   (let ((params (widget-value gnus-ofsetup-params))
672         (news-method gnus-offline-news-fetch-method)
673         (mail-method gnus-offline-mail-fetch-method)
674         (agent-directory gnus-agent-directory)
675         (dialup-program gnus-offline-dialup-program)
676         (dialup-program-arguments gnus-offline-dialup-program-arguments)
677         (hangup-program gnus-offline-hangup-program)
678         (hangup-program-arguments gnus-offline-hangup-program-arguments)
679         (drafts-queue-type gnus-offline-drafts-queue-type)
680         (interval gnus-offline-interval-time)
681         (use-miee (and (boundp 'miee-version)
682                        (or (eq gnus-offline-news-fetch-method 'nnspool)
683                            (eq gnus-offline-drafts-queue-type 'miee))))
684         (mail-spool (or (and (boundp 'sendmail-to-spool-directory)
685                              sendmail-to-spool-directory)
686                         "/usr/spool/mail.out"))
687         (news-spool (or (and (boundp 'news-spool-request-post-directory)
688                              news-spool-request-post-directory)
689                         "/usr/spool/news.out"))
690         (MTA-type gnus-offline-MTA-type)
691         (mail-source gnus-offline-mail-source)
692         (save-passwd (and (memq 'mail-source-password-cache gnus-variable-list)
693                           t)))
694     (if (null params)
695         (gnus-message 4 (gnus-ofsetup-get-message 'customize-done-1))
696       (mapc #'(lambda (el)
697                 (let ((sym (car el))
698                       (val (cdr el)))
699                   (set sym val)
700                   (cond ((eq sym 'news-method)
701                          (if (eq val 'nnspool)
702                              (setq use-miee t)))
703                         ((eq sym 'drafts-queue-type)
704                          (setq use-miee
705                                (if (eq val 'miee) t nil)))
706                         ((eq sym 'save-passwd)
707                          (if val
708                              (add-to-list 'gnus-variable-list
709                                           'mail-source-password-cache)
710                            (setq gnus-variable-list
711                                  (delq 'mail-source-password-cache
712                                        gnus-variable-list)))))))
713             params)
714       (if (and (eq news-method 'nnspool)
715                (not (eq drafts-queue-type 'miee)))
716           (error (gnus-ofsetup-get-message 'customize-done-2)))
717       (if use-miee
718           (gnus-ofsetup-prepare gnus-ofsetup-prepare-for-miee))
719       (gnus-ofsetup-prepare gnus-ofsetup-update-setting-file)
720       (load gnus-offline-setting-file)))
721   (bury-buffer)
722   (switch-to-buffer gnus-group-buffer))
723
724 ;; gnus-ofsetup.el Ends here.