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

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: addressed Matt's comments 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.
mmenke 2015/01/22 20:19:07 2015, for all of these files (No idea if you shoul
xunjieli 2015/01/23 16:39:48 Done. 2015 it is! :)
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/macros.h"
14 #include "base/memory/ref_counted.h"
15 #include "base/message_loop/message_loop_proxy.h"
16 #include "base/threading/thread.h"
17 #include "components/cronet/android/cronet_upload_data_stream_adapter.h"
18 #include "jni/UploadDataStreamHandler_jni.h"
19 #include "net/base/io_buffer.h"
20 #include "net/base/net_errors.h"
21 #include "net/base/upload_data_stream.h"
22
23 namespace cronet {
24
25 namespace {
26
27 static const size_t kReadBufferSize = 32768;
28
29 class UploadDataStreamHandler {
mmenke 2015/01/22 20:19:07 Should have a description of this class.
xunjieli 2015/01/23 16:39:48 Done.
30 public:
31 UploadDataStreamHandler(CronetUploadDataStreamAdapter* adapter,
32 JNIEnv* env,
33 jobject jupload_data_stream_handler);
34
35 ~UploadDataStreamHandler();
36
37 void Destroy();
mmenke 2015/01/22 20:19:08 Suggest separating this from the other methods wit
xunjieli 2015/01/23 16:39:48 Done.
38 void Init();
mmenke 2015/01/22 20:19:07 Suggest a comment before this block of methods, an
xunjieli 2015/01/23 16:39:48 Done.
39 void Read();
40 void Reset();
41 scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() const;
mmenke 2015/01/22 20:19:07 I don't think this is needed - can just access the
xunjieli 2015/01/23 16:39:48 Done.
42 void CheckInitCallbackNotInvoked();
43 void CheckReadCallbackNotInvoked();
mmenke 2015/01/22 20:19:07 Declaration order should match definition order.
xunjieli 2015/01/23 16:39:48 Done.
44
45 private:
46 void OnInitComplete(int res);
47 void OnReadComplete(int res);
48 void InitOnNetworkThread();
49 void ReadOnNetworkThread();
50 void ResetOnNetworkThread();
51 void CheckInitCallbackNotInvokedOnNetworkThread();
52 void CheckReadCallbackNotInvokedOnNetworkThread();
53 std::string Data() const;
54
55 bool init_callback_invoked_;
56 bool read_callback_invoked_;
57 int bytes_read_;
mmenke 2015/01/22 20:19:08 Should include descriptions of these (When set to
xunjieli 2015/01/23 16:39:48 Done.
xunjieli 2015/01/23 16:39:48 Done.
58
59 base::Thread* network_thread_;
mmenke 2015/01/22 20:19:07 Should mention lifetime / creation / destruction o
xunjieli 2015/01/23 16:39:49 Done.
60 scoped_ptr<CronetUploadDataStreamAdapter> adapter_;
61 scoped_refptr<net::IOBufferWithSize> read_buffer_;
62 base::android::ScopedJavaGlobalRef<jobject> jupload_data_stream_handler_;
63
64 DISALLOW_COPY_AND_ASSIGN(UploadDataStreamHandler);
65 };
66
67 } // namespace
mmenke 2015/01/22 20:19:08 This namespace should extend down to the last meth
xunjieli 2015/01/23 16:39:48 Done.
68
69 UploadDataStreamHandler::UploadDataStreamHandler(
70 CronetUploadDataStreamAdapter* adapter,
71 JNIEnv* env,
72 jobject jupload_data_stream_handler)
73 : init_callback_invoked_(false),
74 read_callback_invoked_(false),
75 bytes_read_(0),
76 adapter_(adapter) {
77 network_thread_ = new base::Thread("network");
mmenke 2015/01/22 20:19:07 nit: Think this can be in the initializer list.
xunjieli 2015/01/23 16:39:48 Done.
78 base::Thread::Options options;
79 options.message_loop_type = base::MessageLoop::TYPE_IO;
80 network_thread_->StartWithOptions(options);
81 jupload_data_stream_handler_.Reset(env, jupload_data_stream_handler);
82 }
83
84 UploadDataStreamHandler::~UploadDataStreamHandler() {
85 }
86
87 void UploadDataStreamHandler::Destroy() {
88 DCHECK(!GetTaskRunner()->BelongsToCurrentThread());
89 // Stick network_thread_ in a local, as |this| may be destroyed from the
90 // network thread before delete network_thread is called.
mmenke 2015/01/22 20:19:07 nit: "as" -> "so", "before delete network_thread
xunjieli 2015/01/23 16:39:48 Done.
91 base::Thread* network_thread = network_thread_;
mmenke 2015/01/22 20:19:07 Ownership is a bit weird, but I suggest making bot
xunjieli 2015/01/23 16:39:48 Done. Copied from other code from elsewhere. Why d
mmenke 2015/01/23 21:31:41 Weak pointer factories must be destroyed on the th
92 GetTaskRunner()->DeleteSoon(FROM_HERE, this);
93 // Deleting thread stops it after all tasks are completed.
94 delete network_thread;
95 }
96
97 void UploadDataStreamHandler::OnInitComplete(int res) {
98 DCHECK(GetTaskRunner()->BelongsToCurrentThread());
99 init_callback_invoked_ = true;
100 JNIEnv* env = base::android::AttachCurrentThread();
101 cronet::Java_UploadDataStreamHandler_onInitCompleted(
102 env, jupload_data_stream_handler_.obj(), res);
103 }
104
105 void UploadDataStreamHandler::OnReadComplete(int res) {
106 DCHECK(GetTaskRunner()->BelongsToCurrentThread());
107 read_callback_invoked_ = true;
108 bytes_read_ = res;
109 JNIEnv* env = base::android::AttachCurrentThread();
110 cronet::Java_UploadDataStreamHandler_onReadCompleted(
111 env, jupload_data_stream_handler_.obj(), res,
112 base::android::ConvertUTF8ToJavaString(env, this->Data()).Release());
mmenke 2015/01/22 20:19:07 This callback is idental to the one in ReadOnNetwo
xunjieli 2015/01/23 16:39:48 Done.
113 }
114
115 void UploadDataStreamHandler::Init() {
116 DCHECK(!GetTaskRunner()->BelongsToCurrentThread());
117 GetTaskRunner()->PostTask(
118 FROM_HERE, base::Bind(&UploadDataStreamHandler::InitOnNetworkThread,
119 base::Unretained(this)));
120 }
121
122 void UploadDataStreamHandler::InitOnNetworkThread() {
123 DCHECK(GetTaskRunner()->BelongsToCurrentThread());
124 init_callback_invoked_ = false;
125 read_buffer_ = NULL;
mmenke 2015/01/22 20:19:08 nit: nullptr
xunjieli 2015/01/23 16:39:48 Done.
126 bytes_read_ = 0;
127 int res = adapter_->Init(base::Bind(&UploadDataStreamHandler::OnInitComplete,
128 base::Unretained(this)));
129 JNIEnv* env = base::android::AttachCurrentThread();
130 cronet::Java_UploadDataStreamHandler_onInitCalled(
131 env, jupload_data_stream_handler_.obj(), res);
132
133 if (res == net::OK) {
134 cronet::Java_UploadDataStreamHandler_onInitCompleted(
135 env, jupload_data_stream_handler_.obj(), res);
136 }
137 }
138
139 void UploadDataStreamHandler::Read() {
140 DCHECK(!GetTaskRunner()->BelongsToCurrentThread());
141 GetTaskRunner()->PostTask(
142 FROM_HERE, base::Bind(&UploadDataStreamHandler::ReadOnNetworkThread,
143 base::Unretained(this)));
144 }
145
146 void UploadDataStreamHandler::ReadOnNetworkThread() {
147 DCHECK(GetTaskRunner()->BelongsToCurrentThread());
148 read_callback_invoked_ = false;
149 if (!read_buffer_.get())
150 read_buffer_ = new net::IOBufferWithSize(kReadBufferSize);
151
152 int bytes_read =
153 adapter_->Read(read_buffer_.get(), kReadBufferSize,
154 base::Bind(&UploadDataStreamHandler::OnReadComplete,
155 base::Unretained(this)));
156 if (bytes_read == net::OK) {
157 JNIEnv* env = base::android::AttachCurrentThread();
158 cronet::Java_UploadDataStreamHandler_onReadCompleted(
159 env, jupload_data_stream_handler_.obj(), bytes_read,
160 base::android::ConvertUTF8ToJavaString(env, this->Data()).Release());
161 }
162 }
163
164 void UploadDataStreamHandler::Reset() {
165 DCHECK(!GetTaskRunner()->BelongsToCurrentThread());
166 GetTaskRunner()->PostTask(
167 FROM_HERE, base::Bind(&UploadDataStreamHandler::ResetOnNetworkThread,
168 base::Unretained(this)));
169 }
170
171 void UploadDataStreamHandler::ResetOnNetworkThread() {
172 DCHECK(GetTaskRunner()->BelongsToCurrentThread());
173 read_buffer_ = NULL;
174 bytes_read_ = 0;
175 adapter_->Reset();
176 JNIEnv* env = base::android::AttachCurrentThread();
177 cronet::Java_UploadDataStreamHandler_onResetCompleted(
178 env, jupload_data_stream_handler_.obj());
179 }
180
181 void UploadDataStreamHandler::CheckInitCallbackNotInvoked() {
182 DCHECK(!GetTaskRunner()->BelongsToCurrentThread());
183 GetTaskRunner()->PostTask(
184 FROM_HERE,
185 base::Bind(
186 &UploadDataStreamHandler::CheckInitCallbackNotInvokedOnNetworkThread,
187 base::Unretained(this)));
188 }
189
190 void UploadDataStreamHandler::CheckInitCallbackNotInvokedOnNetworkThread() {
191 DCHECK(GetTaskRunner()->BelongsToCurrentThread());
192 JNIEnv* env = base::android::AttachCurrentThread();
193 cronet::Java_UploadDataStreamHandler_onCheckInitCallbackNotInvoked(
194 env, jupload_data_stream_handler_.obj(), init_callback_invoked_ == false);
195 }
196
197 void UploadDataStreamHandler::CheckReadCallbackNotInvoked() {
198 DCHECK(!GetTaskRunner()->BelongsToCurrentThread());
199 GetTaskRunner()->PostTask(
200 FROM_HERE,
201 base::Bind(
202 &UploadDataStreamHandler::CheckReadCallbackNotInvokedOnNetworkThread,
203 base::Unretained(this)));
204 }
205
206 void UploadDataStreamHandler::CheckReadCallbackNotInvokedOnNetworkThread() {
207 DCHECK(GetTaskRunner()->BelongsToCurrentThread());
208 JNIEnv* env = base::android::AttachCurrentThread();
209 cronet::Java_UploadDataStreamHandler_onCheckReadCallbackNotInvoked(
210 env, jupload_data_stream_handler_.obj(), read_callback_invoked_ == false);
211 }
212
213 std::string UploadDataStreamHandler::Data() const {
214 DCHECK(GetTaskRunner()->BelongsToCurrentThread());
215 if (read_buffer_.get() && bytes_read_ > 0)
216 return std::string(read_buffer_->data(), bytes_read_);
217 return "";
218 }
219
220 scoped_refptr<base::SingleThreadTaskRunner>
221 UploadDataStreamHandler::GetTaskRunner() const {
222 return network_thread_->task_runner();
223 }
224
225 static void Init(JNIEnv* env,
226 jclass jcaller,
227 jlong jupload_data_stream_handler) {
228 UploadDataStreamHandler* handler =
229 reinterpret_cast<UploadDataStreamHandler*>(jupload_data_stream_handler);
230 DCHECK(handler);
231 handler->Init();
232 }
233
234 static void Read(JNIEnv* env,
235 jclass jcaller,
236 jlong jupload_data_stream_handler) {
237 UploadDataStreamHandler* handler =
238 reinterpret_cast<UploadDataStreamHandler*>(jupload_data_stream_handler);
239 DCHECK(handler);
240 handler->Read();
241 }
242
243 static void Reset(JNIEnv* env,
244 jclass jcaller,
245 jlong jupload_data_stream_handler) {
246 UploadDataStreamHandler* handler =
247 reinterpret_cast<UploadDataStreamHandler*>(jupload_data_stream_handler);
248 DCHECK(handler);
249 handler->Reset();
250 }
251
252 static void CheckInitCallbackNotInvoked(JNIEnv* env,
253 jclass jcaller,
254 jlong jupload_data_stream_handler) {
255 UploadDataStreamHandler* handler =
256 reinterpret_cast<UploadDataStreamHandler*>(jupload_data_stream_handler);
257 DCHECK(handler);
258 handler->CheckInitCallbackNotInvoked();
259 }
260
261 static void CheckReadCallbackNotInvoked(JNIEnv* env,
262 jclass jcaller,
263 jlong jupload_data_stream_handler) {
264 UploadDataStreamHandler* handler =
265 reinterpret_cast<UploadDataStreamHandler*>(jupload_data_stream_handler);
266 DCHECK(handler);
267 handler->CheckReadCallbackNotInvoked();
268 }
269
270 static void Destroy(JNIEnv* env,
mmenke 2015/01/22 20:19:07 This should probably be after CreateUploadDataStre
xunjieli 2015/01/23 16:39:48 Done.
271 jclass jcaller,
272 jlong jupload_data_stream_handler) {
273 UploadDataStreamHandler* handler =
274 reinterpret_cast<UploadDataStreamHandler*>(jupload_data_stream_handler);
275 DCHECK(handler);
276 handler->Destroy();
277 }
278
279 static jlong CreateUploadDataStreamHandler(JNIEnv* env,
280 jobject jupload_data_stream_handler,
281 jlong jupload_data_stream_adapter) {
282 CronetUploadDataStreamAdapter* adapter =
283 reinterpret_cast<CronetUploadDataStreamAdapter*>(
284 jupload_data_stream_adapter);
285 UploadDataStreamHandler* handler =
286 new UploadDataStreamHandler(adapter, env, jupload_data_stream_handler);
287 return reinterpret_cast<jlong>(handler);
288 }
289
290 bool UploadDataStreamHandlerRegisterJni(JNIEnv* env) {
291 return RegisterNativesImpl(env);
292 }
293
294 } // namespace cronet
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698