From 0cf89f2e622aa53f31fa5762ca4bc805bb509ed3 Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Mon, 26 Jul 2010 20:40:45 -0400 Subject: MTP host: Add support for reading files from an MTP device via ParcelFileDescriptor Also added some support for sending files to the device that hasn't been debugged yet. Add locking to MtpDevice to prevent it from attempting multiple transactions simultaneously. Change-Id: I2b995ba0af086cc6920bd6b8c869f540ad78560a Signed-off-by: Mike Lockwood --- media/mtp/MtpDataPacket.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) (limited to 'media/mtp/MtpDataPacket.cpp') diff --git a/media/mtp/MtpDataPacket.cpp b/media/mtp/MtpDataPacket.cpp index ebe764a..c159e20 100644 --- a/media/mtp/MtpDataPacket.cpp +++ b/media/mtp/MtpDataPacket.cpp @@ -20,6 +20,8 @@ #include #include +#include + #include "MtpDataPacket.h" #include "MtpStringBuffer.h" @@ -391,6 +393,35 @@ int MtpDataPacket::read(struct usb_endpoint *ep) { return length; } +int MtpDataPacket::readData(struct usb_endpoint *ep, void* buffer, int length) { + int packetSize = usb_endpoint_max_packet(ep); + int read = 0; + while (read < length) { + int ret = transfer(ep, (char *)buffer + read, packetSize); + if (ret < 0) { +printf("MtpDataPacket::readData returning %d\n", ret); + return ret; + } + read += ret; + } +printf("MtpDataPacket::readData returning %d\n", read); + return read; +} + +int MtpDataPacket::readDataHeader(struct usb_endpoint *ep) { + int length = transfer(ep, mBuffer, usb_endpoint_max_packet(ep)); + if (length >= 0) + mPacketSize = length; + return length; +} + +int MtpDataPacket::writeDataHeader(struct usb_endpoint *ep, uint32_t length) { + MtpPacket::putUInt32(MTP_CONTAINER_LENGTH_OFFSET, length); + MtpPacket::putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_DATA); + int ret = transfer(ep, mBuffer, MTP_CONTAINER_HEADER_SIZE); + return (ret < 0 ? ret : 0); +} + int MtpDataPacket::write(struct usb_endpoint *ep) { MtpPacket::putUInt32(MTP_CONTAINER_LENGTH_OFFSET, mPacketSize); MtpPacket::putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_DATA); @@ -403,6 +434,19 @@ int MtpDataPacket::write(struct usb_endpoint *ep) { return (ret < 0 ? ret : 0); } +int MtpDataPacket::write(struct usb_endpoint *ep, void* buffer, uint32_t length) { + int ret = 0; + int packetSize = usb_endpoint_max_packet(ep); + while (length > 0) { + int write = (length > packetSize ? packetSize : length); + int ret = transfer(ep, buffer, write); + if (ret < 0) + break; + length -= ret; + } + return (ret < 0 ? ret : 0); +} + #endif // MTP_HOST void* MtpDataPacket::getData(int& outLength) const { -- cgit v1.1