| Index: chrome/browser/chromeos/file_system_provider/fileapi/file_stream_writer.cc
|
| diff --git a/chrome/browser/chromeos/file_system_provider/fileapi/file_stream_writer.cc b/chrome/browser/chromeos/file_system_provider/fileapi/file_stream_writer.cc
|
| index 227ddaa604acb96d04e584fe9424b16b07ef3afe..51997f8af205b0346de5247dbe1a818a674b44a4 100644
|
| --- a/chrome/browser/chromeos/file_system_provider/fileapi/file_stream_writer.cc
|
| +++ b/chrome/browser/chromeos/file_system_provider/fileapi/file_stream_writer.cc
|
| @@ -38,6 +38,7 @@ class FileStreamWriter::OperationRunner
|
| const storage::FileSystemURL& url,
|
| const storage::AsyncFileUtil::StatusCallback& callback) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| + DCHECK(abort_callback_.is_null());
|
|
|
| util::FileSystemURLParser parser(url);
|
| if (!parser.Parse()) {
|
| @@ -60,6 +61,8 @@ class FileStreamWriter::OperationRunner
|
| // UI thread.
|
| void CloseFileOnUIThread() {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| + DCHECK(abort_callback_.is_null());
|
| +
|
| if (file_system_.get() && file_handle_ != -1) {
|
| // Closing a file must not be aborted, since we could end up on files
|
| // which are never closed.
|
| @@ -75,6 +78,7 @@ class FileStreamWriter::OperationRunner
|
| int length,
|
| const storage::AsyncFileUtil::StatusCallback& callback) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| + DCHECK(abort_callback_.is_null());
|
|
|
| // If the file system got unmounted, then abort the writing operation.
|
| if (!file_system_.get()) {
|
| @@ -94,23 +98,15 @@ class FileStreamWriter::OperationRunner
|
| &OperationRunner::OnWriteFileCompletedOnUIThread, this, callback));
|
| }
|
|
|
| - // Aborts the most recent operation (if exists), and calls the callback.
|
| - void AbortOnUIThread(const storage::AsyncFileUtil::StatusCallback& callback) {
|
| + // Aborts the most recent operation (if exists).
|
| + void AbortOnUIThread() {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -
|
| - if (abort_callback_.is_null()) {
|
| - // No operation to be cancelled. At most a callback call, which will be
|
| - // discarded.
|
| - BrowserThread::PostTask(BrowserThread::IO,
|
| - FROM_HERE,
|
| - base::Bind(callback, base::File::FILE_OK));
|
| + if (abort_callback_.is_null())
|
| return;
|
| - }
|
|
|
| const AbortCallback last_abort_callback = abort_callback_;
|
| abort_callback_ = AbortCallback();
|
| - last_abort_callback.Run(base::Bind(
|
| - &OperationRunner::OnAbortCompletedOnUIThread, this, callback));
|
| + last_abort_callback.Run();
|
| }
|
|
|
| private:
|
| @@ -126,6 +122,7 @@ class FileStreamWriter::OperationRunner
|
| base::File::Error result) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
|
|
| + abort_callback_ = AbortCallback();
|
| if (result == base::File::FILE_OK)
|
| file_handle_ = file_handle;
|
|
|
| @@ -138,15 +135,8 @@ class FileStreamWriter::OperationRunner
|
| const storage::AsyncFileUtil::StatusCallback& callback,
|
| base::File::Error result) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| - BrowserThread::PostTask(
|
| - BrowserThread::IO, FROM_HERE, base::Bind(callback, result));
|
| - }
|
|
|
| - // Forwards a response of aborting an operation to the IO thread.
|
| - void OnAbortCompletedOnUIThread(
|
| - const storage::AsyncFileUtil::StatusCallback& callback,
|
| - base::File::Error result) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| + abort_callback_ = AbortCallback();
|
| BrowserThread::PostTask(
|
| BrowserThread::IO, FROM_HERE, base::Bind(callback, result));
|
| }
|
| @@ -252,6 +242,7 @@ int FileStreamWriter::Write(net::IOBuffer* buffer,
|
| callback));
|
| break;
|
|
|
| + case EXECUTING:
|
| case FAILED:
|
| NOTREACHED();
|
| break;
|
| @@ -263,18 +254,22 @@ int FileStreamWriter::Write(net::IOBuffer* buffer,
|
| int FileStreamWriter::Cancel(const net::CompletionCallback& callback) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
|
|
| + if (state_ != INITIALIZING && state_ != EXECUTING)
|
| + return net::ERR_UNEXPECTED;
|
| +
|
| + // Abort and Optimistically return an OK result code, as the aborting
|
| + // operation is always forced and can't be cancelled.
|
| BrowserThread::PostTask(
|
| - BrowserThread::UI,
|
| - FROM_HERE,
|
| - base::Bind(&OperationRunner::AbortOnUIThread,
|
| - runner_,
|
| - base::Bind(&FileStreamWriter::OnAbortCompleted,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - callback)));
|
| + BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&OperationRunner::AbortOnUIThread, runner_));
|
| + base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
|
| + base::Bind(callback, net::OK));
|
| +
|
| return net::ERR_IO_PENDING;
|
| }
|
|
|
| int FileStreamWriter::Flush(const net::CompletionCallback& callback) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| FROM_HERE,
|
| base::Bind(callback, state_ == INITIALIZED ? net::OK : net::ERR_FAILED));
|
| @@ -287,7 +282,8 @@ void FileStreamWriter::OnWriteFileCompleted(
|
| const net::CompletionCallback& callback,
|
| base::File::Error result) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - DCHECK_EQ(INITIALIZED, state_);
|
| + DCHECK_EQ(EXECUTING, state_);
|
| + state_ = INITIALIZED;
|
|
|
| if (result != base::File::FILE_OK) {
|
| state_ = FAILED;
|
| @@ -307,22 +303,13 @@ void FileStreamWriter::OnWriteCompleted(net::CompletionCallback callback,
|
| "file_system_provider", "FileStreamWriter::Write", this);
|
| }
|
|
|
| -void FileStreamWriter::OnAbortCompleted(const net::CompletionCallback& callback,
|
| - base::File::Error result) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| -
|
| - if (result != base::File::FILE_OK)
|
| - state_ = FAILED;
|
| -
|
| - callback.Run(net::FileErrorToNetError(result));
|
| -}
|
| -
|
| void FileStreamWriter::WriteAfterInitialized(
|
| scoped_refptr<net::IOBuffer> buffer,
|
| int buffer_length,
|
| const net::CompletionCallback& callback) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| DCHECK_EQ(INITIALIZED, state_);
|
| + state_ = EXECUTING;
|
|
|
| BrowserThread::PostTask(
|
| BrowserThread::UI,
|
|
|