From 9a25f5c023268d6866ec90aa0f9c05809424f797 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 26 Aug 2012 17:48:52 +0530 Subject: [PATCH] ... --- src/calibre/devices/mtp/unix/driver.py | 17 +++++++++++------ src/calibre/devices/mtp/unix/libmtp.c | 12 +++++++----- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/calibre/devices/mtp/unix/driver.py b/src/calibre/devices/mtp/unix/driver.py index 24b008802e..3173e6eb98 100644 --- a/src/calibre/devices/mtp/unix/driver.py +++ b/src/calibre/devices/mtp/unix/driver.py @@ -12,7 +12,7 @@ from threading import RLock from io import BytesIO from collections import namedtuple -from calibre import prints +from calibre import prints, as_unicode from calibre.constants import plugins from calibre.ptempfile import SpooledTemporaryFile from calibre.devices.errors import OpenFailed, DeviceError @@ -28,7 +28,7 @@ def fingerprint(d): class MTP_DEVICE(MTPDeviceBase): - supported_platforms = ['linux'] + supported_platforms = ['linux', 'osx'] def __init__(self, *args, **kwargs): MTPDeviceBase.__init__(self, *args, **kwargs) @@ -138,11 +138,12 @@ class MTP_DEVICE(MTPDeviceBase): time.sleep(2) try: self.dev = self.create_device(connected_device) - except self.libmtp.MTPError: + except self.libmtp.MTPError as e: # Black list this device so that it is ignored for the # remainder of this session. self.blacklisted_devices.add(connected_device) - raise OpenFailed('%s is not a MTP device'%(connected_device,)) + raise OpenFailed('Failed to open %s: Error: %s'%( + connected_device, as_unicode(e))) except TypeError: self.blacklisted_devices.add(connected_device) raise OpenFailed('') @@ -309,9 +310,13 @@ if __name__ == '__main__': from pprint import pprint dev = MTP_DEVICE(None) dev.startup() - from calibre.devices.scanner import linux_scanner - devs = linux_scanner() + from calibre.devices.scanner import DeviceScanner + scanner = DeviceScanner() + scanner.scan() + devs = scanner.devices cd = dev.detect_managed_devices(devs) + if cd is None: + raise Exception('No MTP device found') dev.open(cd, 'xxx') d = dev.dev print ("Opened device:", dev.get_gui_name()) diff --git a/src/calibre/devices/mtp/unix/libmtp.c b/src/calibre/devices/mtp/unix/libmtp.c index b0cfd11bb6..61d26e6341 100644 --- a/src/calibre/devices/mtp/unix/libmtp.c +++ b/src/calibre/devices/mtp/unix/libmtp.c @@ -212,22 +212,24 @@ libmtp_Device_dealloc(libmtp_Device* self) static int libmtp_Device_init(libmtp_Device *self, PyObject *args, PyObject *kwds) { - int busnum, devnum, vendor_id, product_id; + uint32_t busnum; + uint8_t devnum; + uint16_t vendor_id, product_id; PyObject *usb_serialnum; char *vendor, *product, *friendly_name, *manufacturer_name, *model_name, *serial_number, *device_version; LIBMTP_raw_device_t rawdev; LIBMTP_mtpdevice_t *dev; size_t i; - if (!PyArg_ParseTuple(args, "iiiissO", &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; } - self->ids = Py_BuildValue("iiiiO", busnum, devnum, vendor_id, product_id, usb_serialnum); + self->ids = Py_BuildValue("IBHHO", busnum, devnum, vendor_id, product_id, usb_serialnum); if (self->ids == NULL) return -1; - rawdev.bus_location = (uint32_t)busnum; - rawdev.devnum = (uint8_t)devnum; + rawdev.bus_location = busnum; + rawdev.devnum = devnum; rawdev.device_entry.vendor = vendor; rawdev.device_entry.product = product; rawdev.device_entry.vendor_id = vendor_id;