Skip to content

Commit 8046b5e

Browse files
mik3yAndroid (Google) Code Review
authored andcommitted
Merge "UsbRequest: set ByteBuffer.position() upon success." into jb-mr1-dev
2 parents 35cf42d + a3665ba commit 8046b5e

File tree

2 files changed

+17
-11
lines changed

2 files changed

+17
-11
lines changed

core/java/android/hardware/usb/UsbRequest.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,10 +152,14 @@ public boolean queue(ByteBuffer buffer, int length) {
152152

153153
/* package */ void dequeue() {
154154
boolean out = (mEndpoint.getDirection() == UsbConstants.USB_DIR_OUT);
155+
int bytesRead;
155156
if (mBuffer.isDirect()) {
156-
native_dequeue_direct();
157+
bytesRead = native_dequeue_direct();
157158
} else {
158-
native_dequeue_array(mBuffer.array(), mLength, out);
159+
bytesRead = native_dequeue_array(mBuffer.array(), mLength, out);
160+
}
161+
if (bytesRead >= 0) {
162+
mBuffer.position(Math.min(bytesRead, mLength));
159163
}
160164
mBuffer = null;
161165
mLength = 0;
@@ -174,8 +178,8 @@ private native boolean native_init(UsbDeviceConnection connection, int ep_addres
174178
int ep_attributes, int ep_max_packet_size, int ep_interval);
175179
private native void native_close();
176180
private native boolean native_queue_array(byte[] buffer, int length, boolean out);
177-
private native void native_dequeue_array(byte[] buffer, int length, boolean out);
181+
private native int native_dequeue_array(byte[] buffer, int length, boolean out);
178182
private native boolean native_queue_direct(ByteBuffer buffer, int length, boolean out);
179-
private native void native_dequeue_direct();
183+
private native int native_dequeue_direct();
180184
private native boolean native_cancel();
181185
}

core/jni/android_hardware_UsbRequest.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ android_hardware_UsbRequest_queue_array(JNIEnv *env, jobject thiz,
9090
request->buffer = malloc(length);
9191
if (!request->buffer)
9292
return false;
93+
memset(request->buffer, 0, length);
9394
if (out) {
9495
// copy data from Java buffer to native buffer
9596
env->GetByteArrayRegion(buffer, 0, length, (jbyte *)request->buffer);
@@ -113,14 +114,14 @@ android_hardware_UsbRequest_queue_array(JNIEnv *env, jobject thiz,
113114
}
114115
}
115116

116-
static void
117+
static int
117118
android_hardware_UsbRequest_dequeue_array(JNIEnv *env, jobject thiz,
118119
jbyteArray buffer, jint length, jboolean out)
119120
{
120121
struct usb_request* request = get_request_from_object(env, thiz);
121122
if (!request) {
122123
ALOGE("request is closed in native_dequeue");
123-
return;
124+
return -1;
124125
}
125126

126127
if (buffer && length && request->buffer && !out) {
@@ -129,7 +130,7 @@ android_hardware_UsbRequest_dequeue_array(JNIEnv *env, jobject thiz,
129130
}
130131
free(request->buffer);
131132
env->DeleteGlobalRef((jobject)request->client_data);
132-
133+
return request->actual_length;
133134
}
134135

135136
static jboolean
@@ -163,16 +164,17 @@ android_hardware_UsbRequest_queue_direct(JNIEnv *env, jobject thiz,
163164
}
164165
}
165166

166-
static void
167+
static int
167168
android_hardware_UsbRequest_dequeue_direct(JNIEnv *env, jobject thiz)
168169
{
169170
struct usb_request* request = get_request_from_object(env, thiz);
170171
if (!request) {
171172
ALOGE("request is closed in native_dequeue");
172-
return;
173+
return -1;
173174
}
174175
// all we need to do is delete our global ref
175176
env->DeleteGlobalRef((jobject)request->client_data);
177+
return request->actual_length;
176178
}
177179

178180
static jboolean
@@ -191,10 +193,10 @@ static JNINativeMethod method_table[] = {
191193
(void *)android_hardware_UsbRequest_init},
192194
{"native_close", "()V", (void *)android_hardware_UsbRequest_close},
193195
{"native_queue_array", "([BIZ)Z", (void *)android_hardware_UsbRequest_queue_array},
194-
{"native_dequeue_array", "([BIZ)V", (void *)android_hardware_UsbRequest_dequeue_array},
196+
{"native_dequeue_array", "([BIZ)I", (void *)android_hardware_UsbRequest_dequeue_array},
195197
{"native_queue_direct", "(Ljava/nio/ByteBuffer;IZ)Z",
196198
(void *)android_hardware_UsbRequest_queue_direct},
197-
{"native_dequeue_direct", "()V", (void *)android_hardware_UsbRequest_dequeue_direct},
199+
{"native_dequeue_direct", "()I", (void *)android_hardware_UsbRequest_dequeue_direct},
198200
{"native_cancel", "()Z", (void *)android_hardware_UsbRequest_cancel},
199201
};
200202

0 commit comments

Comments
 (0)