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

Unified Diff: content/browser/renderer_host/redirect_to_file_resource_handler.cc

Issue 9402014: net: FileStream::Read/Write() to take IOBuffer* instead of char* (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebased Created 8 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/redirect_to_file_resource_handler.cc
diff --git a/content/browser/renderer_host/redirect_to_file_resource_handler.cc b/content/browser/renderer_host/redirect_to_file_resource_handler.cc
index 8ebba69a259a904d9adbd1c44fc59e235b088735..5344b0663a34ffc909ee620c2706a20bba194f7a 100644
--- a/content/browser/renderer_host/redirect_to_file_resource_handler.cc
+++ b/content/browser/renderer_host/redirect_to_file_resource_handler.cc
@@ -36,7 +36,6 @@ RedirectToFileResourceHandler::RedirectToFileResourceHandler(
request_id_(-1),
buf_(new net::GrowableIOBuffer()),
buf_write_pending_(false),
- write_cursor_(0),
write_callback_pending_(false),
request_was_closed_(false),
completed_during_write_(false) {
@@ -111,6 +110,17 @@ bool RedirectToFileResourceHandler::OnReadCompleted(int request_id,
DCHECK(new_offset <= buf_->capacity());
buf_->set_offset(new_offset);
+ // Reset the cursor per the new offset.
+ if (write_cursor_) {
+ // If we already have the write cursor, create a new one and advance
+ // to where we were.
+ int consumed_so_far = write_cursor_->BytesConsumed();
+ write_cursor_ = new net::DrainableIOBuffer(buf_, buf_->offset());
+ write_cursor_->DidConsume(consumed_so_far);
+ } else {
+ write_cursor_ = new net::DrainableIOBuffer(buf_, buf_->offset());
+ }
+
if (BufIsFull())
host_->PauseRequest(process_id_, request_id, true);
@@ -179,7 +189,7 @@ void RedirectToFileResourceHandler::DidWriteToFile(int result) {
bool failed = false;
if (result > 0) {
next_handler_->OnDataDownloaded(request_id_, result);
- write_cursor_ += result;
+ write_cursor_->DidConsume(result);
failed = !WriteMore();
} else {
failed = true;
@@ -197,23 +207,22 @@ void RedirectToFileResourceHandler::DidWriteToFile(int result) {
bool RedirectToFileResourceHandler::WriteMore() {
DCHECK(file_stream_.get());
for (;;) {
- if (write_cursor_ == buf_->offset()) {
+ if (write_cursor_->BytesRemaining() == 0) {
// We've caught up to the network load, but it may be in the process of
// appending more data to the buffer.
if (!buf_write_pending_) {
if (BufIsFull())
host_->PauseRequest(process_id_, request_id_, false);
buf_->set_offset(0);
- write_cursor_ = 0;
+ write_cursor_ = NULL;
}
return true;
}
if (write_callback_pending_)
return true;
- DCHECK(write_cursor_ < buf_->offset());
+ DCHECK_LT(0, write_cursor_->BytesRemaining());
int rv = file_stream_->Write(
- buf_->StartOfBuffer() + write_cursor_,
- buf_->offset() - write_cursor_,
+ write_cursor_, write_cursor_->BytesRemaining(),
base::Bind(&RedirectToFileResourceHandler::DidWriteToFile,
base::Unretained(this)));
if (rv == net::ERR_IO_PENDING) {
@@ -223,7 +232,7 @@ bool RedirectToFileResourceHandler::WriteMore() {
if (rv <= 0)
return false;
next_handler_->OnDataDownloaded(request_id_, rv);
- write_cursor_ += rv;
+ write_cursor_->DidConsume(rv);
}
}

Powered by Google App Engine
This is Rietveld 408576698