summaryrefslogtreecommitdiffstats
path: root/media/mtp/MtpDataPacket.cpp
diff options
context:
space:
mode:
authorMike Lockwood <lockwood@android.com>2010-06-10 16:34:20 -0400
committerMike Lockwood <lockwood@android.com>2010-06-10 16:58:03 -0400
commit3e072b354d1e1e3ee62d58492f0739139df8aff1 (patch)
tree5c1d39a97b326b210d148dfefb70832ea87e1dab /media/mtp/MtpDataPacket.cpp
parentfee87d7b4e60d7541aa2cb0d31f5bdf4ca9e6475 (diff)
downloadframeworks_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.cpp37
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