mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
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:
parent
37ee3db0c2
commit
8bdb39cb9e
@ -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')
|
||||
|
@ -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)
|
||||
|
@ -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))
|
||||
|
Loading…
x
Reference in New Issue
Block a user