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

Side by Side Diff: components/cronet/android/test/upload_data_stream_handler.cc

Issue 849903002: [Cronet] Upload support for async APIs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 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 2014 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 "upload_data_stream_handler.h"
6
7 #include <string>
8
9 #include "base/android/jni_android.h"
10 #include "base/android/jni_string.h"
11 #include "base/android/scoped_java_ref.h"
12 #include "base/bind.h"
13 #include "base/callback_helpers.h"
14 #include "base/location.h"
15 #include "base/logging.h"
16 #include "base/macros.h"
17 #include "base/memory/ref_counted.h"
18 #include "base/memory/weak_ptr.h"
19 #include "base/message_loop/message_loop_proxy.h"
20 #include "components/cronet/android/cronet_upload_data_stream_adapter.h"
21 #include "components/cronet/android/cronet_url_request_adapter.h"
22 #include "jni/UploadDataStreamHandler_jni.h"
23 #include "net/base/io_buffer.h"
24 #include "net/base/net_errors.h"
25 #include "net/base/test_completion_callback.h"
26 #include "net/base/upload_data_stream.h"
27
28 namespace cronet {
29
30 static const size_t kReadBufferSize = 32768;
31
32 bool UploadDataStreamHandlerRegisterJni(JNIEnv* env) {
mmenke 2015/01/21 18:48:58 Declaration order should match definition order -
xunjieli 2015/01/21 23:49:24 Done.
33 return RegisterNativesImpl(env);
34 };
35
36 class UploadDataStreamHandlerDelegate
37 : public UploadDataStreamHandler::Delegate {
38 public:
39 UploadDataStreamHandlerDelegate(JNIEnv* env,
40 jobject jupload_data_stream_handler) {
41 jupload_data_stream_handler_.Reset(env, jupload_data_stream_handler);
42 }
43
44 ~UploadDataStreamHandlerDelegate() override {}
45
46 void OnInitCalled(int res) {
47 JNIEnv* env = base::android::AttachCurrentThread();
48 cronet::Java_UploadDataStreamHandler_onInitCalled(
49 env, jupload_data_stream_handler_.obj(), res);
50 }
51
52 void OnInitCompleted(int res) {
53 JNIEnv* env = base::android::AttachCurrentThread();
54 cronet::Java_UploadDataStreamHandler_onInitCompleted(
55 env, jupload_data_stream_handler_.obj(), res);
56 }
57
58 void OnReadCompleted(int res) {
59 JNIEnv* env = base::android::AttachCurrentThread();
60 cronet::Java_UploadDataStreamHandler_onReadCompleted(
61 env, jupload_data_stream_handler_.obj(), res);
62 }
63
64 void OnResetCompleted() {
65 JNIEnv* env = base::android::AttachCurrentThread();
66 cronet::Java_UploadDataStreamHandler_onResetCompleted(
67 env, jupload_data_stream_handler_.obj());
68 }
69
70 void OnCheckIfInitCallbackInvoked(bool res) {
71 JNIEnv* env = base::android::AttachCurrentThread();
72 cronet::Java_UploadDataStreamHandler_onCheckIfInitCallbackInvoked(
73 env, jupload_data_stream_handler_.obj(), res);
74 }
75
76 void OnCheckIfReadCallbackInvoked(bool res) {
77 JNIEnv* env = base::android::AttachCurrentThread();
78 cronet::Java_UploadDataStreamHandler_onCheckIfReadCallbackInvoked(
79 env, jupload_data_stream_handler_.obj(), res);
80 }
81
82 private:
83 // Initialized on construction, effectively constant.
84 base::android::ScopedJavaGlobalRef<jobject> jupload_data_stream_handler_;
85
86 DISALLOW_COPY_AND_ASSIGN(UploadDataStreamHandlerDelegate);
87 };
88
89 UploadDataStreamHandler::UploadDataStreamHandler(
90 CronetUploadDataStreamAdapter* adapter,
91 JNIEnv* env,
92 jobject jupload_data_stream_handler)
93 : init_complete_(false),
94 read_complete_(false),
95 bytes_read_(-1),
96 adapter_(adapter),
97 weak_factory_(this) {
98 network_thread_ = new base::Thread("network");
mmenke 2015/01/21 18:48:58 Problem: Once we start mucking with weak referenc
xunjieli 2015/01/21 23:49:23 Got it. Thanks for the detailed explanation!
99 base::Thread::Options options;
100 options.message_loop_type = base::MessageLoop::TYPE_IO;
101 network_thread_->StartWithOptions(options);
102 delegate_.reset(
103 new UploadDataStreamHandlerDelegate(env, jupload_data_stream_handler));
104 }
105
106 UploadDataStreamHandler::~UploadDataStreamHandler() {
107 }
108
109 // Called by the data provider.
110 // On data provider's executor.
mmenke 2015/01/21 18:48:58 Method level comments should go above the method d
xunjieli 2015/01/21 23:49:23 Done. Right, haven't cleaned this up. For my own r
111 void UploadDataStreamHandler::OnInitComplete(int res) {
112 init_complete_ = true;
113 delegate_->OnInitCompleted(res);
114 }
115
116 // Called by the data provider.
117 // On data provider's executor.
118 void UploadDataStreamHandler::OnReadComplete(int res) {
119 read_complete_ = true;
120 bytes_read_ = res;
121 delegate_->OnReadCompleted(res);
122 }
123
124 void UploadDataStreamHandler::Init() {
125 init_complete_ = false;
mmenke 2015/01/21 18:48:58 This shouldn't be touched on the IO thread. May m
xunjieli 2015/01/21 23:49:23 Done. Agreed!
126 GetTaskRunner()->PostTask(
127 FROM_HERE, base::Bind(&UploadDataStreamHandler::InitOnNetworkThread,
128 weak_factory_.GetWeakPtr()));
129 }
130
131 void UploadDataStreamHandler::InitOnNetworkThread() {
132 DCHECK(GetTaskRunner()->BelongsToCurrentThread());
133 int res = adapter_->Init(base::Bind(&UploadDataStreamHandler::OnInitComplete,
134 weak_factory_.GetWeakPtr()));
135 delegate_->OnInitCalled(res);
136 if (res == net::OK) {
137 delegate_->OnInitCompleted(res);
138 }
139 }
140
141 void UploadDataStreamHandler::Read() {
142 read_complete_ = false;
mmenke 2015/01/21 18:48:58 This shouldn't be touched on the IO thread
xunjieli 2015/01/21 23:49:24 Done.
143 GetTaskRunner()->PostTask(
144 FROM_HERE, base::Bind(&UploadDataStreamHandler::ReadOnNetworkThread,
145 weak_factory_.GetWeakPtr()));
mmenke 2015/01/21 18:48:58 The GetWeakPtr calls aren't safe. According to th
xunjieli 2015/01/21 23:49:23 Ahh I see. That's how it is used. Thanks!
146 }
147
148 void UploadDataStreamHandler::ReadOnNetworkThread() {
149 DCHECK(GetTaskRunner()->BelongsToCurrentThread());
150 if (!read_buffer_.get())
151 read_buffer_ = new net::IOBufferWithSize(kReadBufferSize);
152
153 int res = adapter_->Read(read_buffer_.get(), kReadBufferSize,
154 base::Bind(&UploadDataStreamHandler::OnReadComplete,
155 weak_factory_.GetWeakPtr()));
156 if (res == net::OK) {
157 delegate_->OnReadCompleted(res);
158 }
159 }
160
161 void UploadDataStreamHandler::Reset() {
162 GetTaskRunner()->PostTask(
163 FROM_HERE, base::Bind(&UploadDataStreamHandler::ResetOnNetworkThread,
164 weak_factory_.GetWeakPtr()));
165 }
166
167 void UploadDataStreamHandler::ResetOnNetworkThread() {
168 DCHECK(GetTaskRunner()->BelongsToCurrentThread());
169 read_buffer_ = NULL;
170 bytes_read_ = 0;
171 adapter_->Reset();
172 delegate_->OnResetCompleted();
173 }
174
175 void UploadDataStreamHandler::CheckIfInitCallbackInvoked() {
176 GetTaskRunner()->PostTask(
177 FROM_HERE, base::Bind(&UploadDataStreamHandler::CheckIfInitCallbackInvoked OnNetworkThread,
178 weak_factory_.GetWeakPtr()));
179 }
180
181 void UploadDataStreamHandler::CheckIfInitCallbackInvokedOnNetworkThread() {
mmenke 2015/01/21 18:48:58 DCHECK(GetTaskRunner()->BelongsToCurrentThread());
xunjieli 2015/01/21 23:49:24 Done.
182 delegate_->OnCheckIfInitCallbackInvoked(init_complete_);
183 }
184
185 void UploadDataStreamHandler::CheckIfReadCallbackInvoked() {
186 GetTaskRunner()->PostTask(
187 FROM_HERE, base::Bind(&UploadDataStreamHandler::CheckIfReadCallbackInvoked OnNetworkThread,
188 weak_factory_.GetWeakPtr()));
189 }
190
191 void UploadDataStreamHandler::CheckIfReadCallbackInvokedOnNetworkThread() {
mmenke 2015/01/21 18:48:58 DCHECK(GetTaskRunner()->BelongsToCurrentThread());
xunjieli 2015/01/21 23:49:23 Done.
192 delegate_->OnCheckIfReadCallbackInvoked(read_complete_);
193 }
194
195 std::string UploadDataStreamHandler::Data() const {
mmenke 2015/01/21 18:48:58 DCHECK(GetTaskRunner()->BelongsToCurrentThread());
xunjieli 2015/01/21 23:49:23 Done.
196 if (read_buffer_.get() && bytes_read_ > 0)
197 return std::string(read_buffer_->data(), bytes_read_);
198 return "";
199 }
200
201 scoped_refptr<base::SingleThreadTaskRunner>
202 UploadDataStreamHandler::GetTaskRunner() const {
203 return network_thread_->task_runner();
204 }
205
206 static void Init(JNIEnv* env,
207 jclass jcaller,
208 jlong jupload_data_stream_handler) {
209 UploadDataStreamHandler* handler =
210 reinterpret_cast<UploadDataStreamHandler*>(jupload_data_stream_handler);
211 DCHECK(handler);
212 handler->Init();
213 }
214
215 static void Read(JNIEnv* env,
216 jclass jcaller,
217 jlong jupload_data_stream_handler) {
218 UploadDataStreamHandler* handler =
219 reinterpret_cast<UploadDataStreamHandler*>(jupload_data_stream_handler);
220 DCHECK(handler);
221 handler->Read();
222 }
223
224 static void Reset(JNIEnv* env,
225 jclass jcaller,
226 jlong jupload_data_stream_handler) {
227 UploadDataStreamHandler* handler =
228 reinterpret_cast<UploadDataStreamHandler*>(jupload_data_stream_handler);
229 DCHECK(handler);
230 handler->Reset();
231 }
232
233 static jstring GetData(JNIEnv* env,
234 jclass jcaller,
235 jlong jupload_data_stream_handler) {
236 UploadDataStreamHandler* handler =
237 reinterpret_cast<UploadDataStreamHandler*>(jupload_data_stream_handler);
238 DCHECK(handler);
239 return base::android::ConvertUTF8ToJavaString(env, handler->Data()).Release();
mmenke 2015/01/21 18:48:58 This doesn't seem threadsafe. Should probably p
xunjieli 2015/01/21 23:49:24 Done. You are right! this is not thread-safe.
240 }
241
242 static void CheckIfInitCallbackInvoked(JNIEnv* env,
243 jclass jcaller,
244 jlong jupload_data_stream_handler) {
245 UploadDataStreamHandler* handler =
246 reinterpret_cast<UploadDataStreamHandler*>(jupload_data_stream_handler);
247 DCHECK(handler);
248 handler->CheckIfInitCallbackInvoked();
249 }
250
251 static void CheckIfReadCallbackInvoked(JNIEnv* env,
252 jclass jcaller,
253 jlong jupload_data_stream_handler) {
254 UploadDataStreamHandler* handler =
255 reinterpret_cast<UploadDataStreamHandler*>(jupload_data_stream_handler);
256 DCHECK(handler);
257 handler->CheckIfReadCallbackInvoked();
258 }
259
260 static jlong CreateUploadDataStreamHandler(JNIEnv* env,
261 jobject jupload_data_stream_handler,
262 jlong jupload_data_stream_adapter) {
263 CronetUploadDataStreamAdapter* adapter =
264 reinterpret_cast<CronetUploadDataStreamAdapter*>(
265 jupload_data_stream_adapter);
266 UploadDataStreamHandler* handler =
267 new UploadDataStreamHandler(adapter, env, jupload_data_stream_handler);
268 return reinterpret_cast<jlong>(handler);
269 }
270 } // namespace cronet
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698