Loading media/jni/android_media_MtpDatabase.cpp +61 −27 Original line number Diff line number Diff line Loading @@ -118,6 +118,18 @@ public: MtpObjectHandleList* references); }; // ---------------------------------------------------------------------------- static void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) { if (env->ExceptionCheck()) { LOGE("An exception was thrown by callback '%s'.", methodName); LOGE_EX(env); env->ExceptionClear(); } } // ---------------------------------------------------------------------------- MyMtpDatabase::MyMtpDatabase(JNIEnv *env, jobject client) : mDatabase(env->NewGlobalRef(client)), mIntBuffer(NULL), Loading Loading @@ -165,8 +177,12 @@ MtpObjectHandle MyMtpDatabase::beginSendObject(const char* path, uint64_t size, time_t modified) { JNIEnv* env = AndroidRuntime::getJNIEnv(); return env->CallIntMethod(mDatabase, method_beginSendObject, env->NewStringUTF(path), (jint)format, (jint)parent, (jint)storage, (jlong)size, (jlong)modified); MtpObjectHandle result = env->CallIntMethod(mDatabase, method_beginSendObject, env->NewStringUTF(path), (jint)format, (jint)parent, (jint)storage, (jlong)size, (jlong)modified); checkAndClearExceptionFromCallback(env, __FUNCTION__); return result; } void MyMtpDatabase::endSendObject(const char* path, MtpObjectHandle handle, Loading @@ -174,6 +190,8 @@ void MyMtpDatabase::endSendObject(const char* path, MtpObjectHandle handle, JNIEnv* env = AndroidRuntime::getJNIEnv(); env->CallVoidMethod(mDatabase, method_endSendObject, env->NewStringUTF(path), (jint)handle, (jint)format, (jboolean)succeeded); checkAndClearExceptionFromCallback(env, __FUNCTION__); } MtpObjectHandleList* MyMtpDatabase::getObjectList(MtpStorageID storageID, Loading @@ -190,6 +208,8 @@ MtpObjectHandleList* MyMtpDatabase::getObjectList(MtpStorageID storageID, for (int i = 0; i < length; i++) list->push(handles[i]); env->ReleaseIntArrayElements(array, handles, 0); checkAndClearExceptionFromCallback(env, __FUNCTION__); return list; } Loading @@ -197,8 +217,11 @@ int MyMtpDatabase::getNumObjects(MtpStorageID storageID, MtpObjectFormat format, MtpObjectHandle parent) { JNIEnv* env = AndroidRuntime::getJNIEnv(); return env->CallIntMethod(mDatabase, method_getNumObjects, int result = env->CallIntMethod(mDatabase, method_getNumObjects, (jint)storageID, (jint)format, (jint)parent); checkAndClearExceptionFromCallback(env, __FUNCTION__); return result; } MtpObjectFormatList* MyMtpDatabase::getSupportedPlaybackFormats() { Loading @@ -213,6 +236,8 @@ MtpObjectFormatList* MyMtpDatabase::getSupportedPlaybackFormats() { for (int i = 0; i < length; i++) list->push(formats[i]); env->ReleaseIntArrayElements(array, formats, 0); checkAndClearExceptionFromCallback(env, __FUNCTION__); return list; } Loading @@ -228,6 +253,8 @@ MtpObjectFormatList* MyMtpDatabase::getSupportedCaptureFormats() { for (int i = 0; i < length; i++) list->push(formats[i]); env->ReleaseIntArrayElements(array, formats, 0); checkAndClearExceptionFromCallback(env, __FUNCTION__); return list; } Loading @@ -243,6 +270,8 @@ MtpObjectPropertyList* MyMtpDatabase::getSupportedObjectProperties(MtpObjectForm for (int i = 0; i < length; i++) list->push(properties[i]); env->ReleaseIntArrayElements(array, properties, 0); checkAndClearExceptionFromCallback(env, __FUNCTION__); return list; } Loading @@ -258,6 +287,8 @@ MtpDevicePropertyList* MyMtpDatabase::getSupportedDeviceProperties() { for (int i = 0; i < length; i++) list->push(properties[i]); env->ReleaseIntArrayElements(array, properties, 0); checkAndClearExceptionFromCallback(env, __FUNCTION__); return list; } Loading Loading @@ -315,6 +346,8 @@ MtpResponseCode MyMtpDatabase::getObjectProperty(MtpObjectHandle handle, LOGE("unsupported object type\n"); return MTP_RESPONSE_INVALID_OBJECT_HANDLE; } checkAndClearExceptionFromCallback(env, __FUNCTION__); return MTP_RESPONSE_OK; } Loading Loading @@ -368,6 +401,7 @@ MtpResponseCode MyMtpDatabase::getObjectInfo(MtpObjectHandle handle, packet.putString(date); // date modified packet.putEmptyString(); // keywords checkAndClearExceptionFromCallback(env, __FUNCTION__); return MTP_RESPONSE_OK; } Loading @@ -388,12 +422,16 @@ MtpResponseCode MyMtpDatabase::getObjectFilePath(MtpObjectHandle handle, fileLength = longValues[0]; env->ReleaseLongArrayElements(mLongBuffer, longValues, 0); checkAndClearExceptionFromCallback(env, __FUNCTION__); return result; } MtpResponseCode MyMtpDatabase::deleteFile(MtpObjectHandle handle) { JNIEnv* env = AndroidRuntime::getJNIEnv(); return env->CallIntMethod(mDatabase, method_deleteFile, (jint)handle); MtpResponseCode result = env->CallIntMethod(mDatabase, method_deleteFile, (jint)handle); checkAndClearExceptionFromCallback(env, __FUNCTION__); return result; } struct PropertyTableEntry { Loading Loading @@ -434,10 +472,13 @@ MtpObjectHandleList* MyMtpDatabase::getObjectReferences(MtpObjectHandle handle) for (int i = 0; i < length; i++) list->push(handles[i]); env->ReleaseIntArrayElements(array, handles, 0); checkAndClearExceptionFromCallback(env, __FUNCTION__); return list; } MtpResponseCode MyMtpDatabase::setObjectReferences(MtpObjectHandle handle, MtpObjectHandleList* references) { MtpResponseCode MyMtpDatabase::setObjectReferences(MtpObjectHandle handle, MtpObjectHandleList* references) { JNIEnv* env = AndroidRuntime::getJNIEnv(); int count = references->size(); jintArray array = env->NewIntArray(count); Loading @@ -449,18 +490,11 @@ MtpResponseCode MyMtpDatabase::setObjectReferences(MtpObjectHandle handle, MtpOb for (int i = 0; i < count; i++) handles[i] = (*references)[i]; env->ReleaseIntArrayElements(array, handles, 0); return env->CallIntMethod(mDatabase, method_setObjectReferences, MtpResponseCode result = env->CallIntMethod(mDatabase, method_setObjectReferences, (jint)handle, array); } // ---------------------------------------------------------------------------- static void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) { if (env->ExceptionCheck()) { LOGE("An exception was thrown by callback '%s'.", methodName); LOGE_EX(env); env->ExceptionClear(); } checkAndClearExceptionFromCallback(env, __FUNCTION__); return result; } #endif // HAVE_ANDROID_OS Loading Loading
media/jni/android_media_MtpDatabase.cpp +61 −27 Original line number Diff line number Diff line Loading @@ -118,6 +118,18 @@ public: MtpObjectHandleList* references); }; // ---------------------------------------------------------------------------- static void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) { if (env->ExceptionCheck()) { LOGE("An exception was thrown by callback '%s'.", methodName); LOGE_EX(env); env->ExceptionClear(); } } // ---------------------------------------------------------------------------- MyMtpDatabase::MyMtpDatabase(JNIEnv *env, jobject client) : mDatabase(env->NewGlobalRef(client)), mIntBuffer(NULL), Loading Loading @@ -165,8 +177,12 @@ MtpObjectHandle MyMtpDatabase::beginSendObject(const char* path, uint64_t size, time_t modified) { JNIEnv* env = AndroidRuntime::getJNIEnv(); return env->CallIntMethod(mDatabase, method_beginSendObject, env->NewStringUTF(path), (jint)format, (jint)parent, (jint)storage, (jlong)size, (jlong)modified); MtpObjectHandle result = env->CallIntMethod(mDatabase, method_beginSendObject, env->NewStringUTF(path), (jint)format, (jint)parent, (jint)storage, (jlong)size, (jlong)modified); checkAndClearExceptionFromCallback(env, __FUNCTION__); return result; } void MyMtpDatabase::endSendObject(const char* path, MtpObjectHandle handle, Loading @@ -174,6 +190,8 @@ void MyMtpDatabase::endSendObject(const char* path, MtpObjectHandle handle, JNIEnv* env = AndroidRuntime::getJNIEnv(); env->CallVoidMethod(mDatabase, method_endSendObject, env->NewStringUTF(path), (jint)handle, (jint)format, (jboolean)succeeded); checkAndClearExceptionFromCallback(env, __FUNCTION__); } MtpObjectHandleList* MyMtpDatabase::getObjectList(MtpStorageID storageID, Loading @@ -190,6 +208,8 @@ MtpObjectHandleList* MyMtpDatabase::getObjectList(MtpStorageID storageID, for (int i = 0; i < length; i++) list->push(handles[i]); env->ReleaseIntArrayElements(array, handles, 0); checkAndClearExceptionFromCallback(env, __FUNCTION__); return list; } Loading @@ -197,8 +217,11 @@ int MyMtpDatabase::getNumObjects(MtpStorageID storageID, MtpObjectFormat format, MtpObjectHandle parent) { JNIEnv* env = AndroidRuntime::getJNIEnv(); return env->CallIntMethod(mDatabase, method_getNumObjects, int result = env->CallIntMethod(mDatabase, method_getNumObjects, (jint)storageID, (jint)format, (jint)parent); checkAndClearExceptionFromCallback(env, __FUNCTION__); return result; } MtpObjectFormatList* MyMtpDatabase::getSupportedPlaybackFormats() { Loading @@ -213,6 +236,8 @@ MtpObjectFormatList* MyMtpDatabase::getSupportedPlaybackFormats() { for (int i = 0; i < length; i++) list->push(formats[i]); env->ReleaseIntArrayElements(array, formats, 0); checkAndClearExceptionFromCallback(env, __FUNCTION__); return list; } Loading @@ -228,6 +253,8 @@ MtpObjectFormatList* MyMtpDatabase::getSupportedCaptureFormats() { for (int i = 0; i < length; i++) list->push(formats[i]); env->ReleaseIntArrayElements(array, formats, 0); checkAndClearExceptionFromCallback(env, __FUNCTION__); return list; } Loading @@ -243,6 +270,8 @@ MtpObjectPropertyList* MyMtpDatabase::getSupportedObjectProperties(MtpObjectForm for (int i = 0; i < length; i++) list->push(properties[i]); env->ReleaseIntArrayElements(array, properties, 0); checkAndClearExceptionFromCallback(env, __FUNCTION__); return list; } Loading @@ -258,6 +287,8 @@ MtpDevicePropertyList* MyMtpDatabase::getSupportedDeviceProperties() { for (int i = 0; i < length; i++) list->push(properties[i]); env->ReleaseIntArrayElements(array, properties, 0); checkAndClearExceptionFromCallback(env, __FUNCTION__); return list; } Loading Loading @@ -315,6 +346,8 @@ MtpResponseCode MyMtpDatabase::getObjectProperty(MtpObjectHandle handle, LOGE("unsupported object type\n"); return MTP_RESPONSE_INVALID_OBJECT_HANDLE; } checkAndClearExceptionFromCallback(env, __FUNCTION__); return MTP_RESPONSE_OK; } Loading Loading @@ -368,6 +401,7 @@ MtpResponseCode MyMtpDatabase::getObjectInfo(MtpObjectHandle handle, packet.putString(date); // date modified packet.putEmptyString(); // keywords checkAndClearExceptionFromCallback(env, __FUNCTION__); return MTP_RESPONSE_OK; } Loading @@ -388,12 +422,16 @@ MtpResponseCode MyMtpDatabase::getObjectFilePath(MtpObjectHandle handle, fileLength = longValues[0]; env->ReleaseLongArrayElements(mLongBuffer, longValues, 0); checkAndClearExceptionFromCallback(env, __FUNCTION__); return result; } MtpResponseCode MyMtpDatabase::deleteFile(MtpObjectHandle handle) { JNIEnv* env = AndroidRuntime::getJNIEnv(); return env->CallIntMethod(mDatabase, method_deleteFile, (jint)handle); MtpResponseCode result = env->CallIntMethod(mDatabase, method_deleteFile, (jint)handle); checkAndClearExceptionFromCallback(env, __FUNCTION__); return result; } struct PropertyTableEntry { Loading Loading @@ -434,10 +472,13 @@ MtpObjectHandleList* MyMtpDatabase::getObjectReferences(MtpObjectHandle handle) for (int i = 0; i < length; i++) list->push(handles[i]); env->ReleaseIntArrayElements(array, handles, 0); checkAndClearExceptionFromCallback(env, __FUNCTION__); return list; } MtpResponseCode MyMtpDatabase::setObjectReferences(MtpObjectHandle handle, MtpObjectHandleList* references) { MtpResponseCode MyMtpDatabase::setObjectReferences(MtpObjectHandle handle, MtpObjectHandleList* references) { JNIEnv* env = AndroidRuntime::getJNIEnv(); int count = references->size(); jintArray array = env->NewIntArray(count); Loading @@ -449,18 +490,11 @@ MtpResponseCode MyMtpDatabase::setObjectReferences(MtpObjectHandle handle, MtpOb for (int i = 0; i < count; i++) handles[i] = (*references)[i]; env->ReleaseIntArrayElements(array, handles, 0); return env->CallIntMethod(mDatabase, method_setObjectReferences, MtpResponseCode result = env->CallIntMethod(mDatabase, method_setObjectReferences, (jint)handle, array); } // ---------------------------------------------------------------------------- static void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) { if (env->ExceptionCheck()) { LOGE("An exception was thrown by callback '%s'.", methodName); LOGE_EX(env); env->ExceptionClear(); } checkAndClearExceptionFromCallback(env, __FUNCTION__); return result; } #endif // HAVE_ANDROID_OS Loading