diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java index 29bcc19281152..760a2d13eecbf 100755 --- a/media/java/android/mtp/MtpDatabase.java +++ b/media/java/android/mtp/MtpDatabase.java @@ -713,8 +713,7 @@ public class MtpDatabase implements AutoCloseable { }; } - - private MtpPropertyList getObjectPropertyList(long handle, int format, long property, + private MtpPropertyList getObjectPropertyList(int handle, int format, int property, int groupCode, int depth) { // FIXME - implement group support if (groupCode != 0) { @@ -722,29 +721,29 @@ public class MtpDatabase implements AutoCloseable { } MtpPropertyGroup propertyGroup; - if (property == 0xFFFFFFFFL) { - if (format == 0 && handle > 0) { + if (property == 0xffffffff) { + if (format == 0 && handle != 0 && handle != 0xffffffff) { // return properties based on the object's format - format = getObjectFormat((int)handle); + format = getObjectFormat(handle); } - propertyGroup = mPropertyGroupsByFormat.get(format); - if (propertyGroup == null) { + propertyGroup = mPropertyGroupsByFormat.get(format); + if (propertyGroup == null) { int[] propertyList = getSupportedObjectProperties(format); propertyGroup = new MtpPropertyGroup(this, mMediaProvider, mVolumeName, propertyList); - mPropertyGroupsByFormat.put(new Integer(format), propertyGroup); + mPropertyGroupsByFormat.put(format, propertyGroup); } } else { - propertyGroup = mPropertyGroupsByProperty.get(property); - if (propertyGroup == null) { - int[] propertyList = new int[] { (int)property }; - propertyGroup = new MtpPropertyGroup(this, mMediaProvider, - mVolumeName, propertyList); - mPropertyGroupsByProperty.put(new Integer((int)property), propertyGroup); + propertyGroup = mPropertyGroupsByProperty.get(property); + if (propertyGroup == null) { + final int[] propertyList = new int[] { property }; + propertyGroup = new MtpPropertyGroup( + this, mMediaProvider, mVolumeName, propertyList); + mPropertyGroupsByProperty.put(property, propertyGroup); } } - return propertyGroup.getPropertyList((int)handle, format, depth); + return propertyGroup.getPropertyList(handle, format, depth); } private int renameFile(int handle, String newName) { @@ -970,7 +969,7 @@ public class MtpDatabase implements AutoCloseable { Cursor c = null; try { c = mMediaProvider.query(mObjectsUri, FORMAT_PROJECTION, - ID_WHERE, new String[] { Integer.toString(handle) }, null, null); + ID_WHERE, new String[] { Integer.toString(handle) }, null, null); if (c != null && c.moveToNext()) { return c.getInt(1); } else { diff --git a/media/jni/android_mtp_MtpDatabase.cpp b/media/jni/android_mtp_MtpDatabase.cpp index 556f2c7706484..5722cb0130265 100644 --- a/media/jni/android_mtp_MtpDatabase.cpp +++ b/media/jni/android_mtp_MtpDatabase.cpp @@ -231,11 +231,11 @@ MyMtpDatabase::~MyMtpDatabase() { } MtpObjectHandle MyMtpDatabase::beginSendObject(const char* path, - MtpObjectFormat format, - MtpObjectHandle parent, - MtpStorageID storage, - uint64_t size, - time_t modified) { + MtpObjectFormat format, + MtpObjectHandle parent, + MtpStorageID storage, + uint64_t size, + time_t modified) { JNIEnv* env = AndroidRuntime::getJNIEnv(); jstring pathStr = env->NewStringUTF(path); MtpObjectHandle result = env->CallIntMethod(mDatabase, method_beginSendObject, @@ -249,7 +249,7 @@ MtpObjectHandle MyMtpDatabase::beginSendObject(const char* path, } void MyMtpDatabase::endSendObject(const char* path, MtpObjectHandle handle, - MtpObjectFormat format, bool succeeded) { + MtpObjectFormat format, bool succeeded) { JNIEnv* env = AndroidRuntime::getJNIEnv(); jstring pathStr = env->NewStringUTF(path); env->CallVoidMethod(mDatabase, method_endSendObject, pathStr, @@ -261,8 +261,8 @@ void MyMtpDatabase::endSendObject(const char* path, MtpObjectHandle handle, } MtpObjectHandleList* MyMtpDatabase::getObjectList(MtpStorageID storageID, - MtpObjectFormat format, - MtpObjectHandle parent) { + MtpObjectFormat format, + MtpObjectHandle parent) { JNIEnv* env = AndroidRuntime::getJNIEnv(); jintArray array = (jintArray)env->CallObjectMethod(mDatabase, method_getObjectList, (jint)storageID, (jint)format, (jint)parent); @@ -281,8 +281,8 @@ MtpObjectHandleList* MyMtpDatabase::getObjectList(MtpStorageID storageID, } int MyMtpDatabase::getNumObjects(MtpStorageID storageID, - MtpObjectFormat format, - MtpObjectHandle parent) { + MtpObjectFormat format, + MtpObjectHandle parent) { JNIEnv* env = AndroidRuntime::getJNIEnv(); int result = env->CallIntMethod(mDatabase, method_getNumObjects, (jint)storageID, (jint)format, (jint)parent); @@ -364,11 +364,21 @@ MtpDevicePropertyList* MyMtpDatabase::getSupportedDeviceProperties() { } MtpResponseCode MyMtpDatabase::getObjectPropertyValue(MtpObjectHandle handle, - MtpObjectProperty property, - MtpDataPacket& packet) { + MtpObjectProperty property, + MtpDataPacket& packet) { + static_assert(sizeof(jint) >= sizeof(MtpObjectHandle), + "Casting MtpObjectHandle to jint loses a value"); + static_assert(sizeof(jint) >= sizeof(MtpObjectProperty), + "Casting MtpObjectProperty to jint loses a value"); JNIEnv* env = AndroidRuntime::getJNIEnv(); - jobject list = env->CallObjectMethod(mDatabase, method_getObjectPropertyList, - (jlong)handle, 0, (jlong)property, 0, 0); + jobject list = env->CallObjectMethod( + mDatabase, + method_getObjectPropertyList, + static_cast(handle), + 0, + static_cast(property), + 0, + 0); MtpResponseCode result = env->GetIntField(list, field_mResult); int count = env->GetIntField(list, field_mCount); if (result == MTP_RESPONSE_OK && count != 1) @@ -532,8 +542,8 @@ static bool readLongValue(int type, MtpDataPacket& packet, jlong& longValue) { } MtpResponseCode MyMtpDatabase::setObjectPropertyValue(MtpObjectHandle handle, - MtpObjectProperty property, - MtpDataPacket& packet) { + MtpObjectProperty property, + MtpDataPacket& packet) { int type; if (!getObjectPropertyInfo(property, type)) @@ -563,7 +573,7 @@ fail: } MtpResponseCode MyMtpDatabase::getDevicePropertyValue(MtpDeviceProperty property, - MtpDataPacket& packet) { + MtpDataPacket& packet) { JNIEnv* env = AndroidRuntime::getJNIEnv(); if (property == MTP_DEVICE_PROPERTY_BATTERY_LEVEL) { @@ -636,7 +646,7 @@ MtpResponseCode MyMtpDatabase::getDevicePropertyValue(MtpDeviceProperty property } MtpResponseCode MyMtpDatabase::setDevicePropertyValue(MtpDeviceProperty property, - MtpDataPacket& packet) { + MtpDataPacket& packet) { int type; if (!getDevicePropertyInfo(property, type)) @@ -670,12 +680,20 @@ MtpResponseCode MyMtpDatabase::resetDeviceProperty(MtpDeviceProperty /*property* } MtpResponseCode MyMtpDatabase::getObjectPropertyList(MtpObjectHandle handle, - uint32_t format, uint32_t property, - int groupCode, int depth, - MtpDataPacket& packet) { + uint32_t format, uint32_t property, + int groupCode, int depth, + MtpDataPacket& packet) { + static_assert(sizeof(jint) >= sizeof(MtpObjectHandle), + "Casting MtpObjectHandle to jint loses a value"); JNIEnv* env = AndroidRuntime::getJNIEnv(); - jobject list = env->CallObjectMethod(mDatabase, method_getObjectPropertyList, - (jlong)handle, (jint)format, (jlong)property, (jint)groupCode, (jint)depth); + jobject list = env->CallObjectMethod( + mDatabase, + method_getObjectPropertyList, + static_cast(handle), + static_cast(format), + static_cast(property), + static_cast(groupCode), + static_cast(depth)); checkAndClearExceptionFromCallback(env, __FUNCTION__); if (!list) return MTP_RESPONSE_GENERAL_ERROR; @@ -787,7 +805,7 @@ static long getLongFromExifEntry(ExifEntry *e) { } MtpResponseCode MyMtpDatabase::getObjectInfo(MtpObjectHandle handle, - MtpObjectInfo& info) { + MtpObjectInfo& info) { MtpString path; int64_t length; MtpObjectFormat format; @@ -940,9 +958,9 @@ void* MyMtpDatabase::getThumbnail(MtpObjectHandle handle, size_t& outThumbSize) } MtpResponseCode MyMtpDatabase::getObjectFilePath(MtpObjectHandle handle, - MtpString& outFilePath, - int64_t& outFileLength, - MtpObjectFormat& outFormat) { + MtpString& outFilePath, + int64_t& outFileLength, + MtpObjectFormat& outFormat) { JNIEnv* env = AndroidRuntime::getJNIEnv(); jint result = env->CallIntMethod(mDatabase, method_getObjectFilePath, (jint)handle, mStringBuffer, mLongBuffer); @@ -1056,7 +1074,7 @@ MtpObjectHandleList* MyMtpDatabase::getObjectReferences(MtpObjectHandle handle) } MtpResponseCode MyMtpDatabase::setObjectReferences(MtpObjectHandle handle, - MtpObjectHandleList* references) { + MtpObjectHandleList* references) { JNIEnv* env = AndroidRuntime::getJNIEnv(); int count = references->size(); jintArray array = env->NewIntArray(count); @@ -1077,7 +1095,7 @@ MtpResponseCode MyMtpDatabase::setObjectReferences(MtpObjectHandle handle, } MtpProperty* MyMtpDatabase::getObjectPropertyDesc(MtpObjectProperty property, - MtpObjectFormat format) { + MtpObjectFormat format) { static const int channelEnum[] = { 1, // mono 2, // stereo @@ -1313,7 +1331,7 @@ int register_android_mtp_MtpDatabase(JNIEnv *env) return -1; } method_getObjectPropertyList = env->GetMethodID(clazz, "getObjectPropertyList", - "(JIJII)Landroid/mtp/MtpPropertyList;"); + "(IIIII)Landroid/mtp/MtpPropertyList;"); if (method_getObjectPropertyList == NULL) { ALOGE("Can't find getObjectPropertyList"); return -1;