summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Langdale <philipl@overt.org>2013-03-04 20:58:19 -0800
committerLinus Walleij <triad@df.lth.se>2013-03-05 21:11:56 +0100
commit31e831cb88e8ff74342f49b6ffcaa2ab5bd73a9c (patch)
tree3c7073dd3d20f55f23c11c37ccc6c8bc61f4ed5e
parentb3aaade14e14a67419c3edf6367b50599eec134f (diff)
downloadlibmtp-31e831cb88e8ff74342f49b6ffcaa2ab5bd73a9c.tar.gz
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 <philipl@overt.org> Signed-off-by: Linus Walleij <triad@df.lth.se>
-rw-r--r--src/libmtp.c108
-rw-r--r--src/libmtp.h.in8
-rw-r--r--src/libmtp.sym5
3 files changed, 121 insertions, 0 deletions
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 <code>tracks</code> 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