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

Side by Side Diff: net/base/upload_data_stream.cc

Issue 9384: UploadDataStream::Reset should call FillBuf to return... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 12 years, 1 month 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/base/upload_data_stream.h ('k') | net/http/http_network_transaction.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
OLDNEW
« no previous file with comments | « net/base/upload_data_stream.h ('k') | net/http/http_network_transaction.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698