diff --git a/src/calibre/devices/mtp/windows/device_enumeration.cpp b/src/calibre/devices/mtp/windows/device_enumeration.cpp index c206c87333..7d9729eb36 100644 --- a/src/calibre/devices/mtp/windows/device_enumeration.cpp +++ b/src/calibre/devices/mtp/windows/device_enumeration.cpp @@ -22,7 +22,7 @@ IPortableDeviceValues *get_client_information() { // {{{ if (FAILED(hr)) { hresult_set_exc("Failed to create IPortableDeviceValues", hr); return NULL; } Py_BEGIN_ALLOW_THREADS; - hr = client_information->SetStringValue(WPD_CLIENT_NAME, client_info.name); + hr = client_information->SetStringValue(WPD_CLIENT_NAME, client_info.name.ptr()); Py_END_ALLOW_THREADS; if (FAILED(hr)) { hresult_set_exc("Failed to set client name", hr); return NULL; } Py_BEGIN_ALLOW_THREADS; diff --git a/src/calibre/devices/mtp/windows/global.h b/src/calibre/devices/mtp/windows/global.h index 2a9361c18b..50552a7a0d 100644 --- a/src/calibre/devices/mtp/windows/global.h +++ b/src/calibre/devices/mtp/windows/global.h @@ -13,6 +13,7 @@ #include #include #include +#include "../../../utils/windows/common.h" #define ENSURE_WPD(retval) \ if (portable_device_manager == NULL) { PyErr_SetString(NoWPD, "No WPD service available."); return retval; } @@ -27,7 +28,7 @@ extern IPortableDeviceManager *portable_device_manager; // Application info typedef struct { - wchar_t *name; + wchar_raii name; unsigned int major_version; unsigned int minor_version; unsigned int revision; @@ -63,4 +64,3 @@ extern PyObject* delete_object(IPortableDevice *device, const wchar_t *object_id extern PyObject* put_file(IPortableDevice *device, const wchar_t *parent_id, const wchar_t *name, PyObject *src, unsigned PY_LONG_LONG size, PyObject *callback); } - diff --git a/src/calibre/devices/mtp/windows/utils.cpp b/src/calibre/devices/mtp/windows/utils.cpp index 363425aca5..4d7976e116 100644 --- a/src/calibre/devices/mtp/windows/utils.cpp +++ b/src/calibre/devices/mtp/windows/utils.cpp @@ -6,7 +6,6 @@ */ #include "global.h" -#include "../../../utils/windows/common.h" using namespace wpd; diff --git a/src/calibre/devices/mtp/windows/wpd.cpp b/src/calibre/devices/mtp/windows/wpd.cpp index c1ddf18c51..0cbca6ce8a 100644 --- a/src/calibre/devices/mtp/windows/wpd.cpp +++ b/src/calibre/devices/mtp/windows/wpd.cpp @@ -18,7 +18,7 @@ IPortableDeviceManager *wpd::portable_device_manager = NULL; // Flag indicating if COM has been initialized static int _com_initialized = 0; // Application Info -wpd::ClientInfo wpd::client_info = {NULL, 0, 0, 0}; +wpd::ClientInfo wpd::client_info = {0}; extern IPortableDeviceValues* wpd::get_client_information(); extern IPortableDevice* wpd::open_device(const wchar_t *pnp_id, IPortableDeviceValues *client_information); @@ -28,10 +28,7 @@ extern PyObject* wpd::get_device_information(IPortableDevice *device, IPortableD static PyObject * wpd_init(PyObject *self, PyObject *args) { HRESULT hr; - PyObject *o; - if (!PyArg_ParseTuple(args, "OIII", &o, &client_info.major_version, &client_info.minor_version, &client_info.revision)) return NULL; - client_info.name = unicode_to_wchar(o); - if (client_info.name == NULL) return NULL; + if (!PyArg_ParseTuple(args, "O&III", py_to_wchar_no_none, &client_info.name, &client_info.major_version, &client_info.minor_version, &client_info.revision)) return NULL; if (!_com_initialized) { Py_BEGIN_ALLOW_THREADS; @@ -75,7 +72,7 @@ wpd_uninit(PyObject *self, PyObject *args) { _com_initialized = 0; } - if (client_info.name != NULL) { free(client_info.name); } + client_info.name.release(); // hresult_set_exc("test", HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED)); return NULL; Py_RETURN_NONE; @@ -137,27 +134,24 @@ wpd_enumerate_devices(PyObject *self, PyObject *args) { // device_info() {{{ static PyObject * wpd_device_info(PyObject *self, PyObject *args) { - PyObject *py_pnp_id, *ans = NULL; - wchar_t *pnp_id; + PyObject *ans = NULL; IPortableDeviceValues *client_information = NULL; IPortableDevice *device = NULL; ENSURE_WPD(NULL); - if (!PyArg_ParseTuple(args, "O", &py_pnp_id)) return NULL; - pnp_id = unicode_to_wchar(py_pnp_id); - if (pnp_id == NULL) return NULL; - if (wcslen(pnp_id) < 1) { PyErr_SetString(WPDError, "The PNP id must not be empty."); return NULL; } + wchar_raii pnp_id; + if (!PyArg_ParseTuple(args, "O&", py_to_wchar_no_none, &pnp_id)) return NULL; + if (wcslen(pnp_id.ptr()) < 1) { PyErr_SetString(WPDError, "The PNP id must not be empty."); return NULL; } client_information = get_client_information(); if (client_information != NULL) { - device = open_device(pnp_id, client_information); + device = open_device(pnp_id.ptr(), client_information); if (device != NULL) { ans = get_device_information(device, NULL); } } - if (pnp_id != NULL) free(pnp_id); if (client_information != NULL) client_information->Release(); if (device != NULL) {device->Close(); device->Release();} return ans; diff --git a/src/calibre/utils/windows/common.h b/src/calibre/utils/windows/common.h index dd45f1a797..a3a845a73f 100644 --- a/src/calibre/utils/windows/common.h +++ b/src/calibre/utils/windows/common.h @@ -36,7 +36,8 @@ class wchar_raii { wchar_raii() : handle(NULL) {} wchar_raii(wchar_t *h) : handle(h) {} - ~wchar_raii() { + ~wchar_raii() { release(); } + void release() { if (handle) { PyMem_Free(handle); handle = NULL;