| 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..e46f2e62718479c71dadccfd7727e191b35581aa 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.
|
| + 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_EQ(UploadElement::TYPE_BYTES, element.type());
|
| + 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;
|
|
|