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

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: 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 "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/bind.h"
12 #include "base/message_loop/message_loop_proxy.h"
13 #include "jni/UploadDataStreamHandler_jni.h"
14 #include "net/base/net_errors.h"
15
16 namespace cronet {
17
18 static const size_t kReadBufferSize = 32768;
19
20 UploadDataStreamHandler::UploadDataStreamHandler(
21 CronetUploadDataStreamAdapter* adapter,
22 JNIEnv* env,
23 jobject jupload_data_stream_handler)
24 : init_callback_invoked_(false),
25 read_callback_invoked_(false),
26 bytes_read_(0),
27 network_thread_(new base::Thread("network")),
28 adapter_(adapter) {
29 base::Thread::Options options;
30 options.message_loop_type = base::MessageLoop::TYPE_IO;
31 network_thread_->StartWithOptions(options);
32 jupload_data_stream_handler_.Reset(env, jupload_data_stream_handler);
33 }
34
35 UploadDataStreamHandler::~UploadDataStreamHandler() {
36 }
37
38 void UploadDataStreamHandler::Destroy(JNIEnv* env, jobject jcaller) {
39 DCHECK(!network_thread_->task_runner()->BelongsToCurrentThread());
40 // Stick network_thread_ in a local, so |this| may be destroyed from the
41 // network thread before the network thread is destroyed.
42 scoped_ptr<base::Thread> network_thread = network_thread_.Pass();
43 network_thread->task_runner()->DeleteSoon(FROM_HERE, this);
44 // Deleting thread stops it after all tasks are completed.
45 network_thread.reset();
46 }
47
48 void UploadDataStreamHandler::OnInitCompleted(int res) {
49 DCHECK(network_thread_->task_runner()->BelongsToCurrentThread());
50 init_callback_invoked_ = true;
51 JNIEnv* env = base::android::AttachCurrentThread();
52 cronet::Java_UploadDataStreamHandler_onInitCompleted(
53 env, jupload_data_stream_handler_.obj(), res);
54 }
55
56 void UploadDataStreamHandler::OnReadCompleted(int res) {
57 DCHECK(network_thread_->task_runner()->BelongsToCurrentThread());
58 read_callback_invoked_ = true;
59 bytes_read_ = res;
60 NotifyJavaReadCompleted();
61 }
62
63 void UploadDataStreamHandler::Init(JNIEnv* env, jobject jcaller) {
64 DCHECK(!network_thread_->task_runner()->BelongsToCurrentThread());
65 network_thread_->task_runner()->PostTask(
66 FROM_HERE, base::Bind(&UploadDataStreamHandler::InitOnNetworkThread,
67 base::Unretained(this)));
68 }
69
70 void UploadDataStreamHandler::Read(JNIEnv* env, jobject jcaller) {
71 DCHECK(!network_thread_->task_runner()->BelongsToCurrentThread());
72 network_thread_->task_runner()->PostTask(
73 FROM_HERE, base::Bind(&UploadDataStreamHandler::ReadOnNetworkThread,
74 base::Unretained(this)));
75 }
76
77 void UploadDataStreamHandler::Reset(JNIEnv* env, jobject jcaller) {
78 DCHECK(!network_thread_->task_runner()->BelongsToCurrentThread());
79 network_thread_->task_runner()->PostTask(
80 FROM_HERE, base::Bind(&UploadDataStreamHandler::ResetOnNetworkThread,
81 base::Unretained(this)));
82 }
83
84 void UploadDataStreamHandler::CheckInitCallbackNotInvoked(JNIEnv* env,
85 jobject jcaller) {
86 DCHECK(!network_thread_->task_runner()->BelongsToCurrentThread());
87 network_thread_->task_runner()->PostTask(
88 FROM_HERE,
89 base::Bind(
90 &UploadDataStreamHandler::CheckInitCallbackNotInvokedOnNetworkThread,
91 base::Unretained(this)));
92 }
93
94 void UploadDataStreamHandler::CheckReadCallbackNotInvoked(JNIEnv* env,
95 jobject jcaller) {
96 DCHECK(!network_thread_->task_runner()->BelongsToCurrentThread());
97 network_thread_->task_runner()->PostTask(
98 FROM_HERE,
99 base::Bind(
100 &UploadDataStreamHandler::CheckReadCallbackNotInvokedOnNetworkThread,
101 base::Unretained(this)));
102 }
103
104 void UploadDataStreamHandler::InitOnNetworkThread() {
105 DCHECK(network_thread_->task_runner()->BelongsToCurrentThread());
106 init_callback_invoked_ = false;
107 read_buffer_ = nullptr;
108 bytes_read_ = 0;
109 int res = adapter_->Init(base::Bind(&UploadDataStreamHandler::OnInitCompleted,
110 base::Unretained(this)));
111 JNIEnv* env = base::android::AttachCurrentThread();
112 cronet::Java_UploadDataStreamHandler_onInitCalled(
113 env, jupload_data_stream_handler_.obj(), res);
114
115 if (res == net::OK) {
116 cronet::Java_UploadDataStreamHandler_onInitCompleted(
117 env, jupload_data_stream_handler_.obj(), res);
118 }
119 }
120
121 void UploadDataStreamHandler::ReadOnNetworkThread() {
122 DCHECK(network_thread_->task_runner()->BelongsToCurrentThread());
123 read_callback_invoked_ = false;
124 if (!read_buffer_.get())
125 read_buffer_ = new net::IOBufferWithSize(kReadBufferSize);
126
127 int bytes_read =
128 adapter_->Read(read_buffer_.get(), kReadBufferSize,
129 base::Bind(&UploadDataStreamHandler::OnReadCompleted,
130 base::Unretained(this)));
131 if (bytes_read == net::OK) {
132 bytes_read_ = bytes_read;
133 NotifyJavaReadCompleted();
134 }
135 }
136
137 void UploadDataStreamHandler::ResetOnNetworkThread() {
138 DCHECK(network_thread_->task_runner()->BelongsToCurrentThread());
139 init_callback_invoked_ = false;
140 read_callback_invoked_ = false;
mmenke 2015/02/18 21:06:23 Should we be resetting these here? If we don't ex
xunjieli 2015/02/19 14:59:11 Done.
141 read_buffer_ = nullptr;
142 bytes_read_ = 0;
143 adapter_->Reset();
144 JNIEnv* env = base::android::AttachCurrentThread();
145 cronet::Java_UploadDataStreamHandler_onResetCompleted(
146 env, jupload_data_stream_handler_.obj());
147 }
148
149 void UploadDataStreamHandler::CheckInitCallbackNotInvokedOnNetworkThread() {
150 DCHECK(network_thread_->task_runner()->BelongsToCurrentThread());
151 JNIEnv* env = base::android::AttachCurrentThread();
152 cronet::Java_UploadDataStreamHandler_onCheckInitCallbackNotInvoked(
153 env, jupload_data_stream_handler_.obj(), !init_callback_invoked_);
154 }
155
156 void UploadDataStreamHandler::CheckReadCallbackNotInvokedOnNetworkThread() {
157 DCHECK(network_thread_->task_runner()->BelongsToCurrentThread());
158 JNIEnv* env = base::android::AttachCurrentThread();
159 cronet::Java_UploadDataStreamHandler_onCheckReadCallbackNotInvoked(
160 env, jupload_data_stream_handler_.obj(), !read_callback_invoked_);
161 }
162
163 void UploadDataStreamHandler::NotifyJavaReadCompleted() {
164 DCHECK(network_thread_->task_runner()->BelongsToCurrentThread());
165 JNIEnv* env = base::android::AttachCurrentThread();
166 std::string data_read = "";
167 if (read_buffer_.get() && bytes_read_ > 0)
168 data_read = std::string(read_buffer_->data(), bytes_read_);
169 cronet::Java_UploadDataStreamHandler_onReadCompleted(
170 env, jupload_data_stream_handler_.obj(), bytes_read_,
171 base::android::ConvertUTF8ToJavaString(env, data_read).Release());
172 }
173
174 static jlong CreateUploadDataStreamHandler(JNIEnv* env,
175 jobject jupload_data_stream_handler,
176 jlong jupload_data_stream_adapter) {
177 CronetUploadDataStreamAdapter* adapter =
178 reinterpret_cast<CronetUploadDataStreamAdapter*>(
179 jupload_data_stream_adapter);
180 UploadDataStreamHandler* handler =
181 new UploadDataStreamHandler(adapter, env, jupload_data_stream_handler);
182 return reinterpret_cast<jlong>(handler);
183 }
184
185 bool UploadDataStreamHandlerRegisterJni(JNIEnv* env) {
186 return RegisterNativesImpl(env);
187 }
188
189 } // namespace cronet
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698