| 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)));
|
| 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();
|
| }
|
|
|
|
|