From 31e831cb88e8ff74342f49b6ffcaa2ab5bd73a9c Mon Sep 17 00:00:00 2001 From: Philip Langdale Date: Mon, 4 Mar 2013 20:58:19 -0800 Subject: Expose libptp methods for android read/write extensions. This change just adds simple libmtp wrappers for the libptp methods that in turn expose the android in-place read/write extensions. Signed-off-by: Philip Langdale Signed-off-by: Linus Walleij --- src/libmtp.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/libmtp.h.in | 8 +++++ src/libmtp.sym | 5 +++ 3 files changed, 121 insertions(+) diff --git a/src/libmtp.c b/src/libmtp.c index 6a2741f..9bfb20f 100644 --- a/src/libmtp.c +++ b/src/libmtp.c @@ -8819,6 +8819,114 @@ int LIBMTP_Get_Thumbnail(LIBMTP_mtpdevice_t *device, uint32_t const id, return -1; } + +int LIBMTP_GetPartialObject(LIBMTP_mtpdevice_t *device, uint32_t const id, + uint64_t offset, uint32_t maxbytes, + unsigned char **data, unsigned int *size) +{ + PTPParams *params = (PTPParams *) device->params; + uint16_t ret; + + if (!ptp_operation_issupported(params, PTP_OC_ANDROID_GetPartialObject64)) { + if (!ptp_operation_issupported(params, PTP_OC_GetPartialObject)) { + add_error_to_errorstack(device, LIBMTP_ERROR_GENERAL, + "LIBMTP_GetPartialObject: PTP_OC_GetPartialObject not supported"); + return -1; + } + + if (offset >> 32 != 0) { + add_error_to_errorstack(device, LIBMTP_ERROR_GENERAL, + "LIBMTP_GetPartialObject: PTP_OC_GetPartialObject only supports 32bit offsets"); + return -1; + } + + ret = ptp_getpartialobject(params, id, (uint32_t)offset, maxbytes, data, size); + } else { + ret = ptp_android_getpartialobject64(params, id, offset, maxbytes, data, size); + } + if (ret == PTP_RC_OK) + return 0; + return -1; +} + + +int LIBMTP_SendPartialObject(LIBMTP_mtpdevice_t *device, uint32_t const id, + uint64_t offset, unsigned char *data, unsigned int size) +{ + PTPParams *params = (PTPParams *) device->params; + uint16_t ret; + + if (!ptp_operation_issupported(params, PTP_OC_ANDROID_SendPartialObject)) { + add_error_to_errorstack(device, LIBMTP_ERROR_GENERAL, + "LIBMTP_SendPartialObject: PTP_OC_ANDROID_SendPartialObject not supported"); + return -1; + } + + ret = ptp_android_sendpartialobject(params, id, offset, data, size); + if (ret == PTP_RC_OK) + return 0; + return -1; +} + + +int LIBMTP_BeginEditObject(LIBMTP_mtpdevice_t *device, uint32_t const id) +{ + PTPParams *params = (PTPParams *) device->params; + uint16_t ret; + + if (!ptp_operation_issupported(params, PTP_OC_ANDROID_BeginEditObject)) { + add_error_to_errorstack(device, LIBMTP_ERROR_GENERAL, + "LIBMTP_BeginEditObject: PTP_OC_ANDROID_BeginEditObject not supported"); + return -1; + } + + ret = ptp_android_begineditobject(params, id); + if (ret == PTP_RC_OK) + return 0; + return -1; +} + + +int LIBMTP_EndEditObject(LIBMTP_mtpdevice_t *device, uint32_t const id) +{ + PTPParams *params = (PTPParams *) device->params; + uint16_t ret; + + if (!ptp_operation_issupported(params, PTP_OC_ANDROID_EndEditObject)) { + add_error_to_errorstack(device, LIBMTP_ERROR_GENERAL, + "LIBMTP_EndEditObject: PTP_OC_ANDROID_EndEditObject not supported"); + return -1; + } + + ret = ptp_android_endeditobject(params, id); + if (ret == PTP_RC_OK) { + // update cached object properties if metadata cache exists + update_metadata_cache(device, id); + return 0; + } + return -1; +} + + +int LIBMTP_TruncateObject(LIBMTP_mtpdevice_t *device, uint32_t const id, + uint64_t offset) +{ + PTPParams *params = (PTPParams *) device->params; + uint16_t ret; + + if (!ptp_operation_issupported(params, PTP_OC_ANDROID_TruncateObject)) { + add_error_to_errorstack(device, LIBMTP_ERROR_GENERAL, + "LIBMTP_TruncateObject: PTP_OC_ANDROID_TruncateObject not supported"); + return -1; + } + + ret = ptp_android_truncate(params, id, offset); + if (ret == PTP_RC_OK) + return 0; + return -1; +} + + /** * This routine updates an album based on the metadata * supplied. If the tracks field of the metadata diff --git a/src/libmtp.h.in b/src/libmtp.h.in index d7ce956..4a15ce7 100644 --- a/src/libmtp.h.in +++ b/src/libmtp.h.in @@ -1014,6 +1014,14 @@ int LIBMTP_Set_Object_Filename(LIBMTP_mtpdevice_t *, uint32_t , char *); */ int LIBMTP_Read_Event(LIBMTP_mtpdevice_t *, LIBMTP_event_t *, uint32_t *); +int LIBMTP_GetPartialObject(LIBMTP_mtpdevice_t *, uint32_t const, + uint64_t, uint32_t, + unsigned char **, unsigned int *); +int LIBMTP_SendPartialObject(LIBMTP_mtpdevice_t *, uint32_t const, + uint64_t, unsigned char *, unsigned int); +int LIBMTP_BeginEditObject(LIBMTP_mtpdevice_t *, uint32_t const); +int LIBMTP_EndEditObject(LIBMTP_mtpdevice_t *, uint32_t const); +int LIBMTP_TruncateObject(LIBMTP_mtpdevice_t *, uint32_t const, uint64_t); /** @} */ diff --git a/src/libmtp.sym b/src/libmtp.sym index b8966f7..ff52a70 100644 --- a/src/libmtp.sym +++ b/src/libmtp.sym @@ -102,3 +102,8 @@ LIBMTP_Set_Album_Name LIBMTP_Set_Object_Filename LIBMTP_Get_Thumbnail LIBMTP_Read_Event +LIBMTP_GetPartialObject +LIBMTP_SendPartialObject +LIBMTP_BeginEditObject +LIBMTP_EndEditObject +LIBMTP_TruncateObject -- cgit v1.2.1