Fix -- user list buffer not updating when parts are hidden.
[riece] / lisp / riece-rdcc.el
index f977f36..7b34f28 100644 (file)
@@ -1,4 +1,4 @@
-;;; riece-rdcc.el --- ruby implementation of DCC add-on
+;;; riece-rdcc.el --- DCC file sending protocol support (written in Ruby) -*- lexical-binding: t -*-
 ;; 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 implementation using ruby"
+  "DCC written in Ruby."
   :prefix "riece-"
   :group 'riece)
 
@@ -41,16 +46,23 @@ Only used for sending files."
   :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
@@ -69,14 +81,14 @@ if session
 end
 ")
   "Ruby program to send file with DCC."
-  :type 'list
+  :type 'sexp
   :group 'riece-rdcc)
 
 (defcustom riece-rdcc-decode-address-program
   '("\"#{" address " >> 24 & 0xFF}.#{" address " >> 16 & 0xFF}.#{"
     address " >> 8 & 0xFF}.#{" address " & 0xFF}\"")
   "Ruby program to numeric IP address."
-  :type 'list
+  :type 'sexp
   :group 'riece-rdcc)
 
 (defcustom riece-rdcc-save-directory nil
@@ -98,16 +110,14 @@ end
 (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)
 (defvar jam-zcat-filename-list)
 
-(defun riece-rdcc-output-handler (name output)
+(defun riece-rdcc-output-handler (name output _time)
   (if (string-match "\\([0-9]+\\) \\([0-9]+\\)" output)
       (let ((address (match-string 1 output))
            (port (match-string 2 output)))
@@ -121,31 +131,35 @@ end
                 (riece-ruby-property name 'riece-rdcc-request-size)))))
   (riece-ruby-set-output-handler name #'riece-rdcc-output-handler-2))
 
-(defun riece-rdcc-output-handler-2 (name output)
-  (message "Sending %s...(%s/%d)"
+(defun riece-rdcc-output-handler-2 (name output _time)
+  (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
@@ -159,8 +173,7 @@ end
     (riece-ruby-set-exit-handler name #'riece-rdcc-exit-handler)))
 
 (defun riece-rdcc-filter (process input)
-  (save-excursion
-    (set-buffer (process-buffer process))
+  (with-current-buffer (process-buffer process)
     (erase-buffer)
     (insert input)
     (let ((coding-system-for-write 'binary)
@@ -174,7 +187,7 @@ end
             (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)
@@ -182,12 +195,11 @@ end
     (if (= riece-rdcc-received-size riece-rdcc-request-size)
        (set-process-filter process nil))))
 
-(defun riece-rdcc-sentinel (process status)
-  (save-excursion
-    (set-buffer (process-buffer process))
+(defun riece-rdcc-sentinel (process _status)
+  (with-current-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
@@ -222,7 +234,7 @@ end
                 (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))
@@ -244,8 +256,8 @@ end
        (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
@@ -301,7 +313,7 @@ end
 
 (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))
@@ -321,7 +333,8 @@ end
                 (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
@@ -351,15 +364,18 @@ end
   (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)