diff options
author | Mike Lockwood <lockwood@android.com> | 2010-12-09 18:34:18 -0800 |
---|---|---|
committer | Mike Lockwood <lockwood@android.com> | 2010-12-09 18:34:18 -0800 |
commit | bfd1d72a1a1d7be1d32d680a270d3c2207e59e28 (patch) | |
tree | e1b101e6c7f6710e6589761ba578e9fe8504700d | |
parent | 957d85ec046651a8b0549b62021079ddcc0b8f53 (diff) | |
download | frameworks_base-bfd1d72a1a1d7be1d32d680a270d3c2207e59e28.zip frameworks_base-bfd1d72a1a1d7be1d32d680a270d3c2207e59e28.tar.gz frameworks_base-bfd1d72a1a1d7be1d32d680a270d3c2207e59e28.tar.bz2 |
MTP host: Handle receiving a response packet instead of data packet.
This will happen if the device needs to report an error rather than returning the data.
Change-Id: I477512b3676c2f0518a85a4135832ed4475fbc2d
Signed-off-by: Mike Lockwood <lockwood@android.com>
-rw-r--r-- | media/mtp/MtpDevice.cpp | 19 | ||||
-rw-r--r-- | media/mtp/MtpDevice.h | 2 | ||||
-rw-r--r-- | media/mtp/MtpPacket.cpp | 11 | ||||
-rw-r--r-- | media/mtp/MtpPacket.h | 3 |
4 files changed, 32 insertions, 3 deletions
diff --git a/media/mtp/MtpDevice.cpp b/media/mtp/MtpDevice.cpp index 8ad39dc..e058a5a 100644 --- a/media/mtp/MtpDevice.cpp +++ b/media/mtp/MtpDevice.cpp @@ -49,7 +49,8 @@ MtpDevice::MtpDevice(struct usb_device* device, int interface, mDeviceInfo(NULL), mID(usb_device_get_unique_id(device)), mSessionID(0), - mTransactionID(0) + mTransactionID(0), + mReceivedResponse(false) { } @@ -513,6 +514,7 @@ fail: bool MtpDevice::sendRequest(MtpOperationCode operation) { LOGV("sendRequest: %s\n", MtpDebug::getOperationCodeName(operation)); + mReceivedResponse = false; mRequest.setOperationCode(operation); if (mTransactionID > 0) mRequest.setTransactionID(mTransactionID++); @@ -535,6 +537,14 @@ bool MtpDevice::readData() { int ret = mData.read(mEndpointIn); LOGV("readData returned %d\n", ret); if (ret >= MTP_CONTAINER_HEADER_SIZE) { + if (mData.getContainerType() == MTP_CONTAINER_TYPE_RESPONSE) { + LOGD("got response packet instead of data packet"); + // we got a response packet rather than data + // copy it to mResponse + mResponse.copyFrom(mData); + mReceivedResponse = true; + return false; + } mData.dump(); return true; } @@ -552,12 +562,15 @@ bool MtpDevice::writeDataHeader(MtpOperationCode operation, int dataLength) { MtpResponseCode MtpDevice::readResponse() { LOGV("readResponse\n"); + if (mReceivedResponse) { + mReceivedResponse = false; + return mResponse.getResponseCode(); + } int ret = mResponse.read(mEndpointIn); if (ret >= MTP_CONTAINER_HEADER_SIZE) { mResponse.dump(); return mResponse.getResponseCode(); - } - else { + } else { LOGD("readResponse failed\n"); return -1; } diff --git a/media/mtp/MtpDevice.h b/media/mtp/MtpDevice.h index 6ffbd24..67bb85f 100644 --- a/media/mtp/MtpDevice.h +++ b/media/mtp/MtpDevice.h @@ -53,6 +53,8 @@ private: MtpRequestPacket mRequest; MtpDataPacket mData; MtpResponsePacket mResponse; + // set to true if we received a response packet instead of a data packet + bool mReceivedResponse; // to ensure only one MTP transaction at a time Mutex mMutex; diff --git a/media/mtp/MtpPacket.cpp b/media/mtp/MtpPacket.cpp index bd6196f..a885249 100644 --- a/media/mtp/MtpPacket.cpp +++ b/media/mtp/MtpPacket.cpp @@ -84,6 +84,13 @@ void MtpPacket::dump() { LOGV("\n"); } +void MtpPacket::copyFrom(const MtpPacket& src) { + int length = src.mPacketSize; + allocate(length); + mPacketSize = length; + memcpy(mBuffer, src.mBuffer, length); +} + uint16_t MtpPacket::getUInt16(int offset) const { return ((uint16_t)mBuffer[offset + 1] << 8) | (uint16_t)mBuffer[offset]; } @@ -113,6 +120,10 @@ void MtpPacket::setContainerCode(uint16_t code) { putUInt16(MTP_CONTAINER_CODE_OFFSET, code); } +uint16_t MtpPacket::getContainerType() const { + return getUInt16(MTP_CONTAINER_TYPE_OFFSET); +} + MtpTransactionID MtpPacket::getTransactionID() const { return getUInt32(MTP_CONTAINER_TRANSACTION_ID_OFFSET); } diff --git a/media/mtp/MtpPacket.h b/media/mtp/MtpPacket.h index 9c8d6da..73963a3 100644 --- a/media/mtp/MtpPacket.h +++ b/media/mtp/MtpPacket.h @@ -43,10 +43,13 @@ public: void allocate(int length); void dump(); + void copyFrom(const MtpPacket& src); uint16_t getContainerCode() const; void setContainerCode(uint16_t code); + uint16_t getContainerType() const; + MtpTransactionID getTransactionID() const; void setTransactionID(MtpTransactionID id); |