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 // For loading files, we make use of overlapped i/o to ensure that reading from | 5 // For loading files, we make use of overlapped i/o to ensure that reading from |
6 // the filesystem (e.g., a network filesystem) does not block the calling | 6 // the filesystem (e.g., a network filesystem) does not block the calling |
7 // thread. An alternative approach would be to use a background thread or pool | 7 // thread. An alternative approach would be to use a background thread or pool |
8 // of threads, but it seems better to leverage the operating system's ability | 8 // of threads, but it seems better to leverage the operating system's ability |
9 // to do background file reads for us. | 9 // to do background file reads for us. |
10 // | 10 // |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 base::Owned(meta_info))); | 76 base::Owned(meta_info))); |
77 } | 77 } |
78 | 78 |
79 void URLRequestFileJob::Kill() { | 79 void URLRequestFileJob::Kill() { |
80 stream_.reset(); | 80 stream_.reset(); |
81 weak_ptr_factory_.InvalidateWeakPtrs(); | 81 weak_ptr_factory_.InvalidateWeakPtrs(); |
82 | 82 |
83 URLRequestJob::Kill(); | 83 URLRequestJob::Kill(); |
84 } | 84 } |
85 | 85 |
86 bool URLRequestFileJob::ReadRawData(IOBuffer* dest, int dest_size, | 86 bool URLRequestFileJob::ReadRawData(IOBuffer* dest, |
87 int *bytes_read) { | 87 int dest_size, |
| 88 int* bytes_read) { |
88 DCHECK_NE(dest_size, 0); | 89 DCHECK_NE(dest_size, 0); |
89 DCHECK(bytes_read); | 90 DCHECK(bytes_read); |
90 DCHECK_GE(remaining_bytes_, 0); | 91 DCHECK_GE(remaining_bytes_, 0); |
91 | 92 |
92 if (remaining_bytes_ < dest_size) | 93 if (remaining_bytes_ < dest_size) |
93 dest_size = static_cast<int>(remaining_bytes_); | 94 dest_size = static_cast<int>(remaining_bytes_); |
94 | 95 |
95 // If we should copy zero bytes because |remaining_bytes_| is zero, short | 96 // If we should copy zero bytes because |remaining_bytes_| is zero, short |
96 // circuit here. | 97 // circuit here. |
97 if (!dest_size) { | 98 if (!dest_size) { |
98 *bytes_read = 0; | 99 *bytes_read = 0; |
99 return true; | 100 return true; |
100 } | 101 } |
101 | 102 |
102 int rv = stream_->Read(dest, dest_size, | 103 int rv = stream_->Read(dest, |
| 104 dest_size, |
103 base::Bind(&URLRequestFileJob::DidRead, | 105 base::Bind(&URLRequestFileJob::DidRead, |
104 weak_ptr_factory_.GetWeakPtr())); | 106 weak_ptr_factory_.GetWeakPtr(), |
| 107 make_scoped_refptr(dest))); |
105 if (rv >= 0) { | 108 if (rv >= 0) { |
106 // Data is immediately available. | 109 // Data is immediately available. |
107 *bytes_read = rv; | 110 *bytes_read = rv; |
108 remaining_bytes_ -= rv; | 111 remaining_bytes_ -= rv; |
109 DCHECK_GE(remaining_bytes_, 0); | 112 DCHECK_GE(remaining_bytes_, 0); |
110 return true; | 113 return true; |
111 } | 114 } |
112 | 115 |
113 // Otherwise, a read error occured. We may just need to wait... | 116 // Otherwise, a read error occured. We may just need to wait... |
114 if (rv == ERR_IO_PENDING) { | 117 if (rv == ERR_IO_PENDING) { |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 // because we need to do multipart encoding here. | 188 // because we need to do multipart encoding here. |
186 // TODO(hclam): decide whether we want to support multiple range | 189 // TODO(hclam): decide whether we want to support multiple range |
187 // requests. | 190 // requests. |
188 NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, | 191 NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, |
189 ERR_REQUEST_RANGE_NOT_SATISFIABLE)); | 192 ERR_REQUEST_RANGE_NOT_SATISFIABLE)); |
190 } | 193 } |
191 } | 194 } |
192 } | 195 } |
193 } | 196 } |
194 | 197 |
| 198 void URLRequestFileJob::OnSeekComplete(int64 result) { |
| 199 } |
| 200 |
| 201 void URLRequestFileJob::OnReadComplete(net::IOBuffer* buf, int result) { |
| 202 } |
| 203 |
195 URLRequestFileJob::~URLRequestFileJob() { | 204 URLRequestFileJob::~URLRequestFileJob() { |
196 } | 205 } |
197 | 206 |
198 void URLRequestFileJob::FetchMetaInfo(const base::FilePath& file_path, | 207 void URLRequestFileJob::FetchMetaInfo(const base::FilePath& file_path, |
199 FileMetaInfo* meta_info) { | 208 FileMetaInfo* meta_info) { |
200 base::File::Info file_info; | 209 base::File::Info file_info; |
201 meta_info->file_exists = base::GetFileInfo(file_path, &file_info); | 210 meta_info->file_exists = base::GetFileInfo(file_path, &file_info); |
202 if (meta_info->file_exists) { | 211 if (meta_info->file_exists) { |
203 meta_info->file_size = file_info.size; | 212 meta_info->file_size = file_info.size; |
204 meta_info->is_directory = file_info.is_directory; | 213 meta_info->is_directory = file_info.is_directory; |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 } | 275 } |
267 } else { | 276 } else { |
268 // We didn't need to call stream_->Seek() at all, so we pass to DidSeek() | 277 // We didn't need to call stream_->Seek() at all, so we pass to DidSeek() |
269 // the value that would mean seek success. This way we skip the code | 278 // the value that would mean seek success. This way we skip the code |
270 // handling seek failure. | 279 // handling seek failure. |
271 DidSeek(byte_range_.first_byte_position()); | 280 DidSeek(byte_range_.first_byte_position()); |
272 } | 281 } |
273 } | 282 } |
274 | 283 |
275 void URLRequestFileJob::DidSeek(int64 result) { | 284 void URLRequestFileJob::DidSeek(int64 result) { |
| 285 OnSeekComplete(result); |
276 if (result != byte_range_.first_byte_position()) { | 286 if (result != byte_range_.first_byte_position()) { |
277 NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, | 287 NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, |
278 ERR_REQUEST_RANGE_NOT_SATISFIABLE)); | 288 ERR_REQUEST_RANGE_NOT_SATISFIABLE)); |
279 return; | 289 return; |
280 } | 290 } |
281 | 291 |
282 set_expected_content_size(remaining_bytes_); | 292 set_expected_content_size(remaining_bytes_); |
283 NotifyHeadersComplete(); | 293 NotifyHeadersComplete(); |
284 } | 294 } |
285 | 295 |
286 void URLRequestFileJob::DidRead(int result) { | 296 void URLRequestFileJob::DidRead(scoped_refptr<net::IOBuffer> buf, int result) { |
| 297 OnReadComplete(buf.get(), result); |
| 298 buf = NULL; |
287 if (result > 0) { | 299 if (result > 0) { |
288 SetStatus(URLRequestStatus()); // Clear the IO_PENDING status | 300 SetStatus(URLRequestStatus()); // Clear the IO_PENDING status |
289 } else if (result == 0) { | 301 } else if (result == 0) { |
290 NotifyDone(URLRequestStatus()); | 302 NotifyDone(URLRequestStatus()); |
291 } else { | 303 } else { |
292 NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, result)); | 304 NotifyDone(URLRequestStatus(URLRequestStatus::FAILED, result)); |
293 } | 305 } |
294 | 306 |
295 remaining_bytes_ -= result; | 307 remaining_bytes_ -= result; |
296 DCHECK_GE(remaining_bytes_, 0); | 308 DCHECK_GE(remaining_bytes_, 0); |
297 | 309 |
298 NotifyReadComplete(result); | 310 NotifyReadComplete(result); |
299 } | 311 } |
300 | 312 |
301 } // namespace net | 313 } // namespace net |
OLD | NEW |