OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_file_element_reader.h" | 5 #include "net/base/upload_file_element_reader.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
9 #include "base/location.h" | 9 #include "base/location.h" |
10 #include "base/task_runner_util.h" | 10 #include "base/task_runner_util.h" |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 if (result == 0) // Reached end-of-file earlier than expected. | 87 if (result == 0) // Reached end-of-file earlier than expected. |
88 result = ERR_UPLOAD_FILE_CHANGED; | 88 result = ERR_UPLOAD_FILE_CHANGED; |
89 } | 89 } |
90 return result; | 90 return result; |
91 } | 91 } |
92 | 92 |
93 } // namespace | 93 } // namespace |
94 | 94 |
95 UploadFileElementReader::FileStreamDeleter::FileStreamDeleter( | 95 UploadFileElementReader::FileStreamDeleter::FileStreamDeleter( |
96 base::TaskRunner* task_runner) : task_runner_(task_runner) { | 96 base::TaskRunner* task_runner) : task_runner_(task_runner) { |
97 DCHECK(task_runner_); | 97 DCHECK(task_runner_.get()); |
98 } | 98 } |
99 | 99 |
100 UploadFileElementReader::FileStreamDeleter::~FileStreamDeleter() {} | 100 UploadFileElementReader::FileStreamDeleter::~FileStreamDeleter() {} |
101 | 101 |
102 void UploadFileElementReader::FileStreamDeleter::operator() ( | 102 void UploadFileElementReader::FileStreamDeleter::operator() ( |
103 FileStream* file_stream) const { | 103 FileStream* file_stream) const { |
104 if (file_stream) { | 104 if (file_stream) { |
105 task_runner_->PostTask(FROM_HERE, | 105 task_runner_->PostTask(FROM_HERE, |
106 base::Bind(&base::DeletePointer<FileStream>, | 106 base::Bind(&base::DeletePointer<FileStream>, |
107 file_stream)); | 107 file_stream)); |
108 } | 108 } |
109 } | 109 } |
110 | 110 |
111 UploadFileElementReader::UploadFileElementReader( | 111 UploadFileElementReader::UploadFileElementReader( |
112 base::TaskRunner* task_runner, | 112 base::TaskRunner* task_runner, |
113 const base::FilePath& path, | 113 const base::FilePath& path, |
114 uint64 range_offset, | 114 uint64 range_offset, |
115 uint64 range_length, | 115 uint64 range_length, |
116 const base::Time& expected_modification_time) | 116 const base::Time& expected_modification_time) |
117 : task_runner_(task_runner), | 117 : task_runner_(task_runner), |
118 path_(path), | 118 path_(path), |
119 range_offset_(range_offset), | 119 range_offset_(range_offset), |
120 range_length_(range_length), | 120 range_length_(range_length), |
121 expected_modification_time_(expected_modification_time), | 121 expected_modification_time_(expected_modification_time), |
122 file_stream_(NULL, FileStreamDeleter(task_runner_)), | 122 file_stream_(NULL, FileStreamDeleter(task_runner_.get())), |
123 content_length_(0), | 123 content_length_(0), |
124 bytes_remaining_(0), | 124 bytes_remaining_(0), |
125 weak_ptr_factory_(this) { | 125 weak_ptr_factory_(this) { |
126 DCHECK(task_runner_); | 126 DCHECK(task_runner_.get()); |
127 } | 127 } |
128 | 128 |
129 UploadFileElementReader::~UploadFileElementReader() { | 129 UploadFileElementReader::~UploadFileElementReader() { |
130 } | 130 } |
131 | 131 |
132 const UploadFileElementReader* UploadFileElementReader::AsFileReader() const { | 132 const UploadFileElementReader* UploadFileElementReader::AsFileReader() const { |
133 return this; | 133 return this; |
134 } | 134 } |
135 | 135 |
136 int UploadFileElementReader::Init(const CompletionCallback& callback) { | 136 int UploadFileElementReader::Init(const CompletionCallback& callback) { |
137 DCHECK(!callback.is_null()); | 137 DCHECK(!callback.is_null()); |
138 Reset(); | 138 Reset(); |
139 | 139 |
140 ScopedFileStreamPtr* file_stream = | 140 ScopedFileStreamPtr* file_stream = |
141 new ScopedFileStreamPtr(NULL, FileStreamDeleter(task_runner_)); | 141 new ScopedFileStreamPtr(NULL, FileStreamDeleter(task_runner_.get())); |
142 uint64* content_length = new uint64; | 142 uint64* content_length = new uint64; |
143 const bool posted = base::PostTaskAndReplyWithResult( | 143 const bool posted = base::PostTaskAndReplyWithResult( |
144 task_runner_, | 144 task_runner_.get(), |
145 FROM_HERE, | 145 FROM_HERE, |
146 base::Bind(&InitInternal<FileStreamDeleter>, | 146 base::Bind(&InitInternal<FileStreamDeleter>, |
147 path_, | 147 path_, |
148 range_offset_, | 148 range_offset_, |
149 range_length_, | 149 range_length_, |
150 expected_modification_time_, | 150 expected_modification_time_, |
151 file_stream, | 151 file_stream, |
152 content_length), | 152 content_length), |
153 base::Bind(&UploadFileElementReader::OnInitCompleted, | 153 base::Bind(&UploadFileElementReader::OnInitCompleted, |
154 weak_ptr_factory_.GetWeakPtr(), | 154 weak_ptr_factory_.GetWeakPtr(), |
(...skipping 20 matching lines...) Expand all Loading... |
175 DCHECK(!callback.is_null()); | 175 DCHECK(!callback.is_null()); |
176 | 176 |
177 if (BytesRemaining() == 0) | 177 if (BytesRemaining() == 0) |
178 return 0; | 178 return 0; |
179 | 179 |
180 // Save the value of file_stream_.get() before base::Passed() invalidates it. | 180 // Save the value of file_stream_.get() before base::Passed() invalidates it. |
181 FileStream* file_stream_ptr = file_stream_.get(); | 181 FileStream* file_stream_ptr = file_stream_.get(); |
182 // Pass the ownership of file_stream_ to the worker pool to safely perform | 182 // Pass the ownership of file_stream_ to the worker pool to safely perform |
183 // operation even when |this| is destructed before the read completes. | 183 // operation even when |this| is destructed before the read completes. |
184 const bool posted = base::PostTaskAndReplyWithResult( | 184 const bool posted = base::PostTaskAndReplyWithResult( |
185 task_runner_, | 185 task_runner_.get(), |
186 FROM_HERE, | 186 FROM_HERE, |
187 base::Bind(&ReadInternal, | 187 base::Bind(&ReadInternal, |
188 scoped_refptr<IOBuffer>(buf), | 188 scoped_refptr<IOBuffer>(buf), |
189 buf_length, | 189 buf_length, |
190 BytesRemaining(), | 190 BytesRemaining(), |
191 file_stream_ptr), | 191 file_stream_ptr), |
192 base::Bind(&UploadFileElementReader::OnReadCompleted, | 192 base::Bind(&UploadFileElementReader::OnReadCompleted, |
193 weak_ptr_factory_.GetWeakPtr(), | 193 weak_ptr_factory_.GetWeakPtr(), |
194 base::Passed(&file_stream_), | 194 base::Passed(&file_stream_), |
195 callback)); | 195 callback)); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 const int result = ReadInternal(buf, buf_length, BytesRemaining(), | 281 const int result = ReadInternal(buf, buf_length, BytesRemaining(), |
282 file_stream_.get()); | 282 file_stream_.get()); |
283 if (result > 0) { | 283 if (result > 0) { |
284 DCHECK_GE(bytes_remaining_, static_cast<uint64>(result)); | 284 DCHECK_GE(bytes_remaining_, static_cast<uint64>(result)); |
285 bytes_remaining_ -= result; | 285 bytes_remaining_ -= result; |
286 } | 286 } |
287 return result; | 287 return result; |
288 } | 288 } |
289 | 289 |
290 } // namespace net | 290 } // namespace net |
OLD | NEW |