From 5b19af05f2c6ad71171f95bdad2484a38b61121f Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Tue, 23 Nov 2010 18:38:55 -0500 Subject: [PATCH 1/3] MTP: Use DateTime form in GetObjectPropDesc for date/time properties. Change-Id: I5a3c0b07a9f2958b86947256606e6a824dbe93a6 Signed-off-by: Mike Lockwood --- media/jni/android_media_MtpDatabase.cpp | 9 ++++++--- media/mtp/MtpProperty.cpp | 4 ++++ media/mtp/MtpProperty.h | 2 ++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/media/jni/android_media_MtpDatabase.cpp b/media/jni/android_media_MtpDatabase.cpp index 4525d1ff88350..f04a2ae941f1e 100644 --- a/media/jni/android_media_MtpDatabase.cpp +++ b/media/jni/android_media_MtpDatabase.cpp @@ -948,18 +948,21 @@ MtpProperty* MyMtpDatabase::getObjectPropertyDesc(MtpObjectProperty property, result = new MtpProperty(property, MTP_TYPE_UINT128); break; case MTP_PROPERTY_NAME: - case MTP_PROPERTY_DATE_MODIFIED: case MTP_PROPERTY_DISPLAY_NAME: - case MTP_PROPERTY_DATE_ADDED: case MTP_PROPERTY_ARTIST: case MTP_PROPERTY_ALBUM_NAME: case MTP_PROPERTY_ALBUM_ARTIST: - case MTP_PROPERTY_ORIGINAL_RELEASE_DATE: case MTP_PROPERTY_GENRE: case MTP_PROPERTY_COMPOSER: case MTP_PROPERTY_DESCRIPTION: result = new MtpProperty(property, MTP_TYPE_STR); break; + case MTP_PROPERTY_DATE_MODIFIED: + case MTP_PROPERTY_DATE_ADDED: + case MTP_PROPERTY_ORIGINAL_RELEASE_DATE: + result = new MtpProperty(property, MTP_TYPE_STR); + result->setFormDateTime(); + break; case MTP_PROPERTY_OBJECT_FILE_NAME: // We allow renaming files and folders result = new MtpProperty(property, MTP_TYPE_STR, true); diff --git a/media/mtp/MtpProperty.cpp b/media/mtp/MtpProperty.cpp index 86889c3ab80c1..42945f5a1da0e 100644 --- a/media/mtp/MtpProperty.cpp +++ b/media/mtp/MtpProperty.cpp @@ -312,6 +312,10 @@ void MtpProperty::setFormEnum(const int* values, int count) { } } +void MtpProperty::setFormDateTime() { + mFormFlag = kFormDateTime; +} + void MtpProperty::print() { LOGV("MtpProperty %04X\n", mCode); LOGV(" type %04X\n", mType); diff --git a/media/mtp/MtpProperty.h b/media/mtp/MtpProperty.h index c12399c04fc66..f783a87349834 100644 --- a/media/mtp/MtpProperty.h +++ b/media/mtp/MtpProperty.h @@ -58,6 +58,7 @@ public: kFormNone = 0, kFormRange = 1, kFormEnum = 2, + kFormDateTime = 3, }; uint32_t mGroupCode; @@ -90,6 +91,7 @@ public: void setFormRange(int min, int max, int step); void setFormEnum(const int* values, int count); + void setFormDateTime(); void print(); From 44e82ddaec046b033abcc9f02d391cf68bf13d26 Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Tue, 23 Nov 2010 09:08:01 -0500 Subject: [PATCH 2/3] MTP: Implement GetPartialObject command Allows host to read partial contents of files on the device Change-Id: I74927f7394224d674e1d150a4b72a51d9358459b Signed-off-by: Mike Lockwood --- media/mtp/MtpPacket.cpp | 4 ++-- media/mtp/MtpServer.cpp | 44 ++++++++++++++++++++++++++++++++++++++++- media/mtp/MtpServer.h | 1 + 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/media/mtp/MtpPacket.cpp b/media/mtp/MtpPacket.cpp index 42bf8ba895335..bd6196fef25a8 100644 --- a/media/mtp/MtpPacket.cpp +++ b/media/mtp/MtpPacket.cpp @@ -123,7 +123,7 @@ void MtpPacket::setTransactionID(MtpTransactionID id) { uint32_t MtpPacket::getParameter(int index) const { if (index < 1 || index > 5) { - LOGE("index %d out of range in MtpRequestPacket::getParameter", index); + LOGE("index %d out of range in MtpPacket::getParameter", index); return 0; } return getUInt32(MTP_CONTAINER_PARAMETER_OFFSET + (index - 1) * sizeof(uint32_t)); @@ -131,7 +131,7 @@ uint32_t MtpPacket::getParameter(int index) const { void MtpPacket::setParameter(int index, uint32_t value) { if (index < 1 || index > 5) { - LOGE("index %d out of range in MtpResponsePacket::setParameter", index); + LOGE("index %d out of range in MtpPacket::setParameter", index); return; } int offset = MTP_CONTAINER_PARAMETER_OFFSET + (index - 1) * sizeof(uint32_t); diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp index ca13636469173..b841bf3551833 100644 --- a/media/mtp/MtpServer.cpp +++ b/media/mtp/MtpServer.cpp @@ -66,7 +66,7 @@ static const MtpOperationCode kSupportedOperationCodes[] = { // MTP_OPERATION_TERMINATE_OPEN_CAPTURE, // MTP_OPERATION_MOVE_OBJECT, // MTP_OPERATION_COPY_OBJECT, -// MTP_OPERATION_GET_PARTIAL_OBJECT, + MTP_OPERATION_GET_PARTIAL_OBJECT, // MTP_OPERATION_INITIATE_OPEN_CAPTURE, MTP_OPERATION_GET_OBJECT_PROPS_SUPPORTED, MTP_OPERATION_GET_OBJECT_PROP_DESC, @@ -289,6 +289,9 @@ bool MtpServer::handleRequest() { case MTP_OPERATION_GET_OBJECT: response = doGetObject(); break; + case MTP_OPERATION_GET_PARTIAL_OBJECT: + response = doGetPartialObject(); + break; case MTP_OPERATION_SEND_OBJECT_INFO: response = doSendObjectInfo(); break; @@ -583,6 +586,45 @@ MtpResponseCode MtpServer::doGetObject() { return MTP_RESPONSE_OK; } +MtpResponseCode MtpServer::doGetPartialObject() { + MtpObjectHandle handle = mRequest.getParameter(1); + uint32_t offset = mRequest.getParameter(2); + uint32_t length = mRequest.getParameter(3); + MtpString pathBuf; + int64_t fileLength; + int result = mDatabase->getObjectFilePath(handle, pathBuf, fileLength); + if (result != MTP_RESPONSE_OK) + return result; + if (offset + length > fileLength) + length = fileLength - offset; + + const char* filePath = (const char *)pathBuf; + mtp_file_range mfr; + mfr.fd = open(filePath, O_RDONLY); + if (mfr.fd < 0) { + return MTP_RESPONSE_GENERAL_ERROR; + } + mfr.offset = offset; + mfr.length = length; + mResponse.setParameter(1, length); + + // send data header + mData.setOperationCode(mRequest.getOperationCode()); + mData.setTransactionID(mRequest.getTransactionID()); + mData.writeDataHeader(mFD, length + MTP_CONTAINER_HEADER_SIZE); + + // then transfer the file + int ret = ioctl(mFD, MTP_SEND_FILE, (unsigned long)&mfr); + close(mfr.fd); + if (ret < 0) { + if (errno == ECANCELED) + return MTP_RESPONSE_TRANSACTION_CANCELLED; + else + return MTP_RESPONSE_GENERAL_ERROR; + } + return MTP_RESPONSE_OK; +} + MtpResponseCode MtpServer::doSendObjectInfo() { MtpString path; MtpStorageID storageID = mRequest.getParameter(1); diff --git a/media/mtp/MtpServer.h b/media/mtp/MtpServer.h index e65ddb0c0c91e..5aee4eac2143a 100644 --- a/media/mtp/MtpServer.h +++ b/media/mtp/MtpServer.h @@ -96,6 +96,7 @@ private: MtpResponseCode doGetObjectPropList(); MtpResponseCode doGetObjectInfo(); MtpResponseCode doGetObject(); + MtpResponseCode doGetPartialObject(); MtpResponseCode doSendObjectInfo(); MtpResponseCode doSendObject(); MtpResponseCode doDeleteObject(); From e3634c3a804eb0b319d8912442322b2d2ff83569 Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Tue, 23 Nov 2010 18:45:25 -0500 Subject: [PATCH 3/3] MTP: Fix typo in MtpServer::doGetObjectPropList Change-Id: Ia5fec45a238c49a6797a4ac55457ddb5d6521408 Signed-off-by: Mike Lockwood --- media/mtp/MtpServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp index b841bf3551833..c3755f31c1a33 100644 --- a/media/mtp/MtpServer.cpp +++ b/media/mtp/MtpServer.cpp @@ -539,7 +539,7 @@ MtpResponseCode MtpServer::doGetObjectPropList() { MtpObjectFormat format = mRequest.getParameter(2); MtpDeviceProperty property = mRequest.getParameter(3); int groupCode = mRequest.getParameter(4); - int depth = mRequest.getParameter(4); + int depth = mRequest.getParameter(5); LOGD("GetObjectPropList %d format: %s property: %s group: %d depth: %d\n", handle, MtpDebug::getFormatCodeName(format), MtpDebug::getObjectPropCodeName(property), groupCode, depth);