| 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 | 
|  |