summaryrefslogtreecommitdiff
path: root/media/jni/android_mtp_MtpDevice.cpp
diff options
context:
space:
mode:
authorDaichi Hirono <hirono@google.com>2016-01-22 19:34:25 +0900
committerDaichi Hirono <hirono@google.com>2016-01-28 11:19:55 +0900
commit038832b9001f66bd2cbebaf1312a7ada2e512114 (patch)
tree20ff3174957a2f30b24619208db6e66591ef1d18 /media/jni/android_mtp_MtpDevice.cpp
parent5012919bc3a75d1de972d29f70ae4a493f3493ed (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.cpp56
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},