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