From 810aa02b74d85074f3c20548e086dc5539af00d8 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Mon, 17 Sep 2012 13:53:35 +0200 Subject: [PATCH] Send books to the device using a pure binary protocol --- .../devices/smart_device_app/driver.py | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/calibre/devices/smart_device_app/driver.py b/src/calibre/devices/smart_device_app/driver.py index 1f44b40b66..10f1f6ea40 100644 --- a/src/calibre/devices/smart_device_app/driver.py +++ b/src/calibre/devices/smart_device_app/driver.py @@ -89,6 +89,8 @@ class ConnectionListener (Thread): except Queue.Empty: pass queue_not_serviced_count = 0 + else: + queue_not_serviced_count = 0 if getattr(self.driver, 'broadcast_socket', None) is not None: while True: @@ -140,7 +142,7 @@ class ConnectionListener (Thread): try: self.driver.connection_queue.put_nowait(device_socket) except Queue.Full: - device_socket.close(); + device_socket.close() device_socket = None self.driver._debug('driver is not answering') @@ -577,7 +579,8 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin): opcode, result = self._call_client('SEND_BOOK', {'lpath': lpath, 'length': length, 'metadata': book_metadata, 'thisBook': this_book, 'totalBooks': total_books, - 'willStreamBooks': self.client_can_stream_books}, + 'willStreamBooks': self.client_can_stream_books, + 'willStreamBinary' : self.client_can_receive_book_binary}, print_debug_info=False, wait_for_response=(not self.client_can_stream_books)) @@ -590,17 +593,21 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin): blen = len(b) if not b: break - b = b64encode(b) - opcode, result = self._call_client('BOOK_DATA', - {'lpath': lpath, 'position': pos, 'data': b}, - print_debug_info=False, - wait_for_response=(not self.client_can_stream_books)) + if self.client_can_stream_books and self.client_can_receive_book_binary: + self._send_byte_string(self.device_socket, b) + else: + b = b64encode(b) + opcode, result = self._call_client('BOOK_DATA', + {'lpath': lpath, 'position': pos, 'data': b}, + print_debug_info=False, + wait_for_response=(not self.client_can_stream_books)) pos += blen if not self.client_can_stream_books and opcode != 'OK': self._debug('protocol error', opcode) failed = True break - self._call_client('BOOK_DONE', {'lpath': lpath}) + if not (self.client_can_stream_books and self.client_can_receive_book_binary): + self._call_client('BOOK_DONE', {'lpath': lpath}) self.time = None if close_: infile.close() @@ -799,6 +806,8 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin): self._debug('Device can stream books', self.client_can_stream_books) self.client_can_stream_metadata = result.get('canStreamMetadata', False) self._debug('Device can stream metadata', self.client_can_stream_metadata) + self.client_can_receive_book_binary = result.get('canReceiveBookBinary', False) + self._debug('Device can receive book binary', self.client_can_stream_metadata) self.max_book_packet_len = result.get('maxBookContentPacketLen', self.BASE_PACKET_LEN)