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