-;;; riece-ndcc.el --- elisp native DCC add-on
+;;; riece-ndcc.el --- DCC file sending protocol support (written in elisp)
;; 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 'calc)
+(require 'riece-globals)
+(require 'riece-options)
(defgroup riece-ndcc nil
- "Elisp native DCC implementation"
+ "DCC written in elisp."
:prefix "riece-"
:group 'riece)
(defvar riece-ndcc-request-user nil)
(defvar riece-ndcc-request-size nil)
+(defconst riece-ndcc-description
+ "DCC file sending protocol support (written in elisp.)")
+
(defun riece-ndcc-encode-address (address)
(unless (string-match
"^\\([0-9]+\\)\\.\\([0-9]+\\)\\.\\([0-9]+\\)\\.\\([0-9]+\\)$"
address)
(error "% is not an IP address" address))
- (let ((calc-number-radix 10))
- (calc-eval (format "%s * (2 ** 24) + %s * (2 **16) + %s * (2 ** 8) + %s"
- (match-string 1 address)
- (match-string 2 address)
- (match-string 3 address)
- (match-string 4 address)))))
+ (let ((string (number-to-string
+ (+ (* (float (string-to-number (match-string 1 address)))
+ 16777216)
+ (* (float (string-to-number (match-string 2 address)))
+ 65536)
+ (* (float (string-to-number (match-string 3 address)))
+ 256)
+ (float (string-to-number (match-string 4 address)))))))
+ (if (string-match "\\." string)
+ (substring string 0 (match-beginning 0))
+ string)))
(defun riece-ndcc-decode-address (address)
- (format "%d.%d.%d.%d"
- (floor (string-to-number
- (calc-eval (format "(%s / (2 ** 24)) %% 256" address))))
- (floor (string-to-number
- (calc-eval (format "(%s / (2 ** 16)) %% 256" address))))
- (floor (string-to-number
- (calc-eval (format "(%s / (2 ** 8)) %% 256" address))))
- (floor (string-to-number
- (calc-eval (format "%s %% 256" address))))))
+ (let ((float-address (string-to-number (concat address ".0"))))
+ (format "%d.%d.%d.%d"
+ (floor (mod (/ float-address 16777216) 256))
+ (floor (mod (/ float-address 65536) 256))
+ (floor (mod (/ float-address 256) 256))
+ (floor (mod float-address 256)))))
(defun riece-ndcc-server-sentinel (process status)
(when (string-match "^open from " status)
(substring (process-name process) 0 (match-beginning 0)))))
(save-excursion
(set-buffer (process-buffer (get-process parent-name)))
- (delete-process parent-name)
(goto-char (point-min))
(while (not (eobp))
(process-send-region process
(message "Sending %s...(%d/%d)"
(buffer-file-name) (1- (point)) (buffer-size)))
(message "Sending %s...done"
- (buffer-file-name))))
- (kill-buffer (process-buffer process))
- (delete-process process)))
+ (buffer-file-name)))
+ (kill-buffer (process-buffer (get-process parent-name))))
+ (kill-buffer (process-buffer process))))
(defun riece-command-dcc-send (user file)
(interactive
(let ((completion-ignore-case t))
(unless riece-ndcc-server-address
(error "Set riece-ndcc-server-address to your host"))
- (list (completing-read
+ (list (riece-completing-read-identity
"User: "
- (mapcar #'list (riece-get-users-on-server)))
+ (riece-get-users-on-server (riece-current-server-name)))
(expand-file-name (read-file-name "File: ")))))
(let* (selective-display
(coding-system-for-read 'binary)
:sentinel 'riece-ndcc-server-sentinel))
(riece-send-string
(format "PRIVMSG %s :\1DCC SEND %s %s %d %d\1\r\n"
- user (file-name-nondirectory file)
+ (riece-identity-prefix user)
+ (file-name-nondirectory file)
(riece-ndcc-encode-address riece-ndcc-server-address)
(nth 1 (process-contact process))
(nth 7 (file-attributes file))))))
"DCC" " *DCC*"
(riece-ndcc-decode-address (nth 2 request))
(nth 3 request))))
- (setq riece-rdcc-requests (delq request riece-rdcc-requests))
+ (setq riece-ndcc-requests (delq request riece-ndcc-requests))
(with-current-buffer (process-buffer process)
(set-buffer-multibyte nil)
(buffer-disable-undo)
(defun riece-handle-dcc-request (prefix target message)
(let ((case-fold-search t))
- (when (string-match
- "SEND \\([^ ]+\\) \\([^ ]+\\) \\([^ ]+\\) \\([^ ]+\\)"
- message)
+ (when (and (get 'riece-ndcc 'riece-addon-enabled)
+ (string-match
+ "SEND \\([^ ]+\\) \\([^ ]+\\) \\([^ ]+\\) \\([^ ]+\\)"
+ message))
(let ((file (match-string 1 message))
(address (match-string 2 message))
(port (string-to-number (match-string 3 message)))
(size (string-to-number (match-string 4 message)))
(buffer (if (riece-channel-p target)
- (cdr (riece-identity-assoc-no-server
- (riece-make-identity target)
- riece-channel-buffer-alist))))
+ (riece-channel-buffer (riece-make-identity
+ target riece-server-name))))
(user (riece-prefix-nickname prefix)))
(setq riece-ndcc-requests
(cons (list user file address port size)
(defvar riece-dialogue-mode-map)
(defun riece-ndcc-insinuate ()
- (add-hook 'riece-ctcp-dcc-request-hook 'riece-handle-dcc-request)
+ (unless (fboundp 'make-network-process)
+ (error "This Emacs does not have make-network-process"))
+ (add-hook 'riece-ctcp-dcc-request-hook 'riece-handle-dcc-request))
+
+(defun riece-ndcc-uninstall ()
+ (remove-hook 'riece-ctcp-dcc-request-hook 'riece-handle-dcc-request))
+
+(defun riece-ndcc-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))
+(defun riece-ndcc-disable ()
+ (define-key riece-dialogue-mode-map "\C-ds" nil)
+ (define-key riece-dialogue-mode-map "\C-dr" nil))
+
(provide 'riece-ndcc)
;;; riece-ndcc.el ends here