15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#ifndef URL_LOADER_HANDLER_H_ 6b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#define URL_LOADER_HANDLER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/completion_callback.h" 10b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "ppapi/cpp/instance.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/url_loader.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/url_request_info.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/utility/completion_callback_factory.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define READ_BUFFER_SIZE 32768 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// URLLoaderHandler is used to download data from |url|. When download is 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// finished or when an error occurs, it posts a message back to the browser 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with the results encoded in the message as a string and self-destroys. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pp::URLLoader.GetDownloadProgress() is used to to allocate the memory 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// required for url_response_body_ before the download starts. (This is not so 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// much of a performance improvement, but it saves some memory since 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// std::string.insert() typically grows the string's capacity by somewhere 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// between 50% to 100% when it needs more memory, depending on the 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implementation.) Other performance improvements made as outlined in this 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bug: http://code.google.com/p/chromium/issues/detail?id=103947 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// EXAMPLE USAGE: 29b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// URLLoaderHandler* handler* = URLLoaderHandler::Create(instance,url); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// handler->Start(); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 32b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class URLLoaderHandler { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 34b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Creates instance of URLLoaderHandler on the heap. 35b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // URLLoaderHandler objects shall be created only on the heap (they 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // self-destroy when all data is in). 37b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) static URLLoaderHandler* Create(pp::Instance* instance_, 38b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const std::string& url); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initiates page (URL) download. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Start(); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 43b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) URLLoaderHandler(pp::Instance* instance_, const std::string& url); 44b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ~URLLoaderHandler(); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Callback for the pp::URLLoader::Open(). 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by pp::URLLoader when response headers are received or when an 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // error occurs (in response to the call of pp::URLLoader::Open()). 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Look at <ppapi/c/ppb_url_loader.h> and 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // <ppapi/cpp/url_loader.h> for more information about pp::URLLoader. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnOpen(int32_t result); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Callback for the pp::URLLoader::ReadResponseBody(). 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |result| contains the number of bytes read or an error code. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Appends data from this->buffer_ to this->url_response_body_. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnRead(int32_t result); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reads the response body (asynchronously) into this->buffer_. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnRead() will be called when bytes are received or when an error occurs. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReadBody(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Append data bytes read from the URL onto the internal buffer. Does 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // nothing if |num_bytes| is 0. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AppendDataBytes(const char* buffer, int32_t num_bytes); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Post a message back to the browser with the download results. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReportResult(const std::string& fname, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& text, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Post a message back to the browser with the download results and 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // self-destroy. |this| is no longer valid when this method returns. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReportResultAndDie(const std::string& fname, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& text, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Instance* instance_; // Weak pointer. 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string url_; // URL to be downloaded. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::URLRequestInfo url_request_; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::URLLoader url_loader_; // URLLoader provides an API to download URLs. 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char* buffer_; // Temporary buffer for reads. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url_response_body_; // Contains accumulated downloaded data. 82b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) pp::CompletionCallbackFactory<URLLoaderHandler> cc_factory_; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) URLLoaderHandler(const URLLoaderHandler&); 85b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) void operator=(const URLLoaderHandler&); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#endif // URL_LOADER_HANDLER_H_ 89