X-Git-Url: https://cgit.sxemacs.org/?p=riece;a=blobdiff_plain;f=lisp%2Friece-async.el;h=6841a0c99ac395b95f4daa018ea21f239de57f4b;hp=c39ccbe7ea8d2ba3dd2aeaacc671792cd747a092;hb=19580aaa990e2d6cda91579c735b7d02f02cd910;hpb=b15f103e353f243f165a94604862e3e0dbcc1bc5 diff --git a/lisp/riece-async.el b/lisp/riece-async.el index c39ccbe..6841a0c 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 @@ -23,12 +23,11 @@ ;;; 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 @@ -37,104 +36,44 @@ ;;; Code: +(require 'riece-options) + (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-ruby-command "ruby" - "Command name for Ruby interpreter." - :type 'string +(defcustom riece-async-buffer-size 65535 + "Maximum size of the write buffer." + :type 'integer :group 'riece-async) -(defcustom riece-async-server-program - '("\ -require '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? - begin - until buf.empty? - len = $stdout.syswrite(buf) - buf.slice!(0 .. len) - end - wfds_in = [] - rescue Errno::EAGAIN - end - end - if rfds.delete(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 - until buf.length <= " max-buffer-size " - buf.slice!(0 .. buf.index(\"\r\n\")) - end - end - end - if rfds.delete($stdin) - line = $stdin.gets(\"\r\n\") - break unless line - socket.write(line) - socket.flush - end -end -socket.close -exit -") - "Ruby program of asynchronous proxy" - :type 'list +(defcustom riece-async-backup-file (expand-file-name "riece-async.bak" + riece-directory) + "A file which contains outdated messages." + :type 'string :group 'riece-async) -(defcustom riece-async-max-buffer-size 65535 - "Maximum size of the write buffer" - :type 'integer - :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" riece-async-buffer-size + "-b" riece-async-backup-file) + "Command line arguments passed to `riece-async-server-program'.") -(defun riece-async-substitute-variables (program variable value) - (setq program (copy-sequence program)) - (let ((pointer program)) - (while pointer - (setq pointer (memq variable program)) - (if pointer - (setcar pointer value))) - program)) +(defconst riece-async-description + "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 "ruby" "-rsocket"))) - (process-kill-without-query process) - (process-send-string process - (apply #'concat - (riece-async-substitute-variables - (riece-async-substitute-variables - (riece-async-substitute-variables - riece-async-server-program - 'host - (concat "'" host "'")) - 'service - (if (numberp service) - (number-to-string service) - (concat "'" service "'"))) - '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)) @@ -144,6 +83,7 @@ exit (not (looking-at (format "NOTICE CONNECTED %d" (process-id process)))))) (accept-process-output process)))) + (process-kill-without-query process) process)) (defun riece-async-insinuate () @@ -152,4 +92,4 @@ exit (provide 'riece-async) -;;; riece-rdcc.el ends here +;;; riece-async.el ends here