diff options
author | hashimoto@chromium.org <hashimoto@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-11 10:36:06 +0000 |
---|---|---|
committer | hashimoto@chromium.org <hashimoto@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-11 10:36:06 +0000 |
commit | b2d26cfdcc1201f5e459ca3f9e0278e3fe45a45f (patch) | |
tree | 839657d1fc942a5976fe8a540c11bdf236f6fb22 /chrome_frame | |
parent | e2c00ede28ae5323b806a8fe1b108d020300e392 (diff) | |
download | chromium_src-b2d26cfdcc1201f5e459ca3f9e0278e3fe45a45f.zip chromium_src-b2d26cfdcc1201f5e459ca3f9e0278e3fe45a45f.tar.gz chromium_src-b2d26cfdcc1201f5e459ca3f9e0278e3fe45a45f.tar.bz2 |
net: Make UploadDataStream independent from UploadData
Change argument of UploadDataStream's ctor from UploadData to ScopedVector<UploadElementReader>
Move chunk related logic from UploadData to UploadDataStream.
Move UploadElementReader creation code from UploadElementReader::Create to URLRequest::set_upload. (this code will soon be moved again to src/webkit/glue/resource_request_body.cc)
BUG=156574
TEST=net_unittests
TBR=jam@chromium.org for chrome/browser/automation (already reviewed by ananta@)
Review URL: https://chromiumcodereview.appspot.com/11419220
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@172295 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome_frame')
-rw-r--r-- | chrome_frame/urlmon_upload_data_stream.cc | 57 |
1 files changed, 54 insertions, 3 deletions
diff --git a/chrome_frame/urlmon_upload_data_stream.cc b/chrome_frame/urlmon_upload_data_stream.cc index 05a2b14..ede66bf 100644 --- a/chrome_frame/urlmon_upload_data_stream.cc +++ b/chrome_frame/urlmon_upload_data_stream.cc @@ -6,11 +6,62 @@ #include "net/base/io_buffer.h" #include "net/base/net_errors.h" +#include "net/base/upload_bytes_element_reader.h" +#include "net/base/upload_file_element_reader.h" + +namespace { + +// Creates UploadDataStream from UploadData. +net::UploadDataStream* CreateUploadDataStream(net::UploadData* upload_data) { + net::UploadDataStream* upload_data_stream = NULL; + const ScopedVector<net::UploadElement>& elements = upload_data->elements(); + + if (upload_data->is_chunked()) { + // Use AppendChunk when data is chunked. + upload_data_stream = new net::UploadDataStream( + net::UploadDataStream::CHUNKED, upload_data->identifier()); + + for (size_t i = 0; i < elements.size(); ++i) { + const net::UploadElement& element = *elements[i]; + const bool is_last_chunk = + i == elements.size() - 1 && upload_data->last_chunk_appended(); + DCHECK_EQ(net::UploadElement::TYPE_BYTES, element.type()); + upload_data_stream->AppendChunk(element.bytes(), element.bytes_length(), + is_last_chunk); + } + } else { + // Not chunked. + ScopedVector<net::UploadElementReader> element_readers; + for (size_t i = 0; i < elements.size(); ++i) { + const net::UploadElement& element = *elements[i]; + net::UploadElementReader* reader = NULL; + switch (element.type()) { + case net::UploadElement::TYPE_BYTES: + reader = new net::UploadBytesElementReader(element.bytes(), + element.bytes_length()); + break; + case net::UploadElement::TYPE_FILE: + reader = new net::UploadFileElementReader( + element.file_path(), + element.file_range_offset(), + element.file_range_length(), + element.expected_file_modification_time()); + break; + } + DCHECK(reader); + element_readers.push_back(reader); + } + upload_data_stream = new net::UploadDataStream(&element_readers, + upload_data->identifier()); + } + return upload_data_stream; +} + +} // namespace void UrlmonUploadDataStream::Initialize(net::UploadData* upload_data) { upload_data_ = upload_data; - request_body_stream_.reset( - new net::UploadDataStream(upload_data)); + request_body_stream_.reset(CreateUploadDataStream(upload_data)); const int result = request_body_stream_->InitSync(); DCHECK_EQ(net::OK, result); } @@ -69,7 +120,7 @@ STDMETHODIMP UrlmonUploadDataStream::Seek(LARGE_INTEGER move, DWORD origin, // STREAM_SEEK_SETs to work with a 0 offset, but fail on everything else. if (origin == STREAM_SEEK_SET && move.QuadPart == 0) { if (request_body_stream_->position() != 0) { - request_body_stream_.reset(new net::UploadDataStream(upload_data_)); + request_body_stream_.reset(CreateUploadDataStream(upload_data_)); const int result = request_body_stream_->InitSync(); DCHECK_EQ(net::OK, result); } |