Change to using the new ctypes device interface code on windows

Provides greater flexibility and is easier to debug in case of problems
This commit is contained in:
Kovid Goyal 2016-01-16 00:04:41 +05:30
parent 37ee3db0c2
commit 8bdb39cb9e
3 changed files with 17 additions and 17 deletions

View File

@ -58,14 +58,14 @@ def main():
# run()
# return
from calibre.devices.scanner import win_scanner
from calibre.devices.winusb import get_usb_devices
from calibre.devices.mtp.driver import MTP_DEVICE
dev = MTP_DEVICE(None)
dev.startup()
print (dev.wpd, dev.wpd_error)
try:
devices = win_scanner()
devices = get_usb_devices()
pnp_id = dev.detect_managed_devices(devices)
if not pnp_id:
raise ValueError('Failed to detect device')

View File

@ -6,20 +6,14 @@ manner.
'''
import sys, os, re
from threading import RLock
from threading import Lock
from collections import namedtuple
from calibre import prints, as_unicode
from calibre.constants import (iswindows, isosx, plugins, islinux, isfreebsd,
isnetbsd)
osx_scanner = win_scanner = linux_scanner = freebsd_scanner = netbsd_scanner = None
if iswindows:
try:
win_scanner = plugins['winutil'][0].get_usb_devices
except:
raise RuntimeError('Failed to load the winutil plugin: %s'%plugins['winutil'][1])
osx_scanner = linux_scanner = freebsd_scanner = netbsd_scanner = None
class Drive(str):
@ -38,10 +32,15 @@ def drivecmp(a, b):
class WinPNPScanner(object):
def __init__(self):
self.scanner = None
if iswindows:
self.scanner = plugins['winutil'][0].get_removable_drives
self.lock = RLock()
self.lock = Lock()
@property
def scanner(self):
if iswindows:
from calibre.devices.winusb import get_removable_drives
return get_removable_drives
return None
def drive_is_ok(self, letter, debug=False):
import win32api, win32file
@ -88,7 +87,7 @@ class WinPNPScanner(object):
if debug:
import traceback
traceback.print_exc()
remove = set([])
remove = set()
for letter in drives:
if not self.drive_is_ok(letter, debug=debug):
remove.add(letter)
@ -313,6 +312,8 @@ if isnetbsd:
class DeviceScanner(object):
def __init__(self, *args):
if iswindows:
from calibre.devices.winusb import get_usb_devices as win_scanner
self.scanner = (win_scanner if iswindows else osx_scanner if isosx else
freebsd_scanner if isfreebsd else netbsd_scanner if isnetbsd
else linux_scanner if islinux else libusb_scanner)

View File

@ -901,9 +901,8 @@ class Device(DeviceConfig, DevicePlugin):
pass
def eject_windows(self):
from calibre.constants import plugins
from calibre.devices.winusb import eject_drive
from threading import Thread
winutil, winutil_err = plugins['winutil']
drives = []
for x in ('_main_prefix', '_card_a_prefix', '_card_b_prefix'):
x = getattr(self, x, None)
@ -913,7 +912,7 @@ class Device(DeviceConfig, DevicePlugin):
def do_it(drives):
for d in drives:
try:
winutil.eject_drive(bytes(d)[0])
eject_drive(d)
except Exception as e:
try:
prints("Eject failed:", as_unicode(e))