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()
|
# run()
|
||||||
# return
|
# return
|
||||||
|
|
||||||
from calibre.devices.scanner import win_scanner
|
from calibre.devices.winusb import get_usb_devices
|
||||||
from calibre.devices.mtp.driver import MTP_DEVICE
|
from calibre.devices.mtp.driver import MTP_DEVICE
|
||||||
dev = MTP_DEVICE(None)
|
dev = MTP_DEVICE(None)
|
||||||
dev.startup()
|
dev.startup()
|
||||||
print (dev.wpd, dev.wpd_error)
|
print (dev.wpd, dev.wpd_error)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
devices = win_scanner()
|
devices = get_usb_devices()
|
||||||
pnp_id = dev.detect_managed_devices(devices)
|
pnp_id = dev.detect_managed_devices(devices)
|
||||||
if not pnp_id:
|
if not pnp_id:
|
||||||
raise ValueError('Failed to detect device')
|
raise ValueError('Failed to detect device')
|
||||||
|
@ -6,20 +6,14 @@ manner.
|
|||||||
'''
|
'''
|
||||||
|
|
||||||
import sys, os, re
|
import sys, os, re
|
||||||
from threading import RLock
|
from threading import Lock
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
from calibre import prints, as_unicode
|
from calibre import prints, as_unicode
|
||||||
from calibre.constants import (iswindows, isosx, plugins, islinux, isfreebsd,
|
from calibre.constants import (iswindows, isosx, plugins, islinux, isfreebsd,
|
||||||
isnetbsd)
|
isnetbsd)
|
||||||
|
|
||||||
osx_scanner = win_scanner = linux_scanner = freebsd_scanner = netbsd_scanner = None
|
osx_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])
|
|
||||||
|
|
||||||
class Drive(str):
|
class Drive(str):
|
||||||
|
|
||||||
@ -38,10 +32,15 @@ def drivecmp(a, b):
|
|||||||
class WinPNPScanner(object):
|
class WinPNPScanner(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.scanner = None
|
|
||||||
if iswindows:
|
if iswindows:
|
||||||
self.scanner = plugins['winutil'][0].get_removable_drives
|
self.lock = Lock()
|
||||||
self.lock = RLock()
|
|
||||||
|
@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):
|
def drive_is_ok(self, letter, debug=False):
|
||||||
import win32api, win32file
|
import win32api, win32file
|
||||||
@ -88,7 +87,7 @@ class WinPNPScanner(object):
|
|||||||
if debug:
|
if debug:
|
||||||
import traceback
|
import traceback
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
remove = set([])
|
remove = set()
|
||||||
for letter in drives:
|
for letter in drives:
|
||||||
if not self.drive_is_ok(letter, debug=debug):
|
if not self.drive_is_ok(letter, debug=debug):
|
||||||
remove.add(letter)
|
remove.add(letter)
|
||||||
@ -313,6 +312,8 @@ if isnetbsd:
|
|||||||
class DeviceScanner(object):
|
class DeviceScanner(object):
|
||||||
|
|
||||||
def __init__(self, *args):
|
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
|
self.scanner = (win_scanner if iswindows else osx_scanner if isosx else
|
||||||
freebsd_scanner if isfreebsd else netbsd_scanner if isnetbsd
|
freebsd_scanner if isfreebsd else netbsd_scanner if isnetbsd
|
||||||
else linux_scanner if islinux else libusb_scanner)
|
else linux_scanner if islinux else libusb_scanner)
|
||||||
|
@ -901,9 +901,8 @@ class Device(DeviceConfig, DevicePlugin):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def eject_windows(self):
|
def eject_windows(self):
|
||||||
from calibre.constants import plugins
|
from calibre.devices.winusb import eject_drive
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
winutil, winutil_err = plugins['winutil']
|
|
||||||
drives = []
|
drives = []
|
||||||
for x in ('_main_prefix', '_card_a_prefix', '_card_b_prefix'):
|
for x in ('_main_prefix', '_card_a_prefix', '_card_b_prefix'):
|
||||||
x = getattr(self, x, None)
|
x = getattr(self, x, None)
|
||||||
@ -913,7 +912,7 @@ class Device(DeviceConfig, DevicePlugin):
|
|||||||
def do_it(drives):
|
def do_it(drives):
|
||||||
for d in drives:
|
for d in drives:
|
||||||
try:
|
try:
|
||||||
winutil.eject_drive(bytes(d)[0])
|
eject_drive(d)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
try:
|
try:
|
||||||
prints("Eject failed:", as_unicode(e))
|
prints("Eject failed:", as_unicode(e))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user