X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=lisp%2Friece-async.el;h=b633ff5752d02b66691d47ae3641b357bbbb75cc;hb=1787b0d1dfee963c78a43655c473981e256d3c3e;hp=a5642cb880f968c3a15a3f7ff287b00be10dde31;hpb=7ff554301d09dddc8241e40a59c1345ae7f63e6d;p=elisp%2Friece.git diff --git a/lisp/riece-async.el b/lisp/riece-async.el index a5642cb..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 @@ -37,103 +36,45 @@ ;;; Code: +(require 'riece-options) +(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-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? - 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 +(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.") -(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)) +(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 + "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)) @@ -143,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 () @@ -151,4 +93,4 @@ socket.close (provide 'riece-async) -;;; riece-rdcc.el ends here +;;; riece-async.el ends here