* lisp/gnus.el (gnus-revision-number): Increment to 03.
[elisp/gnus.git-] / lisp / gnus-offline.el
1 ;;; gnus-offline.el --- To process mail & news at offline environment.
2 ;;; $Id: gnus-offline.el,v 1.1.2.5.2.34 1999-03-22 18:13:31 czkmt Exp $
3
4 ;;; Copyright (C) 1998 Tatsuya Ichikawa
5 ;;;                    Yukihiro Ito
6 ;;; Author: Tatsuya Ichikawa <t-ichi@po.shiojiri.ne.jp>
7 ;;;         Yukihiro Ito <ito@rs.civil.tohoku.ac.jp>
8 ;;;         Hidekazu Nakamura <u90121@uis-inf.co.jp>
9 ;;;         Tsukamoto Tetsuo <czkmt@remus.dti.ne.jp>
10
11 ;;; Version: 2.10
12 ;;; Keywords: news , mail , offline , gnus
13 ;;;
14 ;;; SPECIAL THANKS
15 ;;;    Keiichi Suzuki <kei-suzu@mail.wbs.or.jp>
16 ;;;    KORIYAMA Naohiro <kory@ba2.so-net.or.jp>
17 ;;;    Katsumi Yamaoka <yamaoka@jpl.org>
18
19 ;;; This file is part of Semi-gnus.
20 ;;;
21 ;;; GNU Emacs is free software; you can redistribute it and/or modify
22 ;;; it under the terms of the GNU General Public License as published by
23 ;;; the Free Software Foundation; either version 2, or (at your option)
24 ;;; any later version.
25
26 ;;; GNU Emacs is distributed in the hope that it will be useful,
27 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
28 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29 ;;; GNU General Public License for more details.
30
31 ;;; You should have received a copy of the GNU General Public License
32 ;;; along with GNU Emacs; see the file COPYING.  If not, write to the
33 ;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
34 ;;; Boston, MA 02111-1307, USA.
35 ;;;
36 ;;;; Commentary:
37 ;;; Note.
38 ;;;   This file works only with after version of Emacs 19.30.
39 ;;;   This file needs miee.el and SEMI.
40 ;;;   If you set gnus-offline-drafts-queue-type to 'agent , you don't need 
41 ;;;   miee.el
42 ;;;   You must use Semi-gnus 6.X.X.
43 ;;;
44 ;;; How to use.
45 ;;;
46 ;;; Add following code at the end in your .emacs
47 ;;;
48 ;;;    (load "gnus-ofsetup")
49 ;;;    (gnus-setup-for-offline)
50 ;;;    (load gnus-offline-setting-file)
51 ;;;
52 ;;; If you use gnus-agent as souper , put gnus-agent setup code in you .gnus.el
53 ;;;
54 ;;; If you use nnspool as souper , put following code in your .emacs before
55 ;;; gnus-offline setting.
56 ;;;
57 ;;; Then , put hang.exe in exec-path directory.
58 ;;;
59 ;;; In Gnus group buffer , type g to get all news and mail.
60 ;;; Then send mail and news in spool directory.
61 ;;;
62 ;;; Variables.
63 ;;;  gnus-offline-dialup-program-arguments
64 ;;;                                   ... List of dialup program arguments.
65 ;;;  gnus-offline-hangup-program-arguments
66 ;;;                                   ... List of hangup program arguments.
67 ;;;  gnus-offline-mail-treat-environ  ... toggle sending mail online/offline.
68 ;;;  gnus-offline-articles-to-fetch   ... toggle fetch articles.
69 ;;;                                        both->mail->news->both...
70 ;;;  gnus-offline-load-hook           ... hook before gnus-offline load.
71 ;;;  gnus-offline-before-online-hook  ... hook before all online jobs.
72 ;;;  gnus-offline-after-online-hook   ... hook after all online jobs.
73 ;;;  gnus-offline-interval-time       ... Interval time to do all online jobs.
74 ;;;                                        (minutes)
75 ;;;  gnus-offline-dialup-function     ... Function to diualup.
76 ;;;  gnus-offline-hangup-function     ... Function to hangup.
77
78 ;;; Code:
79
80 (eval '(run-hooks 'gnus-offline-load-hook))
81
82 (require 'cl)
83 (require 'custom)
84 (require 'easymenu)
85 (provide 'gnus-offline)
86
87 (unless (and (condition-case ()
88                  (require 'custom)
89                (file-error nil))
90              (fboundp 'defgroup)
91              (fboundp 'defcustom))
92   (require 'backquote)
93   (defmacro defgroup (&rest args))
94   (defmacro defcustom (symbol value &optional doc &rest args)
95     (` (defvar (, symbol) (, value) (, doc))))
96   )
97 (defgroup gnus-offline nil
98   "Offline backend utility for Gnus."
99   :prefix "gnus-offline-"
100   :group 'mail
101   :group 'news)
102
103 (defconst gnus-offline-version-number "2.10b1")
104 (defconst gnus-offline-codename
105 ;;  "Beta5"                     ; Beta
106 ;;  "This is the time"          ; 2.00
107 ;;  "A matter of trust"
108 ;;  "Modern Woman"
109   "Ahhhhhhh!!"                  ; 2.10b1
110 ;;  "Code of silence"
111   )
112
113 (defconst gnus-offline-version (format "Gnus offline backend utiliy v%s"
114                                        gnus-offline-version-number))
115
116 (defcustom gnus-offline-dialup-program-arguments nil
117   "*Program arguments of gnus-offline-dialup-program."
118   :group 'gnus-offline
119   :type '(repeat (string :tag "Argument")))
120
121 (defcustom gnus-offline-hangup-program-arguments nil
122   "*Program arguments of gnus-offline-hangup-program."
123   :group 'gnus-offline
124   :type '(repeat (string :tag "Argument")))
125
126 (defcustom gnus-offline-auto-hangup t
127   "*Whether dialup-network automatically hang up when all online jobs has done."
128   :group 'gnus-offline
129   :type 'boolean)
130
131 (defcustom gnus-offline-load-hook nil
132   "*Hook to be run after the gnus-offline package has been loaded."
133   :group 'gnus-offline
134   :type 'hook)
135
136 (defcustom gnus-offline-before-online-hook nil
137   "*Hook to be run before all online jobs."
138   :group 'gnus-offline
139   :type 'hook)
140
141 (defcustom gnus-offline-after-online-hook nil
142   "*Hook to be run after all online jobs."
143   :group 'gnus-offline
144   :type 'hook)
145
146 (defcustom gnus-offline-mail-treat-environ 'offline
147   "*If online , gnus-offline send all mail under online environ.
148 If offline , gnus-offline send all mail temporary to spool dir."
149   :group 'gnus-offline
150   :type '(choice (const offline)
151                  (const online)))
152
153 (defcustom gnus-offline-articles-to-fetch 'both
154   "*If both , gnus-offline fetch mail and news articles.
155 If mail , gnus-offline only fetch mail articles.
156  If news , gnus-offline only fetch news articles."
157   :group 'gnus-offline
158   :type '(choice (const both)
159                  (const mail)
160                  (const news)))
161
162 (defcustom gnus-offline-interval-time 0
163   "*Interval time(minutes) to do online jobs.
164 If set to 0 , timer call is disabled."
165   :group 'gnus-offline
166   :type 'integer)
167
168 (defcustom gnus-offline-mail-group-level 1
169   "*Group level for mail group."
170   :group 'gnus-offline
171   :type 'integer)
172
173 (defcustom gnus-offline-after-empting-spool-hook nil
174   "*Hook to be run before empting spool."
175   :group 'gnus-offline
176   :type 'hook)
177
178 (defcustom gnus-offline-before-empting-spool-hook nil
179   "*Hook to be run after empting spool."
180   :group 'gnus-offline
181   :type 'hook)
182
183 (defcustom gnus-offline-dialup-function 'gnus-offline-connect-server
184   "*Function to dialup."
185   :group 'gnus-offline
186   :type 'function)
187
188 (defcustom gnus-offline-hangup-function 'gnus-offline-hangup-line
189   "*Function to hangup."
190   :group 'gnus-offline
191   :type 'function)
192
193 ;;; Internal variables.
194 (defvar gnus-offline-connected nil
195   "*If value is t , dialup line is connected status.
196 If value is nil , dialup line is disconnected status.")
197
198 (defvar gnus-offline-news-fetch-method nil
199   "*Method to fetch news articles.")
200
201 (defvar gnus-offline-mail-fetch-method nil
202   "*Method to fetch mail articles.")
203
204 (defvar gnus-offline-header-string
205   (format "%s - \"%s\""
206           gnus-offline-version
207           gnus-offline-codename)
208   "*Header string for gnus-offline.")
209
210 (defvar gnus-offline-stored-group-level nil
211   "*Mail Group level before changing.")
212
213 (defvar gnus-offline-movemail-arguments nil
214   "*All command line arguments of exec-directory/movemail.")
215
216 (defvar gnus-offline-mail-source nil
217   "*nnmail-spool-file save variable.")
218
219 ;;; Temporary variable:
220 (defvar string)
221 (defvar hdr)
222 (defvar str)
223 (defvar ver)
224 (defvar passwd)
225 (defvar num)
226 (defvar gnus-offline-error-buffer " *Error*")
227 (defvar gnus-offline-map (make-sparse-keymap))
228
229 ;;; To silence byte compiler
230 (and
231  (fboundp 'eval-when-compile)
232  (eval-when-compile
233    (save-excursion
234      (beginning-of-defun)
235      (eval-region (point-min) (point)))
236    (let (case-fold-search)
237      (mapcar
238       (function
239        (lambda (symbol)
240          (unless (boundp symbol)
241            (make-local-variable symbol)
242            (eval (list 'setq symbol nil)))))
243       '(:group
244         :prefix :type
245         sendmail-to-spool-directory
246         news-spool-request-post-directory
247         nnspool-version
248         nnagent-version
249         msspool-news-server
250         msspool-news-service
251         gnspool-get-news
252         mail-spool-send
253         news-spool-post
254         gnus-agent-handle-level
255         ))
256      (make-local-variable 'byte-compile-warnings)
257      (setq byte-compile-warnings nil))))
258        
259 (put 'gnus-offline-set-unplugged-state 'menu-enable 'gnus-offline-connected)
260 (if (eq system-type 'windows-nt)
261     (define-process-argument-editing "/hang\\.exe\\'"
262       (lambda (x) (general-process-argument-editing-function
263                    x nil t t nil t t))))
264 ;;; Functions
265 ;;
266 ;; Setting up...
267 ;;
268 (defun gnus-offline-setup ()
269   "*Initialize gnus-offline function"
270
271   ;; Load setting file - required.
272   (load gnus-offline-setting-file)
273
274   ;; Menu and keymap
275   (gnus-offline-define-menu-and-key)
276   
277   ;; To transfer Mail/News function.
278   (cond ((eq gnus-offline-mail-treat-environ 'offline)
279          ;; send mail under offline environ.
280          (gnus-offline-set-offline-sendmail-function))
281         ((eq gnus-offline-mail-treat-environ 'online)
282          ;; send mail under offline environ.
283          (gnus-offline-set-online-sendmail-function))))
284 ;;  (add-hook 'gnus-group-mode-hook 'gnus-offline-setup))
285
286 ;;
287 ;; Setting Error check.
288 (defun gnus-offline-error-check ()
289   ;; Check gnus-agent and nnspool setting.
290   (cond ((eq gnus-offline-news-fetch-method 'nnagent)
291          ;; nnagent and gnus-agent loaded ??
292          (if (not (and (featurep 'gnus-agent)
293                        (featurep 'nnagent)))
294              (progn
295                (get-buffer-create gnus-offline-error-buffer)
296                (set-buffer gnus-offline-error-buffer)
297                (erase-buffer)
298                (insert "WARNING!!: gnus-agent.el or nnagent.el is not loaded.\n")
299                (insert "Please check your .emacs or .gnus.el to work gnus-agent fine.")
300                (pop-to-buffer gnus-offline-error-buffer))))
301         
302         ((eq gnus-offline-news-fetch-method 'nnspool)
303          (if (not (featurep 'nnspool))
304              (progn
305                (get-buffer-create gnus-offline-error-buffer)
306                (set-buffer gnus-offline-error-buffer)
307                (erase-buffer)
308                (insert "WARNING!!: nnspool.el is not loaded.\n")
309                (insert "Please check your .emacs or .gnus.el to work nnspool fine.")
310                (pop-to-buffer gnus-offline-error-buffer))))))
311 ;;
312 ;;
313 (defun gnus-offline-set-offline-sendmail-function ()
314   "*Initialize sendmail-function when unplugged status."
315   (if (eq gnus-offline-drafts-queue-type 'miee)
316       (progn
317         (if (eq gnus-offline-news-fetch-method 'nnagent)
318             (setq gnus-agent-send-mail-function 'sendmail-to-spool-in-gnspool-format))
319         (setq message-send-mail-function 'sendmail-to-spool-in-gnspool-format))
320     (setq gnus-agent-send-mail-function (gnus-offline-set-online-sendmail-function)
321           message-send-mail-function 'gnus-agent-send-mail)))
322 ;;
323 (defun gnus-offline-set-online-sendmail-function ()
324   "*Initialize sendmail-function when plugged status."
325   (if (eq gnus-offline-MTA-type 'smtp)
326       (setq message-send-mail-function 'message-send-mail-with-smtp)
327     (setq message-send-mail-function 'message-send-mail-with-sendmail)))
328 ;;
329 (defun gnus-offline-set-offline-post-news-function ()
330   "*Initialize sendnews-function when unplugged status."
331   (if (eq gnus-offline-drafts-queue-type 'miee)
332       (setq message-send-news-function 'gnspool-request-post)))
333 ;;
334 (defun gnus-offline-set-online-post-news-function ()
335   "*Initialize sendnews-function when plugged status."
336   (setq message-send-news-function 'message-send-news-with-gnus))
337 ;;
338 ;; Get new news jobs. (gnus-agent and nnspool)
339 ;;
340 (defun gnus-offline-gnus-get-new-news (&optional arg)
341   "*Override function \"gnus-group-get-new-news\"."
342   (interactive "P")
343   (run-hooks 'gnus-offline-before-online-hook)
344   (if (functionp gnus-offline-dialup-function)
345       (funcall gnus-offline-dialup-function))
346   (gnus-offline-get-new-news-function)
347   (gnus-group-get-new-news arg))
348
349 ;;
350 ;; dialup...
351 ;;
352 (defun gnus-offline-connect-server ()
353   "*Dialup function."
354   ;; Dialup if gnus-offline-dialup-program is specified
355   (if (stringp gnus-offline-dialup-program)
356       (progn
357         (message "Dialing ...")
358         (apply 'call-process gnus-offline-dialup-program nil nil nil
359                gnus-offline-dialup-program-arguments)
360         (sleep-for 1)
361         (message "Dialing ... done."))))
362
363 ;;
364 ;; Jobs before get new news , send mail and post news.
365 ;;
366 (defun gnus-offline-get-new-news-function ()
367   "*Prepare to get new news/mail."
368   ;; Set mail group level
369   (if (eq gnus-offline-articles-to-fetch 'mail)
370       (gnus-offline-set-mail-group-level gnus-offline-mail-group-level))
371
372   ;; Set to online environ.
373   (setq gnus-offline-connected t)
374
375   ;; Set send mail/news functions to online functions.
376   (gnus-offline-set-online-sendmail-function)
377   (gnus-offline-set-online-post-news-function)
378   (message "Set to online status.")
379
380   ;; fetch only news
381   (if (eq gnus-offline-articles-to-fetch 'news)
382       (gnus-offline-disable-fetch-mail))
383
384   ;; fetch both mail and news. or Only mail.
385   (gnus-offline-enable-fetch-news)
386   (if (memq gnus-offline-articles-to-fetch '(both mail))
387       (gnus-offline-enable-fetch-mail))
388
389   ;; fetch only mail for gnus-agent
390   (if (and (eq gnus-offline-news-fetch-method 'nnagent)
391            (eq gnus-offline-articles-to-fetch 'mail))
392           (setq gnus-agent-handle-level gnus-offline-mail-group-level)))
393
394 ;;
395 ;; Change mail group level to handle only mail.
396 ;;
397 (defun gnus-offline-set-mail-group-level (level)
398   "*Set nnm* group level."
399   (switch-to-buffer gnus-group-buffer)
400   (goto-char (point-min))
401   
402   ;; Save current level
403   (if (not gnus-offline-stored-group-level)
404       (while (re-search-forward " nnm" nil t)
405         (setq gnus-offline-stored-group-level
406               (append gnus-offline-stored-group-level
407                       (list (gnus-group-group-level)))))
408     (forward-line 1)
409     (beginning-of-line))
410   ;;
411   (goto-char (point-min))
412   (while (re-search-forward " nnm" nil t)
413     (gnus-group-set-current-level 1 level)
414     (forward-line 1)
415     (beginning-of-line))
416   t)
417 ;;
418 ;; Restore mail group level
419 ;;
420 (defun gnus-offline-restore-mail-group-level ()
421   "*Restore nnm* group level."
422   (switch-to-buffer gnus-group-buffer)
423   (goto-char (point-min))
424   (setq num 0)
425   (while (re-search-forward " nnm" nil t)
426     (gnus-group-set-current-level 1 (nth num gnus-offline-stored-group-level))
427     (forward-line 1)
428     (setq num (+ num 1))
429     (beginning-of-line)))
430 ;;
431 ;; Jobs after getting new news.
432 ;;
433 (defun gnus-offline-after-get-new-news ()
434   "*After getting news and mail jobs."
435   (if (memq gnus-offline-articles-to-fetch '(both mail))
436       (progn
437         ;; Mail/both
438         ;; send mail/news in spool
439         (gnus-offline-empting-spool)
440         (if (eq gnus-offline-articles-to-fetch 'mail)
441             (progn
442               ;; Send only mail and hang up...
443               (if (and gnus-offline-connected
444                        gnus-offline-auto-hangup)
445                   (gnus-offline-set-unplugged-state))
446               ;; Disable fetch mail.
447               (gnus-offline-disable-fetch-mail)
448               (gnus-offline-after-jobs-done)))))
449   
450   ;; News/Both
451   (if (memq gnus-offline-articles-to-fetch '(both news))
452       (progn
453         (if gnus-offline-connected
454             (cond ((eq gnus-offline-news-fetch-method 'nnagent)
455                    ;; Get New News (gnus-agent)
456                    (gnus-agent-toggle-plugged t)
457                   
458                    ;; fetch articles
459                    (gnus-agent-fetch-session)
460                   
461                    ;; Hang Up line. then set to offline status.
462                    (if (and gnus-offline-connected
463                             gnus-offline-auto-hangup)
464                        (gnus-offline-set-unplugged-state))
465                    
466                    ;; All online jobs has done.
467                    (gnus-offline-after-jobs-done))
468                   (t
469                    (if (eq gnus-offline-news-fetch-method 'nnspool)
470                        ;; Get New News (nnspool)
471                        (gnspool-get-news))))))))
472 ;;
473 ;; Disable fetch mail
474 ;;
475 (defun gnus-offline-disable-fetch-mail ()
476   "*Set do not fetch mail."
477   (setq nnmail-spool-file nil))
478 ;;
479 ;; Enable fetch mail
480 ;;
481 (defun gnus-offline-enable-fetch-mail ()
482   "*Set to fetch mail."
483   (setq gnus-offline-mail-fetch-method 'nnmail)
484   (if (not (featurep 'running-pterodactyl-gnus-0_73-or-later))
485       (progn
486         (setq nnmail-movemail-program 'pop3-fma-movemail)
487         (setq nnmail-spool-file (append
488                                  pop3-fma-local-spool-file-alist
489                                  (mapcar
490                                   (lambda (spool)
491                                     (car spool))
492                                   pop3-fma-spool-file-alist))))
493     (setq nnmail-spool-file gnus-offline-mail-source)))
494 ;;
495 ;; Enable fetch news
496 ;;
497 (defun gnus-offline-enable-fetch-news ()
498   "*Set to fetch news."
499   (if (eq gnus-offline-news-fetch-method 'nnagent)
500       (progn
501         (setq gnus-agent-handle-level gnus-level-subscribed)
502         (gnus-agent-toggle-plugged t))))
503 \f
504 ;;
505 ;; Add your custom header.
506 ;;
507 (defun gnus-offline-add-custom-header (header string)
508   "*Add X-Gnus-Offline-Backend header to Mail/News message."
509   (let ((delimline
510          (progn (goto-char (point-min))
511                 (re-search-forward
512                  (concat "^" (regexp-quote mail-header-separator) "\n"))
513                 (point-marker))))
514     (goto-char (point-min))
515     (or (re-search-forward (concat "^" header) delimline t)
516         (progn
517           (goto-char delimline)
518           (forward-line -1)
519           (beginning-of-line)
520           (setq hdr (concat header " "))
521           (setq str (concat hdr string))
522           (setq hdr (concat str "\n"))
523           (insert-string hdr)))))
524 ;;
525 ;; Add X-Offline-Backend header.
526 ;;
527 (defun gnus-offline-message-add-header ()
528   "*Add X-Gnus-Offline-Backend header to Mail/News message."
529   (if (eq gnus-offline-mail-treat-environ 'offline)
530       (progn
531         (if (eq gnus-offline-news-fetch-method 'nnagent)
532             (setq ver nnagent-version)
533           (setq ver nnspool-version))
534         (setq str (format "\n                        with %s" ver)
535               string (concat gnus-offline-header-string str))
536         (gnus-offline-add-custom-header "X-Gnus-Offline-Backend:" string))))
537   
538 \f
539 ;;
540 ;; Toggle plugged/unplugged
541 ;;
542 (defun gnus-offline-toggle-plugged (plugged)
543   "*Override function \"Jj\" - gnus-agent-toggle-plugged."
544   (interactive (list (not gnus-offline-connected)))
545   (if plugged
546       (progn
547         (setq gnus-offline-connected plugged)
548         (gnus-agent-toggle-plugged plugged)
549         ;; Set send mail/news function to offline functions.
550         (gnus-offline-set-online-sendmail-function)
551         (gnus-offline-set-online-post-news-function))
552     ;; Set to offline status
553     (gnus-offline-set-unplugged-state)))
554 ;;
555 ;; Function of hang up line.
556 ;;
557 (defun gnus-offline-set-unplugged-state ()
558   "*Set to unplugged state."
559   (interactive)
560   ;; Hang Up Line.
561   (if (functionp gnus-offline-hangup-function)
562       (funcall gnus-offline-hangup-function))
563   (setq gnus-offline-connected nil)
564   (if (eq gnus-offline-news-fetch-method 'nnagent)
565       (gnus-agent-toggle-plugged nil))
566
567   ;; Set send mail/news function to offline functions.
568   (gnus-offline-set-offline-sendmail-function)
569   (gnus-offline-set-offline-post-news-function)
570   ;;
571   (setenv "MAILHOST" nil))
572 ;;
573 ;; Hangup line function 
574 ;;
575 (defun gnus-offline-hangup-line ()
576   "*Hangup line function."
577   (message "Hang up line ... ")
578   (if (stringp gnus-offline-hangup-program)
579       (apply 'start-process "hup" nil gnus-offline-hangup-program
580              gnus-offline-hangup-program-arguments))
581   (message "Hang up line ... done."))
582 ;;
583 ;; Hang Up line routine whe using nnspool
584 ;;
585 (defun gnus-offline-nnspool-hangup-line ()
586   (if (and gnus-offline-connected
587            gnus-offline-auto-hangup)
588       (gnus-offline-set-unplugged-state))
589   (gnus-offline-after-jobs-done))
590 ;;
591 ;; Function of all jobs has done.
592 ;;
593 (defun gnus-offline-after-jobs-done ()
594   "*Jobs after all online jobs."
595   (run-hooks 'gnus-offline-after-online-hook)
596   (if (eq gnus-offline-articles-to-fetch 'mail)
597       (gnus-offline-restore-mail-group-level))
598   (if (eq gnus-offline-news-fetch-method 'nnagent)
599       (or gnus-agent-expire-all
600           (gnus-offline-agent-expire)))
601   (if (and (featurep 'xemacs)
602            (fboundp 'play-sound-file))
603       (ding nil 'drum)
604     (ding))
605   (gnus-group-save-newsrc)
606   (message "All online jobs has done."))
607
608 \f
609 ;;
610 ;; Toggle auto hang up
611 ;;
612 (defun gnus-offline-toggle-auto-hangup ()
613   "*Toggle auto hangup flag."
614   (interactive)
615   (setq string "Auto hang up logic")
616   (if gnus-offline-auto-hangup
617       (progn
618         (setq gnus-offline-auto-hangup nil
619               str "disabled."))
620     (setq gnus-offline-auto-hangup t
621           str "enabled."))
622   (message (format "%s %s" string str)))
623 ;;
624 ;; Toggle offline/online to send mail.
625 ;;
626 (defun gnus-offline-toggle-on/off-send-mail ()
627   "*Toggel online/offline sendmail."
628   (interactive)
629   (if (eq gnus-offline-mail-treat-environ 'offline)
630       (progn
631         ;; Sending mail under online environ.
632         (gnus-offline-set-online-sendmail-function)
633         (setq gnus-offline-mail-treat-environ 'online)
634         (message "Sending mail immidiately."))
635     ;; Sending mail under offline environ.
636     (gnus-offline-set-offline-sendmail-function)
637     (setq gnus-offline-mail-treat-environ 'offline)
638     (message "Sending mail temporary to spool directory.")))
639 ;;
640 ;; Toggle articles to fetch ... both -> mail -> news -> both
641 ;;
642 (defun gnus-offline-toggle-articles-to-fetch ()
643   "*Set articles to fetch... both(Mail/News) -> mail only -> News only -> both"
644   (interactive)
645   (setq string "Articles fetch from server.")
646   (cond ((eq gnus-offline-articles-to-fetch 'both)
647          (setq gnus-offline-articles-to-fetch 'mail
648                str "Only Mail"))
649         ((eq gnus-offline-articles-to-fetch 'mail)
650            (setq gnus-offline-articles-to-fetch 'news
651                  str "Only News"))
652         (t
653          (setq gnus-offline-articles-to-fetch 'both
654                str "Mail/News both")))
655   (message (format "%s %s" string str)))
656 ;;
657 ;; Toggle movemail program pop3.el -> movemail -> pop3.el
658 ;;
659 (defun gnus-offline-toggle-movemail-program ()
660   "*Toggle movemail program movemail -> pop3.el -> movemail ->..."
661   (interactive)
662   (setq string "Set nnmail-movemail-program")
663   (cond ((eq pop3-fma-movemail-type 'lisp)
664          (setq pop3-fma-movemail-type 'exe
665                str "to movemail"))
666         (t
667          (setq pop3-fma-movemail-type 'lisp
668                str "to pop3.el")))
669   (message (format "%s %s" string str)))
670 ;;
671 ;; Send mail and Post news using Miee or gnus-agent.
672 ;;
673 (defun gnus-offline-empting-spool ()
674   "*Send all drafts on queue."
675   (run-hooks 'gnus-offline-before-empting-spool-hook)
676   (if (eq gnus-offline-drafts-queue-type 'miee)
677       ;; Send queued message by miee.el.
678       (progn
679         (if (eq gnus-offline-mail-treat-environ 'offline)
680             (progn
681               (message "Sending mails in spool ...")
682               ;; Using miee to send mail.
683               (mail-spool-send)
684               (message "Sending mails in spool ... done.")))
685         (message "Posting news in spool ...")
686         ;; Using miee to post news.
687         (if (and (not (stringp msspool-news-server))
688                  (not msspool-news-service))
689             (progn
690               (setq msspool-news-server (nth 1 gnus-select-method))
691               (setq msspool-news-service 119)))
692         (news-spool-post)
693         (message "Posting news in spool ... done."))
694     ;; Send queued message by gnus-agent
695     (message "Sending messages in spool ...")
696     (gnus-group-send-drafts)
697     (message "Sending messages in spool ... done."))
698   ;;
699   (run-hooks 'gnus-offline-after-empting-spool-hook))
700 ;;
701 ;; Set interval time
702 ;;
703 (defun gnus-offline-set-interval-time ()
704   "*Set interval time for gnus-daemon."
705   (interactive)
706   (setq gnus-offline-interval-time
707         (string-to-int (read-from-minibuffer
708                         (format "Interval time (now %s minutes) : "
709                                 gnus-offline-interval-time)
710                         nil)))
711   (if (< gnus-offline-interval-time 2)
712       (progn
713         (message "Retrieving message logic by timer is disabled.")
714         (setq gnus-offline-interval-time 0))
715     (message (format "Interval time set to %d minutes" gnus-offline-interval-time)))
716   (gnus-offline-processed-by-timer))
717 ;;
718 ;; Expire articles using gnus-agent.
719 ;;
720 (defun gnus-offline-agent-expire ()
721   "*Expire expirable article on News group."
722   (interactive)
723   (gnus-agent-expire))
724 ;;
725 ;; Menu.
726 ;;
727 (defun gnus-offline-define-menu-and-key ()
728   "*Set key and menu."
729   (if (eq gnus-offline-drafts-queue-type 'miee)
730       (if (featurep 'xemacs)
731           (add-hook 'gnus-group-mode-hook 'gnus-offline-define-menu-on-miee)
732         (gnus-offline-define-menu-on-miee))
733     (add-hook 'gnus-group-mode-hook 'gnus-offline-define-menu-on-agent))
734   (add-hook 'gnus-group-mode-hook
735             '(lambda ()
736                (local-set-key "\C-coh" 'gnus-offline-set-unplugged-state)
737                (if (not (featurep 'running-pterodactyl-gnus-0_73-or-later))
738                    (local-set-key "\C-com" 'gnus-offline-toggle-movemail-program))
739                (local-set-key "\C-cof" 'gnus-offline-toggle-articles-to-fetch)
740                (local-set-key "\C-coo" 'gnus-offline-toggle-on/off-send-mail)
741                (local-set-key "\C-cox" 'gnus-offline-toggle-auto-hangup)
742                (local-set-key "\C-cos" 'gnus-offline-set-interval-time)
743                (substitute-key-definition
744                 'gnus-group-get-new-news 'gnus-offline-gnus-get-new-news
745                 gnus-group-mode-map)
746                (if (eq gnus-offline-news-fetch-method 'nnagent)
747                    (progn
748                      (substitute-key-definition
749                       'gnus-agent-toggle-plugged 'gnus-offline-toggle-plugged
750                       gnus-agent-group-mode-map)
751                      (local-set-key "\C-coe" 'gnus-offline-agent-expire)))
752                (or (featurep 'xemacs)
753                    (define-key gnus-group-mode-map 
754                      (if (eq system-type 'windows-nt) [S-mouse-2] [mouse-3])
755                      'gnus-offline-popup-menu))))
756   (if (eq gnus-offline-news-fetch-method 'nnagent)
757       (add-hook 'gnus-summary-mode-hook
758                 '(lambda ()
759                    (substitute-key-definition
760                     'gnus-agent-toggle-plugged 'gnus-offline-toggle-plugged
761                     gnus-agent-summary-mode-map))))
762   (if (featurep 'xemacs)
763       ;; Overwrite the toolbar spec for gnus-group-mode.
764       (add-hook 'gnus-startup-hook
765                 (lambda ()
766                   (catch 'tag
767                     (mapcar (lambda (but)
768                               (when (eq 'gnus-group-get-new-news (aref but 1))
769                                 (aset but 1 'gnus-offline-gnus-get-new-news)
770                                 (throw 'tag nil)))
771                             gnus-group-toolbar))))))
772 ;;
773 ;;
774 (defun gnus-offline-define-menu-on-miee ()
775   "*Set and change menu bar on MIEE menu."
776   (let ((menu
777   (if (featurep 'meadow)
778       (easy-menu-change
779        nil
780        "Miee"
781        '(
782          ["Spool \e$B$K$"$k5-;v$NAw?.\e(B" news-spool-post t]
783          ["Spool \e$B$K$"$k\e(B Mail \e$B$NAw?.\e(B" mail-spool-send t]
784          "----"
785          ["Offline \e$B>uBV$X\e(B" message-offline-state (not message-offline-state)]
786          ["Online \e$B>uBV$X\e(B" message-online-state message-offline-state]
787          "----"
788          ("Gnus Offline"
789           ["movemail \e$B$N@ZBX$(\e(B" gnus-offline-toggle-movemail-program
790            (not (featurep 'running-pterodactyl-gnus-0_73-or-later))]
791           ["\e$B<hF@5-;v<oN`$NJQ99\e(B" gnus-offline-toggle-articles-to-fetch t]
792           ["Mail \e$BAw?.J}K!\e(B(On/Off)\e$B$N@ZBX$(\e(B" gnus-offline-toggle-on/off-send-mail t]
793           ["\e$B<+F0@ZCG$N@ZBX$(\e(B" gnus-offline-toggle-auto-hangup t]
794           "----"
795           ["\e$B<hF@:Q5-;v$r>C$9\e(B" gnus-offline-agent-expire (eq gnus-offline-news-fetch-method 'nnagent)]
796           ["\e$B5-;v<hF@4V3V;~4V$N@_Dj\e(B" gnus-offline-set-interval-time t]
797           "----"
798           ["\e$B2s@~$N@ZCG\e(B" gnus-offline-set-unplugged-state gnus-offline-connected])
799          ))
800     (easy-menu-change
801      nil
802      "Miee"
803      '(
804        ["Post news in spool" news-spool-post t]
805        ["Send mails in spool" mail-spool-send t]
806        "----"
807        ["Message Offline" message-offline-state (not message-offline-state)]
808        ["Message Online" message-online-state message-offline-state]
809        "----"
810        ("Gnus Offline"
811         ["Toggle movemail program" gnus-offline-toggle-movemail-program
812          (not (featurep 'running-pterodactyl-gnus-0_73-or-later))]
813         ["Toggle articles to fetch" gnus-offline-toggle-articles-to-fetch t]
814         ["Toggle online/offline send mail" gnus-offline-toggle-on/off-send-mail t]
815         ["Toggle auto hangup" gnus-offline-toggle-auto-hangup t]
816         "----"
817         ["Expire articles" gnus-offline-agent-expire (eq gnus-offline-news-fetch-method 'nnagent)]
818         ["Set interval time" gnus-offline-set-interval-time t]
819         "----"
820         ["Hang up Line." gnus-offline-set-unplugged-state gnus-offline-connected]
821         ))))))
822   (and (featurep 'xemacs)
823        (easy-menu-add menu))))
824 ;;
825 ;; define menu without miee.
826 ;;
827 (defun gnus-offline-define-menu-on-agent ()
828   "*Set menu bar on OFFLINE menu."
829   (easy-menu-define 
830    gnus-offline-menu-on-agent
831    gnus-group-mode-map
832    "Gnus offline Menu"
833    (if (featurep 'meadow)
834        '("Offline"
835          ["movemail \e$B$N@ZBX$(\e(B" gnus-offline-toggle-movemail-program
836           (not (featurep 'running-pterodactyl-gnus-0_73-or-later))]
837          ["\e$B<hF@5-;v<oN`$NJQ99\e(B" gnus-offline-toggle-articles-to-fetch t]
838          ["Mail \e$BAw?.J}K!\e(B(On/Off)\e$B$N@ZBX$(\e(B" gnus-offline-toggle-on/off-send-mail t]
839          ["\e$B<+F0@ZCG$N@ZBX$(\e(B" gnus-offline-toggle-auto-hangup t]
840          "----"
841          ["\e$B<hF@:Q5-;v$r>C$9\e(B" gnus-offline-agent-expire (eq gnus-offline-news-fetch-method 'nnagent)]
842          ["\e$B5-;v<hF@4V3V;~4V$N@_Dj\e(B" gnus-offline-set-interval-time t]
843          "----"
844          ["\e$B2s@~$N@ZCG\e(B" gnus-offline-set-unplugged-state gnus-offline-connected])
845      '("Offline"
846        ["Toggle movemail program" gnus-offline-toggle-movemail-program
847         (not (featurep 'running-pterodactyl-gnus-0_73-or-later))]
848        ["Toggle articles to fetch" gnus-offline-toggle-articles-to-fetch t]
849        ["Toggle online/offline send mail" gnus-offline-toggle-on/off-send-mail t]
850        ["Toggle auto hangup" gnus-offline-toggle-auto-hangup t]
851        "----"
852        ["Expire articles" gnus-offline-agent-expire (eq gnus-offline-news-fetch-method 'nnagent)]
853        ["Set interval time" gnus-offline-set-interval-time t]
854        "----"
855        ["Hang up Line." gnus-offline-set-unplugged-state gnus-offline-connected])))
856   (and (featurep 'xemacs)
857        (easy-menu-add gnus-offline-menu-on-agent)))
858 ;;
859 ;; Popup menu within the group buffer (under Emacs).
860 ;;
861 (defvar gnus-offline-popup-menu nil)
862 (defun gnus-offline-popup-menu (event)
863   "Popup menu for Gnus offline."
864   (interactive "e")
865   (unless gnus-offline-popup-menu
866     (setq gnus-offline-popup-menu
867           (or (featurep 'xemacs)
868               (let ((menu
869                      (if (boundp 'miee-popup-menu)
870                          (or (assoc 'keymap
871                                     (assoc 'Miee (assoc 'menu-bar global-map)))
872                              miee-popup-menu)
873                        gnus-offline-menu-on-agent)))
874                 (if (string< emacs-version "20")
875                     (append (list 'keymap
876                                   (if (boundp 'miee-popup-menu)
877                                       '(nil "Miee")
878                                     '(nil "Offline"))
879                                   '(nil "")
880                                   '(nil ""))
881                             (cdr menu))
882                   menu)))))
883   (let* ((pop (x-popup-menu t gnus-offline-popup-menu))
884          (func (and pop (lookup-key gnus-offline-popup-menu
885                                     (apply 'vector pop)))))
886     (and pop func (funcall func))))
887 \f
888 ;;
889 ;; Timer Function
890 (defun gnus-offline-processed-by-timer ()
891   "*Set timer interval."
892   (if (and (> gnus-offline-interval-time 0)
893            (not gnus-offline-connected))
894       ;; Timer call
895       (gnus-demon-add-handler 'gnus-offline-gnus-get-new-news
896                               gnus-offline-interval-time
897                               gnus-offline-interval-time))
898   (if (= gnus-offline-interval-time 0)
899       (gnus-demon-remove-handler 'gnus-offline-gnus-get-new-news t)))
900 ;;
901 ;;
902 ;;; gnus-offline.el ends here