From 828d19dd96b05fa99abdc517701e5366543c324f Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Tue, 10 Aug 2010 15:20:35 -0400 Subject: MTP: work in progress on expanded property support GetObjectPropValue and SetObjectPropValue are disabled until I figure out why Windows doesn't like what I have done. Change-Id: I74e945ef3ea031f6d46f4ebaa8df815da0a5c3ed Signed-off-by: Mike Lockwood --- media/mtp/MtpDataPacket.cpp | 12 ++++- media/mtp/MtpDataPacket.h | 2 + media/mtp/MtpDatabase.h | 19 ++++++- media/mtp/MtpServer.cpp | 118 +++++++++++++++++++++++++++++--------------- media/mtp/MtpServer.h | 14 ++---- 5 files changed, 113 insertions(+), 52 deletions(-) (limited to 'media/mtp') diff --git a/media/mtp/MtpDataPacket.cpp b/media/mtp/MtpDataPacket.cpp index 27dc796..f3c7b9b 100644 --- a/media/mtp/MtpDataPacket.cpp +++ b/media/mtp/MtpDataPacket.cpp @@ -242,6 +242,16 @@ void MtpDataPacket::putUInt128(const uint128_t& value) { putUInt32(value[3]); } +void MtpDataPacket::putInt128(int64_t value) { + putInt64(value); + putUInt64(value < 0 ? 0xFFFFFFFFFFFFFFFF : 0); +} + +void MtpDataPacket::putUInt128(uint64_t value) { + putUInt64(value); + putUInt64(0); +} + void MtpDataPacket::putAInt8(const int8_t* values, int count) { putUInt32(count); for (int i = 0; i < count; i++) @@ -363,7 +373,7 @@ int MtpDataPacket::readDataHeader(int fd) { int MtpDataPacket::write(int fd) { MtpPacket::putUInt32(MTP_CONTAINER_LENGTH_OFFSET, mPacketSize); MtpPacket::putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_DATA); - + dump(); // send header separately from data int ret = ::write(fd, mBuffer, MTP_CONTAINER_HEADER_SIZE); if (ret == MTP_CONTAINER_HEADER_SIZE) diff --git a/media/mtp/MtpDataPacket.h b/media/mtp/MtpDataPacket.h index 1467aab..fab6a07 100644 --- a/media/mtp/MtpDataPacket.h +++ b/media/mtp/MtpDataPacket.h @@ -69,6 +69,8 @@ public: void putUInt64(uint64_t value); void putInt128(const int128_t& value); void putUInt128(const uint128_t& value); + void putInt128(int64_t value); + void putUInt128(uint64_t value); void putAInt8(const int8_t* values, int count); void putAUInt8(const uint8_t* values, int count); diff --git a/media/mtp/MtpDatabase.h b/media/mtp/MtpDatabase.h index 17823df..899b34a 100644 --- a/media/mtp/MtpDatabase.h +++ b/media/mtp/MtpDatabase.h @@ -22,6 +22,7 @@ namespace android { class MtpDataPacket; +class MtpProperty; class MtpDatabase { public: @@ -58,10 +59,22 @@ public: virtual MtpObjectPropertyList* getSupportedObjectProperties(MtpObjectFormat format) = 0; virtual MtpDevicePropertyList* getSupportedDeviceProperties() = 0; - virtual MtpResponseCode getObjectProperty(MtpObjectHandle handle, + virtual MtpResponseCode getObjectPropertyValue(MtpObjectHandle handle, MtpObjectProperty property, MtpDataPacket& packet) = 0; + virtual MtpResponseCode setObjectPropertyValue(MtpObjectHandle handle, + MtpObjectProperty property, + MtpDataPacket& packet) = 0; + + virtual MtpResponseCode getDevicePropertyValue(MtpDeviceProperty property, + MtpDataPacket& packet) = 0; + + virtual MtpResponseCode setDevicePropertyValue(MtpDeviceProperty property, + MtpDataPacket& packet) = 0; + + virtual MtpResponseCode resetDeviceProperty(MtpDeviceProperty property) = 0; + virtual MtpResponseCode getObjectInfo(MtpObjectHandle handle, MtpDataPacket& packet) = 0; @@ -76,6 +89,10 @@ public: virtual MtpResponseCode setObjectReferences(MtpObjectHandle handle, MtpObjectHandleList* references) = 0; + virtual MtpProperty* getObjectPropertyDesc(MtpObjectProperty property, + MtpObjectFormat format) = 0; + + virtual MtpProperty* getDevicePropertyDesc(MtpDeviceProperty property) = 0; }; }; // namespace android diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp index 30abfb8..1e64e4f 100644 --- a/media/mtp/MtpServer.cpp +++ b/media/mtp/MtpServer.cpp @@ -56,17 +56,17 @@ static const MtpOperationCode kSupportedOperationCodes[] = { // MTP_OPERATION_SET_OBJECT_PROTECTION, // MTP_OPERATION_POWER_DOWN, // MTP_OPERATION_GET_DEVICE_PROP_DESC, -// MTP_OPERATION_GET_DEVICE_PROP_VALUE, -// MTP_OPERATION_SET_DEVICE_PROP_VALUE, -// MTP_OPERATION_RESET_DEVICE_PROP_VALUE, + MTP_OPERATION_GET_DEVICE_PROP_VALUE, + MTP_OPERATION_SET_DEVICE_PROP_VALUE, + MTP_OPERATION_RESET_DEVICE_PROP_VALUE, // MTP_OPERATION_TERMINATE_OPEN_CAPTURE, // MTP_OPERATION_MOVE_OBJECT, // MTP_OPERATION_COPY_OBJECT, // MTP_OPERATION_GET_PARTIAL_OBJECT, // MTP_OPERATION_INITIATE_OPEN_CAPTURE, MTP_OPERATION_GET_OBJECT_PROPS_SUPPORTED, -// MTP_OPERATION_GET_OBJECT_PROP_DESC, - MTP_OPERATION_GET_OBJECT_PROP_VALUE, + MTP_OPERATION_GET_OBJECT_PROP_DESC, +// MTP_OPERATION_GET_OBJECT_PROP_VALUE, // MTP_OPERATION_SET_OBJECT_PROP_VALUE, MTP_OPERATION_GET_OBJECT_REFERENCES, MTP_OPERATION_SET_OBJECT_REFERENCES, @@ -91,7 +91,6 @@ MtpServer::MtpServer(int fd, MtpDatabase* database, mSendObjectFormat(0), mSendObjectFileSize(0) { - initObjectProperties(); } MtpServer::~MtpServer() { @@ -136,7 +135,9 @@ void MtpServer::run() { // FIXME need to generalize this bool dataIn = (operation == MTP_OPERATION_SEND_OBJECT_INFO - || operation == MTP_OPERATION_SET_OBJECT_REFERENCES); + || operation == MTP_OPERATION_SET_OBJECT_REFERENCES + || operation == MTP_OPERATION_SET_OBJECT_PROP_VALUE + || operation == MTP_OPERATION_SET_DEVICE_PROP_VALUE); if (dataIn) { int ret = mData.read(fd); if (ret < 0) { @@ -158,7 +159,6 @@ void MtpServer::run() { mData.setOperationCode(operation); mData.setTransactionID(transaction); LOGV("sending data:"); - mData.dump(); ret = mData.write(fd); if (ret < 0) { LOGE("request write returned %d, errno: %d", ret, errno); @@ -187,24 +187,6 @@ void MtpServer::run() { } } -MtpProperty* MtpServer::getObjectProperty(MtpPropertyCode propCode) { - for (int i = 0; i < mObjectProperties.size(); i++) { - MtpProperty* property = mObjectProperties[i]; - if (property->getPropertyCode() == propCode) - return property; - } - return NULL; -} - -MtpProperty* MtpServer::getDeviceProperty(MtpPropertyCode propCode) { - for (int i = 0; i < mDeviceProperties.size(); i++) { - MtpProperty* property = mDeviceProperties[i]; - if (property->getPropertyCode() == propCode) - return property; - } - return NULL; -} - void MtpServer::sendObjectAdded(MtpObjectHandle handle) { if (mSessionOpen) { LOGD("sendObjectAdded %d\n", handle); @@ -227,14 +209,6 @@ void MtpServer::sendObjectRemoved(MtpObjectHandle handle) { } } -void MtpServer::initObjectProperties() { - mObjectProperties.push(new MtpProperty(MTP_PROPERTY_STORAGE_ID, MTP_TYPE_UINT32)); - mObjectProperties.push(new MtpProperty(MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16)); - mObjectProperties.push(new MtpProperty(MTP_PROPERTY_OBJECT_SIZE, MTP_TYPE_UINT64)); - mObjectProperties.push(new MtpProperty(MTP_PROPERTY_OBJECT_FILE_NAME, MTP_TYPE_STR)); - mObjectProperties.push(new MtpProperty(MTP_PROPERTY_PARENT_OBJECT, MTP_TYPE_UINT32)); -} - bool MtpServer::handleRequest() { MtpOperationCode operation = mRequest.getOperationCode(); MtpResponseCode response; @@ -281,6 +255,18 @@ bool MtpServer::handleRequest() { case MTP_OPERATION_GET_OBJECT_PROP_VALUE: response = doGetObjectPropValue(); break; + case MTP_OPERATION_SET_OBJECT_PROP_VALUE: + response = doSetObjectPropValue(); + break; + case MTP_OPERATION_GET_DEVICE_PROP_VALUE: + response = doGetDevicePropValue(); + break; + case MTP_OPERATION_SET_DEVICE_PROP_VALUE: + response = doSetDevicePropValue(); + break; + case MTP_OPERATION_RESET_DEVICE_PROP_VALUE: + response = doResetDevicePropValue(); + break; case MTP_OPERATION_GET_OBJECT_INFO: response = doGetObjectInfo(); break; @@ -456,13 +442,15 @@ MtpResponseCode MtpServer::doGetObjectReferences() { if (!mSessionOpen) return MTP_RESPONSE_SESSION_NOT_OPEN; MtpStorageID handle = mRequest.getParameter(1); + + // FIXME - check for invalid object handle MtpObjectHandleList* handles = mDatabase->getObjectReferences(handle); - if (!handles) { + if (handles) { + mData.putAUInt32(handles); + delete handles; + } else { mData.putEmptyArray(); - return MTP_RESPONSE_INVALID_OBJECT_HANDLE; } - mData.putAUInt32(handles); - delete handles; return MTP_RESPONSE_OK; } @@ -479,8 +467,43 @@ MtpResponseCode MtpServer::doSetObjectReferences() { MtpResponseCode MtpServer::doGetObjectPropValue() { MtpObjectHandle handle = mRequest.getParameter(1); MtpObjectProperty property = mRequest.getParameter(2); + LOGD("GetObjectPropValue %d %s\n", handle, + MtpDebug::getObjectPropCodeName(property)); - return mDatabase->getObjectProperty(handle, property, mData); + return mDatabase->getObjectPropertyValue(handle, property, mData); +} + +MtpResponseCode MtpServer::doSetObjectPropValue() { + MtpObjectHandle handle = mRequest.getParameter(1); + MtpObjectProperty property = mRequest.getParameter(2); + LOGD("SetObjectPropValue %d %s\n", handle, + MtpDebug::getObjectPropCodeName(property)); + + return mDatabase->setObjectPropertyValue(handle, property, mData); +} + +MtpResponseCode MtpServer::doGetDevicePropValue() { + MtpDeviceProperty property = mRequest.getParameter(1); + LOGD("GetDevicePropValue %s\n", + MtpDebug::getDevicePropCodeName(property)); + + return mDatabase->getDevicePropertyValue(property, mData); +} + +MtpResponseCode MtpServer::doSetDevicePropValue() { + MtpDeviceProperty property = mRequest.getParameter(1); + LOGD("SetDevicePropValue %s\n", + MtpDebug::getDevicePropCodeName(property)); + + return mDatabase->setDevicePropertyValue(property, mData); +} + +MtpResponseCode MtpServer::doResetDevicePropValue() { + MtpDeviceProperty property = mRequest.getParameter(1); + LOGD("ResetDevicePropValue %s\n", + MtpDebug::getDevicePropCodeName(property)); + + return mDatabase->resetDeviceProperty(property); } MtpResponseCode MtpServer::doGetObjectInfo() { @@ -592,7 +615,7 @@ MtpResponseCode MtpServer::doSendObjectInfo() { } mResponse.setParameter(1, storageID); - mResponse.setParameter(2, (parent == 0 ? 0xFFFFFFFF: parent)); + mResponse.setParameter(2, parent); mResponse.setParameter(3, handle); return MTP_RESPONSE_OK; @@ -677,11 +700,24 @@ MtpResponseCode MtpServer::doDeleteObject() { MtpResponseCode MtpServer::doGetObjectPropDesc() { MtpObjectProperty propCode = mRequest.getParameter(1); MtpObjectFormat format = mRequest.getParameter(2); - MtpProperty* property = getObjectProperty(propCode); + LOGD("GetObjectPropDesc %s %s\n", MtpDebug::getObjectPropCodeName(propCode), + MtpDebug::getFormatCodeName(format)); + MtpProperty* property = mDatabase->getObjectPropertyDesc(propCode, format); if (!property) return MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED; + property->write(mData); + delete property; + return MTP_RESPONSE_OK; +} +MtpResponseCode MtpServer::doGetDevicePropDesc() { + MtpDeviceProperty propCode = mRequest.getParameter(1); + LOGD("GetDevicePropDesc %s\n", MtpDebug::getDevicePropCodeName(propCode)); + MtpProperty* property = mDatabase->getDevicePropertyDesc(propCode); + if (!property) + return MTP_RESPONSE_DEVICE_PROP_NOT_SUPPORTED; property->write(mData); + delete property; return MTP_RESPONSE_OK; } diff --git a/media/mtp/MtpServer.h b/media/mtp/MtpServer.h index 19ccf24..68a6564 100644 --- a/media/mtp/MtpServer.h +++ b/media/mtp/MtpServer.h @@ -28,7 +28,6 @@ namespace android { class MtpDatabase; -class MtpProperty; class MtpStorage; class MtpServer { @@ -57,9 +56,6 @@ private: MtpStorageList mStorages; - MtpPropertyList mObjectProperties; - MtpPropertyList mDeviceProperties; - // handle for new object, set by SendObjectInfo and used by SendObject MtpObjectHandle mSendObjectHandle; MtpObjectFormat mSendObjectFormat; @@ -76,15 +72,10 @@ public: MtpStorage* getStorage(MtpStorageID id); void run(); - MtpProperty* getObjectProperty(MtpPropertyCode propCode); - MtpProperty* getDeviceProperty(MtpPropertyCode propCode); - void sendObjectAdded(MtpObjectHandle handle); void sendObjectRemoved(MtpObjectHandle handle); private: - void initObjectProperties(); - bool handleRequest(); MtpResponseCode doGetDeviceInfo(); @@ -98,12 +89,17 @@ private: MtpResponseCode doGetObjectReferences(); MtpResponseCode doSetObjectReferences(); MtpResponseCode doGetObjectPropValue(); + MtpResponseCode doSetObjectPropValue(); + MtpResponseCode doGetDevicePropValue(); + MtpResponseCode doSetDevicePropValue(); + MtpResponseCode doResetDevicePropValue(); MtpResponseCode doGetObjectInfo(); MtpResponseCode doGetObject(); MtpResponseCode doSendObjectInfo(); MtpResponseCode doSendObject(); MtpResponseCode doDeleteObject(); MtpResponseCode doGetObjectPropDesc(); + MtpResponseCode doGetDevicePropDesc(); }; }; // namespace android -- cgit v1.1