From 3466c1a7c49adab67d96eb9808c29cedd48746de Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 8 Aug 2012 11:04:34 +0530 Subject: [PATCH] MTP driver: Implement delete_object(). C interface is now done, I think. --- src/calibre/devices/mtp/unix/driver.py | 13 ++++++++----- src/calibre/devices/mtp/unix/libmtp.c | 26 ++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/calibre/devices/mtp/unix/driver.py b/src/calibre/devices/mtp/unix/driver.py index 46ffdd236e..923702826c 100644 --- a/src/calibre/devices/mtp/unix/driver.py +++ b/src/calibre/devices/mtp/unix/driver.py @@ -237,6 +237,7 @@ class MTP_DEVICE(MTPDeviceBase): if __name__ == '__main__': + BytesIO class PR: def report_progress(self, sent, total): print (sent, total, end=', ') @@ -252,11 +253,13 @@ if __name__ == '__main__': print ("Storage info:") pprint(d.storage_info) print("Free space:", dev.free_space()) - raw = b'test' - fname = b'moose.txt' - src = BytesIO(raw) - print (d.put_file(dev._main_id, 0, fname, src, len(raw), PR())) - # dev.filesystem_cache.dump_filesystem() + for x in (1015, 1014, 1013, 1012): + print (d.delete_object(x)) + # raw = b'test' + # fname = b'moose.txt' + # src = BytesIO(raw) + # print (d.put_file(dev._main_id, 0, fname, src, len(raw), PR())) + dev.filesystem_cache.dump_filesystem() # with open('/tmp/flint.epub', 'wb') as f: # print(d.get_file(786, f, PR())) # print() diff --git a/src/calibre/devices/mtp/unix/libmtp.c b/src/calibre/devices/mtp/unix/libmtp.c index 02b2db0696..526bb66df9 100644 --- a/src/calibre/devices/mtp/unix/libmtp.c +++ b/src/calibre/devices/mtp/unix/libmtp.c @@ -497,12 +497,33 @@ libmtp_Device_put_file(libmtp_Device *self, PyObject *args, PyObject *kwargs) { "size", nf->filesize, "modtime", nf->modificationdate ); + LIBMTP_destroy_file_t(nf); } } return Py_BuildValue("ONN", (ret == 0) ? Py_True : Py_False, fo, errs); } // }}} + +// Device.delete_object {{{ +static PyObject * +libmtp_Device_delete_object(libmtp_Device *self, PyObject *args, PyObject *kwargs) { + PyObject *errs; + uint32_t id; + int res; + + ENSURE_DEV(NULL); ENSURE_STORAGE(NULL); + + if (!PyArg_ParseTuple(args, "k", &id)) return NULL; + errs = PyList_New(0); + if (errs == NULL) { PyErr_NoMemory(); return NULL; } + + res = LIBMTP_Delete_Object(self->device, id); + if (res != 0) dump_errorstack(self->device, errs); + + return Py_BuildValue("ON", (res == 0) ? Py_True : Py_False, errs); +} // }}} + static PyMethodDef libmtp_Device_methods[] = { {"update_storage_info", (PyCFunction)libmtp_Device_update_storage_info, METH_VARARGS, "update_storage_info() -> Reread the storage info from the device (total, space, free space, storage locations, etc.)" @@ -524,6 +545,11 @@ static PyMethodDef libmtp_Device_methods[] = { "put_file(storage_id, parent_id, filename, stream, size, callback=None) -> Put a file on the device. The file is read from stream. It is put inside the folder identified by parent_id on the storage identified by storage_id. Use parent_id=0 to put it in the root. Use storage_id=0 to put it on the primary storage. stream must be a file-like object. size is the size in bytes of the data in stream. callback works the same as in get_filelist(). Returns ok, fileinfo, errs, where errs is a list of errors (if any), and fileinfo is a file information dictionary, as returned by get_filelist()." }, + {"delete_object", (PyCFunction)libmtp_Device_delete_object, METH_VARARGS, + "delete_object(id) -> Delete the object identified by id from the device. Can be used to delete files, folders, etc. Returns ok, errs." + }, + + {NULL} /* Sentinel */ };