Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(942)

Side by Side Diff: components/cronet/android/cronet_upload_data_stream_delegate.cc

Issue 849903002: [Cronet] Upload support for async APIs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added throws IOException to UploadDataProvider Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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 void CronetUploadDataStreamDelegate::InitializeOnNetworkThread(
28 base::WeakPtr<CronetUploadDataStreamAdapter> adapter) {
29 DCHECK(!adapter_);
30 DCHECK(!network_task_runner_.get());
31
32 adapter_ = adapter;
33 network_task_runner_ = base::MessageLoopProxy::current();
34 DCHECK(network_task_runner_);
35 }
36
37 void CronetUploadDataStreamDelegate::Read(net::IOBuffer* buffer, int buf_len) {
38 DCHECK(adapter_);
39 DCHECK(network_task_runner_);
40 DCHECK(network_task_runner_->BelongsToCurrentThread());
41 DCHECK_GT(buf_len, 0);
42 DCHECK(!buffer_.get());
43 buffer_ = buffer;
44
45 // TODO(mmenke): Consider preserving the java buffer across reads, when the
46 // IOBuffer's data pointer and its length are unchanged.
47 JNIEnv* env = base::android::AttachCurrentThread();
48 base::android::ScopedJavaLocalRef<jobject> java_buffer(
49 env, env->NewDirectByteBuffer(buffer->data(), buf_len));
50 Java_CronetUploadDataStream_readData(env, jupload_data_stream_.obj(),
51 java_buffer.obj());
52 }
53
54 void CronetUploadDataStreamDelegate::Rewind() {
55 DCHECK(adapter_);
56 DCHECK(network_task_runner_->BelongsToCurrentThread());
57
58 JNIEnv* env = base::android::AttachCurrentThread();
59 Java_CronetUploadDataStream_rewind(env, jupload_data_stream_.obj());
60 }
61
62 void CronetUploadDataStreamDelegate::OnAdapterDestroyed() {
63 DCHECK(adapter_);
64 DCHECK(network_task_runner_->BelongsToCurrentThread());
65
66 JNIEnv* env = base::android::AttachCurrentThread();
67 Java_CronetUploadDataStream_onAdapterDestroyed(env,
68 jupload_data_stream_.obj());
69 }
70
71 void CronetUploadDataStreamDelegate::OnReadSucceeded(JNIEnv* env,
72 jobject jcaller,
73 int bytes_read,
74 bool final_chunk) {
75 DCHECK(!network_task_runner_->BelongsToCurrentThread());
76 DCHECK(bytes_read > 0 || (final_chunk && bytes_read == 0));
77
78 buffer_ = nullptr;
79 DCHECK(network_task_runner_->PostTask(
80 FROM_HERE, base::Bind(&CronetUploadDataStreamAdapter::OnReadSuccess,
81 adapter_, bytes_read, final_chunk)));
82 }
83
84 void CronetUploadDataStreamDelegate::OnRewindSucceeded(JNIEnv* env,
85 jobject jcaller) {
86 DCHECK(!network_task_runner_->BelongsToCurrentThread());
87
88 network_task_runner_->PostTask(
89 FROM_HERE,
90 base::Bind(&CronetUploadDataStreamAdapter::OnRewindSuccess, adapter_));
91 }
92
93 // Explicitly register static JNI functions.
mmenke 2015/02/18 17:08:40 nit: Remove comment, or move to the declaration i
xunjieli 2015/02/19 14:59:09 Done.
94 bool CronetUploadDataStreamDelegateRegisterJni(JNIEnv* env) {
95 return RegisterNativesImpl(env);
96 }
97
98 static jlong AttachUploadDataToRequest(JNIEnv* env,
99 jobject jupload_data_stream,
100 jlong jcronet_url_request_adapter,
101 jlong jlength) {
102 CronetURLRequestAdapter* request_adapter =
103 reinterpret_cast<CronetURLRequestAdapter*>(jcronet_url_request_adapter);
104 DCHECK(request_adapter != nullptr);
105
106 CronetUploadDataStreamDelegate* delegate =
107 new CronetUploadDataStreamDelegate(env, jupload_data_stream);
108
109 scoped_ptr<CronetUploadDataStreamAdapter> upload_adapter(
110 new CronetUploadDataStreamAdapter(delegate, jlength));
111
112 request_adapter->SetUpload(upload_adapter.Pass());
113
114 return reinterpret_cast<jlong>(delegate);
115 }
116
117 static jlong CreateDelegateForTesting(JNIEnv* env,
118 jobject jupload_data_stream) {
119 CronetUploadDataStreamDelegate* delegate =
120 new CronetUploadDataStreamDelegate(env, jupload_data_stream);
121 return reinterpret_cast<jlong>(delegate);
122 }
123
124 static jlong CreateAdapterForTesting(JNIEnv* env,
125 jobject jupload_data_stream,
126 jlong jlength,
127 jlong jdelegate) {
128 CronetUploadDataStreamDelegate* delegate =
129 reinterpret_cast<CronetUploadDataStreamDelegate*>(jdelegate);
130 CronetUploadDataStreamAdapter* upload_adapter =
131 new CronetUploadDataStreamAdapter(delegate, jlength);
132 return reinterpret_cast<jlong>(upload_adapter);
133 }
134
135 static void DestroyDelegate(JNIEnv* env,
136 jclass jcronet_url_request_adapter,
137 jlong jupload_data_stream_delegate) {
138 CronetUploadDataStreamDelegate* delegate =
139 reinterpret_cast<CronetUploadDataStreamDelegate*>(
140 jupload_data_stream_delegate);
141 DCHECK(delegate != nullptr);
142 delete delegate;
143 }
144
145 } // namespace cronet
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698