Chromium Code Reviews| Index: webkit/fileapi/file_system_url_request_job.cc |
| diff --git a/webkit/fileapi/file_system_url_request_job.cc b/webkit/fileapi/file_system_url_request_job.cc |
| index 18151171f424be03f0a43c3ca7499cb0cad56756..3a9af905a88d6de4218a39781625cb7df15e66cb 100644 |
| --- a/webkit/fileapi/file_system_url_request_job.cc |
| +++ b/webkit/fileapi/file_system_url_request_job.cc |
| @@ -4,8 +4,6 @@ |
| #include "webkit/fileapi/file_system_url_request_job.h" |
| -#include <vector> |
| - |
| #include "base/bind.h" |
| #include "base/compiler_specific.h" |
| #include "base/file_path.h" |
| @@ -13,6 +11,7 @@ |
| #include "base/message_loop.h" |
| #include "base/platform_file.h" |
| #include "base/threading/thread_restrictions.h" |
| +#include "base/time.h" |
| #include "build/build_config.h" |
| #include "googleurl/src/gurl.h" |
| #include "net/base/file_stream.h" |
| @@ -24,6 +23,7 @@ |
| #include "net/http/http_response_info.h" |
| #include "net/http/http_util.h" |
| #include "net/url_request/url_request.h" |
| +#include "webkit/blob/local_file_reader.h" |
| #include "webkit/blob/shareable_file_reference.h" |
| #include "webkit/fileapi/file_system_context.h" |
| #include "webkit/fileapi/file_system_operation.h" |
| @@ -32,13 +32,10 @@ |
| using net::URLRequest; |
| using net::URLRequestJob; |
| using net::URLRequestStatus; |
| +using webkit_blob::LocalFileReader; |
| namespace fileapi { |
| -static const int kFileFlags = base::PLATFORM_FILE_OPEN | |
| - base::PLATFORM_FILE_READ | |
| - base::PLATFORM_FILE_ASYNC; |
| - |
| static net::HttpResponseHeaders* CreateHttpResponseHeaders() { |
| // HttpResponseHeaders expects its input string to be terminated by two NULs. |
| static const char kStatus[] = "HTTP/1.1 200 OK\0"; |
| @@ -62,20 +59,11 @@ FileSystemURLRequestJob::FileSystemURLRequestJob( |
| file_system_context_(file_system_context), |
| file_thread_proxy_(file_thread_proxy), |
| ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)), |
| - stream_(NULL), |
| is_directory_(false), |
| remaining_bytes_(0) { |
| } |
| -FileSystemURLRequestJob::~FileSystemURLRequestJob() { |
| - // Since we use the two-arg constructor of FileStream, we need to call Close() |
| - // manually: ~FileStream won't call it for us. |
| - if (stream_ != NULL) { |
| - // Close() performs file IO: crbug.com/113300. |
| - base::ThreadRestrictions::ScopedAllowIO allow_io; |
| - stream_->CloseSync(); |
| - } |
| -} |
| +FileSystemURLRequestJob::~FileSystemURLRequestJob() {} |
| void FileSystemURLRequestJob::Start() { |
| MessageLoop::current()->PostTask( |
| @@ -85,12 +73,8 @@ void FileSystemURLRequestJob::Start() { |
| } |
| void FileSystemURLRequestJob::Kill() { |
| - if (stream_ != NULL) { |
| - // Close() performs file IO: crbug.com/113300. |
| - base::ThreadRestrictions::ScopedAllowIO allow_io; |
| - stream_->CloseSync(); |
| - stream_.reset(NULL); |
| - } |
| + if (reader_.get() != NULL) |
| + reader_.reset(); |
| URLRequestJob::Kill(); |
| weak_factory_.InvalidateWeakPtrs(); |
| } |
| @@ -101,7 +85,7 @@ bool FileSystemURLRequestJob::ReadRawData(net::IOBuffer* dest, int dest_size, |
| DCHECK(bytes_read); |
| DCHECK_GE(remaining_bytes_, 0); |
| - if (stream_ == NULL) |
| + if (reader_.get() == NULL) |
| return false; |
| if (remaining_bytes_ < dest_size) |
| @@ -112,18 +96,9 @@ bool FileSystemURLRequestJob::ReadRawData(net::IOBuffer* dest, int dest_size, |
| return true; |
| } |
| - int rv = stream_->Read(dest, dest_size, |
| - base::Bind(&FileSystemURLRequestJob::DidRead, |
| - base::Unretained(this))); |
| - if (rv >= 0) { |
| - // Data is immediately available. |
| - *bytes_read = rv; |
| - remaining_bytes_ -= rv; |
| - DCHECK_GE(remaining_bytes_, 0); |
| - return true; |
| - } |
| - |
| - // Otherwise, a read error occured. We may just need to wait... |
| + const int rv = reader_->Read(dest, dest_size, |
| + base::Bind(&FileSystemURLRequestJob::DidRead, |
| + base::Unretained(this))); |
|
tzik
2012/04/16 02:57:56
Can we expect LocalFileReader::Read() not to retur
kinuko
2012/04/16 08:30:41
Oops, good catch this was actually not always true
|
| if (rv == net::ERR_IO_PENDING) |
| SetStatus(URLRequestStatus(URLRequestStatus::IO_PENDING, 0)); |
| else |
| @@ -214,47 +189,24 @@ void FileSystemURLRequestJob::DidCreateSnapshot( |
| return; |
| } |
| - if (!is_directory_) { |
| - base::FileUtilProxy::CreateOrOpen( |
| - file_thread_proxy_, platform_path, kFileFlags, |
| - base::Bind(&FileSystemURLRequestJob::DidOpen, |
| - weak_factory_.GetWeakPtr())); |
| - } else { |
| + if (is_directory_) { |
| NotifyHeadersComplete(); |
| - } |
| -} |
| - |
| -void FileSystemURLRequestJob::DidOpen(base::PlatformFileError error_code, |
| - base::PassPlatformFile file, |
| - bool created) { |
| - if (error_code != base::PLATFORM_FILE_OK) { |
| - NotifyFailed(error_code); |
| return; |
| } |
| - stream_.reset(new net::FileStream(file.ReleaseValue(), kFileFlags, NULL)); |
| - |
| remaining_bytes_ = byte_range_.last_byte_position() - |
| byte_range_.first_byte_position() + 1; |
| DCHECK_GE(remaining_bytes_, 0); |
| - // TODO(adamk): Please remove this ScopedAllowIO once we support async seek |
| - // on FileStream. crbug.com/113300 |
| - base::ThreadRestrictions::ScopedAllowIO allow_io; |
| - // Do the seek at the beginning of the request. |
| - if (remaining_bytes_ > 0 && |
| - byte_range_.first_byte_position() != 0 && |
| - byte_range_.first_byte_position() != |
| - stream_->SeekSync(net::FROM_BEGIN, |
| - byte_range_.first_byte_position())) { |
| - NotifyFailed(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE); |
| - return; |
| - } |
| + DCHECK(!reader_.get()); |
| + reader_.reset(new LocalFileReader( |
| + file_thread_proxy_, platform_path, |
| + byte_range_.first_byte_position(), |
| + base::Time())); |
| set_expected_content_size(remaining_bytes_); |
| response_info_.reset(new net::HttpResponseInfo()); |
| response_info_->headers = CreateHttpResponseHeaders(); |
| - |
| NotifyHeadersComplete(); |
| } |