diff options
author | Mike Lockwood <lockwood@android.com> | 2010-06-10 16:34:20 -0400 |
---|---|---|
committer | Mike Lockwood <lockwood@android.com> | 2010-06-10 16:58:03 -0400 |
commit | 3e072b354d1e1e3ee62d58492f0739139df8aff1 (patch) | |
tree | 5c1d39a97b326b210d148dfefb70832ea87e1dab /media/mtp/MtpDataPacket.cpp | |
parent | fee87d7b4e60d7541aa2cb0d31f5bdf4ca9e6475 (diff) | |
download | frameworks_av-3e072b354d1e1e3ee62d58492f0739139df8aff1.zip frameworks_av-3e072b354d1e1e3ee62d58492f0739139df8aff1.tar.gz frameworks_av-3e072b354d1e1e3ee62d58492f0739139df8aff1.tar.bz2 |
MTP: Add support for retrieving thumbnails to MTP content provider.
Signed-off-by: Mike Lockwood <lockwood@android.com>
Diffstat (limited to 'media/mtp/MtpDataPacket.cpp')
-rw-r--r-- | media/mtp/MtpDataPacket.cpp | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/media/mtp/MtpDataPacket.cpp b/media/mtp/MtpDataPacket.cpp index f96284c..d12425a 100644 --- a/media/mtp/MtpDataPacket.cpp +++ b/media/mtp/MtpDataPacket.cpp @@ -361,11 +361,24 @@ int MtpDataPacket::writeDataHeader(int fd, uint32_t length) { #ifdef MTP_HOST int MtpDataPacket::read(struct usb_endpoint *ep) { // first read the header - int ret = transfer(ep, mBuffer, mBufferSize); -printf("MtpDataPacket::transfer returned %d\n", ret); - if (ret >= 0) - mPacketSize = ret; - return ret; + int length = transfer(ep, mBuffer, mBufferSize); + if (length > MTP_CONTAINER_HEADER_SIZE) { + // look at the length field to see if the data spans multiple packets + uint32_t totalLength = MtpPacket::getUInt32(MTP_CONTAINER_LENGTH_OFFSET); + while (totalLength > length) { + allocate(length + mAllocationIncrement); + int ret = transfer(ep, mBuffer + length, mAllocationIncrement); + if (ret >= 0) + length += ret; + else { + length = ret; + break; + } + } + } + if (length >= 0) + mPacketSize = length; + return length; } int MtpDataPacket::write(struct usb_endpoint *ep) { @@ -382,4 +395,18 @@ int MtpDataPacket::write(struct usb_endpoint *ep) { #endif // MTP_HOST +void* MtpDataPacket::getData(int& outLength) const { + int length = mPacketSize - MTP_CONTAINER_HEADER_SIZE; + if (length > 0) { + void* result = malloc(length); + if (result) { + memcpy(result, mBuffer + MTP_CONTAINER_HEADER_SIZE, length); + outLength = length; + return result; + } + } + outLength = 0; + return NULL; +} + } // namespace android |