diff options
author | Daichi Hirono <hirono@google.com> | 2016-01-22 19:34:25 +0900 |
---|---|---|
committer | Daichi Hirono <hirono@google.com> | 2016-01-28 11:19:55 +0900 |
commit | 038832b9001f66bd2cbebaf1312a7ada2e512114 (patch) | |
tree | 20ff3174957a2f30b24619208db6e66591ef1d18 /media/jni/android_mtp_MtpDevice.cpp | |
parent | 5012919bc3a75d1de972d29f70ae4a493f3493ed (diff) |
Implement MtpDevice#getPartialObject64 in Java API.
BUG=26703522
Change-Id: I08510e3a179b7dc8bf247a9e997dc8a160138fc2
Diffstat (limited to 'media/jni/android_mtp_MtpDevice.cpp')
-rw-r--r-- | media/jni/android_mtp_MtpDevice.cpp | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/media/jni/android_mtp_MtpDevice.cpp b/media/jni/android_mtp_MtpDevice.cpp index 8b7a9264a30a..129ce1ca2829 100644 --- a/media/jni/android_mtp_MtpDevice.cpp +++ b/media/jni/android_mtp_MtpDevice.cpp @@ -438,6 +438,60 @@ android_mtp_MtpDevice_get_partial_object(JNIEnv *env, return static_cast<jlong>(written_size); } +static jint +android_mtp_MtpDevice_get_partial_object_64(JNIEnv *env, + jobject thiz, + jint objectID, + jlong offset, + jlong size, + jbyteArray array) { + if (!array) { + jniThrowException(env, "java/lang/IllegalArgumentException", "Array must not be null."); + return -1; + } + + if (offset < 0) { + jniThrowException( + env, + "java/lang/IllegalArgumentException", + "Offset argument must not be a negative value."); + return -1; + } + + if (size < 0 || 0xffffffffL < size) { + jniThrowException( + env, + "java/lang/IllegalArgumentException", + "Size argument must be a 32-bit unsigned integer."); + return -1; + } + + MtpDevice* const device = get_device_from_object(env, thiz); + if (!device) { + jniThrowException(env, "java/io/IOException", "Failed to obtain MtpDevice."); + return -1; + } + + const uint32_t native_object_handle = static_cast<uint32_t>(objectID); + const uint64_t native_offset = static_cast<uint64_t>(offset); + const uint32_t native_size = static_cast<uint32_t>(size); + + JavaArrayWriter writer(env, array); + uint32_t written_size; + const bool success = device->readPartialObject64( + native_object_handle, + native_offset, + native_size, + &written_size, + JavaArrayWriter::writeTo, + &writer); + if (!success) { + jniThrowException(env, "java/io/IOException", "Failed to read data."); + return -1; + } + return static_cast<jint>(written_size); +} + static jbyteArray android_mtp_MtpDevice_get_thumbnail(JNIEnv *env, jobject thiz, jint objectID) { @@ -649,6 +703,8 @@ static const JNINativeMethod gMethods[] = { (void *)android_mtp_MtpDevice_get_object_info}, {"native_get_object", "(II)[B",(void *)android_mtp_MtpDevice_get_object}, {"native_get_partial_object", "(IJJ[B)J", (void *)android_mtp_MtpDevice_get_partial_object}, + {"native_get_partial_object_64", "(IJJ[B)I", + (void *)android_mtp_MtpDevice_get_partial_object_64}, {"native_get_thumbnail", "(I)[B",(void *)android_mtp_MtpDevice_get_thumbnail}, {"native_delete_object", "(I)Z", (void *)android_mtp_MtpDevice_delete_object}, {"native_get_parent", "(I)J", (void *)android_mtp_MtpDevice_get_parent}, |