>From 0c98e87ba18493857f4d0d63f0e00bbefc152c93 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Sun, 10 Apr 2022 19:50:55 -0700 Subject: [PATCH 0/4] *** NOT A PATCH *** *** BLURB HERE *** F. Jason Park (4): Display error message on incomplete ERC DCC transfer Don't send reports in erc-dcc-get-filter when nested Allow matching against string values in erc-dcc-member Allow running erc-dcc GET operations in a subprocess lisp/erc/erc-dcc.el | 117 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 91 insertions(+), 26 deletions(-) Interdiff: diff --git a/lisp/erc/erc-dcc.el b/lisp/erc/erc-dcc.el index c6871aefd3..d8452f2661 100644 --- a/lisp/erc/erc-dcc.el +++ b/lisp/erc/erc-dcc.el @@ -897,10 +897,7 @@ erc-dcc-receive-cache (defvar-local erc-dcc-file-name nil) -(defun erc-dcc-get-file (entry file parent-proc) - "Set up a transfer from the remote client to the local over a TCP connection. -This involves setting up a process filter and a process sentinel, -and making the connection." +(defun erc-dcc--get-file (entry file parent-proc) (let* ((buffer (generate-new-buffer (file-name-nondirectory file))) proc) (with-current-buffer buffer @@ -938,6 +935,71 @@ erc-dcc-get-file (setq erc-dcc-entry-data (plist-put (plist-put entry :peer proc) :start-time (erc-current-time)))))) +(defcustom erc-dcc-get-use-subprocess nil + "If non-nil, run GET (receive) operations in a subordinate Emacs." + :package-version '(ERC . "5.4.1") ; FIXME make this honest + :type 'boolean) + +(defun erc-dcc--get-display-messages (&rest args) + (pcase-let ((`(,_parsed ,_type ,_buffer ,msg . ,rest) args)) + (message (apply #'erc-format-message msg rest)))) + +(defun erc-dcc--get-file-subprocess-sentinel (proc _event) + (with-current-buffer (process-buffer proc) + (widen) + (goto-char (point-max)) + (while (and (not (looking-at (concat "DCC: " erc-dcc-file-name ":"))) + (zerop (forward-line -1)))) + (when (and (search-forward erc-dcc-file-name nil t) + (search-forward-regexp (rx (group (+ digit))) (point-at-eol) t)) + (setq erc-dcc-byte-count (string-to-number (match-string 0)))) + ;; FIXME factor this out (see other GET sentinel) + (let ((done (= erc-dcc-byte-count (plist-get erc-dcc-entry-data :size)))) + (erc-display-message + nil (if done 'notice '(notice error)) erc-server-process + (if done 'dcc-get-complete 'dcc-get-failed) + ?v (plist-get erc-dcc-entry-data :size) + ?f erc-dcc-file-name + ?s (number-to-string erc-dcc-byte-count) + ?t (format "%.0f" + (erc-time-diff (plist-get erc-dcc-entry-data :start-time) + nil)))) + (kill-buffer))) + +(defun erc-dcc--get-file-subprocess (entry file parent-proc) + (let* ((buf (generate-new-buffer (file-name-nondirectory file))) + (exe (concat invocation-directory invocation-name)) + (prog `(with-current-buffer (messages-buffer) + (setq erc-dcc-verbose t) ;global + (advice-add 'erc-display-message :override + #'erc-dcc--get-display-messages) + (let ((e ',entry) + p) + (erc-dcc--get-file e ,file nil) + (setq p (plist-get e :peer)) + (set-process-query-on-exit-flag p nil) + (message "Starting: %S" (list :entry e :file ,file)) + (while (accept-process-output p))))) + (proc (start-process file buf exe "-Q" "--batch" "-l" "erc-dcc" + "--eval" (prin1-to-string prog)))) + (with-current-buffer buf + (setq erc-dcc-file-name (plist-get entry :file) + erc-dcc-byte-count 0) + (set-process-sentinel proc #'erc-dcc--get-file-subprocess-sentinel) + (setq erc-server-process parent-proc + entry (plist-put entry :peer proc) + entry (plist-put entry :start-time (erc-current-time)) + erc-dcc-entry-data entry)))) + +(defun erc-dcc-get-file (entry file parent-proc) + "Set up a transfer from the remote client to the local over a TCP connection. +This involves setting up a process filter and a process sentinel, +and making the connection." + (if erc-dcc-get-use-subprocess + (erc-dcc--get-file-subprocess (plist-put entry :parent nil) + file parent-proc) + (erc-dcc--get-file entry file parent-proc))) + (defun erc-dcc-append-contents (buffer _file) "Append the contents of BUFFER to FILE. The contents of the BUFFER will then be erased." -- 2.35.1