| diff --git a/src/libmtp.c b/src/libmtp.c |
| index da2cf9a..14d1532 100644 |
| --- a/src/libmtp.c |
| +++ b/src/libmtp.c |
| @@ -5145,6 +5145,56 @@ LIBMTP_track_t *LIBMTP_Get_Trackmetadata(LIBMTP_mtpdevice_t *device, uint32_t co |
| return track; |
| } |
| |
| +/** |
| + * This copies a chunk of a file off the device to memory. |
| + * @param device a pointer to the device to get the track from. |
| + * @param id the file ID of the file to retrieve. |
| + * @param offset the offset of the file to read from. |
| + * @param count the amount of data to read. |
| + * @param data a pointer to the data from the device. Must be |
| + * <coded>free()</code>:ed by the caller after use. |
| + * @param datalen the amount of data written to <code>data</code>. |
| + * @return 0 if the transfer was successful, any other value means |
| + * failure. |
| + */ |
| +int LIBMTP_Get_File_Chunk(LIBMTP_mtpdevice_t* device, uint32_t id, |
| + uint32_t offset, uint32_t count, |
| + unsigned char** data, uint32_t* datalen) |
| +{ |
| + uint16_t ret; |
| + PTPParams *params = (PTPParams *) device->params; |
| + PTP_USB *ptp_usb = (PTP_USB*) device->usbinfo; |
| + PTPObject *ob; |
| + |
| + if (!data || !datalen) { |
| + add_error_to_errorstack(device, LIBMTP_ERROR_GENERAL, "LIBMTP_Get_File_Chunk(): Invalid parameter."); |
| + return -1; |
| + } |
| + |
| + ret = ptp_object_want (params, id, PTPOBJECT_OBJECTINFO_LOADED, &ob); |
| + if (ret != PTP_RC_OK) { |
| + add_error_to_errorstack(device, LIBMTP_ERROR_GENERAL, "LIBMTP_Get_File_Chunk(): Could not get object info."); |
| + return -1; |
| + } |
| + if (ob->oi.ObjectFormat == PTP_OFC_Association) { |
| + add_error_to_errorstack(device, LIBMTP_ERROR_GENERAL, "LIBMTP_Get_File_Chunk(): Bad object format."); |
| + return -1; |
| + } |
| + |
| + ret = ptp_getpartialobject(params, id, offset, count, data, datalen); |
| + |
| + if (ret == PTP_ERROR_CANCEL) { |
| + add_error_to_errorstack(device, LIBMTP_ERROR_CANCELLED, "LIBMTP_Get_File_Chunk(): Cancelled transfer."); |
| + return -1; |
| + } |
| + if (ret != PTP_RC_OK) { |
| + add_ptp_error_to_errorstack(device, ret, "LIBMTP_Get_File_Chunk(): Could not get file from device."); |
| + return -1; |
| + } |
| + |
| + return 0; |
| +} |
| + |
| /** |
| * This is a manual conversion from MTPDataGetFunc to PTPDataGetFunc |
| * to isolate the internal type. |
| diff --git a/src/libmtp.h.in b/src/libmtp.h.in |
| index f292ec1..671b922 100644 |
| --- a/src/libmtp.h.in |
| +++ b/src/libmtp.h.in |
| @@ -923,6 +923,8 @@ LIBMTP_file_t * LIBMTP_Get_Files_And_Folders(LIBMTP_mtpdevice_t *, |
| uint32_t const, |
| uint32_t const); |
| LIBMTP_file_t *LIBMTP_Get_Filemetadata(LIBMTP_mtpdevice_t *, uint32_t const); |
| +int LIBMTP_Get_File_Chunk(LIBMTP_mtpdevice_t*, uint32_t, uint32_t, uint32_t, |
| + unsigned char**, uint32_t*); |
| int LIBMTP_Get_File_To_File(LIBMTP_mtpdevice_t*, uint32_t, char const * const, |
| LIBMTP_progressfunc_t const, void const * const); |
| int LIBMTP_Get_File_To_File_Descriptor(LIBMTP_mtpdevice_t*, |
| diff --git a/src/libmtp.sym b/src/libmtp.sym |
| index fec6e58..6736dc4 100644 |
| --- a/src/libmtp.sym |
| +++ b/src/libmtp.sym |
| @@ -50,6 +50,7 @@ LIBMTP_Get_Filelisting |
| LIBMTP_Get_Filelisting_With_Callback |
| LIBMTP_Get_Files_And_Folders |
| LIBMTP_Get_Filemetadata |
| +LIBMTP_Get_File_Chunk |
| LIBMTP_Get_File_To_File |
| LIBMTP_Get_File_To_File_Descriptor |
| LIBMTP_Get_File_To_Handler |