mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
MTP: Update to work with libmtp 1.1.4
This commit is contained in:
parent
9a25f5c023
commit
ec8d874fd7
@ -217,42 +217,40 @@ libmtp_Device_init(libmtp_Device *self, PyObject *args, PyObject *kwds)
|
|||||||
uint16_t vendor_id, product_id;
|
uint16_t vendor_id, product_id;
|
||||||
PyObject *usb_serialnum;
|
PyObject *usb_serialnum;
|
||||||
char *vendor, *product, *friendly_name, *manufacturer_name, *model_name, *serial_number, *device_version;
|
char *vendor, *product, *friendly_name, *manufacturer_name, *model_name, *serial_number, *device_version;
|
||||||
LIBMTP_raw_device_t rawdev;
|
LIBMTP_raw_device_t *rawdevs = NULL, rdev;
|
||||||
LIBMTP_mtpdevice_t *dev;
|
int numdevs, c;
|
||||||
size_t i;
|
LIBMTP_mtpdevice_t *dev = NULL;
|
||||||
|
LIBMTP_error_number_t err;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "IBHHssO", &busnum, &devnum, &vendor_id, &product_id, &vendor, &product, &usb_serialnum)) return -1;
|
if (!PyArg_ParseTuple(args, "IBHHssO", &busnum, &devnum, &vendor_id, &product_id, &vendor, &product, &usb_serialnum)) return -1;
|
||||||
|
|
||||||
if (devnum < 0 || devnum > 255 || busnum < 0) { PyErr_SetString(PyExc_TypeError, "Invalid busnum/devnum"); return -1; }
|
if (devnum < 0 || devnum > 255 || busnum < 0) { PyErr_SetString(PyExc_TypeError, "Invalid busnum/devnum"); return -1; }
|
||||||
|
|
||||||
self->ids = Py_BuildValue("IBHHO", busnum, devnum, vendor_id, product_id, usb_serialnum);
|
// We have to build and search the rawdevice list instead of creating a
|
||||||
if (self->ids == NULL) return -1;
|
// rawdevice directly as otherwise, dynamic bug flag assignment in libmtp
|
||||||
|
// does not work
|
||||||
rawdev.bus_location = busnum;
|
|
||||||
rawdev.devnum = devnum;
|
|
||||||
rawdev.device_entry.vendor = vendor;
|
|
||||||
rawdev.device_entry.product = product;
|
|
||||||
rawdev.device_entry.vendor_id = vendor_id;
|
|
||||||
rawdev.device_entry.product_id = product_id;
|
|
||||||
rawdev.device_entry.device_flags = 0x00000000U;
|
|
||||||
|
|
||||||
Py_BEGIN_ALLOW_THREADS;
|
Py_BEGIN_ALLOW_THREADS;
|
||||||
for (i = 0; ; i++) {
|
err = LIBMTP_Detect_Raw_Devices(&rawdevs, &numdevs);
|
||||||
if (calibre_mtp_device_table[i].vendor == NULL && calibre_mtp_device_table[i].product == NULL && calibre_mtp_device_table[i].vendor_id == 0xffff) break;
|
Py_END_ALLOW_THREADS;
|
||||||
if (calibre_mtp_device_table[i].vendor_id == vendor_id && calibre_mtp_device_table[i].product_id == product_id) {
|
if (err != 0) { PyErr_SetString(MTPError, "Failed to detect raw MTP devices"); return -1; }
|
||||||
rawdev.device_entry.device_flags = calibre_mtp_device_table[i].device_flags;
|
|
||||||
|
for (c = 0; c < numdevs; c++) {
|
||||||
|
rdev = rawdevs[c];
|
||||||
|
if (rdev.bus_location == busnum && rdev.devnum == devnum) {
|
||||||
|
Py_BEGIN_ALLOW_THREADS;
|
||||||
|
dev = LIBMTP_Open_Raw_Device_Uncached(&rdev);
|
||||||
|
Py_END_ALLOW_THREADS;
|
||||||
|
if (dev == NULL) { free(rawdevs); PyErr_SetString(MTPError, "Unable to open raw device."); return -1; }
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dev = LIBMTP_Open_Raw_Device_Uncached(&rawdev);
|
if (rawdevs != NULL) free(rawdevs);
|
||||||
Py_END_ALLOW_THREADS;
|
if (dev == NULL) { PyErr_Format(MTPError, "No device with busnum=%lu and devnum=%u found", (long unsigned int)busnum, devnum); return -1; }
|
||||||
|
|
||||||
if (dev == NULL) {
|
|
||||||
PyErr_SetString(MTPError, "Unable to open raw device.");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
self->device = dev;
|
self->device = dev;
|
||||||
|
self->ids = Py_BuildValue("IBHHO", busnum, devnum, vendor_id, product_id, usb_serialnum);
|
||||||
|
if (self->ids == NULL) return -1;
|
||||||
|
|
||||||
Py_BEGIN_ALLOW_THREADS;
|
Py_BEGIN_ALLOW_THREADS;
|
||||||
friendly_name = LIBMTP_Get_Friendlyname(self->device);
|
friendly_name = LIBMTP_Get_Friendlyname(self->device);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user