| OLD | NEW | 
| (Empty) |  | 
 |    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 | 
 |    3 // found in the LICENSE file. | 
 |    4  | 
 |    5 #include "components/cronet/android/cronet_upload_data_stream_delegate.h" | 
 |    6  | 
 |    7 #include <string> | 
 |    8  | 
 |    9 #include "base/android/jni_android.h" | 
 |   10 #include "base/android/jni_string.h" | 
 |   11 #include "base/bind.h" | 
 |   12 #include "base/message_loop/message_loop_proxy.h" | 
 |   13 #include "base/single_thread_task_runner.h" | 
 |   14 #include "components/cronet/android/cronet_url_request_adapter.h" | 
 |   15 #include "jni/CronetUploadDataStream_jni.h" | 
 |   16  | 
 |   17 using base::android::ConvertUTF8ToJavaString; | 
 |   18  | 
 |   19 namespace cronet { | 
 |   20  | 
 |   21 CronetUploadDataStreamDelegate::CronetUploadDataStreamDelegate( | 
 |   22     JNIEnv* env, | 
 |   23     jobject jupload_data_stream) { | 
 |   24   jupload_data_stream_.Reset(env, jupload_data_stream); | 
 |   25 } | 
 |   26  | 
 |   27 CronetUploadDataStreamDelegate::~CronetUploadDataStreamDelegate() { | 
 |   28 } | 
 |   29  | 
 |   30 void CronetUploadDataStreamDelegate::InitializeOnNetworkThread( | 
 |   31     base::WeakPtr<CronetUploadDataStreamAdapter> adapter) { | 
 |   32   DCHECK(!adapter_); | 
 |   33   DCHECK(!network_task_runner_.get()); | 
 |   34  | 
 |   35   adapter_ = adapter; | 
 |   36   network_task_runner_ = base::MessageLoopProxy::current(); | 
 |   37   DCHECK(network_task_runner_); | 
 |   38 } | 
 |   39  | 
 |   40 void CronetUploadDataStreamDelegate::Read(net::IOBuffer* buffer, int buf_len) { | 
 |   41   DCHECK(adapter_); | 
 |   42   DCHECK(network_task_runner_); | 
 |   43   DCHECK(network_task_runner_->BelongsToCurrentThread()); | 
 |   44   DCHECK_GT(buf_len, 0); | 
 |   45   DCHECK(!buffer_.get()); | 
 |   46   buffer_ = buffer; | 
 |   47  | 
 |   48   // TODO(mmenke):  Consider preserving the java buffer across reads, when the | 
 |   49   // IOBuffer's data pointer and its length are unchanged. | 
 |   50   JNIEnv* env = base::android::AttachCurrentThread(); | 
 |   51   base::android::ScopedJavaLocalRef<jobject> java_buffer( | 
 |   52       env, env->NewDirectByteBuffer(buffer->data(), buf_len)); | 
 |   53   Java_CronetUploadDataStream_readData(env, jupload_data_stream_.obj(), | 
 |   54                                        java_buffer.obj()); | 
 |   55 } | 
 |   56  | 
 |   57 void CronetUploadDataStreamDelegate::Rewind() { | 
 |   58   DCHECK(adapter_); | 
 |   59   DCHECK(network_task_runner_->BelongsToCurrentThread()); | 
 |   60  | 
 |   61   JNIEnv* env = base::android::AttachCurrentThread(); | 
 |   62   Java_CronetUploadDataStream_rewind(env, jupload_data_stream_.obj()); | 
 |   63 } | 
 |   64  | 
 |   65 void CronetUploadDataStreamDelegate::OnAdapterDestroyed() { | 
 |   66   DCHECK(adapter_); | 
 |   67   DCHECK(network_task_runner_->BelongsToCurrentThread()); | 
 |   68  | 
 |   69   JNIEnv* env = base::android::AttachCurrentThread(); | 
 |   70   Java_CronetUploadDataStream_onAdapterDestroyed(env, | 
 |   71                                                  jupload_data_stream_.obj()); | 
 |   72 } | 
 |   73  | 
 |   74 void CronetUploadDataStreamDelegate::OnReadSucceeded(JNIEnv* env, | 
 |   75                                                      jobject jcaller, | 
 |   76                                                      int bytes_read, | 
 |   77                                                      bool final_chunk) { | 
 |   78   DCHECK(!network_task_runner_->BelongsToCurrentThread()); | 
 |   79   DCHECK(bytes_read > 0 || (final_chunk && bytes_read == 0)); | 
 |   80  | 
 |   81   buffer_ = nullptr; | 
 |   82   DCHECK(network_task_runner_->PostTask( | 
 |   83       FROM_HERE, base::Bind(&CronetUploadDataStreamAdapter::OnReadSuccess, | 
 |   84                             adapter_, bytes_read, final_chunk))); | 
 |   85 } | 
 |   86  | 
 |   87 void CronetUploadDataStreamDelegate::OnRewindSucceeded(JNIEnv* env, | 
 |   88                                                        jobject jcaller) { | 
 |   89   DCHECK(!network_task_runner_->BelongsToCurrentThread()); | 
 |   90  | 
 |   91   network_task_runner_->PostTask( | 
 |   92       FROM_HERE, | 
 |   93       base::Bind(&CronetUploadDataStreamAdapter::OnRewindSuccess, adapter_)); | 
 |   94 } | 
 |   95  | 
 |   96 bool CronetUploadDataStreamDelegateRegisterJni(JNIEnv* env) { | 
 |   97   return RegisterNativesImpl(env); | 
 |   98 } | 
 |   99  | 
 |  100 static jlong AttachUploadDataToRequest(JNIEnv* env, | 
 |  101                                        jobject jupload_data_stream, | 
 |  102                                        jlong jcronet_url_request_adapter, | 
 |  103                                        jlong jlength) { | 
 |  104   CronetURLRequestAdapter* request_adapter = | 
 |  105       reinterpret_cast<CronetURLRequestAdapter*>(jcronet_url_request_adapter); | 
 |  106   DCHECK(request_adapter != nullptr); | 
 |  107  | 
 |  108   CronetUploadDataStreamDelegate* delegate = | 
 |  109       new CronetUploadDataStreamDelegate(env, jupload_data_stream); | 
 |  110  | 
 |  111   scoped_ptr<CronetUploadDataStreamAdapter> upload_adapter( | 
 |  112       new CronetUploadDataStreamAdapter(delegate, jlength)); | 
 |  113  | 
 |  114   request_adapter->SetUpload(upload_adapter.Pass()); | 
 |  115  | 
 |  116   return reinterpret_cast<jlong>(delegate); | 
 |  117 } | 
 |  118  | 
 |  119 static jlong CreateDelegateForTesting(JNIEnv* env, | 
 |  120                                       jobject jupload_data_stream) { | 
 |  121   CronetUploadDataStreamDelegate* delegate = | 
 |  122       new CronetUploadDataStreamDelegate(env, jupload_data_stream); | 
 |  123   return reinterpret_cast<jlong>(delegate); | 
 |  124 } | 
 |  125  | 
 |  126 static jlong CreateAdapterForTesting(JNIEnv* env, | 
 |  127                                      jobject jupload_data_stream, | 
 |  128                                      jlong jlength, | 
 |  129                                      jlong jdelegate) { | 
 |  130   CronetUploadDataStreamDelegate* delegate = | 
 |  131       reinterpret_cast<CronetUploadDataStreamDelegate*>(jdelegate); | 
 |  132   CronetUploadDataStreamAdapter* upload_adapter = | 
 |  133       new CronetUploadDataStreamAdapter(delegate, jlength); | 
 |  134   return reinterpret_cast<jlong>(upload_adapter); | 
 |  135 } | 
 |  136  | 
 |  137 static void DestroyDelegate(JNIEnv* env, | 
 |  138                             jclass jcronet_url_request_adapter, | 
 |  139                             jlong jupload_data_stream_delegate) { | 
 |  140   CronetUploadDataStreamDelegate* delegate = | 
 |  141       reinterpret_cast<CronetUploadDataStreamDelegate*>( | 
 |  142           jupload_data_stream_delegate); | 
 |  143   DCHECK(delegate != nullptr); | 
 |  144   delete delegate; | 
 |  145 } | 
 |  146  | 
 |  147 }  // namespace cronet | 
| OLD | NEW |