| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/base/upload_data_stream.h" | 5 #include "net/base/upload_data_stream.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "net/base/net_errors.h" | 8 #include "net/base/net_errors.h" |
| 9 | 9 |
| 10 namespace net { | 10 namespace net { |
| 11 | 11 |
| 12 UploadDataStream::UploadDataStream(const UploadData* data) | 12 UploadDataStream::UploadDataStream(const UploadData* data) |
| 13 : data_(data), | 13 : data_(data), |
| 14 total_size_(data->GetContentLength()) { | 14 buf_len_(0), |
| 15 Reset(); | 15 next_element_(data->elements().begin()), |
| 16 next_element_offset_(0), |
| 17 next_element_remaining_(0), |
| 18 total_size_(data->GetContentLength()), |
| 19 current_position_(0) { |
| 16 FillBuf(); | 20 FillBuf(); |
| 17 } | 21 } |
| 18 | 22 |
| 19 UploadDataStream::~UploadDataStream() { | 23 UploadDataStream::~UploadDataStream() { |
| 20 } | 24 } |
| 21 | 25 |
| 22 void UploadDataStream::DidConsume(size_t num_bytes) { | 26 void UploadDataStream::DidConsume(size_t num_bytes) { |
| 23 DCHECK(num_bytes <= buf_len_); | 27 DCHECK(num_bytes <= buf_len_); |
| 24 | 28 |
| 25 buf_len_ -= num_bytes; | 29 buf_len_ -= num_bytes; |
| 26 if (buf_len_) | 30 if (buf_len_) |
| 27 memmove(buf_, buf_ + num_bytes, buf_len_); | 31 memmove(buf_, buf_ + num_bytes, buf_len_); |
| 28 | 32 |
| 29 FillBuf(); | 33 FillBuf(); |
| 30 | 34 |
| 31 current_position_ += num_bytes; | 35 current_position_ += num_bytes; |
| 32 } | 36 } |
| 33 | 37 |
| 34 void UploadDataStream::Reset() { | |
| 35 next_element_stream_.Close(); | |
| 36 buf_len_ = 0; | |
| 37 next_element_ = data_->elements().begin(); | |
| 38 next_element_offset_ = 0; | |
| 39 next_element_remaining_ = 0; | |
| 40 current_position_ = 0; | |
| 41 } | |
| 42 | |
| 43 void UploadDataStream::FillBuf() { | 38 void UploadDataStream::FillBuf() { |
| 44 std::vector<UploadData::Element>::const_iterator end = | 39 std::vector<UploadData::Element>::const_iterator end = |
| 45 data_->elements().end(); | 40 data_->elements().end(); |
| 46 | 41 |
| 47 while (buf_len_ < kBufSize && next_element_ != end) { | 42 while (buf_len_ < kBufSize && next_element_ != end) { |
| 48 bool advance_to_next_element = false; | 43 bool advance_to_next_element = false; |
| 49 | 44 |
| 50 const UploadData::Element& element = *next_element_; | 45 const UploadData::Element& element = *next_element_; |
| 51 | 46 |
| 52 size_t size_remaining = kBufSize - buf_len_; | 47 size_t size_remaining = kBufSize - buf_len_; |
| 53 if (element.type() == UploadData::TYPE_BYTES) { | 48 if (element.type() == UploadData::TYPE_BYTES) { |
| 54 const std::vector<char>& d = element.bytes(); | 49 const std::vector<char>& d = element.bytes(); |
| 55 size_t count = d.size() - next_element_offset_; | 50 size_t count = d.size() - next_element_offset_; |
| 56 | 51 |
| 57 size_t bytes_copied = std::min(count, size_remaining); | 52 size_t bytes_copied = std::min(count, size_remaining); |
| 58 | 53 |
| 59 memcpy(buf_ + buf_len_, &d[next_element_offset_], bytes_copied); | 54 memcpy(buf_ + buf_len_, &d[next_element_offset_], bytes_copied); |
| 60 buf_len_ += bytes_copied; | 55 buf_len_ += bytes_copied; |
| 61 | 56 |
| 62 if (bytes_copied == count) { | 57 if (bytes_copied == count) { |
| 63 advance_to_next_element = true; | 58 advance_to_next_element = true; |
| 64 } else { | 59 } else { |
| 65 next_element_offset_ += bytes_copied; | 60 next_element_offset_ += bytes_copied; |
| 66 } | 61 } |
| 67 } else { | 62 } else { |
| 68 DCHECK(element.type() == UploadData::TYPE_FILE); | 63 DCHECK(element.type() == UploadData::TYPE_FILE); |
| 69 | 64 |
| 70 if (!next_element_stream_.IsOpen()) { | 65 if (!next_element_stream_.IsOpen()) { |
| 71 int flags = base::PLATFORM_FILE_OPEN | | 66 int flags = base::PLATFORM_FILE_OPEN | |
| 72 base::PLATFORM_FILE_READ; | 67 base::PLATFORM_FILE_READ; |
| 73 int rv = next_element_stream_.Open(element.file_path(), flags); | 68 int rv = next_element_stream_.Open(element.file_path(), flags); |
| 74 // If the file does not exist, that's technically okay.. we'll just | 69 // If the file does not exist, that's technically okay.. we'll just |
| 75 // upload an empty file. This is for consistency with Mozilla. | 70 // upload an empty file. This is for consistency with Mozilla. |
| 76 DLOG_IF(WARNING, rv != OK) << "Failed to open \"" << | 71 DLOG_IF(WARNING, rv != OK) << "Failed to open \"" << |
| 77 element.file_path() << "\" for reading: " << rv; | 72 element.file_path() << "\" for reading: " << rv; |
| 78 | 73 |
| 79 next_element_remaining_ = 0; // Default to reading nothing. | 74 next_element_remaining_ = 0; // Default to reading nothing. |
| 80 if (rv == OK) { | 75 if (rv == OK) { |
| 81 uint64 offset = element.file_range_offset(); | 76 uint64 offset = element.file_range_offset(); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 103 if (advance_to_next_element) { | 98 if (advance_to_next_element) { |
| 104 ++next_element_; | 99 ++next_element_; |
| 105 next_element_offset_ = 0; | 100 next_element_offset_ = 0; |
| 106 next_element_stream_.Close(); | 101 next_element_stream_.Close(); |
| 107 } | 102 } |
| 108 } | 103 } |
| 109 } | 104 } |
| 110 | 105 |
| 111 } // namespace net | 106 } // namespace net |
| 112 | 107 |
| OLD | NEW |