From 3240c330c1c6473ab0cb69c0b07ad22d44192396 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 15 Jan 2010 20:24:40 -0700 Subject: [PATCH] Windows device detection: Don't do expensive polling while waiting for device disconnect --- src/calibre/devices/interface.py | 10 ++++++---- src/calibre/devices/scanner.py | 7 +++++-- src/calibre/gui2/device.py | 3 ++- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/calibre/devices/interface.py b/src/calibre/devices/interface.py index 3d75f0ae22..092f4cb5cd 100644 --- a/src/calibre/devices/interface.py +++ b/src/calibre/devices/interface.py @@ -60,7 +60,8 @@ class DevicePlugin(Plugin): import traceback traceback.print_exc() - def is_usb_connected_windows(self, devices_on_system, debug=False): + def is_usb_connected_windows(self, devices_on_system, debug=False, + only_presence=False): def id_iterator(): if hasattr(self.VENDOR_ID, 'keys'): @@ -85,7 +86,7 @@ class DevicePlugin(Plugin): self.test_bcd_windows(device_id, bcd): if debug: self.print_usb_device_info(device_id) - if self.can_handle_windows(device_id, debug=debug): + if only_presence or self.can_handle_windows(device_id, debug=debug): return True return False @@ -97,7 +98,8 @@ class DevicePlugin(Plugin): return True return False - def is_usb_connected(self, devices_on_system, debug=False): + def is_usb_connected(self, devices_on_system, debug=False, + only_presence=False): ''' Return True, device_info if a device handled by this plugin is currently connected. @@ -105,7 +107,7 @@ class DevicePlugin(Plugin): ''' if iswindows: return self.is_usb_connected_windows(devices_on_system, - debug=debug), None + debug=debug, only_presence=only_presence), None vendors_on_system = set([x[0] for x in devices_on_system]) vendors = self.VENDOR_ID if hasattr(self.VENDOR_ID, '__len__') else [self.VENDOR_ID] diff --git a/src/calibre/devices/scanner.py b/src/calibre/devices/scanner.py index 70d44dc767..c47bdfb6fa 100644 --- a/src/calibre/devices/scanner.py +++ b/src/calibre/devices/scanner.py @@ -139,8 +139,11 @@ class DeviceScanner(object): '''Fetch list of connected USB devices from operating system''' self.devices = self.scanner() - def is_device_connected(self, device, debug=False): - return device.is_usb_connected(self.devices, debug=debug) + def is_device_connected(self, device, debug=False, only_presence=False): + ''' If only_presence is True don't perform any expensive checks (used + only in windows)''' + return device.is_usb_connected(self.devices, debug=debug, + only_presence=only_presence) def main(args=sys.argv): diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index 49a341ae14..7c2ff498b8 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -134,7 +134,8 @@ class DeviceManager(Thread): self.scanner.scan() if self.is_device_connected: connected, detected_device = \ - self.scanner.is_device_connected(self.connected_device) + self.scanner.is_device_connected(self.connected_device, + only_presence=True) if not connected: self.connected_device_removed() else: