| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cronet_bidirectional_stream_adapter.h" | 5 #include "cronet_bidirectional_stream_adapter.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 jboolean jend_of_stream) { | 157 jboolean jend_of_stream) { |
| 158 size_t buffers_array_size = SafeGetArrayLength(env, jbyte_buffers.obj()); | 158 size_t buffers_array_size = SafeGetArrayLength(env, jbyte_buffers.obj()); |
| 159 size_t pos_array_size = SafeGetArrayLength(env, jbyte_buffers.obj()); | 159 size_t pos_array_size = SafeGetArrayLength(env, jbyte_buffers.obj()); |
| 160 size_t limit_array_size = SafeGetArrayLength(env, jbyte_buffers.obj()); | 160 size_t limit_array_size = SafeGetArrayLength(env, jbyte_buffers.obj()); |
| 161 if (buffers_array_size != pos_array_size || | 161 if (buffers_array_size != pos_array_size || |
| 162 buffers_array_size != limit_array_size) { | 162 buffers_array_size != limit_array_size) { |
| 163 DLOG(ERROR) << "Illegal arguments."; | 163 DLOG(ERROR) << "Illegal arguments."; |
| 164 return JNI_FALSE; | 164 return JNI_FALSE; |
| 165 } | 165 } |
| 166 | 166 |
| 167 IOByteBufferList buffers; | 167 IOBufferWithByteBufferList buffers; |
| 168 for (size_t i = 0; i < buffers_array_size; ++i) { | 168 for (size_t i = 0; i < buffers_array_size; ++i) { |
| 169 ScopedJavaLocalRef<jobject> jbuffer( | 169 ScopedJavaLocalRef<jobject> jbuffer( |
| 170 env, env->GetObjectArrayElement(jbyte_buffers, i)); | 170 env, env->GetObjectArrayElement(jbyte_buffers, i)); |
| 171 void* data = env->GetDirectBufferAddress(jbuffer.obj()); | 171 void* data = env->GetDirectBufferAddress(jbuffer.obj()); |
| 172 if (!data) | 172 if (!data) |
| 173 return JNI_FALSE; | 173 return JNI_FALSE; |
| 174 jint pos; | 174 jint pos; |
| 175 env->GetIntArrayRegion(jbyte_buffers_pos.obj(), i, 1, &pos); | 175 env->GetIntArrayRegion(jbyte_buffers_pos.obj(), i, 1, &pos); |
| 176 jint limit; | 176 jint limit; |
| 177 env->GetIntArrayRegion(jbyte_buffers_limit.obj(), i, 1, &limit); | 177 env->GetIntArrayRegion(jbyte_buffers_limit.obj(), i, 1, &limit); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 251 // embedder releases it, too. | 251 // embedder releases it, too. |
| 252 read_buffer_ = nullptr; | 252 read_buffer_ = nullptr; |
| 253 } | 253 } |
| 254 | 254 |
| 255 void CronetBidirectionalStreamAdapter::OnDataSent() { | 255 void CronetBidirectionalStreamAdapter::OnDataSent() { |
| 256 DCHECK(context_->IsOnNetworkThread()); | 256 DCHECK(context_->IsOnNetworkThread()); |
| 257 DCHECK(!write_buffer_list_.empty()); | 257 DCHECK(!write_buffer_list_.empty()); |
| 258 | 258 |
| 259 JNIEnv* env = base::android::AttachCurrentThread(); | 259 JNIEnv* env = base::android::AttachCurrentThread(); |
| 260 base::android::ScopedJavaLocalRef<jclass> byte_buffer_clazz( | 260 base::android::ScopedJavaLocalRef<jclass> byte_buffer_clazz( |
| 261 env, env->GetObjectClass(write_buffer_list_[0]->byte_buffer())); | 261 env, env->FindClass("java/nio/ByteBuffer")); |
| 262 size_t size = write_buffer_list_.size(); | 262 size_t size = write_buffer_list_.size(); |
| 263 jobjectArray jbuffers = | 263 jobjectArray jbuffer_array = |
| 264 env->NewObjectArray(size, byte_buffer_clazz.obj(), NULL); | 264 env->NewObjectArray(size, byte_buffer_clazz.obj(), NULL); |
| 265 base::android::CheckException(env); | 265 base::android::CheckException(env); |
| 266 std::vector<int> initial_positions; | 266 std::vector<int> initial_positions; |
| 267 std::vector<int> initial_limits; | 267 std::vector<int> initial_limits; |
| 268 for (size_t i = 0; i < size; ++i) { | 268 for (size_t i = 0; i < size; ++i) { |
| 269 env->SetObjectArrayElement(jbuffers, i, | 269 env->SetObjectArrayElement(jbuffer_array, i, |
| 270 write_buffer_list_[i]->byte_buffer()); | 270 write_buffer_list_[i]->byte_buffer()); |
| 271 initial_positions.push_back(write_buffer_list_[i]->initial_position()); | 271 initial_positions.push_back(write_buffer_list_[i]->initial_position()); |
| 272 initial_limits.push_back(write_buffer_list_[i]->initial_limit()); | 272 initial_limits.push_back(write_buffer_list_[i]->initial_limit()); |
| 273 } | 273 } |
| 274 ScopedJavaLocalRef<jobjectArray> jbuffers(env, jbuffer_array); |
| 274 ScopedJavaLocalRef<jintArray> jinitial_positions = | 275 ScopedJavaLocalRef<jintArray> jinitial_positions = |
| 275 base::android::ToJavaIntArray(env, initial_positions); | 276 base::android::ToJavaIntArray(env, initial_positions); |
| 276 ScopedJavaLocalRef<jintArray> jinitial_limits = | 277 ScopedJavaLocalRef<jintArray> jinitial_limits = |
| 277 base::android::ToJavaIntArray(env, initial_limits); | 278 base::android::ToJavaIntArray(env, initial_limits); |
| 278 // Call into Java. | 279 // Call into Java. |
| 279 cronet::Java_CronetBidirectionalStream_onWritevCompleted( | 280 cronet::Java_CronetBidirectionalStream_onWritevCompleted( |
| 280 env, owner_.obj(), jbuffers, jinitial_positions.obj(), | 281 env, owner_.obj(), jbuffers.obj(), jinitial_positions.obj(), |
| 281 jinitial_limits.obj(), write_end_of_stream_); | 282 jinitial_limits.obj(), write_end_of_stream_); |
| 282 // Free the write buffers. This lets the Java ByteBuffer be freed, if the | 283 // Free the write buffers. This lets the Java ByteBuffer be freed, if the |
| 283 // embedder releases it, too. | 284 // embedder releases it, too. |
| 284 write_buffer_list_.clear(); | 285 write_buffer_list_.clear(); |
| 285 } | 286 } |
| 286 | 287 |
| 287 void CronetBidirectionalStreamAdapter::OnTrailersReceived( | 288 void CronetBidirectionalStreamAdapter::OnTrailersReceived( |
| 288 const net::SpdyHeaderBlock& response_trailers) { | 289 const net::SpdyHeaderBlock& response_trailers) { |
| 289 DCHECK(context_->IsOnNetworkThread()); | 290 DCHECK(context_->IsOnNetworkThread()); |
| 290 JNIEnv* env = base::android::AttachCurrentThread(); | 291 JNIEnv* env = base::android::AttachCurrentThread(); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 return; | 333 return; |
| 333 | 334 |
| 334 if (bytes_read < 0) { | 335 if (bytes_read < 0) { |
| 335 OnFailed(bytes_read); | 336 OnFailed(bytes_read); |
| 336 return; | 337 return; |
| 337 } | 338 } |
| 338 OnDataRead(bytes_read); | 339 OnDataRead(bytes_read); |
| 339 } | 340 } |
| 340 | 341 |
| 341 void CronetBidirectionalStreamAdapter::WritevDataOnNetworkThread( | 342 void CronetBidirectionalStreamAdapter::WritevDataOnNetworkThread( |
| 342 const IOByteBufferList& write_buffer_list, | 343 const IOBufferWithByteBufferList& write_buffer_list, |
| 343 bool end_of_stream) { | 344 bool end_of_stream) { |
| 344 DCHECK(context_->IsOnNetworkThread()); | 345 DCHECK(context_->IsOnNetworkThread()); |
| 345 DCHECK(write_buffer_list_.empty()); | 346 DCHECK(write_buffer_list_.empty()); |
| 346 DCHECK(!write_buffer_list.empty()); | 347 DCHECK(!write_buffer_list.empty()); |
| 347 DCHECK(!write_end_of_stream_); | 348 DCHECK(!write_end_of_stream_); |
| 348 | 349 |
| 349 if (stream_failed_) { | 350 if (stream_failed_) { |
| 350 // If stream failed between the time when WriteData is invoked and | 351 // If stream failed between the time when WritevData is invoked and |
| 351 // WriteDataOnNetworkThread is executed, do not call into |bidi_stream_| | 352 // WritevDataOnNetworkThread is executed, do not call into |bidi_stream_| |
| 352 // since the underlying stream might have been destroyed. Do not invoke | 353 // since the underlying stream might have been destroyed. Do not invoke |
| 353 // Java callback either, since onError is posted when |stream_failed_| is | 354 // Java callback either, since onError is posted when |stream_failed_| is |
| 354 // set to true. | 355 // set to true. |
| 355 return; | 356 return; |
| 356 } | 357 } |
| 357 | 358 |
| 358 write_end_of_stream_ = end_of_stream; | 359 write_end_of_stream_ = end_of_stream; |
| 359 std::vector<net::IOBuffer*> buffers; | 360 std::vector<net::IOBuffer*> buffers; |
| 360 std::vector<int> lengths; | 361 std::vector<int> lengths; |
| 361 for (const auto& buffer : write_buffer_list) { | 362 for (const auto& buffer : write_buffer_list) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 388 | 389 |
| 389 std::vector<std::string> headers; | 390 std::vector<std::string> headers; |
| 390 for (const auto& header : header_block) { | 391 for (const auto& header : header_block) { |
| 391 headers.push_back(header.first.as_string()); | 392 headers.push_back(header.first.as_string()); |
| 392 headers.push_back(header.second.as_string()); | 393 headers.push_back(header.second.as_string()); |
| 393 } | 394 } |
| 394 return base::android::ToJavaArrayOfStrings(env, headers); | 395 return base::android::ToJavaArrayOfStrings(env, headers); |
| 395 } | 396 } |
| 396 | 397 |
| 397 } // namespace cronet | 398 } // namespace cronet |
| OLD | NEW |