1 ;;; gnus-offline.el --- To process mail & news at offline environment.
2 ;;; $Id: gnus-offline.el,v 1.1.2.5.2.35.2.1 1999-07-20 15:01:17 czkmt Exp $
4 ;;; Copyright (C) 1998 Tatsuya Ichikawa
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>
12 ;;; Keywords: news , mail , offline , gnus
15 ;;; Keiichi Suzuki <kei-suzu@mail.wbs.or.jp>
16 ;;; KORIYAMA Naohiro <kory@ba2.so-net.or.jp>
17 ;;; Katsumi Yamaoka <yamaoka@jpl.org>
19 ;;; This file is part of Semi-gnus.
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.
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.
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.
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
42 ;;; You must use Semi-gnus 6.X.X.
46 ;;; Add following code at the end in your .emacs
48 ;;; (load "gnus-ofsetup")
49 ;;; (gnus-setup-for-offline)
50 ;;; (load gnus-offline-setting-file)
52 ;;; If you use gnus-agent as souper , put gnus-agent setup code in you .gnus.el
54 ;;; If you use nnspool as souper , put following code in your .emacs before
55 ;;; gnus-offline setting.
57 ;;; Then , put hang.exe in exec-path directory.
59 ;;; In Gnus group buffer , type g to get all news and mail.
60 ;;; Then send mail and news in spool directory.
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.
75 ;;; gnus-offline-dialup-function ... Function to diualup.
76 ;;; gnus-offline-hangup-function ... Function to hangup.
80 (eval '(run-hooks 'gnus-offline-load-hook))
85 (provide 'gnus-offline)
87 (unless (and (condition-case ()
93 (defmacro defgroup (&rest args))
94 (defmacro defcustom (symbol value &optional doc &rest args)
95 (` (defvar (, symbol) (, value) (, doc))))
97 (defgroup gnus-offline nil
98 "Offline backend utility for Gnus."
99 :prefix "gnus-offline-"
103 (defconst gnus-offline-version-number "2.20")
104 (defconst gnus-offline-codename
106 ;; "This is the time" ; 2.00
107 ;; "A matter of trust"
109 ;; "Ahhhhhhh!!" ; 2.10b1
114 (defconst gnus-offline-version (format "Gnus offline backend utiliy v%s"
115 gnus-offline-version-number))
117 (defcustom gnus-offline-dialup-program-arguments nil
118 "*Program arguments of gnus-offline-dialup-program."
120 :type '(repeat (string :tag "Argument")))
122 (defcustom gnus-offline-hangup-program-arguments nil
123 "*Program arguments of gnus-offline-hangup-program."
125 :type '(repeat (string :tag "Argument")))
127 (defcustom gnus-offline-auto-hangup t
128 "*Whether dialup-network automatically hang up when all online jobs has done."
132 (defcustom gnus-offline-load-hook nil
133 "*Hook to be run after the gnus-offline package has been loaded."
137 (defcustom gnus-offline-before-online-hook nil
138 "*Hook to be run before all online jobs."
142 (defcustom gnus-offline-after-online-hook nil
143 "*Hook to be run after all online jobs."
147 (defcustom gnus-offline-mail-treat-environ 'offline
148 "*If online , gnus-offline send all mail under online environ.
149 If offline , gnus-offline send all mail temporary to spool dir."
151 :type '(choice (const offline)
154 (defcustom gnus-offline-articles-to-fetch 'both
155 "*If both , gnus-offline fetch mail and news articles.
156 If mail , gnus-offline only fetch mail articles.
157 If news , gnus-offline only fetch news articles."
159 :type '(choice (const both)
163 (defcustom gnus-offline-interval-time 0
164 "*Interval time(minutes) to do online jobs.
165 If set to 0 , timer call is disabled."
169 (defcustom gnus-offline-mail-group-level 1
170 "*Group level for mail group."
174 (defcustom gnus-offline-after-empting-spool-hook nil
175 "*Hook to be run before empting spool."
179 (defcustom gnus-offline-before-empting-spool-hook nil
180 "*Hook to be run after empting spool."
184 (defcustom gnus-offline-dialup-function 'gnus-offline-connect-server
185 "*Function to dialup."
189 (defcustom gnus-offline-hangup-function 'gnus-offline-hangup-line
190 "*Function to hangup."
194 ;;; Internal variables.
195 (defvar gnus-offline-connected nil
196 "*If value is t , dialup line is connected status.
197 If value is nil , dialup line is disconnected status.")
199 (defvar gnus-offline-news-fetch-method nil
200 "*Method to fetch news articles.")
202 (defvar gnus-offline-mail-fetch-method nil
203 "*Method to fetch mail articles.")
205 (defvar gnus-offline-header-string
206 (format "%s - \"%s\""
208 gnus-offline-codename)
209 "*Header string for gnus-offline.")
211 (defvar gnus-offline-stored-group-level nil
212 "*Mail Group level before changing.")
214 (defvar gnus-offline-movemail-arguments nil
215 "*All command line arguments of exec-directory/movemail.")
217 (defvar gnus-offline-mail-source nil
218 "*nnmail-spool-file save variable.")
220 ;;; Temporary variable:
227 (defvar gnus-offline-error-buffer " *Error*")
228 (defvar gnus-offline-map (make-sparse-keymap))
230 ;;; To silence byte compiler
232 (fboundp 'eval-when-compile)
236 (eval-region (point-min) (point)))
237 (let (case-fold-search)
241 (unless (boundp symbol)
242 (make-local-variable symbol)
243 (eval (list 'setq symbol nil)))))
246 sendmail-to-spool-directory
247 news-spool-request-post-directory
255 gnus-agent-handle-level
257 (make-local-variable 'byte-compile-warnings)
258 (setq byte-compile-warnings nil))))
260 (put 'gnus-offline-set-unplugged-state 'menu-enable 'gnus-offline-connected)
261 (if (eq system-type 'windows-nt)
262 (define-process-argument-editing "/hang\\.exe\\'"
263 (lambda (x) (general-process-argument-editing-function
264 x nil t t nil t t))))
269 (defun gnus-offline-setup ()
270 "*Initialize gnus-offline function"
272 ;; Load setting file - required.
273 (load gnus-offline-setting-file)
276 (gnus-offline-define-menu-and-key)
278 ;; To transfer Mail/News function.
279 (cond ((eq gnus-offline-mail-treat-environ 'offline)
280 ;; send mail under offline environ.
281 (gnus-offline-set-offline-sendmail-function))
282 ((eq gnus-offline-mail-treat-environ 'online)
283 ;; send mail under offline environ.
284 (gnus-offline-set-online-sendmail-function))))
285 ;; (add-hook 'gnus-group-mode-hook 'gnus-offline-setup))
288 ;; Setting Error check.
289 (defun gnus-offline-error-check ()
290 ;; Check gnus-agent and nnspool setting.
291 (cond ((eq gnus-offline-news-fetch-method 'nnagent)
292 ;; nnagent and gnus-agent loaded ??
293 (if (not (and (featurep 'gnus-agent)
294 (featurep 'nnagent)))
296 (get-buffer-create gnus-offline-error-buffer)
297 (set-buffer gnus-offline-error-buffer)
299 (insert "WARNING!!: gnus-agent.el or nnagent.el is not loaded.\n")
300 (insert "Please check your .emacs or .gnus.el to work gnus-agent fine.")
301 (pop-to-buffer gnus-offline-error-buffer))))
303 ((eq gnus-offline-news-fetch-method 'nnspool)
304 (if (not (featurep 'nnspool))
306 (get-buffer-create gnus-offline-error-buffer)
307 (set-buffer gnus-offline-error-buffer)
309 (insert "WARNING!!: nnspool.el is not loaded.\n")
310 (insert "Please check your .emacs or .gnus.el to work nnspool fine.")
311 (pop-to-buffer gnus-offline-error-buffer))))))
314 (defun gnus-offline-set-offline-sendmail-function ()
315 "*Initialize sendmail-function when unplugged status."
316 (if (eq gnus-offline-drafts-queue-type 'miee)
318 (if (eq gnus-offline-news-fetch-method 'nnagent)
319 (setq gnus-agent-send-mail-function 'sendmail-to-spool-in-gnspool-format))
320 (setq message-send-mail-function 'sendmail-to-spool-in-gnspool-format))
321 (setq gnus-agent-send-mail-function (gnus-offline-set-online-sendmail-function)
322 message-send-mail-function 'gnus-agent-send-mail)))
324 (defun gnus-offline-set-online-sendmail-function ()
325 "*Initialize sendmail-function when plugged status."
326 (if (eq gnus-offline-MTA-type 'smtp)
327 (setq message-send-mail-function 'message-send-mail-with-smtp)
328 (setq message-send-mail-function 'message-send-mail-with-sendmail)))
330 (defun gnus-offline-set-offline-post-news-function ()
331 "*Initialize sendnews-function when unplugged status."
332 (if (eq gnus-offline-drafts-queue-type 'miee)
333 (setq message-send-news-function 'gnspool-request-post)))
335 (defun gnus-offline-set-online-post-news-function ()
336 "*Initialize sendnews-function when plugged status."
337 (setq message-send-news-function 'message-send-news-with-gnus))
339 ;; Get new news jobs. (gnus-agent and nnspool)
341 (defun gnus-offline-gnus-get-new-news (&optional arg)
342 "*Override function \"gnus-group-get-new-news\"."
344 (run-hooks 'gnus-offline-before-online-hook)
345 (if (functionp gnus-offline-dialup-function)
346 (funcall gnus-offline-dialup-function))
347 (gnus-offline-get-new-news-function)
348 (gnus-group-get-new-news arg))
353 (defun gnus-offline-connect-server ()
355 ;; Dialup if gnus-offline-dialup-program is specified
356 (if (stringp gnus-offline-dialup-program)
358 (message "Dialing ...")
359 (apply 'call-process gnus-offline-dialup-program nil nil nil
360 gnus-offline-dialup-program-arguments)
362 (message "Dialing ... done."))))
365 ;; Jobs before get new news , send mail and post news.
367 (defun gnus-offline-get-new-news-function ()
368 "*Prepare to get new news/mail."
369 ;; Set mail group level
370 (if (eq gnus-offline-articles-to-fetch 'mail)
371 (gnus-offline-set-mail-group-level gnus-offline-mail-group-level))
373 ;; Set to online environ.
374 (setq gnus-offline-connected t)
376 ;; Set send mail/news functions to online functions.
377 (gnus-offline-set-online-sendmail-function)
378 (gnus-offline-set-online-post-news-function)
379 (message "Set to online status.")
382 (if (eq gnus-offline-articles-to-fetch 'news)
383 (gnus-offline-disable-fetch-mail))
385 ;; fetch both mail and news. or Only mail.
386 (gnus-offline-enable-fetch-news)
387 (if (memq gnus-offline-articles-to-fetch '(both mail))
388 (gnus-offline-enable-fetch-mail))
390 ;; fetch only mail for gnus-agent
391 (if (and (eq gnus-offline-news-fetch-method 'nnagent)
392 (eq gnus-offline-articles-to-fetch 'mail))
393 (setq gnus-agent-handle-level gnus-offline-mail-group-level)))
396 ;; Change mail group level to handle only mail.
398 (defun gnus-offline-set-mail-group-level (level)
399 "*Set nnm* group level."
400 (switch-to-buffer gnus-group-buffer)
401 (goto-char (point-min))
403 ;; Save current level
404 (if (not gnus-offline-stored-group-level)
405 (while (re-search-forward " nnm" nil t)
406 (setq gnus-offline-stored-group-level
407 (append gnus-offline-stored-group-level
408 (list (gnus-group-group-level)))))
412 (goto-char (point-min))
413 (while (re-search-forward " nnm" nil t)
414 (gnus-group-set-current-level 1 level)
419 ;; Restore mail group level
421 (defun gnus-offline-restore-mail-group-level ()
422 "*Restore nnm* group level."
423 (switch-to-buffer gnus-group-buffer)
424 (goto-char (point-min))
426 (while (re-search-forward " nnm" nil t)
427 (gnus-group-set-current-level 1 (nth num gnus-offline-stored-group-level))
430 (beginning-of-line)))
432 ;; Jobs after getting new news.
434 (defun gnus-offline-after-get-new-news ()
435 "*After getting news and mail jobs."
436 (if (memq gnus-offline-articles-to-fetch '(both mail))
439 ;; send mail/news in spool
440 (gnus-offline-empting-spool)
441 (if (eq gnus-offline-articles-to-fetch 'mail)
443 ;; Send only mail and hang up...
444 (if (and gnus-offline-connected
445 gnus-offline-auto-hangup)
446 (gnus-offline-set-unplugged-state))
447 ;; Disable fetch mail.
448 (gnus-offline-disable-fetch-mail)
449 (gnus-offline-after-jobs-done)))))
452 (if (memq gnus-offline-articles-to-fetch '(both news))
454 (if gnus-offline-connected
455 (cond ((eq gnus-offline-news-fetch-method 'nnagent)
456 ;; Get New News (gnus-agent)
457 (gnus-agent-toggle-plugged t)
460 (gnus-agent-fetch-session)
462 ;; Hang Up line. then set to offline status.
463 (if (and gnus-offline-connected
464 gnus-offline-auto-hangup)
465 (gnus-offline-set-unplugged-state))
467 ;; All online jobs has done.
468 (gnus-offline-after-jobs-done))
470 (if (eq gnus-offline-news-fetch-method 'nnspool)
471 ;; Get New News (nnspool)
472 (gnspool-get-news))))))))
474 ;; Disable fetch mail
476 (defun gnus-offline-disable-fetch-mail ()
477 "*Set do not fetch mail."
478 (setq nnmail-spool-file nil))
482 (defun gnus-offline-enable-fetch-mail ()
483 "*Set to fetch mail."
484 (setq gnus-offline-mail-fetch-method 'nnmail)
485 (if (not (featurep 'running-pterodactyl-gnus-0_73-or-later))
487 (setq nnmail-movemail-program 'pop3-fma-movemail)
488 (setq nnmail-spool-file (append
489 pop3-fma-local-spool-file-alist
493 pop3-fma-spool-file-alist))))
494 (setq nnmail-spool-file gnus-offline-mail-source)))
498 (defun gnus-offline-enable-fetch-news ()
499 "*Set to fetch news."
500 (if (eq gnus-offline-news-fetch-method 'nnagent)
502 (setq gnus-agent-handle-level gnus-level-subscribed)
503 (gnus-agent-toggle-plugged t))))
506 ;; Add your custom header.
508 (defun gnus-offline-add-custom-header (header string)
509 "*Add X-Gnus-Offline-Backend header to Mail/News message."
511 (progn (goto-char (point-min))
513 (concat "^" (regexp-quote mail-header-separator) "\n"))
515 (goto-char (point-min))
516 (or (re-search-forward (concat "^" header) delimline t)
518 (goto-char delimline)
521 (setq hdr (concat header " "))
522 (setq str (concat hdr string))
523 (setq hdr (concat str "\n"))
524 (insert-string hdr)))))
526 ;; Add X-Offline-Backend header.
528 (defun gnus-offline-message-add-header ()
529 "*Add X-Gnus-Offline-Backend header to Mail/News message."
530 (if (eq gnus-offline-mail-treat-environ 'offline)
532 (if (eq gnus-offline-news-fetch-method 'nnagent)
533 (setq ver nnagent-version)
534 (setq ver nnspool-version))
535 (setq str (format "\n with %s" ver)
536 string (concat gnus-offline-header-string str))
537 (gnus-offline-add-custom-header "X-Gnus-Offline-Backend:" string))))
541 ;; Toggle plugged/unplugged
543 (defun gnus-offline-toggle-plugged (plugged)
544 "*Override function \"Jj\" - gnus-agent-toggle-plugged."
545 (interactive (list (not gnus-offline-connected)))
548 (setq gnus-offline-connected plugged)
549 (gnus-agent-toggle-plugged plugged)
550 ;; Set send mail/news function to offline functions.
551 (gnus-offline-set-online-sendmail-function)
552 (gnus-offline-set-online-post-news-function))
553 ;; Set to offline status
554 (gnus-offline-set-unplugged-state)))
556 ;; Function of hang up line.
558 (defun gnus-offline-set-unplugged-state ()
559 "*Set to unplugged state."
562 (if (functionp gnus-offline-hangup-function)
563 (funcall gnus-offline-hangup-function))
564 (setq gnus-offline-connected nil)
565 (if (eq gnus-offline-news-fetch-method 'nnagent)
566 (gnus-agent-toggle-plugged nil))
568 ;; Set send mail/news function to offline functions.
569 (gnus-offline-set-offline-sendmail-function)
570 (gnus-offline-set-offline-post-news-function)
572 (setenv "MAILHOST" nil))
574 ;; Hangup line function
576 (defun gnus-offline-hangup-line ()
577 "*Hangup line function."
578 (message "Hang up line ... ")
579 (if (stringp gnus-offline-hangup-program)
580 (apply 'start-process "hup" nil gnus-offline-hangup-program
581 gnus-offline-hangup-program-arguments))
582 (message "Hang up line ... done."))
584 ;; Hang Up line routine whe using nnspool
586 (defun gnus-offline-nnspool-hangup-line ()
587 (if (and gnus-offline-connected
588 gnus-offline-auto-hangup)
589 (gnus-offline-set-unplugged-state))
590 (gnus-offline-after-jobs-done))
592 ;; Function of all jobs has done.
594 (defun gnus-offline-after-jobs-done ()
595 "*Jobs after all online jobs."
596 (run-hooks 'gnus-offline-after-online-hook)
597 (if (eq gnus-offline-articles-to-fetch 'mail)
598 (gnus-offline-restore-mail-group-level))
599 (if (eq gnus-offline-news-fetch-method 'nnagent)
600 (or gnus-agent-expire-all
601 (gnus-offline-agent-expire)))
602 (if (and (featurep 'xemacs)
603 (fboundp 'play-sound-file))
606 (gnus-group-save-newsrc)
607 (message "All online jobs has done."))
611 ;; Toggle auto hang up
613 (defun gnus-offline-toggle-auto-hangup ()
614 "*Toggle auto hangup flag."
616 (setq string "Auto hang up logic")
617 (if gnus-offline-auto-hangup
619 (setq gnus-offline-auto-hangup nil
621 (setq gnus-offline-auto-hangup t
623 (message (format "%s %s" string str)))
625 ;; Toggle offline/online to send mail.
627 (defun gnus-offline-toggle-on/off-send-mail ()
628 "*Toggel online/offline sendmail."
630 (if (eq gnus-offline-mail-treat-environ 'offline)
632 ;; Sending mail under online environ.
633 (gnus-offline-set-online-sendmail-function)
634 (setq gnus-offline-mail-treat-environ 'online)
635 (message "Sending mail immidiately."))
636 ;; Sending mail under offline environ.
637 (gnus-offline-set-offline-sendmail-function)
638 (setq gnus-offline-mail-treat-environ 'offline)
639 (message "Sending mail temporary to spool directory.")))
641 ;; Toggle articles to fetch ... both -> mail -> news -> both
643 (defun gnus-offline-toggle-articles-to-fetch ()
644 "*Set articles to fetch... both(Mail/News) -> mail only -> News only -> both"
646 (setq string "Articles fetch from server.")
647 (cond ((eq gnus-offline-articles-to-fetch 'both)
648 (setq gnus-offline-articles-to-fetch 'mail
650 ((eq gnus-offline-articles-to-fetch 'mail)
651 (setq gnus-offline-articles-to-fetch 'news
654 (setq gnus-offline-articles-to-fetch 'both
655 str "Mail/News both")))
656 (message (format "%s %s" string str)))
658 ;; Toggle movemail program pop3.el -> movemail -> pop3.el
660 (defun gnus-offline-toggle-movemail-program ()
661 "*Toggle movemail program movemail -> pop3.el -> movemail ->..."
663 (setq string "Set nnmail-movemail-program")
664 (cond ((eq pop3-fma-movemail-type 'lisp)
665 (setq pop3-fma-movemail-type 'exe
668 (setq pop3-fma-movemail-type 'lisp
670 (message (format "%s %s" string str)))
672 ;; Send mail and Post news using Miee or gnus-agent.
674 (defun gnus-offline-empting-spool ()
675 "*Send all drafts on queue."
676 (run-hooks 'gnus-offline-before-empting-spool-hook)
677 (if (eq gnus-offline-drafts-queue-type 'miee)
678 ;; Send queued message by miee.el.
680 (if (eq gnus-offline-mail-treat-environ 'offline)
682 (message "Sending mails in spool ...")
683 ;; Using miee to send mail.
685 (message "Sending mails in spool ... done.")))
686 (message "Posting news in spool ...")
687 ;; Using miee to post news.
688 (if (and (not (stringp msspool-news-server))
689 (not msspool-news-service))
691 (setq msspool-news-server (nth 1 gnus-select-method))
692 (setq msspool-news-service 119)))
694 (message "Posting news in spool ... done."))
695 ;; Send queued message by gnus-agent
696 (message "Sending messages in spool ...")
697 (gnus-group-send-drafts)
698 (message "Sending messages in spool ... done."))
700 (run-hooks 'gnus-offline-after-empting-spool-hook))
704 (defun gnus-offline-set-interval-time ()
705 "*Set interval time for gnus-daemon."
707 (setq gnus-offline-interval-time
708 (string-to-int (read-from-minibuffer
709 (format "Interval time (now %s minutes) : "
710 gnus-offline-interval-time)
712 (if (< gnus-offline-interval-time 2)
714 (message "Retrieving message logic by timer is disabled.")
715 (setq gnus-offline-interval-time 0))
716 (message (format "Interval time set to %d minutes" gnus-offline-interval-time)))
717 (gnus-offline-processed-by-timer))
719 ;; Expire articles using gnus-agent.
721 (defun gnus-offline-agent-expire ()
722 "*Expire expirable article on News group."
728 (defun gnus-offline-define-menu-and-key ()
730 (if (eq gnus-offline-drafts-queue-type 'miee)
731 (if (featurep 'xemacs)
732 (add-hook 'gnus-group-mode-hook 'gnus-offline-define-menu-on-miee)
733 (gnus-offline-define-menu-on-miee))
734 (add-hook 'gnus-group-mode-hook 'gnus-offline-define-menu-on-agent))
735 (add-hook 'gnus-group-mode-hook
737 (local-set-key "\C-coh" 'gnus-offline-set-unplugged-state)
738 (if (not (featurep 'running-pterodactyl-gnus-0_73-or-later))
739 (local-set-key "\C-com" 'gnus-offline-toggle-movemail-program))
740 (local-set-key "\C-cof" 'gnus-offline-toggle-articles-to-fetch)
741 (local-set-key "\C-coo" 'gnus-offline-toggle-on/off-send-mail)
742 (local-set-key "\C-cox" 'gnus-offline-toggle-auto-hangup)
743 (local-set-key "\C-cos" 'gnus-offline-set-interval-time)
744 (substitute-key-definition
745 'gnus-group-get-new-news 'gnus-offline-gnus-get-new-news
747 (if (eq gnus-offline-news-fetch-method 'nnagent)
749 (substitute-key-definition
750 'gnus-agent-toggle-plugged 'gnus-offline-toggle-plugged
751 gnus-agent-group-mode-map)
752 (local-set-key "\C-coe" 'gnus-offline-agent-expire)))
753 (or (featurep 'xemacs)
754 (define-key gnus-group-mode-map
755 (if (eq system-type 'windows-nt) [S-mouse-2] [mouse-3])
756 'gnus-offline-popup-menu))))
757 (if (eq gnus-offline-news-fetch-method 'nnagent)
758 (add-hook 'gnus-summary-mode-hook
760 (substitute-key-definition
761 'gnus-agent-toggle-plugged 'gnus-offline-toggle-plugged
762 gnus-agent-summary-mode-map))))
763 (if (featurep 'xemacs)
764 ;; Overwrite the toolbar spec for gnus-group-mode.
765 (add-hook 'gnus-startup-hook
768 (mapcar (lambda (but)
769 (when (eq 'gnus-group-get-new-news (aref but 1))
770 (aset but 1 'gnus-offline-gnus-get-new-news)
772 gnus-group-toolbar))))))
775 (defun gnus-offline-define-menu-on-miee ()
776 "*Set and change menu bar on MIEE menu."
778 (if (featurep 'meadow)
783 ["Spool
\e$B$K$"$k5-;v$NAw?.
\e(B" news-spool-post t]
784 ["Spool
\e$B$K$"$k
\e(B Mail
\e$B$NAw?.
\e(B" mail-spool-send t]
786 ["Offline
\e$B>uBV$X
\e(B" message-offline-state (not message-offline-state)]
787 ["Online
\e$B>uBV$X
\e(B" message-online-state message-offline-state]
790 ["movemail
\e$B$N@ZBX$(
\e(B" gnus-offline-toggle-movemail-program
791 (not (featurep 'running-pterodactyl-gnus-0_73-or-later))]
792 ["
\e$B<hF@5-;v<oN`$NJQ99
\e(B" gnus-offline-toggle-articles-to-fetch t]
793 ["Mail
\e$BAw?.J}K!
\e(B(On/Off)
\e$B$N@ZBX$(
\e(B" gnus-offline-toggle-on/off-send-mail t]
794 ["
\e$B<+F0@ZCG$N@ZBX$(
\e(B" gnus-offline-toggle-auto-hangup t]
796 ["
\e$B<hF@:Q5-;v$r>C$9
\e(B" gnus-offline-agent-expire (eq gnus-offline-news-fetch-method 'nnagent)]
797 ["
\e$B5-;v<hF@4V3V;~4V$N@_Dj
\e(B" gnus-offline-set-interval-time t]
799 ["
\e$B2s@~$N@ZCG
\e(B" gnus-offline-set-unplugged-state gnus-offline-connected]
801 ["
\e$B%W%m%Q%F%#
\e(B..." gnus-ofsetup-customize t])
807 ["Post news in spool" news-spool-post t]
808 ["Send mails in spool" mail-spool-send t]
810 ["Message Offline" message-offline-state (not message-offline-state)]
811 ["Message Online" message-online-state message-offline-state]
814 ["Toggle movemail program" gnus-offline-toggle-movemail-program
815 (not (featurep 'running-pterodactyl-gnus-0_73-or-later))]
816 ["Toggle articles to fetch" gnus-offline-toggle-articles-to-fetch t]
817 ["Toggle online/offline send mail" gnus-offline-toggle-on/off-send-mail t]
818 ["Toggle auto hangup" gnus-offline-toggle-auto-hangup t]
820 ["Expire articles" gnus-offline-agent-expire (eq gnus-offline-news-fetch-method 'nnagent)]
821 ["Set interval time" gnus-offline-set-interval-time t]
823 ["Hang up Line." gnus-offline-set-unplugged-state gnus-offline-connected]
825 ["Customize options..." gnus-ofsetup-customize t]
827 (and (featurep 'xemacs)
828 (easy-menu-add menu))))
830 ;; define menu without miee.
832 (defun gnus-offline-define-menu-on-agent ()
833 "*Set menu bar on OFFLINE menu."
835 gnus-offline-menu-on-agent
838 (if (featurep 'meadow)
840 ["movemail
\e$B$N@ZBX$(
\e(B" gnus-offline-toggle-movemail-program
841 (not (featurep 'running-pterodactyl-gnus-0_73-or-later))]
842 ["
\e$B<hF@5-;v<oN`$NJQ99
\e(B" gnus-offline-toggle-articles-to-fetch t]
843 ["Mail
\e$BAw?.J}K!
\e(B(On/Off)
\e$B$N@ZBX$(
\e(B" gnus-offline-toggle-on/off-send-mail t]
844 ["
\e$B<+F0@ZCG$N@ZBX$(
\e(B" gnus-offline-toggle-auto-hangup t]
846 ["
\e$B<hF@:Q5-;v$r>C$9
\e(B" gnus-offline-agent-expire (eq gnus-offline-news-fetch-method 'nnagent)]
847 ["
\e$B5-;v<hF@4V3V;~4V$N@_Dj
\e(B" gnus-offline-set-interval-time t]
849 ["
\e$B2s@~$N@ZCG
\e(B" gnus-offline-set-unplugged-state gnus-offline-connected]
851 ["
\e$B%W%m%Q%F%#
\e(B..." gnus-ofsetup-customize t])
853 ["Toggle movemail program" gnus-offline-toggle-movemail-program
854 (not (featurep 'running-pterodactyl-gnus-0_73-or-later))]
855 ["Toggle articles to fetch" gnus-offline-toggle-articles-to-fetch t]
856 ["Toggle online/offline send mail" gnus-offline-toggle-on/off-send-mail t]
857 ["Toggle auto hangup" gnus-offline-toggle-auto-hangup t]
859 ["Expire articles" gnus-offline-agent-expire (eq gnus-offline-news-fetch-method 'nnagent)]
860 ["Set interval time" gnus-offline-set-interval-time t]
862 ["Hang up Line." gnus-offline-set-unplugged-state gnus-offline-connected]
864 ["Customize options..." gnus-ofsetup-customize t])))
865 (and (featurep 'xemacs)
866 (easy-menu-add gnus-offline-menu-on-agent)))
868 ;; Popup menu within the group buffer (under Emacs).
870 (defvar gnus-offline-popup-menu nil)
871 (defun gnus-offline-popup-menu (event)
872 "Popup menu for Gnus offline."
874 (unless gnus-offline-popup-menu
875 (setq gnus-offline-popup-menu
877 (if (boundp 'miee-popup-menu)
879 (assoc 'Miee (assoc 'menu-bar global-map)))
881 gnus-offline-menu-on-agent)))
882 (if (string< emacs-version "20")
883 (append (list 'keymap
884 (if (boundp 'miee-popup-menu)
891 (let* ((pop (x-popup-menu t gnus-offline-popup-menu))
892 (func (and pop (lookup-key gnus-offline-popup-menu
893 (apply 'vector pop)))))
894 (and pop func (funcall func))))
898 (defun gnus-offline-processed-by-timer ()
899 "*Set timer interval."
900 (if (and (> gnus-offline-interval-time 0)
901 (not gnus-offline-connected))
903 (gnus-demon-add-handler 'gnus-offline-gnus-get-new-news
904 gnus-offline-interval-time
905 gnus-offline-interval-time))
906 (if (= gnus-offline-interval-time 0)
907 (gnus-demon-remove-handler 'gnus-offline-gnus-get-new-news t)))
910 ;;; gnus-offline.el ends here