X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=lisp%2Friece-async.el;h=b633ff5752d02b66691d47ae3641b357bbbb75cc;hb=d464dd4cda287ad1d4722ddf565b60ebefdc3471;hp=05827cd066eb50c12dc29bbedbbe6a11a258aaef;hpb=1e66b16a79304f1c953577a369dc6f57320e8ab5;p=elisp%2Friece.git diff --git a/lisp/riece-async.el b/lisp/riece-async.el index 05827cd..b633ff5 100644 --- a/lisp/riece-async.el +++ b/lisp/riece-async.el @@ -1,4 +1,4 @@ -;;; riece-async.el --- connect to IRC server via asynchronous proxy +;;; riece-async.el --- connect to IRC server via async proxy ;; Copyright (C) 1998-2003 Daiki Ueno ;; Author: Daiki Ueno @@ -18,17 +18,16 @@ ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. ;;; Commentary: +;; NOTE: This is an add-on module for Riece. + ;; This program allows to connect to an IRC server via local proxy ;; which responds to PING requests from server. -;; To use, add the following line to your ~/.riece/init.el: -;; (add-to-list 'riece-addons 'riece-async) - ;; If you want to enable this feature per server, write the server ;; spec like this: ;; (add-to-list 'riece-server-alist @@ -38,91 +37,44 @@ ;;; Code: (require 'riece-options) -(require 'riece-ruby) ;riece-ruby-command, - ;riece-ruby-substitute-variables +(require 'riece-ruby) ;riece-ruby-command (defgroup riece-async nil - "Connect to IRC server via asynchronous proxy" + "Connect to IRC server via async proxy." :prefix "riece-" :group 'riece) -(defcustom riece-async-server-program - '("\ -orequire 'io/nonblock' -socket = TCPSocket.new(" host ", " service ") -$stdout.write(\"NOTICE CONNECTED #{$$}\\r\\n\") -$stdout.flush -$stdout.nonblock = true -trap('STOP', 'IGNORE') -trap('TSTP', 'IGNORE') -wfds_in = [] -buf = '' -loop do - rfds, wfds, = select([socket, $stdin], wfds_in) - unless wfds.empty? - until buf.length <= " max-buffer-size " - i = buf.index(\"\\r\\n\") - break unless i - buf.slice!(0 .. i + 1) - end - begin - until buf.empty? - len = $stdout.syswrite(buf) - buf.slice!(0 .. len) - end - wfds_in = [] - rescue Errno::EAGAIN - end - end - if rfds.include?(socket) - line = socket.gets(\"\\r\\n\") - break unless line - if line =~ /^(?::[^ ]+ +)?PING +(.+)\\r\\n/i - socket.write(\"PONG #{$1}\\r\\n\") - socket.flush - else - wfds_in = [$stdout] - buf << line - end - end - if rfds.include?($stdin) - line = $stdin.gets(\"\\r\\n\") - break unless line - socket.write(line) - socket.flush - end -end -socket.close -") - "Ruby program of asynchronous proxy." - :type 'list - :group 'riece-async) - -(defcustom riece-async-max-buffer-size 65535 +(defcustom riece-async-buffer-size 65535 "Maximum size of the write buffer." :type 'integer :group 'riece-async) +(defcustom riece-async-backup-file (expand-file-name "riece-async.bak" + riece-directory) + "A file which contains outdated messages." + :type 'string + :group 'riece-async) + +(defvar riece-async-server-program "aproxy.rb" + "The server program file. If the filename is not absolute, it is +assumed that the file is in the same directory of this file.") + +(defvar riece-async-server-program-arguments + (list "-s" (number-to-string riece-async-buffer-size) + "-b" riece-async-backup-file) + "Command line arguments passed to `riece-async-server-program'.") + (defconst riece-async-description - "Keep IRC connection with external process") + "Connect to IRC server via async proxy.") ;;;###autoload (defun riece-async-open-network-stream (name buffer host service) - (let* ((process-connection-type nil) - (process (start-process name buffer riece-ruby-command "-rsocket"))) - (process-kill-without-query process) - (process-send-string process - (riece-ruby-substitute-variables - (list (cons 'host - (concat "'" host "'")) - (cons 'service - (if (numberp service) - (number-to-string service) - (concat "'" service "'"))) - (cons 'max-buffer-size - (number-to-string - riece-async-max-buffer-size))))) - (process-send-string process "\0\n") ;input to process is needed + (let* (process-connection-type + (process + (apply #'start-process name buffer riece-ruby-command + (expand-file-name riece-async-server-program + riece-data-directory) + riece-async-server-program-arguments))) (if buffer (save-excursion (set-buffer (process-buffer process)) @@ -132,6 +84,7 @@ socket.close (not (looking-at (format "NOTICE CONNECTED %d" (process-id process)))))) (accept-process-output process)))) + (process-kill-without-query process) process)) (defun riece-async-insinuate () @@ -140,4 +93,4 @@ socket.close (provide 'riece-async) -;;; riece-rdcc.el ends here +;;; riece-async.el ends here