Index: src/libmtp.c |
diff --git a/src/libmtp.c b/src/libmtp.c |
index b91f2465c7c8f645e7dde05f4e6b8c98b4d8c123..bbe2642ff5b3d7dbf5dc348d3ccd2c4577a35717 100644 |
--- a/src/libmtp.c |
+++ b/src/libmtp.c |
@@ -4415,6 +4415,78 @@ LIBMTP_file_t * LIBMTP_Get_Files_And_Folders(LIBMTP_mtpdevice_t *device, |
return retfiles; |
} |
+/** |
+ * This function retrieves the list of ids of files and folders in a certain |
+ * folder with id parent on a certain storage on a certain device. |
+ * The device used with this operations must have been opened with |
+ * LIBMTP_Open_Raw_Device_Uncached() or it will fail. |
+ * |
+ * NOTE: the request will always perform I/O with the device. |
+ * @param device a pointer to the MTP device to report info from. |
+ * @param storage a storage on the device to report info from. If |
+ * 0 is passed in, the files for the given parent will be |
+ * searched across all available storages. |
+ * @param parent the parent folder id. |
+ * @param out the pointer where the array of ids is returned. It is |
+ * set only when the returned value > 0. The caller takes the |
+ * ownership of the array and has to free() it. |
+ * @return the length of the returned array or -1 in case of failure. |
+ */ |
+ |
+int LIBMTP_Get_Children(LIBMTP_mtpdevice_t *device, |
+ uint32_t const storage, |
+ uint32_t const parent, |
+ uint32_t **out) |
+{ |
+ PTPParams *params = (PTPParams *) device->params; |
+ PTP_USB *ptp_usb = (PTP_USB*) device->usbinfo; |
+ LIBMTP_file_t *retfiles = NULL; |
+ LIBMTP_file_t *curfile = NULL; |
+ PTPObjectHandles currentHandles; |
+ uint32_t storageid; |
+ uint16_t ret; |
+ int i = 0; |
+ |
+ if (device->cached) { |
+ // This function is only supposed to be used by devices |
+ // opened as uncached! |
+ LIBMTP_ERROR("tried to use %s on a cached device!\n", __func__); |
+ return -1; |
+ } |
+ |
+ if (FLAG_BROKEN_GET_OBJECT_PROPVAL(ptp_usb)) { |
+ // These devices cannot handle the commands needed for |
+ // Uncached access! |
+ LIBMTP_ERROR("tried to use %s on an unsupported device, " |
+ "this command does not work on all devices " |
+ "due to missing low-level support to read " |
+ "information on individual tracks\n", |
+ __func__); |
+ return -1; |
+ } |
+ |
+ if (storage == 0) |
+ storageid = PTP_GOH_ALL_STORAGE; |
+ else |
+ storageid = storage; |
+ |
+ ret = ptp_getobjecthandles(params, |
+ storageid, |
+ PTP_GOH_ALL_FORMATS, |
+ parent, |
+ ¤tHandles); |
+ |
+ if (ret != PTP_RC_OK) { |
+ add_ptp_error_to_errorstack(device, ret, |
+ "LIBMTP_Get_Children(): could not get object handles."); |
+ return -1; |
+ } |
+ |
+ if (currentHandles.Handler == NULL || currentHandles.n == 0) |
+ return 0; |
+ *out = currentHandles.Handler; |
+ return currentHandles.n; |
+} |
/** |
* This creates a new track metadata structure and allocates memory |