-;;; riece-rdcc.el --- Ruby implementation of DCC add-on
+;;; riece-rdcc.el --- DCC file sending protocol support (written in Ruby)
;; Copyright (C) 1998-2003 Daiki Ueno
;; Author: Daiki Ueno <ueno@unixuser.org>
;; 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.
;;; Code:
(require 'riece-identity)
(require 'riece-ctcp) ;for riece-ctcp-additional-clientinfo
(require 'riece-ruby)
+(require 'riece-mcat)
(defgroup riece-rdcc nil
"DCC written in Ruby."
:type 'string
:group 'riece-rdcc)
+(defcustom riece-rdcc-server-port nil
+ "Local port of the DCC server.
+Only used for sending files."
+ :type 'integer
+ :group 'riece-rdcc)
+
(defcustom riece-rdcc-send-program
'("\
require 'socket'
address = " address "
+port = " port "
unless address
sock = UDPSocket.new
sock.connect('164.46.176.4', 7) # www.unixuser.org/echo
address = sock.getsockname[4 .. 7].unpack('CCCC').join('.')
end
-server = TCPServer.new(address, 0)
+server = TCPServer.new(address, port)
output(\"#{server.addr[3].split(/\\./).collect{|c| c.to_i}.pack('CCCC').unpack('N')[0]} #{server.addr[1]}\")
session = server.accept
if session
(defvar riece-rdcc-temp-file nil)
(defvar riece-rdcc-received-size nil)
-(defvar riece-rdcc-enabled nil)
-
(defconst riece-rdcc-description
- "DCC file sending extension implemented in Ruby")
+ "DCC file sending protocol support (written in Ruby.)")
(defvar temporary-file-directory)
(defvar jka-compr-compression-info-list)
(riece-ruby-set-output-handler name #'riece-rdcc-output-handler-2))
(defun riece-rdcc-output-handler-2 (name output time)
- (message "Sending %s...(%s/%d)"
+ (message (riece-mcat "Sending %s...(%s/%d)")
(riece-ruby-property name 'riece-rdcc-request-file)
(string-to-number output)
(riece-ruby-property name 'riece-rdcc-request-size)))
(defun riece-rdcc-exit-handler (name)
- (message "Sending %s...done"
+ (message (riece-mcat "Sending %s...done")
(riece-ruby-property name 'riece-rdcc-request-file)))
(defun riece-command-dcc-send (user file)
(interactive
(let ((completion-ignore-case t))
(list (riece-completing-read-identity
- "User: "
+ (riece-mcat "User: ")
(riece-get-users-on-server (riece-current-server-name)))
- (expand-file-name (read-file-name "File: ")))))
+ (expand-file-name (read-file-name (riece-mcat "File: "))))))
(let ((name (riece-ruby-execute
(riece-ruby-substitute-variables
riece-rdcc-send-program
(list (cons 'address
(if riece-rdcc-server-address
(concat "'" riece-rdcc-server-address
- "'")
+ "'")
"nil"))
+ (cons 'port
+ (if riece-rdcc-server-port
+ (number-to-string riece-rdcc-server-port)
+ "0"))
(cons 'file
(concat "'" file "'"))
(cons 'block-size
(logand (lsh riece-rdcc-received-size -16) 255)
(logand (lsh riece-rdcc-received-size -8) 255)
(logand riece-rdcc-received-size 255)))
- (message "Receiving %s from %s...(%s/%s)"
+ (message (riece-mcat "Receiving %s from %s...(%s/%s)")
(file-name-nondirectory riece-rdcc-request-file)
riece-rdcc-request-user
(riece-rdcc-format-size riece-rdcc-received-size)
(set-buffer (process-buffer process))
(unless (= riece-rdcc-received-size riece-rdcc-request-size)
(error "Premature end of file"))
- (message "Receiving %s from %s...done"
+ (message (riece-mcat "Receiving %s from %s...done")
(file-name-nondirectory riece-rdcc-request-file)
riece-rdcc-request-user)
(condition-case nil
(let ((requests riece-rdcc-requests)
(index 1))
(while requests
- (princ (format "%2d: %s %s (%d bytes)\n"
+ (princ (format (riece-mcat "%2d: %s %s (%d bytes)\n")
index
(car (car requests))
(nth 1 (car requests))
(list request
(expand-file-name
(read-file-name
- (concat "Save as (default "
- (file-name-nondirectory default-name) ") ")
+ (format (riece-mcat "Save as (default %s) ")
+ (file-name-nondirectory default-name))
(file-name-directory default-name)
default-name))))))
(let* ((temp-file (expand-file-name
(defun riece-handle-dcc-request (prefix target message)
(let ((case-fold-search t))
- (when (and riece-rdcc-enabled
+ (when (and (get 'riece-rdcc 'riece-addon-enabled)
(string-match
"SEND \\(\\([^ ]+\\)\\|\"\\(.+\\)\"\\) \\([^ ]+\\) \\([^ ]+\\) \\([^ ]+\\)"
message))
(with-current-buffer (window-buffer (selected-window))
(substitute-command-keys
(format
- "Type \\[riece-command-dcc-receive] to receive"
+ (riece-mcat
+ "Type \\[riece-command-dcc-receive] to receive")
user))))
(riece-insert-change buffer (format "DCC SEND from %s: %s (%s)\n"
user file
(add-to-list 'riece-ctcp-additional-clientinfo "DCC")
(add-hook 'riece-ctcp-dcc-request-hook 'riece-handle-dcc-request))
+(defun riece-rdcc-uninstall ()
+ (setq riece-ctcp-additional-clientinfo
+ (delete "DCC" riece-ctcp-additional-clientinfo))
+ (remove-hook 'riece-ctcp-dcc-request-hook 'riece-handle-dcc-request))
+
(defun riece-rdcc-enable ()
(define-key riece-dialogue-mode-map "\C-ds" 'riece-command-dcc-send)
- (define-key riece-dialogue-mode-map "\C-dr" 'riece-command-dcc-receive)
- (setq riece-rdcc-enabled t))
+ (define-key riece-dialogue-mode-map "\C-dr" 'riece-command-dcc-receive))
(defun riece-rdcc-disable ()
(define-key riece-dialogue-mode-map "\C-ds" nil)
- (define-key riece-dialogue-mode-map "\C-dr" nil)
- (setq riece-rdcc-enabled nil))
+ (define-key riece-dialogue-mode-map "\C-dr" nil))
(provide 'riece-rdcc)