Loading core/java/android/provider/Mtp.java +3 −0 Original line number Diff line number Diff line Loading @@ -311,9 +311,12 @@ public final class Mtp // Object properties we support public static final int PROPERTY_STORAGE_ID = 0xDC01; public static final int PROPERTY_OBJECT_FORMAT = 0xDC02; public static final int PROPERTY_PROTECTION_STATUS = 0xDC03; public static final int PROPERTY_OBJECT_SIZE = 0xDC04; public static final int PROPERTY_OBJECT_FILE_NAME = 0xDC07; public static final int PROPERTY_DATE_MODIFIED = 0xDC09; public static final int PROPERTY_PARENT_OBJECT = 0xDC0B; public static final int PROPERTY_PERSISTENT_UID = 0xDC41; /** * Object is not protected. It may be modified and deleted, and its properties Loading media/java/android/media/MtpDatabase.java +18 −15 Original line number Diff line number Diff line Loading @@ -66,14 +66,6 @@ public class MtpDatabase { private final MediaScanner mMediaScanner; // MTP property codes private static final int MTP_PROPERTY_STORAGE_ID = 0xDC01; private static final int MTP_PROPERTY_OBJECT_FORMAT = 0xDC02; private static final int MTP_PROPERTY_OBJECT_SIZE = 0xDC04; private static final int MTP_PROPERTY_OBJECT_FILE_NAME = 0xDC07; private static final int MTP_PROPERTY_DATE_MODIFIED = 0xDC09; private static final int MTP_PROPERTY_PARENT_OBJECT = 0xDC0B; // MTP response codes private static final int MTP_RESPONSE_OK = 0x2001; private static final int MTP_RESPONSE_GENERAL_ERROR = 0x2002; Loading Loading @@ -271,25 +263,36 @@ public class MtpDatabase { boolean isString = false; switch (property) { case MTP_PROPERTY_STORAGE_ID: case Mtp.Object.PROPERTY_STORAGE_ID: outIntValue[0] = mStorageID; return MTP_RESPONSE_OK; case MTP_PROPERTY_OBJECT_FORMAT: case Mtp.Object.PROPERTY_OBJECT_FORMAT: column = MtpObjects.ObjectColumns.FORMAT; break; case MTP_PROPERTY_OBJECT_SIZE: case Mtp.Object.PROPERTY_PROTECTION_STATUS: // protection status is always 0 outIntValue[0] = 0; return MTP_RESPONSE_OK; case Mtp.Object.PROPERTY_OBJECT_SIZE: column = MtpObjects.ObjectColumns.SIZE; break; case MTP_PROPERTY_OBJECT_FILE_NAME: case Mtp.Object.PROPERTY_OBJECT_FILE_NAME: column = MtpObjects.ObjectColumns.DATA; isString = true; break; case MTP_PROPERTY_DATE_MODIFIED: case Mtp.Object.PROPERTY_DATE_MODIFIED: column = MtpObjects.ObjectColumns.DATE_MODIFIED; break; case MTP_PROPERTY_PARENT_OBJECT: case Mtp.Object.PROPERTY_PARENT_OBJECT: column = MtpObjects.ObjectColumns.PARENT; break; case Mtp.Object.PROPERTY_PERSISTENT_UID: // PUID is concatenation of storageID and object handle long puid = mStorageID; puid <<= 32; puid += handle; outIntValue[0] = puid; return MTP_RESPONSE_OK; default: return MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED; } Loading @@ -305,7 +308,7 @@ public class MtpDatabase { String value = c.getString(1); int start = 0; if (property == MTP_PROPERTY_OBJECT_FILE_NAME) { if (property == Mtp.Object.PROPERTY_OBJECT_FILE_NAME) { // extract name from full path int lastSlash = value.lastIndexOf('/'); if (lastSlash >= 0) { Loading media/jni/android_media_MtpDatabase.cpp +91 −5 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ #include "MtpDatabase.h" #include "MtpDataPacket.h" #include "MtpProperty.h" #include "MtpUtils.h" #include "mtp.h" Loading @@ -45,6 +46,7 @@ static jmethodID method_getSupportedCaptureFormats; static jmethodID method_getSupportedObjectProperties; static jmethodID method_getSupportedDeviceProperties; static jmethodID method_getObjectProperty; static jmethodID method_setObjectProperty; static jmethodID method_getObjectInfo; static jmethodID method_getObjectFilePath; static jmethodID method_deleteFile; Loading Loading @@ -98,10 +100,22 @@ public: virtual MtpObjectPropertyList* getSupportedObjectProperties(MtpObjectFormat format); virtual MtpDevicePropertyList* getSupportedDeviceProperties(); virtual MtpResponseCode getObjectProperty(MtpObjectHandle handle, virtual MtpResponseCode getObjectPropertyValue(MtpObjectHandle handle, MtpObjectProperty property, MtpDataPacket& packet); virtual MtpResponseCode setObjectPropertyValue(MtpObjectHandle handle, MtpObjectProperty property, MtpDataPacket& packet); virtual MtpResponseCode getDevicePropertyValue(MtpDeviceProperty property, MtpDataPacket& packet); virtual MtpResponseCode setDevicePropertyValue(MtpDeviceProperty property, MtpDataPacket& packet); virtual MtpResponseCode resetDeviceProperty(MtpDeviceProperty property); virtual MtpResponseCode getObjectInfo(MtpObjectHandle handle, MtpDataPacket& packet); Loading @@ -116,6 +130,11 @@ public: virtual MtpResponseCode setObjectReferences(MtpObjectHandle handle, MtpObjectHandleList* references); virtual MtpProperty* getObjectPropertyDesc(MtpObjectProperty property, MtpObjectFormat format); virtual MtpProperty* getDevicePropertyDesc(MtpDeviceProperty property); }; // ---------------------------------------------------------------------------- Loading Loading @@ -292,7 +311,7 @@ MtpDevicePropertyList* MyMtpDatabase::getSupportedDeviceProperties() { return list; } MtpResponseCode MyMtpDatabase::getObjectProperty(MtpObjectHandle handle, MtpResponseCode MyMtpDatabase::getObjectPropertyValue(MtpObjectHandle handle, MtpObjectProperty property, MtpDataPacket& packet) { int type; Loading @@ -310,6 +329,15 @@ MtpResponseCode MyMtpDatabase::getObjectProperty(MtpObjectHandle handle, jlong longValue = longValues[0]; env->ReleaseLongArrayElements(mLongBuffer, longValues, 0); // special case MTP_PROPERTY_DATE_MODIFIED, which is a string to MTP // but stored internally as a uint64 if (property == MTP_PROPERTY_DATE_MODIFIED) { char date[20]; formatDateTime(longValue, date, sizeof(date)); packet.putString(date); return MTP_RESPONSE_OK; } switch (type) { case MTP_TYPE_INT8: packet.putInt8(longValue); Loading @@ -335,6 +363,12 @@ MtpResponseCode MyMtpDatabase::getObjectProperty(MtpObjectHandle handle, case MTP_TYPE_UINT64: packet.putUInt64(longValue); break; case MTP_TYPE_INT128: packet.putInt128(longValue); break; case MTP_TYPE_UINT128: packet.putInt128(longValue); break; case MTP_TYPE_STR: { jchar* str = env->GetCharArrayElements(mStringBuffer, 0); Loading @@ -351,6 +385,26 @@ MtpResponseCode MyMtpDatabase::getObjectProperty(MtpObjectHandle handle, return MTP_RESPONSE_OK; } MtpResponseCode MyMtpDatabase::setObjectPropertyValue(MtpObjectHandle handle, MtpObjectProperty property, MtpDataPacket& packet) { return -1; } MtpResponseCode MyMtpDatabase::getDevicePropertyValue(MtpDeviceProperty property, MtpDataPacket& packet) { return -1; } MtpResponseCode MyMtpDatabase::setDevicePropertyValue(MtpDeviceProperty property, MtpDataPacket& packet) { return -1; } MtpResponseCode MyMtpDatabase::resetDeviceProperty(MtpDeviceProperty property) { return -1; } MtpResponseCode MyMtpDatabase::getObjectInfo(MtpObjectHandle handle, MtpDataPacket& packet) { char date[20]; Loading @@ -372,9 +426,10 @@ MtpResponseCode MyMtpDatabase::getObjectInfo(MtpObjectHandle handle, uint64_t modified = longValues[1]; env->ReleaseLongArrayElements(mLongBuffer, longValues, 0); int associationType = (format == MTP_FORMAT_ASSOCIATION ? MTP_ASSOCIATION_TYPE_GENERIC_FOLDER : MTP_ASSOCIATION_TYPE_UNDEFINED); // int associationType = (format == MTP_FORMAT_ASSOCIATION ? // MTP_ASSOCIATION_TYPE_GENERIC_FOLDER : // MTP_ASSOCIATION_TYPE_UNDEFINED); int associationType = MTP_ASSOCIATION_TYPE_UNDEFINED; packet.putUInt32(storageID); packet.putUInt16(format); Loading Loading @@ -497,6 +552,37 @@ MtpResponseCode MyMtpDatabase::setObjectReferences(MtpObjectHandle handle, return result; } MtpProperty* MyMtpDatabase::getObjectPropertyDesc(MtpObjectProperty property, MtpObjectFormat format) { MtpProperty* result = NULL; switch (property) { case MTP_PROPERTY_OBJECT_FORMAT: case MTP_PROPERTY_PROTECTION_STATUS: result = new MtpProperty(property, MTP_TYPE_UINT16); break; case MTP_PROPERTY_STORAGE_ID: case MTP_PROPERTY_PARENT_OBJECT: result = new MtpProperty(property, MTP_TYPE_UINT32); break; case MTP_PROPERTY_OBJECT_SIZE: result = new MtpProperty(property, MTP_TYPE_UINT64); break; case MTP_PROPERTY_PERSISTENT_UID: result = new MtpProperty(property, MTP_TYPE_UINT128); break; case MTP_PROPERTY_OBJECT_FILE_NAME: case MTP_PROPERTY_DATE_MODIFIED: result = new MtpProperty(property, MTP_TYPE_STR); break; } return result; } MtpProperty* MyMtpDatabase::getDevicePropertyDesc(MtpDeviceProperty property) { return NULL; } #endif // HAVE_ANDROID_OS // ---------------------------------------------------------------------------- Loading media/mtp/MtpDataPacket.cpp +11 −1 Original line number Diff line number Diff line Loading @@ -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++) Loading Loading @@ -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) Loading media/mtp/MtpDataPacket.h +2 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading
core/java/android/provider/Mtp.java +3 −0 Original line number Diff line number Diff line Loading @@ -311,9 +311,12 @@ public final class Mtp // Object properties we support public static final int PROPERTY_STORAGE_ID = 0xDC01; public static final int PROPERTY_OBJECT_FORMAT = 0xDC02; public static final int PROPERTY_PROTECTION_STATUS = 0xDC03; public static final int PROPERTY_OBJECT_SIZE = 0xDC04; public static final int PROPERTY_OBJECT_FILE_NAME = 0xDC07; public static final int PROPERTY_DATE_MODIFIED = 0xDC09; public static final int PROPERTY_PARENT_OBJECT = 0xDC0B; public static final int PROPERTY_PERSISTENT_UID = 0xDC41; /** * Object is not protected. It may be modified and deleted, and its properties Loading
media/java/android/media/MtpDatabase.java +18 −15 Original line number Diff line number Diff line Loading @@ -66,14 +66,6 @@ public class MtpDatabase { private final MediaScanner mMediaScanner; // MTP property codes private static final int MTP_PROPERTY_STORAGE_ID = 0xDC01; private static final int MTP_PROPERTY_OBJECT_FORMAT = 0xDC02; private static final int MTP_PROPERTY_OBJECT_SIZE = 0xDC04; private static final int MTP_PROPERTY_OBJECT_FILE_NAME = 0xDC07; private static final int MTP_PROPERTY_DATE_MODIFIED = 0xDC09; private static final int MTP_PROPERTY_PARENT_OBJECT = 0xDC0B; // MTP response codes private static final int MTP_RESPONSE_OK = 0x2001; private static final int MTP_RESPONSE_GENERAL_ERROR = 0x2002; Loading Loading @@ -271,25 +263,36 @@ public class MtpDatabase { boolean isString = false; switch (property) { case MTP_PROPERTY_STORAGE_ID: case Mtp.Object.PROPERTY_STORAGE_ID: outIntValue[0] = mStorageID; return MTP_RESPONSE_OK; case MTP_PROPERTY_OBJECT_FORMAT: case Mtp.Object.PROPERTY_OBJECT_FORMAT: column = MtpObjects.ObjectColumns.FORMAT; break; case MTP_PROPERTY_OBJECT_SIZE: case Mtp.Object.PROPERTY_PROTECTION_STATUS: // protection status is always 0 outIntValue[0] = 0; return MTP_RESPONSE_OK; case Mtp.Object.PROPERTY_OBJECT_SIZE: column = MtpObjects.ObjectColumns.SIZE; break; case MTP_PROPERTY_OBJECT_FILE_NAME: case Mtp.Object.PROPERTY_OBJECT_FILE_NAME: column = MtpObjects.ObjectColumns.DATA; isString = true; break; case MTP_PROPERTY_DATE_MODIFIED: case Mtp.Object.PROPERTY_DATE_MODIFIED: column = MtpObjects.ObjectColumns.DATE_MODIFIED; break; case MTP_PROPERTY_PARENT_OBJECT: case Mtp.Object.PROPERTY_PARENT_OBJECT: column = MtpObjects.ObjectColumns.PARENT; break; case Mtp.Object.PROPERTY_PERSISTENT_UID: // PUID is concatenation of storageID and object handle long puid = mStorageID; puid <<= 32; puid += handle; outIntValue[0] = puid; return MTP_RESPONSE_OK; default: return MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED; } Loading @@ -305,7 +308,7 @@ public class MtpDatabase { String value = c.getString(1); int start = 0; if (property == MTP_PROPERTY_OBJECT_FILE_NAME) { if (property == Mtp.Object.PROPERTY_OBJECT_FILE_NAME) { // extract name from full path int lastSlash = value.lastIndexOf('/'); if (lastSlash >= 0) { Loading
media/jni/android_media_MtpDatabase.cpp +91 −5 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ #include "MtpDatabase.h" #include "MtpDataPacket.h" #include "MtpProperty.h" #include "MtpUtils.h" #include "mtp.h" Loading @@ -45,6 +46,7 @@ static jmethodID method_getSupportedCaptureFormats; static jmethodID method_getSupportedObjectProperties; static jmethodID method_getSupportedDeviceProperties; static jmethodID method_getObjectProperty; static jmethodID method_setObjectProperty; static jmethodID method_getObjectInfo; static jmethodID method_getObjectFilePath; static jmethodID method_deleteFile; Loading Loading @@ -98,10 +100,22 @@ public: virtual MtpObjectPropertyList* getSupportedObjectProperties(MtpObjectFormat format); virtual MtpDevicePropertyList* getSupportedDeviceProperties(); virtual MtpResponseCode getObjectProperty(MtpObjectHandle handle, virtual MtpResponseCode getObjectPropertyValue(MtpObjectHandle handle, MtpObjectProperty property, MtpDataPacket& packet); virtual MtpResponseCode setObjectPropertyValue(MtpObjectHandle handle, MtpObjectProperty property, MtpDataPacket& packet); virtual MtpResponseCode getDevicePropertyValue(MtpDeviceProperty property, MtpDataPacket& packet); virtual MtpResponseCode setDevicePropertyValue(MtpDeviceProperty property, MtpDataPacket& packet); virtual MtpResponseCode resetDeviceProperty(MtpDeviceProperty property); virtual MtpResponseCode getObjectInfo(MtpObjectHandle handle, MtpDataPacket& packet); Loading @@ -116,6 +130,11 @@ public: virtual MtpResponseCode setObjectReferences(MtpObjectHandle handle, MtpObjectHandleList* references); virtual MtpProperty* getObjectPropertyDesc(MtpObjectProperty property, MtpObjectFormat format); virtual MtpProperty* getDevicePropertyDesc(MtpDeviceProperty property); }; // ---------------------------------------------------------------------------- Loading Loading @@ -292,7 +311,7 @@ MtpDevicePropertyList* MyMtpDatabase::getSupportedDeviceProperties() { return list; } MtpResponseCode MyMtpDatabase::getObjectProperty(MtpObjectHandle handle, MtpResponseCode MyMtpDatabase::getObjectPropertyValue(MtpObjectHandle handle, MtpObjectProperty property, MtpDataPacket& packet) { int type; Loading @@ -310,6 +329,15 @@ MtpResponseCode MyMtpDatabase::getObjectProperty(MtpObjectHandle handle, jlong longValue = longValues[0]; env->ReleaseLongArrayElements(mLongBuffer, longValues, 0); // special case MTP_PROPERTY_DATE_MODIFIED, which is a string to MTP // but stored internally as a uint64 if (property == MTP_PROPERTY_DATE_MODIFIED) { char date[20]; formatDateTime(longValue, date, sizeof(date)); packet.putString(date); return MTP_RESPONSE_OK; } switch (type) { case MTP_TYPE_INT8: packet.putInt8(longValue); Loading @@ -335,6 +363,12 @@ MtpResponseCode MyMtpDatabase::getObjectProperty(MtpObjectHandle handle, case MTP_TYPE_UINT64: packet.putUInt64(longValue); break; case MTP_TYPE_INT128: packet.putInt128(longValue); break; case MTP_TYPE_UINT128: packet.putInt128(longValue); break; case MTP_TYPE_STR: { jchar* str = env->GetCharArrayElements(mStringBuffer, 0); Loading @@ -351,6 +385,26 @@ MtpResponseCode MyMtpDatabase::getObjectProperty(MtpObjectHandle handle, return MTP_RESPONSE_OK; } MtpResponseCode MyMtpDatabase::setObjectPropertyValue(MtpObjectHandle handle, MtpObjectProperty property, MtpDataPacket& packet) { return -1; } MtpResponseCode MyMtpDatabase::getDevicePropertyValue(MtpDeviceProperty property, MtpDataPacket& packet) { return -1; } MtpResponseCode MyMtpDatabase::setDevicePropertyValue(MtpDeviceProperty property, MtpDataPacket& packet) { return -1; } MtpResponseCode MyMtpDatabase::resetDeviceProperty(MtpDeviceProperty property) { return -1; } MtpResponseCode MyMtpDatabase::getObjectInfo(MtpObjectHandle handle, MtpDataPacket& packet) { char date[20]; Loading @@ -372,9 +426,10 @@ MtpResponseCode MyMtpDatabase::getObjectInfo(MtpObjectHandle handle, uint64_t modified = longValues[1]; env->ReleaseLongArrayElements(mLongBuffer, longValues, 0); int associationType = (format == MTP_FORMAT_ASSOCIATION ? MTP_ASSOCIATION_TYPE_GENERIC_FOLDER : MTP_ASSOCIATION_TYPE_UNDEFINED); // int associationType = (format == MTP_FORMAT_ASSOCIATION ? // MTP_ASSOCIATION_TYPE_GENERIC_FOLDER : // MTP_ASSOCIATION_TYPE_UNDEFINED); int associationType = MTP_ASSOCIATION_TYPE_UNDEFINED; packet.putUInt32(storageID); packet.putUInt16(format); Loading Loading @@ -497,6 +552,37 @@ MtpResponseCode MyMtpDatabase::setObjectReferences(MtpObjectHandle handle, return result; } MtpProperty* MyMtpDatabase::getObjectPropertyDesc(MtpObjectProperty property, MtpObjectFormat format) { MtpProperty* result = NULL; switch (property) { case MTP_PROPERTY_OBJECT_FORMAT: case MTP_PROPERTY_PROTECTION_STATUS: result = new MtpProperty(property, MTP_TYPE_UINT16); break; case MTP_PROPERTY_STORAGE_ID: case MTP_PROPERTY_PARENT_OBJECT: result = new MtpProperty(property, MTP_TYPE_UINT32); break; case MTP_PROPERTY_OBJECT_SIZE: result = new MtpProperty(property, MTP_TYPE_UINT64); break; case MTP_PROPERTY_PERSISTENT_UID: result = new MtpProperty(property, MTP_TYPE_UINT128); break; case MTP_PROPERTY_OBJECT_FILE_NAME: case MTP_PROPERTY_DATE_MODIFIED: result = new MtpProperty(property, MTP_TYPE_STR); break; } return result; } MtpProperty* MyMtpDatabase::getDevicePropertyDesc(MtpDeviceProperty property) { return NULL; } #endif // HAVE_ANDROID_OS // ---------------------------------------------------------------------------- Loading
media/mtp/MtpDataPacket.cpp +11 −1 Original line number Diff line number Diff line Loading @@ -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++) Loading Loading @@ -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) Loading
media/mtp/MtpDataPacket.h +2 −0 Original line number Diff line number Diff line Loading @@ -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); Loading