diff options
Diffstat (limited to 'share/emacs/site-lisp/w3m/w3m-proc.el')
-rw-r--r-- | share/emacs/site-lisp/w3m/w3m-proc.el | 801 |
1 files changed, 0 insertions, 801 deletions
diff --git a/share/emacs/site-lisp/w3m/w3m-proc.el b/share/emacs/site-lisp/w3m/w3m-proc.el deleted file mode 100644 index fe76a52ed50..00000000000 --- a/share/emacs/site-lisp/w3m/w3m-proc.el +++ /dev/null @@ -1,801 +0,0 @@ -;;; w3m-proc.el --- Functions and macros to control sub-processes - -;; Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009 -;; TSUCHIYA Masatoshi <tsuchiya@namazu.org> - -;; Authors: TSUCHIYA Masatoshi <tsuchiya@namazu.org>, -;; Shun-ichi GOTO <gotoh@taiyo.co.jp>, -;; Satoru Takabayashi <satoru-t@is.aist-nara.ac.jp>, -;; Hideyuki SHIRAI <shirai@meadowy.org>, -;; Keisuke Nishida <kxn30@po.cwru.edu>, -;; Yuuichi Teranishi <teranisi@gohome.org>, -;; Akihiro Arisawa <ari@mbf.sphere.ne.jp>, -;; Katsumi Yamaoka <yamaoka@jpl.org> -;; Keywords: w3m, WWW, hypermedia - -;; This file is a part of emacs-w3m. - -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program; see the file COPYING. If not, write to -;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -;; Boston, MA 02110-1301, USA. - -;;; Commentary: - -;; This module is a part of emacs-w3m which provides functions and -;; macros to control sub-processes. Visit -;; <URL:http://emacs-w3m.namazu.org/> for more details of emacs-w3m. - -;;; Code: - -(eval-when-compile - (require 'cl)) - -(require 'w3m-util) - -(eval-when-compile - ;; Variable(s) which are used in the following inline functions. - ;; They should be defined in the other module at run-time. - (defvar w3m-current-url) - (defvar w3m-current-buffer) - (defvar w3m-current-process) - (defvar w3m-profile-directory) - (defvar w3m-terminal-coding-system) - (defvar w3m-command) - (defvar w3m-command-arguments) - (defvar w3m-command-environment) - (defvar w3m-async-exec) - (defvar w3m-process-connection-type) - (defvar w3m-process-modeline-format) - (defvar w3m-work-buffer-list) - (autoload 'w3m-idle-images-show-unqueue "w3m")) - -;; Silence the Emacs' byte-compiler that says ``might not be defined''. -(eval-when-compile - (defun w3m-decode-coding-string-with-priority (str coding) - ())) - -(defvar w3m-process-inhibit-quit t - "`w3m-process-sentinel' binds `inhibit-quit' according to this variable.") -(defvar w3m-process-timeout 300 - "Number of seconds idle time waiting for processes to terminate.") -(defvar w3m-process-kill-surely (featurep 'meadow) - "If non-nil, kill the process surely.") - -(defconst w3m-process-max 5 "The maximum limit of the working processes.") -(defvar w3m-process-queue nil "Queue of processes.") - -(defvar w3m-process-exit-status nil "The last exit status of a process.") -(defvar w3m-process-authinfo-alist nil) -(defvar w3m-process-accept-alist nil) - -(defvar w3m-process-user nil) -(defvar w3m-process-passwd nil) -(defvar w3m-process-realm nil) -(defvar w3m-process-object nil) -(make-variable-buffer-local 'w3m-process-user) -(make-variable-buffer-local 'w3m-process-passwd) -(make-variable-buffer-local 'w3m-process-realm) -(make-variable-buffer-local 'w3m-process-object) - -(defvar w3m-process-modeline-string nil - "Modeline string to show status of retrieving process.") -(make-variable-buffer-local 'w3m-process-modeline-string) - -(defvar w3m-process-proxy-user nil "User name of the proxy server.") -(defvar w3m-process-proxy-passwd nil "Password of the proxy server.") -(defvar w3m-process-ssl-passphrase nil - "Passphrase for the client certificate.") - -(defmacro w3m-process-with-coding-system (&rest body) - "Set coding systems for `w3m-command', and evaluate BODY." - `(let ((coding-system-for-read 'binary) - (coding-system-for-write w3m-terminal-coding-system) - (default-process-coding-system - (cons 'binary w3m-terminal-coding-system)) - (process-connection-type w3m-process-connection-type)) - ,@body)) -(put 'w3m-process-with-coding-system 'lisp-indent-function 0) -(put 'w3m-process-with-coding-system 'edebug-form-spec '(body)) - -(defmacro w3m-process-with-environment (alist &rest body) - "Set the environment variables according to ALIST, and evaluate BODY." - `(let ((process-environment (copy-sequence process-environment)) - (temporary-file-directory - (if (file-directory-p w3m-profile-directory) - (file-name-as-directory w3m-profile-directory) - ,(if (featurep 'xemacs) - ;; Though `temporary-file-directory' exists even in XEmacs, - ;; that's only an imitation provided by APEL. - '(temp-directory) - 'temporary-file-directory))) - (default-directory - (cond ((file-directory-p w3m-profile-directory) - (file-name-as-directory w3m-profile-directory)) - ((file-directory-p (expand-file-name "~/")) - (expand-file-name "~/")) - (t temporary-file-directory)))) - ;; XEmacs obtains tmp-dir from the `temp-directory' function of which - ;; return value can only be modified by the following env vars. - ,@(if (featurep 'xemacs) - '((setenv "TEMP" temporary-file-directory) ;; Windoze - (setenv "TMPDIR" temporary-file-directory))) ;; Un|x - (dolist (pair ,alist) - (setenv (car pair) (cdr pair))) - ,@body)) -(put 'w3m-process-with-environment 'lisp-indent-function 1) -(put 'w3m-process-with-environment 'edebug-form-spec '(form body)) - -(defun w3m-process-p (object) - "Return t if OBJECT is a `w3m-process' object." - (and (consp object) - (vectorp (cdr object)) - (eq 'w3m-process-object (aref (cdr object) 0)))) - -(put 'w3m-process-new 'edebug-form-spec '(form form form &optional form form)) -(defmacro w3m-process-new (command arguments buffer &optional process handlers) - "Return a new `w3m-process' object." - `(cons (cons ,command ,arguments) - (vector 'w3m-process-object - ,buffer - ,process - ,handlers))) - -(defmacro w3m-process-command (object) - `(car (car ,object))) -(defmacro w3m-process-arguments (object) - `(cdr (car ,object))) -(defmacro w3m-process-buffer (object) - `(aref (cdr ,object) 1)) -(defmacro w3m-process-process (object) - `(aref (cdr ,object) 2)) -(defmacro w3m-process-handlers (object) - `(aref (cdr ,object) 3)) - -(put 'w3m-process-handler-new 'edebug-form-spec '(form form form)) -(defmacro w3m-process-handler-new (buffer parent-buffer functions) - `(vector ,buffer ,parent-buffer ,functions nil)) -(defmacro w3m-process-handler-buffer (handler) - `(aref ,handler 0)) -(defmacro w3m-process-handler-parent-buffer (handler) - `(aref ,handler 1)) -(defmacro w3m-process-handler-functions (handler) - `(aref ,handler 2)) -(defmacro w3m-process-handler-result (handler) - `(aref ,handler 3)) - -(defun w3m-process-push (handler command arguments) - "Generate a new `w3m-process' object which is provided by HANDLER, -ARGUMENTS and this buffer, regist it to `w3m-process-queue', and -return it." - (let ((x (assoc (cons command arguments) w3m-process-queue))) - (unless x - (setq x (w3m-process-new command arguments (current-buffer))) - (push x w3m-process-queue)) - (push (w3m-process-handler-new (current-buffer) w3m-current-buffer handler) - (w3m-process-handlers x)) - (with-current-buffer (w3m-process-buffer x) - (setq w3m-process-object x)))) - -(defun w3m-process-kill-process (process) - "Kill process PROCESS safely." - (when (processp process) - (set-process-filter process 'ignore) - (set-process-sentinel process 'ignore) - (when (memq (process-status process) '(run stop)) - (kill-process process) - (when w3m-process-kill-surely - (while (memq (process-status process) '(run stop)) - (sit-for 0.1)))))) - -(defun w3m-process-start-process (object &optional no-sentinel) - "Start a process specified by the OBJECT, return always nil. -When NO-SENTINEL is not equal to nil, all status changes of the -generated asynchronous process is ignored. Otherwise, -`w3m-process-sentinel' is given to the process as the sentinel." - (if (w3m-process-process object) - (when no-sentinel - (set-process-sentinel (w3m-process-process object) 'ignore)) - (with-current-buffer (w3m-process-buffer object) - (w3m-process-with-coding-system - (w3m-process-with-environment w3m-command-environment - (let* ((command (w3m-process-command object)) - (proc (apply 'start-process command - (current-buffer) command - (w3m-process-arguments object))) - (authinfo (when w3m-current-url - (w3m-url-authinfo w3m-current-url))) - (set-process-query-on-exit-flag - (if (fboundp 'set-process-query-on-exit-flag) - 'set-process-query-on-exit-flag - 'process-kill-without-query))) - (setq w3m-process-user (car authinfo) - w3m-process-passwd (cdr authinfo) - w3m-process-realm nil) - (setf (w3m-process-process object) proc) - (set-process-filter proc 'w3m-process-filter) - (set-process-sentinel proc (if no-sentinel - 'ignore - 'w3m-process-sentinel)) - (funcall set-process-query-on-exit-flag proc nil)))))) - nil) ;; The return value of `w3m-process-start-process'. - -(defun w3m-process-kill-stray-processes () - "Kill stray processes." - (dolist (obj w3m-process-queue) - (unless (buffer-name (w3m-process-buffer obj)) - (setq w3m-process-queue (delq obj w3m-process-queue)) - (when (w3m-process-process obj) - (w3m-process-kill-process (w3m-process-process obj)))))) - -(defun w3m-process-start-queued-processes () - "Start a process which is registerd in `w3m-process-queue' if the -number of current working processes is less than `w3m-process-max'." - (w3m-process-kill-stray-processes) - (let ((num 0)) - (catch 'last - (dolist (obj (reverse w3m-process-queue)) - (when (buffer-name (w3m-process-buffer obj)) - (if (> (incf num) w3m-process-max) - (throw 'last nil) - (w3m-process-start-process obj))))))) - -(defun w3m-process-stop (buffer) - "Remove handlers related to the buffer BUFFER, and stop processes -which have no handler." - (interactive (list (current-buffer))) - (w3m-cancel-refresh-timer buffer) - (setq w3m-process-queue - (delq nil - (mapcar - (lambda (obj) - (let ((handlers - ;; List up handlers related to other buffer - ;; than the buffer BUFFER. - (delq nil - (mapcar - (lambda (handler) - (unless (eq buffer - (w3m-process-handler-parent-buffer - handler)) - handler)) - (w3m-process-handlers obj))))) - (if handlers - (w3m-process-new - (w3m-process-command obj) - (w3m-process-arguments obj) - (w3m-process-buffer obj) - (w3m-process-process obj) - (if (memq (w3m-process-buffer obj) - (mapcar (lambda (x) - (w3m-process-handler-buffer x)) - handlers)) - handlers - (cons - ;; Dummy handler to remove buffer. - (w3m-process-handler-new - (w3m-process-buffer obj) - (w3m-process-handler-parent-buffer (car handlers)) - (lambda (x) (w3m-kill-buffer (current-buffer)))) - handlers))) - (when (w3m-process-process obj) - (w3m-process-kill-process (w3m-process-process obj))) - (dolist (handler (w3m-process-handlers obj)) - (w3m-kill-buffer (w3m-process-handler-buffer handler))) - nil))) - w3m-process-queue))) - (when (buffer-name buffer) - (with-current-buffer buffer - (setq w3m-current-process nil))) - (w3m-process-start-queued-processes) - (w3m-force-window-update-later buffer)) - -(defun w3m-process-shutdown () - (let ((list w3m-process-queue)) - (setq w3m-process-queue nil - w3m-process-authinfo-alist nil - w3m-process-accept-alist nil) - (dolist (obj list) - (when (buffer-name (w3m-process-buffer obj)) - (when (w3m-process-process obj) - (w3m-process-kill-process (w3m-process-process obj)))) - (w3m-kill-buffer (w3m-process-buffer obj))))) - -(defmacro w3m-process-with-null-handler (&rest body) - "Generate the null handler, and evaluate BODY. -When BODY is evaluated, the local variable `handler' keeps the null -handler." - (let ((var (gensym "--tempvar--"))) - `(let ((,var (let (handler) ,@body))) - (when (w3m-process-p ,var) - (w3m-process-start-process ,var)) - ,var))) -(put 'w3m-process-with-null-handler 'lisp-indent-function 0) -(put 'w3m-process-with-null-handler 'edebug-form-spec '(body)) - -;; Error symbol: -(put 'w3m-process-timeout 'error-conditions '(error w3m-process-timeout)) -(put 'w3m-process-timeout 'error-message "Time out") - -(defun w3m-process-error-handler (error-data process) - (setq w3m-process-queue (delq process w3m-process-queue)) - (w3m-process-kill-process (w3m-process-process process)) - (signal (car error-data) (cdr error-data))) - -(defvar w3m-process-waited nil - "Non-nil means that `w3m-process-with-wait-handler' is being evaluated.") - -(defun w3m-process-wait-process (process seconds) - "Wait for SECONDS seconds or until PROCESS will exit. -Returns the exit status of the PROCESS when it exit normally, -otherwise returns nil." - (catch 'timeout - (let ((start (current-time))) - (while (or (and (prog2 - (discard-input) - (not (save-current-buffer (sit-for 0.1))) - (discard-input)) - ;; Some input is detected but it may be a key - ;; press event which should be ignored when the - ;; process is not running. - (memq (process-status process) '(open run))) - (memq (process-status process) '(open run stop))) - (and seconds - (< seconds (w3m-time-lapse-seconds start (current-time))) - (throw 'timeout nil))) - (process-exit-status process)))) - -(defmacro w3m-process-with-wait-handler (&rest body) - "Generate the waiting handler, and evaluate BODY. -When BODY is evaluated, the local variable `handler' keeps the handler -which will wait for the end of the evaluation." - (let ((result (gensym "--result--")) - (wait-function (gensym "--wait-function--"))) - `(let ((w3m-process-waited t) - (,result) - (,wait-function (make-symbol "wait-function"))) - (fset ,wait-function 'identity) - (setq ,result (let ((handler (list ,wait-function))) ,@body)) - (while (w3m-process-p ,result) - (condition-case error - (let (w3m-process-inhibit-quit inhibit-quit) - ;; No sentinel function is registered and the process - ;; sentinel function is called from this macro, in - ;; order to avoid the dead-locking which occurs when - ;; this macro is called in the environment that - ;; `w3m-process-sentinel' is evaluated. - (w3m-process-start-process ,result t) - (unless (w3m-process-wait-process (w3m-process-process ,result) - w3m-process-timeout) - (w3m-process-error-handler (cons 'w3m-process-timeout nil) - ,result))) - (quit (w3m-process-error-handler error ,result))) - (w3m-process-sentinel (w3m-process-process ,result) "finished\n" t) - (setq ,result - (catch 'result - (dolist (handler (w3m-process-handlers ,result)) - (when (memq ,wait-function - (w3m-process-handler-functions handler)) - (throw 'result (w3m-process-handler-result handler)))) - (w3m-process-error-handler (cons 'error - "Can't find wait handler") - ,result)))) - ,result))) -(put 'w3m-process-with-wait-handler 'lisp-indent-function 0) -(put 'w3m-process-with-wait-handler 'edebug-form-spec '(body)) - -;;; Explanation of w3m-process-do in Japanese: -;; -;; w3m-process-do $B$O!"HsF14|=hM}$r4JC1$K=q$/$?$a$N%^%/%m$G$"$k!#Nc$($P!"(B -;; -;; (w3m-process-do -;; (var (async-form...)) -;; post-body...) -;; -;; $B$H$$$&$h$&$K=q$/$H!"0J2<$N=g=x$G=hM}$,9T$o$l$k!#(B -;; -;; (1) async-form $B$rI>2A(B -;; --> async-form $BFb$GHsF14|%W%m%;%9$,@8@.$5$l$?>l9g$O!"$=$NHsF1(B -;; $B4|%W%m%;%9=*N;8e$K(B post-body $B$,I>2A$5$l$k$h$&$K!"%O%s%I%i(B -;; $B$KDI2C(B -;; --> $BHsF14|%W%m%;%9$,@8@.$5$l$J$+$C$?>l9g$O!"C1$K<!$N%9%F%C%W(B -;; $B$K?J$`(B(= post-body $B$rI>2A$9$k(B)$B!#(B -;; (2) post-body $B$rI>2A(B -;; -;; $B$J$*!"(Basync-form / post-body $B$,I>2A$5$l$k;~!"$=$NFbIt$GHsF14|%W%m%;(B -;; $B%9$,@8@.$5$l$?>l9g$K!"$=$NJV$jCM$r=hM}$9$k$?$a$N%O%s%I%i$,!"JQ?t(B -;; handler $B$K@_Dj$5$l$F$$$k!#HsF14|$J=hM}$r9T$&4X?t$r8F$S=P$9>l9g$K$O!"(B -;; $B$=$N4X?t$N0z?t$H$7$FI,$:(B handler $B$rEO$5$J$1$l$P$J$i$J$$!#(B -;; -;; $B$^$?!"(Bw3m-process-do $B$O!"8=:_$N%O%s%I%i$NFbMF$rD4$Y$k$?$a!"$=$N%^%/(B -;; $B%m$,8F$S=P$5$l$F$$$k4D6-$NJQ?t(B handler $B$r;2>H$9$k!#Nc$($P!"(B -;; -;; (let (handler) (w3m-process-do ...)) -;; -;; $B$HJQ?t(B handler $B$r(B nil $B$KB+G{$7$F$*$/$H!"!V8=;~E@$N%O%s%I%i$O6u$G$"(B -;; $B$k(B = $BHsF14|%W%m%;%9<B9T8e$KI,MW$J=hM}$OB8:_$7$J$$!W$H$$$&0UL#$K$J$j!"(B -;; w3m-process-do() $B$O!"HsF14|%W%m%;%9$,@8@.$5$l$?>l9g$K$OC1$K(B nil $B$r(B -;; $BJV$7!"$=$l0J30$N>l9g$O(B post-body $B$NCM$rJV$9!#(B -;; -(defmacro w3m-process-do (spec &rest body) - "(w3m-process-do (VAR FORM) BODY...): Eval the body BODY asynchronously. -If an asynchronous process is generated in the evaluation of the form -FORM, this macro returns its object immdiately, and the body BODY will -be evaluated after the end of the process with the variable VAR which -is set to the result of the form FORM. Otherwise, the body BODY is -evaluated at the same time, and this macro returns the result of the -body BODY." - (let ((var (or (car spec) (gensym "--tempvar--"))) - (form (cdr spec)) - (post-function (gensym "--post-function--"))) - `(let ((,post-function (lambda (,var) ,@body))) - (let ((,var (let ((handler (cons ,post-function handler))) - ,@form))) - (if (w3m-process-p ,var) - (if handler - ,var - (w3m-process-start-process ,var)) - (if (w3m-process-p (setq ,var (funcall ,post-function ,var))) - (if handler - ,var - (w3m-process-start-process ,var)) - ,var)))))) -(put 'w3m-process-do 'lisp-indent-function 1) -(put 'w3m-process-do 'edebug-form-spec '((symbolp form) def-body)) - -(defmacro w3m-process-do-with-temp-buffer (spec &rest body) - "(w3m-process-do-with-temp-buffer (VAR FORM) BODY...): -Like `w3m-process-do', but the form FORM and the body BODY are -evaluated in a temporary buffer." - (let ((var (or (car spec) (gensym "--tempvar--"))) - (form (cdr spec)) - (post-body (gensym "--post-body--")) - (post-handler (gensym "--post-handler--")) - (temp-buffer (gensym "--temp-buffer--")) - (current-buffer (gensym "--current-buffer--"))) - `(lexical-let ((,temp-buffer - (w3m-get-buffer-create - (generate-new-buffer-name w3m-work-buffer-name))) - (,current-buffer (current-buffer))) - (labels ((,post-body (,var) - (when (buffer-name ,temp-buffer) - (set-buffer ,temp-buffer)) - ,@body) - (,post-handler (,var) - (w3m-kill-buffer ,temp-buffer) - (when (buffer-name ,current-buffer) - (set-buffer ,current-buffer)) - ,var)) - (let ((,var (let ((handler - (cons ',post-body (cons ',post-handler handler)))) - (with-current-buffer ,temp-buffer ,@form)))) - (if (w3m-process-p ,var) - (if handler - ,var - (w3m-process-start-process ,var)) - (if (w3m-process-p - (setq ,var (save-current-buffer - (let ((handler (cons ',post-handler handler))) - (,post-body ,var))))) - (if handler - ,var - (w3m-process-start-process ,var)) - (,post-handler ,var)))))))) -(put 'w3m-process-do-with-temp-buffer 'lisp-indent-function 1) -(put 'w3m-process-do-with-temp-buffer 'edebug-form-spec - '((symbolp form) def-body)) - - -(defun w3m-process-start (handler command arguments) - "Run COMMAND with ARGUMENTS, and eval HANDLER asynchronously." - (if w3m-async-exec - (w3m-process-do - (exit-status (w3m-process-push handler command arguments)) - (w3m-process-start-after exit-status)) - (w3m-process-start-after - (w3m-process-with-coding-system - (w3m-process-with-environment w3m-command-environment - (apply 'call-process command nil t nil arguments)))))) - -(defun w3m-process-start-after (exit-status) - (when w3m-current-buffer - (with-current-buffer w3m-current-buffer - (setq w3m-process-modeline-string nil))) - (cond - ((numberp exit-status) - (zerop (setq w3m-process-exit-status exit-status))) - ((not exit-status) - (setq w3m-process-exit-status nil)) - (t - (setq w3m-process-exit-status - (string-as-multibyte (format "%s" exit-status))) - nil))) - -(defvar w3m-process-background nil - "Non-nil means that an after handler is being evaluated.") - -(defun w3m-process-sentinel (process event &optional ignore-queue) - ;; Ensure that this function will be never called repeatedly. - (set-process-sentinel process 'ignore) - (let ((inhibit-quit w3m-process-inhibit-quit) - (w3m-process-background t)) - (unwind-protect - (if (buffer-name (process-buffer process)) - (with-current-buffer (process-buffer process) - (w3m-static-unless (featurep 'xemacs) - (accept-process-output process 1)) - (setq w3m-process-queue - (delq w3m-process-object w3m-process-queue)) - (let ((exit-status (process-exit-status process)) - (buffer (current-buffer)) - (realm w3m-process-realm) - (user w3m-process-user) - (passwd w3m-process-passwd) - (obj w3m-process-object)) - (setq w3m-process-object nil) - (dolist (x (w3m-process-handlers obj)) - (when (and - (buffer-name (w3m-process-handler-buffer x)) - (buffer-name (w3m-process-handler-parent-buffer x))) - (set-buffer (w3m-process-handler-buffer x)) - (unless (eq buffer (current-buffer)) - (insert-buffer-substring buffer)))) - (dolist (x (w3m-process-handlers obj)) - (when (and - (buffer-name (w3m-process-handler-buffer x)) - (buffer-name (w3m-process-handler-parent-buffer x))) - (set-buffer (w3m-process-handler-buffer x)) - (let ((w3m-process-exit-status) - (w3m-current-buffer - (w3m-process-handler-parent-buffer x)) - (handler - (w3m-process-handler-functions x)) - (exit-status exit-status)) - (when realm - (w3m-process-set-authinfo w3m-current-url - realm user passwd)) - (while (and handler - (not (w3m-process-p - (setq exit-status - (funcall (pop handler) - exit-status)))))) - (setf (w3m-process-handler-result x) exit-status)))))) - ;; Something wrong has been occured. - (catch 'last - (dolist (obj w3m-process-queue) - (when (eq process (w3m-process-process obj)) - (setq w3m-process-queue (delq obj w3m-process-queue)) - (throw 'last nil))))) - (delete-process process) - (unless ignore-queue - (w3m-process-start-queued-processes))))) - -(defun w3m-process-filter (process string) - (when (buffer-name (process-buffer process)) - (with-current-buffer (process-buffer process) - (let ((buffer-read-only nil) - (case-fold-search nil)) - (goto-char (process-mark process)) - (insert string) - (set-marker (process-mark process) (point)) - (unless (string= "" string) - (goto-char (point-min)) - (cond - ((and (looking-at - "\\(?:Accept [^\n]+\n\\)*\\([^\n]+: accept\\? \\)(y/n)") - (= (match-end 0) (point-max))) - ;; SSL certificate - (message "") - (let ((yn (w3m-process-y-or-n-p w3m-current-url (match-string 1)))) - (ignore-errors - (process-send-string process (if yn "y\n" "n\n")) - (delete-region (point-min) (point-max))))) - ((and (looking-at "\n?Accept unsecure SSL session:.*\n") - (= (match-end 0) (point-max))) - (delete-region (point-min) (point-max))) - ((and (looking-at "\\(\n?Wrong username or password\n\\)?\ -Proxy Username for \\(?:.*\\): Proxy Password: ") - (= (match-end 0) (point-max))) - (when (or (match-beginning 1) - (not (stringp w3m-process-proxy-passwd))) - (setq w3m-process-proxy-passwd - (read-passwd "Proxy Password: "))) - (ignore-errors - (process-send-string process - (concat w3m-process-proxy-passwd "\n")) - (delete-region (point-min) (point-max)))) - ((and (looking-at "\\(\n?Wrong username or password\n\\)?\ -Proxy Username for \\(.*\\): ") - (= (match-end 0) (point-max))) - (when (or (match-beginning 1) - (not (stringp w3m-process-proxy-user))) - (setq w3m-process-proxy-user - (read-from-minibuffer (concat - "Proxy Username for " - (match-string 2) ": ")))) - (ignore-errors - (process-send-string process - (concat w3m-process-proxy-user "\n")))) - ((and (looking-at "\\(\n?Wrong username or password\n\\)?\ -Username for [^\n]*\n?: Password: ") - (= (match-end 0) (point-max))) - (when (or (match-beginning 1) - (not (stringp w3m-process-passwd))) - (setq w3m-process-passwd - (w3m-process-read-passwd w3m-current-url - w3m-process-realm - w3m-process-user - (match-beginning 1)))) - (ignore-errors - (process-send-string process - (concat w3m-process-passwd "\n")) - (delete-region (point-min) (point-max)))) - ((and (looking-at "\\(\n?Wrong username or password\n\\)?\ -Username for \\(.*\\)\n?: ") - (= (match-end 0) (point-max))) - (setq w3m-process-realm (w3m-decode-coding-string-with-priority - (match-string 2) nil)) - (when (or (match-beginning 1) - (not (stringp w3m-process-user))) - (setq w3m-process-user - (w3m-process-read-user w3m-current-url - w3m-process-realm - (match-beginning 1)))) - (ignore-errors - (process-send-string process - (concat w3m-process-user "\n")))) - ((and (looking-at "Enter PEM pass phrase:") - (= (match-end 0) (point-max))) - (unless (stringp w3m-process-ssl-passphrase) - (setq w3m-process-ssl-passphrase - (read-passwd "PEM pass phrase: "))) - (ignore-errors - (process-send-string process - (concat w3m-process-ssl-passphrase "\n")) - (delete-region (point-min) (point-max)))) - ((progn - (or (search-forward "\nW3m-current-url:" nil t) - (goto-char (process-mark process))) - (re-search-backward - "^W3m-\\(?:in-\\)?progress: \\([.0-9]+/[.0-9]+[a-zA-Z]?b\\)$" - nil t)) - (let ((str (w3m-process-modeline-format (match-string 1))) - (buf)) - (save-current-buffer - (dolist (handler (w3m-process-handlers w3m-process-object)) - (when (setq buf (w3m-process-handler-parent-buffer handler)) - (if (buffer-name buf) - (progn - (set-buffer buf) - (setq w3m-process-modeline-string str)) - (w3m-process-kill-stray-processes))))))))))))) - -(defun w3m-process-modeline-format (str) - (ignore-errors - (cond - ((stringp w3m-process-modeline-format) - (format w3m-process-modeline-format - (if (string-match "/0\\([a-zA-Z]?b\\)\\'" str) - (replace-match "\\1" t nil str) - str))) - ((functionp w3m-process-modeline-format) - (funcall w3m-process-modeline-format str))))) - -;; w3m-process-authinfo-alist has an association list as below format. -;; (("root1" ("realm11" ("user11" . "pass11") -;; ("user12" . "pass12")) -;; ("realm12" ("user13" . "pass13"))) -;; ("root2" ("realm21" ("user21" . "pass21")))) -(defun w3m-process-set-authinfo (url realm username password) - (let (x y z (root (w3m-get-server-hostname url))) - (if (setq x (assoc root w3m-process-authinfo-alist)) - (if (setq y (assoc realm x)) - (if (setq z (assoc username y)) - ;; Change a password only. - (setcdr z password) - ;; Add a pair of a username and a password. - (setcdr y (cons (cons username password) (cdr y)))) - ;; Add a 3-tuple of a realm, a username and a password. - (setcdr x (cons (cons realm (list (cons username password))) - (cdr x)))) - ;; Add a 4-tuple of a server root, a realm, a username and a password. - (push (cons root (list (cons realm (list (cons username password))))) - w3m-process-authinfo-alist)))) - -(defun w3m-process-read-user (url &optional realm ignore-history) - "Read a user name for URL and REALM." - (let* ((root (when (stringp url) (w3m-get-server-hostname url))) - (ident (or realm root)) - (alist)) - (if (and (not ignore-history) - (setq alist - (cdr (assoc realm - (cdr (assoc root - w3m-process-authinfo-alist)))))) - (if (= 1 (length alist)) - (caar alist) - (completing-read (if ident - (format "Select username for %s: " ident) - "Select username: ") - (mapcar (lambda (x) (cons (car x) (car x))) alist) - nil t)) - (read-from-minibuffer (if ident - (format "Username for %s: " ident) - "Username: "))))) - -(defun w3m-process-read-passwd (url &optional realm username ignore-history) - "Read a password for URL, REALM, and USERNAME." - (let* ((root (when (stringp url) (w3m-get-server-hostname url))) - (ident (or realm root)) - (pass (cdr (assoc username - (cdr (assoc realm - (cdr (assoc root - w3m-process-authinfo-alist)))))))) - (if (and pass (not ignore-history)) - pass - (read-passwd (format (if ident - (format "Password for %s%%s: " ident) - "Password%s: ") - (if (and (stringp pass) - (> (length pass) 0) - (not (featurep 'xemacs))) - (concat " (default " - (make-string (length pass) ?\*) - ")") - "")) - nil pass)))) - -(defun w3m-process-y-or-n-p (url prompt) - "Ask user a \"y or n\" question. Return t if answer is \"y\". -NOTE: This function is designed to avoid annoying questions. So when -the same questions is reasked, its previous answer is reused without -prompt." - (let ((root (w3m-get-server-hostname url)) - (map (copy-keymap query-replace-map)) - elem answer) - ;; ignore [space] to avoid answering y without intention. - (define-key map " " 'ignore) - (let ((query-replace-map map)) - (if (setq elem (assoc root w3m-process-accept-alist)) - (if (member prompt (cdr elem)) - ;; When the same question has been asked, the previous - ;; answer is reused. - (setq answer t) - ;; When any question for the same server has been asked, - ;; regist the pair of this question and its answer to - ;; `w3m-process-accept-alist'. - (when (setq answer (y-or-n-p prompt)) - (setcdr elem (cons prompt (cdr elem))))) - ;; When no question for the same server has been asked, regist - ;; the 3-tuple of the server, the question and its answer to - ;; `w3m-process-accept-alist'. - (when (setq answer (y-or-n-p prompt)) - (push (cons root (list prompt)) w3m-process-accept-alist))) - answer))) - -;; Silence the byte compiler complaining against `gensym' like: -;; "Warning: the function `gensym' might not be defined at runtime." -(eval-when-compile - (and (boundp 'byte-compile-unresolved-functions) - (fboundp 'gensym) - (symbol-file 'gensym) - (string-match "/cl-macs\\.el[^/]*\\'" (symbol-file 'gensym)) - (condition-case nil - (setq byte-compile-unresolved-functions - (delq (assq 'gensym byte-compile-unresolved-functions) - byte-compile-unresolved-functions)) - (error)))) - -(provide 'w3m-proc) - -;;; w3m-proc.el ends here |