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

Unified Diff: net/base/upload_data_stream.cc

Issue 10868064: net: Move data reading functionalities from UploadElement to UploadElementReader (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 8 years, 3 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
« no previous file with comments | « net/base/upload_data_stream.h ('k') | net/base/upload_data_stream_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
« no previous file with comments | « net/base/upload_data_stream.h ('k') | net/base/upload_data_stream_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698