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

Side by Side Diff: webkit/glue/plugins/pepper_url_loader.cc

Issue 2806079: Stream to file implementation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 years, 4 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "webkit/glue/plugins/pepper_url_loader.h" 5 #include "webkit/glue/plugins/pepper_url_loader.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "third_party/ppapi/c/pp_completion_callback.h" 8 #include "third_party/ppapi/c/pp_completion_callback.h"
9 #include "third_party/ppapi/c/pp_errors.h" 9 #include "third_party/ppapi/c/pp_errors.h"
10 #include "third_party/ppapi/c/ppb_url_loader.h" 10 #include "third_party/ppapi/c/ppb_url_loader.h"
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 char* buffer, 115 char* buffer,
116 int32_t bytes_to_read, 116 int32_t bytes_to_read,
117 PP_CompletionCallback callback) { 117 PP_CompletionCallback callback) {
118 scoped_refptr<URLLoader> loader(Resource::GetAs<URLLoader>(loader_id)); 118 scoped_refptr<URLLoader> loader(Resource::GetAs<URLLoader>(loader_id));
119 if (!loader) 119 if (!loader)
120 return PP_ERROR_BADRESOURCE; 120 return PP_ERROR_BADRESOURCE;
121 121
122 return loader->ReadResponseBody(buffer, bytes_to_read, callback); 122 return loader->ReadResponseBody(buffer, bytes_to_read, callback);
123 } 123 }
124 124
125 int32_t FinishStreamingToFile(PP_Resource loader_id,
126 PP_CompletionCallback callback) {
127 scoped_refptr<URLLoader> loader(Resource::GetAs<URLLoader>(loader_id));
128 if (!loader)
129 return PP_ERROR_BADRESOURCE;
130
131 return loader->FinishStreamingToFile(callback);
132 }
133
125 void Close(PP_Resource loader_id) { 134 void Close(PP_Resource loader_id) {
126 scoped_refptr<URLLoader> loader(Resource::GetAs<URLLoader>(loader_id)); 135 scoped_refptr<URLLoader> loader(Resource::GetAs<URLLoader>(loader_id));
127 if (!loader) 136 if (!loader)
128 return; 137 return;
129 138
130 loader->Close(); 139 loader->Close();
131 } 140 }
132 141
133 const PPB_URLLoader ppb_urlloader = { 142 const PPB_URLLoader ppb_urlloader = {
134 &Create, 143 &Create,
135 &IsURLLoader, 144 &IsURLLoader,
136 &Open, 145 &Open,
137 &FollowRedirect, 146 &FollowRedirect,
138 &GetUploadProgress, 147 &GetUploadProgress,
139 &GetDownloadProgress, 148 &GetDownloadProgress,
140 &GetResponseInfo, 149 &GetResponseInfo,
141 &ReadResponseBody, 150 &ReadResponseBody,
151 &FinishStreamingToFile,
142 &Close 152 &Close
143 }; 153 };
144 154
145 } // namespace 155 } // namespace
146 156
147 URLLoader::URLLoader(PluginInstance* instance) 157 URLLoader::URLLoader(PluginInstance* instance)
148 : Resource(instance->module()), 158 : Resource(instance->module()),
149 instance_(instance), 159 instance_(instance),
150 pending_callback_(), 160 pending_callback_(),
151 bytes_sent_(0), 161 bytes_sent_(0),
152 total_bytes_to_be_sent_(-1), 162 total_bytes_to_be_sent_(-1),
153 bytes_received_(0), 163 bytes_received_(0),
154 total_bytes_to_be_received_(-1), 164 total_bytes_to_be_received_(-1),
155 user_buffer_(NULL), 165 user_buffer_(NULL),
156 user_buffer_size_(0), 166 user_buffer_size_(0),
157 done_(false) { 167 done_status_(PP_ERROR_WOULDBLOCK) {
158 } 168 }
159 169
160 URLLoader::~URLLoader() { 170 URLLoader::~URLLoader() {
161 } 171 }
162 172
163 // static 173 // static
164 const PPB_URLLoader* URLLoader::GetInterface() { 174 const PPB_URLLoader* URLLoader::GetInterface() {
165 return &ppb_urlloader; 175 return &ppb_urlloader;
166 } 176 }
167 177
(...skipping 25 matching lines...) Expand all
193 return PP_ERROR_WOULDBLOCK; 203 return PP_ERROR_WOULDBLOCK;
194 } 204 }
195 205
196 int32_t URLLoader::FollowRedirect(PP_CompletionCallback callback) { 206 int32_t URLLoader::FollowRedirect(PP_CompletionCallback callback) {
197 NOTIMPLEMENTED(); // TODO(darin): Implement me. 207 NOTIMPLEMENTED(); // TODO(darin): Implement me.
198 return PP_ERROR_FAILED; 208 return PP_ERROR_FAILED;
199 } 209 }
200 210
201 int32_t URLLoader::ReadResponseBody(char* buffer, int32_t bytes_to_read, 211 int32_t URLLoader::ReadResponseBody(char* buffer, int32_t bytes_to_read,
202 PP_CompletionCallback callback) { 212 PP_CompletionCallback callback) {
213 if (!response_info_ || response_info_->body())
214 return PP_ERROR_FAILED;
203 if (bytes_to_read <= 0 || !buffer) 215 if (bytes_to_read <= 0 || !buffer)
204 return PP_ERROR_BADARGUMENT; 216 return PP_ERROR_BADARGUMENT;
205 if (pending_callback_.func) 217 if (pending_callback_.func)
206 return PP_ERROR_INPROGRESS; 218 return PP_ERROR_INPROGRESS;
207 219
208 // We only support non-blocking calls. 220 // We only support non-blocking calls.
209 if (!callback.func) 221 if (!callback.func)
210 return PP_ERROR_BADARGUMENT; 222 return PP_ERROR_BADARGUMENT;
211 223
212 user_buffer_ = buffer; 224 user_buffer_ = buffer;
213 user_buffer_size_ = bytes_to_read; 225 user_buffer_size_ = bytes_to_read;
214 226
215 if (!buffer_.empty()) 227 if (!buffer_.empty())
216 return FillUserBuffer(); 228 return FillUserBuffer();
217 229
218 if (done_) { 230 // We may have already reached EOF.
231 if (done_status_ != PP_ERROR_WOULDBLOCK) {
219 user_buffer_ = NULL; 232 user_buffer_ = NULL;
220 user_buffer_size_ = 0; 233 user_buffer_size_ = 0;
221 return 0; 234 return done_status_;
222 } 235 }
223 236
224 pending_callback_ = callback; 237 pending_callback_ = callback;
225 return PP_ERROR_WOULDBLOCK; 238 return PP_ERROR_WOULDBLOCK;
226 } 239 }
227 240
241 int32_t URLLoader::FinishStreamingToFile(PP_CompletionCallback callback) {
242 if (!response_info_ || !response_info_->body())
243 return PP_ERROR_FAILED;
244 if (pending_callback_.func)
245 return PP_ERROR_INPROGRESS;
246
247 // We may have already reached EOF.
248 if (done_status_ != PP_ERROR_WOULDBLOCK)
249 return done_status_;
250
251 // Wait for didFinishLoading / didFail.
252 pending_callback_ = callback;
253 return PP_ERROR_WOULDBLOCK;
254 }
255
228 void URLLoader::Close() { 256 void URLLoader::Close() {
229 NOTIMPLEMENTED(); // TODO(darin): Implement me. 257 NOTIMPLEMENTED(); // TODO(darin): Implement me.
230 } 258 }
231 259
232 void URLLoader::willSendRequest(WebURLLoader* loader, 260 void URLLoader::willSendRequest(WebURLLoader* loader,
233 WebURLRequest& new_request, 261 WebURLRequest& new_request,
234 const WebURLResponse& redirect_response) { 262 const WebURLResponse& redirect_response) {
235 NOTIMPLEMENTED(); // TODO(darin): Allow the plugin to inspect redirects. 263 NOTIMPLEMENTED(); // TODO(darin): Allow the plugin to inspect redirects.
236 } 264 }
237 265
(...skipping 29 matching lines...) Expand all
267 295
268 buffer_.insert(buffer_.end(), data, data + data_length); 296 buffer_.insert(buffer_.end(), data, data + data_length);
269 if (user_buffer_) { 297 if (user_buffer_) {
270 RunCallback(FillUserBuffer()); 298 RunCallback(FillUserBuffer());
271 } else { 299 } else {
272 DCHECK(!pending_callback_.func); 300 DCHECK(!pending_callback_.func);
273 } 301 }
274 } 302 }
275 303
276 void URLLoader::didFinishLoading(WebURLLoader* loader) { 304 void URLLoader::didFinishLoading(WebURLLoader* loader) {
277 done_ = true; 305 done_status_ = PP_OK;
278 RunCallback(PP_OK); 306 RunCallback(done_status_);
279 } 307 }
280 308
281 void URLLoader::didFail(WebURLLoader* loader, const WebURLError& error) { 309 void URLLoader::didFail(WebURLLoader* loader, const WebURLError& error) {
282 done_ = true;
283 // TODO(darin): Provide more detailed error information. 310 // TODO(darin): Provide more detailed error information.
284 RunCallback(PP_ERROR_FAILED); 311 done_status_ = PP_ERROR_FAILED;
312 RunCallback(done_status_);
285 } 313 }
286 314
287 void URLLoader::RunCallback(int32_t result) { 315 void URLLoader::RunCallback(int32_t result) {
288 if (!pending_callback_.func) 316 if (!pending_callback_.func)
289 return; 317 return;
290 318
291 PP_CompletionCallback callback = {0}; 319 PP_CompletionCallback callback = {0};
292 std::swap(callback, pending_callback_); 320 std::swap(callback, pending_callback_);
293 PP_RunCompletionCallback(&callback, result); 321 PP_RunCompletionCallback(&callback, result);
294 } 322 }
295 323
296 size_t URLLoader::FillUserBuffer() { 324 size_t URLLoader::FillUserBuffer() {
297 DCHECK(user_buffer_); 325 DCHECK(user_buffer_);
298 DCHECK(user_buffer_size_); 326 DCHECK(user_buffer_size_);
299 327
300 size_t bytes_to_copy = std::min(buffer_.size(), user_buffer_size_); 328 size_t bytes_to_copy = std::min(buffer_.size(), user_buffer_size_);
301 std::copy(buffer_.begin(), buffer_.begin() + bytes_to_copy, user_buffer_); 329 std::copy(buffer_.begin(), buffer_.begin() + bytes_to_copy, user_buffer_);
302 buffer_.erase(buffer_.begin(), buffer_.begin() + bytes_to_copy); 330 buffer_.erase(buffer_.begin(), buffer_.begin() + bytes_to_copy);
303 331
304 // Reset for next time. 332 // Reset for next time.
305 user_buffer_ = NULL; 333 user_buffer_ = NULL;
306 user_buffer_size_ = 0; 334 user_buffer_size_ = 0;
307 return bytes_to_copy; 335 return bytes_to_copy;
308 } 336 }
309 337
310 } // namespace pepper 338 } // namespace pepper
OLDNEW
« no previous file with comments | « webkit/glue/plugins/pepper_url_loader.h ('k') | webkit/glue/plugins/pepper_url_response_info.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698