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

Unified Diff: chrome/browser/chrome_plugin_host.cc

Issue 18390: Change URLRequest to use a ref-counted buffer for actual IO.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chrome_plugin_host.cc
===================================================================
--- chrome/browser/chrome_plugin_host.cc (revision 8565)
+++ chrome/browser/chrome_plugin_host.cc (working copy)
@@ -145,7 +145,7 @@
}
PluginRequestHandler(ChromePluginLib* plugin, ScopableCPRequest* cprequest)
- : PluginHelper(plugin), cprequest_(cprequest) {
+ : PluginHelper(plugin), cprequest_(cprequest), user_buffer_(NULL) {
cprequest_->data = this; // see FromCPRequest().
URLRequestContext* context = CPBrowsingContextManager::Instance()->
@@ -163,6 +163,25 @@
URLRequest* request() { return request_.get(); }
+ // Wraper of URLRequest::Read()
+ bool Read(char* dest, int dest_size, int *bytes_read) {
+ CHECK(!my_buffer_.get());
+ // We'll use our own buffer until the read actually completes.
+ user_buffer_ = dest;
+ my_buffer_ = new net::IOBuffer(dest_size);
+
+ if (request_->Read(my_buffer_, dest_size, bytes_read)) {
+ memcpy(dest, my_buffer_->data(), *bytes_read);
+ my_buffer_ = NULL;
+ return true;
+ }
+
+ if (!request_->status().is_io_pending())
+ my_buffer_ = NULL;
+
+ return false;
+ }
+
// URLRequest::Delegate
virtual void OnReceivedRedirect(URLRequest* request, const GURL& new_url) {
plugin_->functions().response_funcs->received_redirect(
@@ -178,16 +197,24 @@
}
virtual void OnReadCompleted(URLRequest* request, int bytes_read) {
- // TODO(mpcomplete): better error codes
- if (bytes_read < 0)
+ CHECK(my_buffer_.get());
+ CHECK(user_buffer_);
+ if (bytes_read > 0) {
+ memcpy(user_buffer_, my_buffer_->data(), bytes_read);
+ } else if (bytes_read < 0) {
+ // TODO(mpcomplete): better error codes
bytes_read = CPERR_FAILURE;
+ }
+ my_buffer_ = NULL;
plugin_->functions().response_funcs->read_completed(
- cprequest_.get(), bytes_read);
+ cprequest_.get(), bytes_read);
}
private:
scoped_ptr<ScopableCPRequest> cprequest_;
scoped_ptr<URLRequest> request_;
+ scoped_refptr<net::IOBuffer> my_buffer_;
+ char* user_buffer_;
};
// This class manages plugins that want to handle UI commands. Right now, we
@@ -614,7 +641,7 @@
CHECK(handler);
int bytes_read;
- if (handler->request()->Read(static_cast<char*>(buf), buf_size, &bytes_read))
+ if (handler->Read(static_cast<char*>(buf), buf_size, &bytes_read))
return bytes_read; // 0 == CPERR_SUCESS
if (handler->request()->status().is_io_pending())
« no previous file with comments | « chrome/browser/automation/url_request_slow_download_job.cc ('k') | chrome/browser/dom_ui/chrome_url_data_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698