Chromium Code Reviews| Index: net/base/upload_data_stream.cc |
| diff --git a/net/base/upload_data_stream.cc b/net/base/upload_data_stream.cc |
| index b96680efc3eeaf056276a44b1c2942d4f42f1378..0f434a12a426d87dabb0c506ff7f8a04477227ad 100644 |
| --- a/net/base/upload_data_stream.cc |
| +++ b/net/base/upload_data_stream.cc |
| @@ -4,12 +4,10 @@ |
| #include "net/base/upload_data_stream.h" |
| -#include "base/file_util.h" |
| #include "base/logging.h" |
| -#include "base/threading/thread_restrictions.h" |
| -#include "net/base/file_stream.h" |
| #include "net/base/io_buffer.h" |
| #include "net/base/net_errors.h" |
| +#include "net/base/upload_element_reader.h" |
| namespace net { |
| @@ -27,6 +25,9 @@ UploadDataStream::UploadDataStream(UploadData* upload_data) |
| total_size_(0), |
| current_position_(0), |
| initialized_successfully_(false) { |
| + const std::vector<UploadElement>& elements = *upload_data_->elements(); |
| + for (size_t i = 0; i < elements.size(); ++i) |
| + element_readers_.push_back(UploadElementReader::Create(elements[i])); |
| } |
| UploadDataStream::~UploadDataStream() { |
| @@ -34,57 +35,47 @@ UploadDataStream::~UploadDataStream() { |
| int UploadDataStream::Init() { |
| DCHECK(!initialized_successfully_); |
| - std::vector<UploadElement>* elements = upload_data_->elements_mutable(); |
| - { |
| - base::ThreadRestrictions::ScopedAllowIO allow_io; |
| - total_size_ = 0; |
| - if (!is_chunked()) { |
| - for (size_t i = 0; i < elements->size(); ++i) |
| - total_size_ += (*elements)[i].GetContentLength(); |
| - } |
| - } |
| - // If the underlying file has been changed and the expected file |
| - // modification time is set, treat it as error. Note that the expected |
| - // modification time from WebKit is based on time_t precision. So we |
| - // have to convert both to time_t to compare. This check is used for |
| - // sliced files. |
| - for (size_t i = 0; i < elements->size(); ++i) { |
| - const UploadElement& element = (*elements)[i]; |
| - if (element.type() == UploadElement::TYPE_FILE && |
| - !element.expected_file_modification_time().is_null()) { |
| - // Temporarily allow until fix: http://crbug.com/72001. |
| - base::ThreadRestrictions::ScopedAllowIO allow_io; |
| - base::PlatformFileInfo info; |
| - if (file_util::GetFileInfo(element.file_path(), &info) && |
| - element.expected_file_modification_time().ToTimeT() != |
| - info.last_modified.ToTimeT()) { |
| - return ERR_UPLOAD_FILE_CHANGED; |
| - } |
| - } |
| + uint64 total_size = 0; |
| + for (size_t i = 0; i < element_readers_.size(); ++i) { |
| + UploadElementReader* reader = element_readers_[i]; |
| + const int result = reader->InitSync(); |
| + if (result != OK) |
| + return result; |
| + if (!is_chunked()) |
| + total_size += reader->GetContentLength(); |
| } |
| - |
| - // Reset the offset, as upload_data_ may already be read (i.e. UploadData |
| - // can be reused for a new UploadDataStream). |
| - for (size_t i = 0; i < elements->size(); ++i) |
| - (*elements)[i].ResetOffset(); |
| + total_size_ = total_size; |
| initialized_successfully_ = true; |
| return OK; |
| } |
| int UploadDataStream::Read(IOBuffer* buf, int buf_len) { |
| - std::vector<UploadElement>& elements = |
| - *upload_data_->elements_mutable(); |
| + DCHECK(initialized_successfully_); |
| - int bytes_copied = 0; |
| - while (bytes_copied < buf_len && element_index_ < elements.size()) { |
| - UploadElement& element = elements[element_index_]; |
| + // Initialize readers for newly appended chunks. |
|
willchan no longer on Chromium
2012/09/06 01:06:01
This just occurred to me. I'm not sure how big a d
hashimoto
2012/09/06 01:55:39
This is not a regression.
Currently, appended chun
|
| + if (is_chunked()) { |
| + const std::vector<UploadElement>& elements = *upload_data_->elements(); |
| + DCHECK_LE(element_readers_.size(), elements.size()); |
| - bytes_copied += element.ReadSync(buf->data() + bytes_copied, |
| - buf_len - bytes_copied); |
| + for (size_t i = element_readers_.size(); i < elements.size(); ++i) { |
| + const UploadElement& element = elements[i]; |
| + DCHECK(element.type() == UploadElement::TYPE_BYTES); |
|
willchan no longer on Chromium
2012/09/06 01:06:01
DCHECK_EQ?
hashimoto
2012/09/06 01:55:39
Done.
|
| + UploadElementReader* reader = UploadElementReader::Create(element); |
| - if (element.BytesRemaining() == 0) |
| + const int rv = reader->InitSync(); |
| + DCHECK_EQ(rv, OK); |
| + element_readers_.push_back(reader); |
| + } |
| + } |
| + |
| + int bytes_copied = 0; |
| + while (bytes_copied < buf_len && element_index_ < element_readers_.size()) { |
| + UploadElementReader* reader = element_readers_[element_index_]; |
| + bytes_copied += reader->ReadSync(buf->data() + bytes_copied, |
| + buf_len - bytes_copied); |
| + if (reader->BytesRemaining() == 0) |
| ++element_index_; |
| if (is_chunked() && !merge_chunks_) |
| @@ -99,6 +90,7 @@ int UploadDataStream::Read(IOBuffer* buf, int buf_len) { |
| } |
| bool UploadDataStream::IsEOF() const { |
| + DCHECK(initialized_successfully_); |
| const std::vector<UploadElement>& elements = *upload_data_->elements(); |
| // Check if all elements are consumed. |
| @@ -119,9 +111,8 @@ bool UploadDataStream::IsInMemory() const { |
| if (is_chunked()) |
| return false; |
| - const std::vector<UploadElement>& elements = *upload_data_->elements(); |
| - for (size_t i = 0; i < elements.size(); ++i) { |
| - if (elements[i].type() != UploadElement::TYPE_BYTES) |
| + for (size_t i = 0; i < element_readers_.size(); ++i) { |
| + if (!element_readers_[i]->IsInMemory()) |
| return false; |
| } |
| return true; |