From 324ae47a3752c7e9977e304735d1663a53657e0a Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 31 Jul 2012 15:15:55 +0200 Subject: [PATCH 1/2] Kovid's comments #1 --- .../devices/smart_device_app/driver.py | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/calibre/devices/smart_device_app/driver.py b/src/calibre/devices/smart_device_app/driver.py index c63c04b7a6..daab9bcb48 100644 --- a/src/calibre/devices/smart_device_app/driver.py +++ b/src/calibre/devices/smart_device_app/driver.py @@ -137,10 +137,13 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin): return total_elapsed = time.time() - self.debug_start_time elapsed = time.time() - self.debug_time - prints('SMART_DEV (%7.2f:%7.3f) %s'%(total_elapsed, elapsed, + print('SMART_DEV (%7.2f:%7.3f) %s'%(total_elapsed, elapsed, inspect.stack()[1][3]), end='') for a in args: - prints(a, end='') + try: + prints('', a, end='') + except: + prints('', 'value too long', end='') print() self.debug_time = time.time() @@ -285,16 +288,16 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin): return json.dumps([op, res], encoding='utf-8') # Network functions - def _read_string_from_net(self, conn): + def _read_string_from_net(self): data = bytes(0) while True: dex = data.find('[') if dex >= 0: break - # conn.recv seems to return a pointer into some internal buffer. + # recv seems to return a pointer into some internal buffer. # Things get trashed if we don't make a copy of the data. self.device_socket.settimeout(self.MAX_CLIENT_COMM_TIMEOUT) - v = conn.recv(self.BASE_PACKET_LEN) + v = self.device_socket.recv(self.BASE_PACKET_LEN) self.device_socket.settimeout(None) if len(v) == 0: return '' # documentation says the socket is broken permanently. @@ -304,7 +307,7 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin): pos = len(data) while pos < total_len: self.device_socket.settimeout(self.MAX_CLIENT_COMM_TIMEOUT) - v = conn.recv(total_len - pos) + v = self.device_socket.recv(total_len - pos) self.device_socket.settimeout(None) if len(v) == 0: return '' # documentation says the socket is broken permanently. @@ -330,7 +333,7 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin): self.device_socket.settimeout(self.MAX_CLIENT_COMM_TIMEOUT) self.device_socket.sendall(('%d' % len(s))+s) self.device_socket.settimeout(None) - v = self._read_string_from_net(self.device_socket) + v = self._read_string_from_net() if print_debug_info and extra_debug: self._debug('received string', v) if v: @@ -452,13 +455,12 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin): # through and actually try to talk to the client. try: # This will usually toss an exception if the socket is gone. - try: - if self._call_client('NOOP', dict())[0] is None: - self.is_connected = False - except: + if self._call_client('NOOP', dict())[0] is None: self.is_connected = False except: self.is_connected = False + if not self.is_connected: + self.device_socket.close() return (self.is_connected, self) if getattr(self, 'listen_socket', None) is not None: ans = select.select((self.listen_socket,), (), (), 0) From 49cb868bb3b0b0659986e1c3ad442c0c89ccc4af Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Tue, 31 Jul 2012 15:25:46 +0200 Subject: [PATCH 2/2] Use a str type instead of unicode when searching for the opening '[' in the network packet. Using unicode seems to work, but it really is a byte. --- src/calibre/devices/smart_device_app/driver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/devices/smart_device_app/driver.py b/src/calibre/devices/smart_device_app/driver.py index daab9bcb48..bae5d82ba3 100644 --- a/src/calibre/devices/smart_device_app/driver.py +++ b/src/calibre/devices/smart_device_app/driver.py @@ -291,7 +291,7 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin): def _read_string_from_net(self): data = bytes(0) while True: - dex = data.find('[') + dex = data.find(b'[') if dex >= 0: break # recv seems to return a pointer into some internal buffer.