branch: externals/calibre
commit 300b8d2dc6d576e665484f90e4d7b868d4c3026d
Author: Kjartan Oli Agustsson <[email protected]>
Commit: Kjartan Oli Agustsson <[email protected]>
Queue device transfers instead of doing them in parallel
* calibre-device.el: Add missing require on calibre-library.
(calibre-device--transferring): New variable.
(calibre-device--transfer-queue): New variable.
(calibre-device-send-book): Change error logging in process sentinel.
Make process sentinel start next transfer, if any are queued.
(calibre-device--start-transfer): New function.
(calibre-device--transfer-next): New function.
(calibre-device-send-books): Queue books for transfer instead of
calling calibre-device-send-book directly.
Start transfer process if it is not already in progress.
---
calibre-device.el | 45 +++++++++++++++++++++++++++++++++++++++------
1 file changed, 39 insertions(+), 6 deletions(-)
diff --git a/calibre-device.el b/calibre-device.el
index 464569a810..415813ff87 100644
--- a/calibre-device.el
+++ b/calibre-device.el
@@ -19,15 +19,22 @@
;;; Commentary:
;; This file file contains the infrastructure to interact with external
-;; reading devices, such as transfering books to those devices.
+;; reading devices, such as transferring books to those devices.
;;; Code:
(require 'calibre-book)
(require 'calibre-core)
+(require 'calibre-library)
(defconst calibre-device--process-buffer "*ebook-device*"
"The name of the buffer containing output from ebook-device processes.")
+(defvar calibre-device--transferring nil
+ "A boolean indicating whether transfer of books is ongoing.")
+
+(defvar calibre-device--transfer-queue nil
+ "A list of books queued for transfer.")
+
(defun calibre-device-send-book (book &optional force)
"Transfer BOOK to an external device.
@@ -48,8 +55,30 @@ Overwrite an existing file if FORCE is non-nil."
"cp" ,@(if force '("--force") nil) ,library-path ,device-path)
:buffer (get-buffer-create calibre-device--process-buffer)
:sentinel (lambda (_ event)
- (unless (string= event "finished\n")
- (message "Error transfering \"%s\" to device"
(calibre-book-title book)))))))
+ (if (string= event "finished\n")
+ (with-current-buffer calibre-device--process-buffer
+ (erase-buffer))
+ (message "Error transferring \"%s\" to device"
(calibre-book-title book)))
+ (if calibre-device--transfer-queue
+ (calibre-device--transfer-next)
+ (progn
+ (setf calibre-device--transferring nil)
+ (message "Transfer complete")))))))
+
+(defun calibre-device--start-transfer ()
+ "Start the transfer of books."
+ (unless calibre-device--transfer-queue
+ (error "No books queued for transfer"))
+ (unless calibre-device--transferring
+ (setf calibre-device--transferring t)
+ (calibre-device--transfer-next)))
+
+(defun calibre-device--transfer-next ()
+ "Transfer the next book."
+ (when calibre-device--transfer-queue
+ (pcase-let ((`(,book . ,force) (pop calibre-device--transfer-queue)))
+ (message "Transferring: %s" (calibre-book-title book))
+ (calibre-device-send-book book force))))
(defun calibre-device-send-books (books &optional force)
"Transfer BOOKS to an external device.
@@ -57,9 +86,13 @@ Overwrite an existing file if FORCE is non-nil."
Overwrite existing files if FORCE is non-nil."
(interactive (list (calibre--get-active-books)
current-prefix-arg)
- calibre-librar-mode)
- (dolist (book books)
- (calibre-device-send-book book force)))
+ calibre-library-mode)
+ (setf calibre-device--transfer-queue
+ (append calibre-device--transfer-queue
+ (mapcar (lambda (book) (list book force))
+ books)))
+ (unless calibre-device--transferring
+ (calibre-device--start-transfer)))
(defun calibre-device-eject ()
"Eject an external device."