Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(692)

Unified Diff: src/libmtp.c

Issue 365823004: Add LIBMTP_Get_Children() to read the list of raw IDs of a folder. (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/libmtp.git@master
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/libmtp.h ('k') | src/libmtp.sym » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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,
+ &currentHandles);
+
+ 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
« no previous file with comments | « src/libmtp.h ('k') | src/libmtp.sym » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698