OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "content/common/url_fetcher.h" | 5 #include "content/common/url_fetcher.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/file_path.h" | 10 #include "base/file_path.h" |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 public: | 102 public: |
103 TempFileWriter( | 103 TempFileWriter( |
104 URLFetcher::Core* core, | 104 URLFetcher::Core* core, |
105 scoped_refptr<base::MessageLoopProxy> file_message_loop_proxy); | 105 scoped_refptr<base::MessageLoopProxy> file_message_loop_proxy); |
106 | 106 |
107 ~TempFileWriter(); | 107 ~TempFileWriter(); |
108 void CreateTempFile(); | 108 void CreateTempFile(); |
109 void DidCreateTempFile(base::PlatformFileError error_code, | 109 void DidCreateTempFile(base::PlatformFileError error_code, |
110 base::PassPlatformFile file_handle, | 110 base::PassPlatformFile file_handle, |
111 FilePath file_path); | 111 FilePath file_path); |
112 void DidCloseTempFile(base::PlatformFileError error_code); | |
113 void DidReopenTempFile(base::PlatformFileError error_code, | |
114 base::PassPlatformFile file_handle, | |
115 bool created); | |
116 | 112 |
117 // Record |num_bytes_| response bytes in |core_->buffer_| to the file. | 113 // Record |num_bytes_| response bytes in |core_->buffer_| to the file. |
118 void WriteBuffer(int num_bytes); | 114 void WriteBuffer(int num_bytes); |
119 | 115 |
120 // Called when a write has been done. Continues writing if there are | 116 // Called when a write has been done. Continues writing if there are |
121 // any more bytes to write. Otherwise, initiates a read in core_. | 117 // any more bytes to write. Otherwise, initiates a read in core_. |
122 void ContinueWrite(base::PlatformFileError error_code, | 118 void ContinueWrite(base::PlatformFileError error_code, |
123 int bytes_written); | 119 int bytes_written); |
124 | 120 |
125 // Drop ownership of the file at path |temp_file_|. This class | 121 // Drop ownership of the file at path |temp_file_|. This class |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 } | 306 } |
311 | 307 |
312 URLFetcher::Core::TempFileWriter::~TempFileWriter() { | 308 URLFetcher::Core::TempFileWriter::~TempFileWriter() { |
313 Destroy(); | 309 Destroy(); |
314 } | 310 } |
315 | 311 |
316 void URLFetcher::Core::TempFileWriter::CreateTempFile() { | 312 void URLFetcher::Core::TempFileWriter::CreateTempFile() { |
317 CHECK(file_message_loop_proxy_.get()); | 313 CHECK(file_message_loop_proxy_.get()); |
318 base::FileUtilProxy::CreateTemporary( | 314 base::FileUtilProxy::CreateTemporary( |
319 file_message_loop_proxy_, | 315 file_message_loop_proxy_, |
| 316 0, // No additional file flags. |
320 callback_factory_.NewCallback( | 317 callback_factory_.NewCallback( |
321 &URLFetcher::Core::TempFileWriter::DidCreateTempFile)); | 318 &URLFetcher::Core::TempFileWriter::DidCreateTempFile)); |
322 } | 319 } |
323 | 320 |
324 void URLFetcher::Core::TempFileWriter::DidCreateTempFile( | 321 void URLFetcher::Core::TempFileWriter::DidCreateTempFile( |
325 base::PlatformFileError error_code, | 322 base::PlatformFileError error_code, |
326 base::PassPlatformFile file_handle, | 323 base::PassPlatformFile file_handle, |
327 FilePath file_path) { | 324 FilePath file_path) { |
328 if (base::PLATFORM_FILE_OK != error_code) { | 325 if (base::PLATFORM_FILE_OK != error_code) { |
329 error_code_ = error_code; | 326 error_code_ = error_code; |
330 core_->InformDelegateFetchIsComplete(); | 327 core_->InformDelegateFetchIsComplete(); |
331 return; | 328 return; |
332 } | 329 } |
333 | 330 |
334 temp_file_ = file_path; | 331 temp_file_ = file_path; |
335 | |
336 // The file was opened with async writes enabled. FileUtilProxy::Write() | |
337 // treats a write that returns IO_PENDING as an error, and does not inform | |
338 // the caller. We need to close and reopen the file with asyncronus writes | |
339 // disabled. | |
340 // TODO(skerner): Make FileUtilProxy::Write() play nice with async IO. | |
341 base::FileUtilProxy::Close( | |
342 file_message_loop_proxy_, | |
343 file_handle.ReleaseValue(), | |
344 callback_factory_.NewCallback( | |
345 &URLFetcher::Core::TempFileWriter::DidCloseTempFile)); | |
346 } | |
347 | |
348 void URLFetcher::Core::TempFileWriter::DidCloseTempFile( | |
349 base::PlatformFileError error_code) { | |
350 if (base::PLATFORM_FILE_OK != error_code) { | |
351 error_code_ = error_code; | |
352 core_->InformDelegateFetchIsComplete(); | |
353 return; | |
354 } | |
355 | |
356 int file_flags = | |
357 base::PLATFORM_FILE_CREATE_ALWAYS | | |
358 base::PLATFORM_FILE_WRITE | | |
359 base::PLATFORM_FILE_TEMPORARY; | |
360 | |
361 base::FileUtilProxy::CreateOrOpen( | |
362 file_message_loop_proxy_, | |
363 temp_file_, | |
364 file_flags, | |
365 callback_factory_.NewCallback( | |
366 &URLFetcher::Core::TempFileWriter::DidReopenTempFile)); | |
367 } | |
368 | |
369 void URLFetcher::Core::TempFileWriter::DidReopenTempFile( | |
370 base::PlatformFileError error_code, | |
371 base::PassPlatformFile file_handle, | |
372 bool created) { | |
373 if (base::PLATFORM_FILE_OK != error_code) { | |
374 error_code_ = error_code; | |
375 core_->InformDelegateFetchIsComplete(); | |
376 return; | |
377 } | |
378 | |
379 temp_file_handle_ = file_handle.ReleaseValue(); | 332 temp_file_handle_ = file_handle.ReleaseValue(); |
380 total_bytes_written_ = 0; | 333 total_bytes_written_ = 0; |
381 | 334 |
382 core_->io_message_loop_proxy_->PostTask( | 335 core_->io_message_loop_proxy_->PostTask( |
383 FROM_HERE, | 336 FROM_HERE, |
384 NewRunnableMethod(core_, &Core::StartURLRequestWhenAppropriate)); | 337 NewRunnableMethod(core_, &Core::StartURLRequestWhenAppropriate)); |
385 } | 338 } |
386 | 339 |
387 void URLFetcher::Core::TempFileWriter::WriteBuffer(int num_bytes) { | 340 void URLFetcher::Core::TempFileWriter::WriteBuffer(int num_bytes) { |
388 // Start writing to the temp file by setting the initial state | 341 // Start writing to the temp file by setting the initial state |
(...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1032 } | 985 } |
1033 | 986 |
1034 // static | 987 // static |
1035 int URLFetcher::GetNumFetcherCores() { | 988 int URLFetcher::GetNumFetcherCores() { |
1036 return Core::g_registry.Get().size(); | 989 return Core::g_registry.Get().size(); |
1037 } | 990 } |
1038 | 991 |
1039 URLFetcher::Delegate* URLFetcher::delegate() const { | 992 URLFetcher::Delegate* URLFetcher::delegate() const { |
1040 return core_->delegate(); | 993 return core_->delegate(); |
1041 } | 994 } |
OLD | NEW |