mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Fix device detection on windows broken on python3
This commit is contained in:
parent
dbf9a81940
commit
bbdebbc3ef
@ -3,7 +3,7 @@
|
|||||||
# License: GPLv3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
|
# License: GPLv3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
|
||||||
|
|
||||||
|
|
||||||
import os, string, re, sys
|
import os, string, re, sys, errno
|
||||||
from collections import namedtuple, defaultdict
|
from collections import namedtuple, defaultdict
|
||||||
from operator import itemgetter
|
from operator import itemgetter
|
||||||
from ctypes import (
|
from ctypes import (
|
||||||
@ -398,7 +398,7 @@ def bool_err_check(result, func, args):
|
|||||||
|
|
||||||
def config_err_check(result, func, args):
|
def config_err_check(result, func, args):
|
||||||
if result != CR_CODES['CR_SUCCESS']:
|
if result != CR_CODES['CR_SUCCESS']:
|
||||||
raise WindowsError(result, 'The cfgmgr32 function failed with err: %s' % CR_CODE_NAMES.get(result, result))
|
raise WinError(result, 'The cfgmgr32 function failed with err: %s' % CR_CODE_NAMES.get(result, result))
|
||||||
return args
|
return args
|
||||||
|
|
||||||
|
|
||||||
@ -464,7 +464,7 @@ class DeviceSet(object):
|
|||||||
break
|
break
|
||||||
try:
|
try:
|
||||||
buf, devinfo, devpath = get_device_interface_detail_data(self.dev_list, byref(interface_data), buf)
|
buf, devinfo, devpath = get_device_interface_detail_data(self.dev_list, byref(interface_data), buf)
|
||||||
except WindowsError:
|
except OSError:
|
||||||
if ignore_errors:
|
if ignore_errors:
|
||||||
continue
|
continue
|
||||||
raise
|
raise
|
||||||
@ -489,7 +489,7 @@ def iterchildren(parent_devinst):
|
|||||||
NO_MORE = CR_CODES['CR_NO_SUCH_DEVINST']
|
NO_MORE = CR_CODES['CR_NO_SUCH_DEVINST']
|
||||||
try:
|
try:
|
||||||
CM_Get_Child(byref(child), parent_devinst, 0)
|
CM_Get_Child(byref(child), parent_devinst, 0)
|
||||||
except WindowsError as err:
|
except OSError as err:
|
||||||
if err.winerror == NO_MORE:
|
if err.winerror == NO_MORE:
|
||||||
return
|
return
|
||||||
raise
|
raise
|
||||||
@ -497,7 +497,7 @@ def iterchildren(parent_devinst):
|
|||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
CM_Get_Sibling(byref(child), child, 0)
|
CM_Get_Sibling(byref(child), child, 0)
|
||||||
except WindowsError as err:
|
except OSError as err:
|
||||||
if err.winerror == NO_MORE:
|
if err.winerror == NO_MORE:
|
||||||
break
|
break
|
||||||
raise
|
raise
|
||||||
@ -517,7 +517,7 @@ def iterancestors(devinst):
|
|||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
CM_Get_Parent(byref(parent), parent, 0)
|
CM_Get_Parent(byref(parent), parent, 0)
|
||||||
except WindowsError as err:
|
except OSError as err:
|
||||||
if err.winerror == NO_MORE:
|
if err.winerror == NO_MORE:
|
||||||
break
|
break
|
||||||
raise
|
raise
|
||||||
@ -530,7 +530,7 @@ def device_io_control(handle, which, inbuf, outbuf, initbuf):
|
|||||||
initbuf(inbuf)
|
initbuf(inbuf)
|
||||||
try:
|
try:
|
||||||
DeviceIoControl(handle, which, inbuf, len(inbuf), outbuf, len(outbuf), byref(bytes_returned), None)
|
DeviceIoControl(handle, which, inbuf, len(inbuf), outbuf, len(outbuf), byref(bytes_returned), None)
|
||||||
except WindowsError as err:
|
except OSError as err:
|
||||||
if err.winerror not in (ERROR_INSUFFICIENT_BUFFER, ERROR_MORE_DATA):
|
if err.winerror not in (ERROR_INSUFFICIENT_BUFFER, ERROR_MORE_DATA):
|
||||||
raise
|
raise
|
||||||
outbuf = create_string_buffer(2*len(outbuf))
|
outbuf = create_string_buffer(2*len(outbuf))
|
||||||
@ -560,7 +560,7 @@ def get_device_id(devinst, buf=None):
|
|||||||
buf = create_unicode_buffer(devid_size.value)
|
buf = create_unicode_buffer(devid_size.value)
|
||||||
continue
|
continue
|
||||||
if ret != CR_CODES['CR_SUCCESS']:
|
if ret != CR_CODES['CR_SUCCESS']:
|
||||||
raise WindowsError((ret, 'The cfgmgr32 function failed with err: %s' % CR_CODE_NAMES.get(ret, ret)))
|
raise WinError(ret, 'The cfgmgr32 function failed with err: %s' % CR_CODE_NAMES.get(ret, ret))
|
||||||
break
|
break
|
||||||
return wstring_at(buf), buf
|
return wstring_at(buf), buf
|
||||||
|
|
||||||
@ -675,7 +675,7 @@ def get_volume_pathnames(volume_id, buf=None):
|
|||||||
try:
|
try:
|
||||||
GetVolumePathNamesForVolumeName(volume_id, buf, len(buf), byref(bufsize))
|
GetVolumePathNamesForVolumeName(volume_id, buf, len(buf), byref(bufsize))
|
||||||
break
|
break
|
||||||
except WindowsError as err:
|
except OSError as err:
|
||||||
if err.winerror == ERROR_MORE_DATA:
|
if err.winerror == ERROR_MORE_DATA:
|
||||||
buf = create_unicode_buffer(bufsize.value + 10)
|
buf = create_unicode_buffer(bufsize.value + 10)
|
||||||
continue
|
continue
|
||||||
@ -781,7 +781,7 @@ def get_drive_letters_for_device_single(usbdev, storage_number_map, debug=False)
|
|||||||
devid = 'Unknown'
|
devid = 'Unknown'
|
||||||
try:
|
try:
|
||||||
storage_number = get_storage_number(devpath)
|
storage_number = get_storage_number(devpath)
|
||||||
except WindowsError as err:
|
except OSError as err:
|
||||||
if debug:
|
if debug:
|
||||||
prints('Failed to get storage number for: %s with error: %s' % (devid, as_unicode(err)))
|
prints('Failed to get storage number for: %s with error: %s' % (devid, as_unicode(err)))
|
||||||
continue
|
continue
|
||||||
@ -802,7 +802,7 @@ def get_drive_letters_for_device_single(usbdev, storage_number_map, debug=False)
|
|||||||
try:
|
try:
|
||||||
if is_readonly(dl):
|
if is_readonly(dl):
|
||||||
ans['readonly_drives'].add(dl)
|
ans['readonly_drives'].add(dl)
|
||||||
except WindowsError as err:
|
except OSError as err:
|
||||||
if debug:
|
if debug:
|
||||||
prints('Failed to get readonly status for drive: %s with error: %s' % (dl, as_unicode(err)))
|
prints('Failed to get readonly status for drive: %s with error: %s' % (dl, as_unicode(err)))
|
||||||
|
|
||||||
@ -819,7 +819,7 @@ def get_storage_number_map(drive_types=(DRIVE_REMOVABLE, DRIVE_FIXED), debug=Fal
|
|||||||
try:
|
try:
|
||||||
sn = get_storage_number('\\\\.\\' + letter + ':')
|
sn = get_storage_number('\\\\.\\' + letter + ':')
|
||||||
ans[sn[:2]].append((sn[2], letter))
|
ans[sn[:2]].append((sn[2], letter))
|
||||||
except WindowsError as err:
|
except OSError as err:
|
||||||
if debug:
|
if debug:
|
||||||
prints('Failed to get storage number for drive: %s with error: %s' % (letter, as_unicode(err)))
|
prints('Failed to get storage number for drive: %s with error: %s' % (letter, as_unicode(err)))
|
||||||
continue
|
continue
|
||||||
@ -837,14 +837,14 @@ def get_storage_number_map_alt(debug=False):
|
|||||||
devpath += os.sep
|
devpath += os.sep
|
||||||
try:
|
try:
|
||||||
GetVolumeNameForVolumeMountPoint(devpath, wbuf, len(wbuf))
|
GetVolumeNameForVolumeMountPoint(devpath, wbuf, len(wbuf))
|
||||||
except WindowsError as err:
|
except OSError as err:
|
||||||
if debug:
|
if debug:
|
||||||
prints('Failed to get volume id for drive: %s with error: %s' % (devpath, as_unicode(err)))
|
prints('Failed to get volume id for drive: %s with error: %s' % (devpath, as_unicode(err)))
|
||||||
continue
|
continue
|
||||||
vname = wbuf.value
|
vname = wbuf.value
|
||||||
try:
|
try:
|
||||||
wbuf, names = get_volume_pathnames(vname, buf=wbuf)
|
wbuf, names = get_volume_pathnames(vname, buf=wbuf)
|
||||||
except WindowsError as err:
|
except OSError as err:
|
||||||
if debug:
|
if debug:
|
||||||
prints('Failed to get mountpoints for volume %s with error: %s' % (devpath, as_unicode(err)))
|
prints('Failed to get mountpoints for volume %s with error: %s' % (devpath, as_unicode(err)))
|
||||||
continue
|
continue
|
||||||
@ -859,7 +859,7 @@ def get_storage_number_map_alt(debug=False):
|
|||||||
try:
|
try:
|
||||||
sn = get_storage_number('\\\\.\\' + name[0] + ':')
|
sn = get_storage_number('\\\\.\\' + name[0] + ':')
|
||||||
ans[sn[:2]].append((sn[2], name[0]))
|
ans[sn[:2]].append((sn[2], name[0]))
|
||||||
except WindowsError as err:
|
except OSError as err:
|
||||||
if debug:
|
if debug:
|
||||||
prints('Failed to get storage number for drive: %s with error: %s' % (name[0], as_unicode(err)))
|
prints('Failed to get storage number for drive: %s with error: %s' % (name[0], as_unicode(err)))
|
||||||
continue
|
continue
|
||||||
@ -915,7 +915,7 @@ def get_usb_info(usbdev, debug=False): # {{{
|
|||||||
if index:
|
if index:
|
||||||
try:
|
try:
|
||||||
buf, ans[name] = get_device_string(handle, device_port, index, buf=buf)
|
buf, ans[name] = get_device_string(handle, device_port, index, buf=buf)
|
||||||
except WindowsError as err:
|
except OSError as err:
|
||||||
if debug:
|
if debug:
|
||||||
# Note that I have observed that this fails
|
# Note that I have observed that this fails
|
||||||
# randomly after some time of my Kindle being
|
# randomly after some time of my Kindle being
|
||||||
@ -961,7 +961,7 @@ def get_device_string(hub_handle, device_port, index, buf=None, lang=0x409):
|
|||||||
data = cast(buf, PUSB_DESCRIPTOR_REQUEST).contents.Data
|
data = cast(buf, PUSB_DESCRIPTOR_REQUEST).contents.Data
|
||||||
sz, dtype = data.bLength, data.bType
|
sz, dtype = data.bLength, data.bType
|
||||||
if dtype != 0x03:
|
if dtype != 0x03:
|
||||||
raise WindowsError('Invalid datatype for string descriptor: 0x%x' % dtype)
|
raise OSError(errno.EINVAL, 'Invalid datatype for string descriptor: 0x%x' % dtype)
|
||||||
return buf, wstring_at(addressof(data.String), sz // 2).rstrip('\0')
|
return buf, wstring_at(addressof(data.String), sz // 2).rstrip('\0')
|
||||||
|
|
||||||
|
|
||||||
@ -981,7 +981,7 @@ def get_device_languages(hub_handle, device_port, buf=None):
|
|||||||
data = cast(buf, PUSB_DESCRIPTOR_REQUEST).contents.Data
|
data = cast(buf, PUSB_DESCRIPTOR_REQUEST).contents.Data
|
||||||
sz, dtype = data.bLength, data.bType
|
sz, dtype = data.bLength, data.bType
|
||||||
if dtype != 0x03:
|
if dtype != 0x03:
|
||||||
raise WindowsError('Invalid datatype for string descriptor: 0x%x' % dtype)
|
raise OSError(errno.EINVAL, 'Invalid datatype for string descriptor: 0x%x' % dtype)
|
||||||
data = cast(data.String, POINTER(USHORT*(sz//2)))
|
data = cast(data.String, POINTER(USHORT*(sz//2)))
|
||||||
return buf, list(filter(None, data.contents))
|
return buf, list(filter(None, data.contents))
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user