1a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_operation_impl.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/single_thread_task_runner.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/escape.h" 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "net/url_request/url_request.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/async_file_util.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/copy_or_move_operation_delegate.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_observers.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_backend.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_context.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_file_util.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_operation_context.h" 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_url.h" 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_writer_delegate.h" 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/remove_operation_delegate.h" 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/sandbox_file_system_backend.h" 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/quota_manager_proxy.h" 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/blob/shareable_file_reference.h" 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/fileapi/file_system_types.h" 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/fileapi/file_system_util.h" 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/quota/quota_types.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::ScopedFile; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)FileSystemOperation* FileSystemOperation::Create( 35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const FileSystemURL& url, 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FileSystemContext* file_system_context, 3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<FileSystemOperationContext> operation_context) { 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return new FileSystemOperationImpl(url, file_system_context, 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) operation_context.Pass()); 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)FileSystemOperationImpl::~FileSystemOperationImpl() { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::CreateFile(const FileSystemURL& url, 46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool exclusive, 47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const StatusCallback& callback) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(SetPendingOperationType(kOperationCreateFile)); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetUsageAndQuotaThenRunTask( 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DoCreateFile, 52424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), url, callback, exclusive), 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(callback, base::File::FILE_ERROR_FAILED)); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::CreateDirectory(const FileSystemURL& url, 57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool exclusive, 58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool recursive, 59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const StatusCallback& callback) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(SetPendingOperationType(kOperationCreateDirectory)); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetUsageAndQuotaThenRunTask( 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DoCreateDirectory, 64424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), url, callback, 65424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) exclusive, recursive), 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(callback, base::File::FILE_ERROR_FAILED)); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void FileSystemOperationImpl::Copy( 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const FileSystemURL& src_url, 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const FileSystemURL& dest_url, 7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CopyOrMoveOption option, 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const CopyProgressCallback& progress_callback, 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const StatusCallback& callback) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(SetPendingOperationType(kOperationCopy)); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!recursive_operation_delegate_); 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(hidehiko): Support |progress_callback|. (crbug.com/278038). 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recursive_operation_delegate_.reset( 80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new CopyOrMoveOperationDelegate( 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_system_context(), 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) src_url, dest_url, 83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CopyOrMoveOperationDelegate::OPERATION_COPY, 8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) option, 85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) progress_callback, 86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DidFinishOperation, 87424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), callback))); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recursive_operation_delegate_->RunRecursively(); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::Move(const FileSystemURL& src_url, 92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const FileSystemURL& dest_url, 9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CopyOrMoveOption option, 94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const StatusCallback& callback) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(SetPendingOperationType(kOperationMove)); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!recursive_operation_delegate_); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recursive_operation_delegate_.reset( 98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) new CopyOrMoveOperationDelegate( 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) file_system_context(), 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) src_url, dest_url, 101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CopyOrMoveOperationDelegate::OPERATION_MOVE, 10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) option, 103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FileSystemOperation::CopyProgressCallback(), 104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DidFinishOperation, 105424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), callback))); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recursive_operation_delegate_->RunRecursively(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::DirectoryExists(const FileSystemURL& url, 110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const StatusCallback& callback) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(SetPendingOperationType(kOperationDirectoryExists)); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) async_file_util_->GetFileInfo( 113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) operation_context_.Pass(), url, 114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DidDirectoryExists, 115424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), callback)); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::FileExists(const FileSystemURL& url, 119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const StatusCallback& callback) { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(SetPendingOperationType(kOperationFileExists)); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) async_file_util_->GetFileInfo( 122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) operation_context_.Pass(), url, 123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DidFileExists, 124424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), callback)); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::GetMetadata( 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, const GetMetadataCallback& callback) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(SetPendingOperationType(kOperationGetMetadata)); 130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) async_file_util_->GetFileInfo(operation_context_.Pass(), url, callback); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::ReadDirectory( 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, const ReadDirectoryCallback& callback) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(SetPendingOperationType(kOperationReadDirectory)); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) async_file_util_->ReadDirectory( 137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) operation_context_.Pass(), url, callback); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::Remove(const FileSystemURL& url, 141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool recursive, 142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const StatusCallback& callback) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(SetPendingOperationType(kOperationRemove)); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!recursive_operation_delegate_); 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (recursive) { 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // For recursive removal, try to delegate the operation to AsyncFileUtil 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // first. If not supported, it is delegated to RemoveOperationDelegate 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // in DidDeleteRecursively. 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch async_file_util_->DeleteRecursively( 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch operation_context_.Pass(), url, 152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DidDeleteRecursively, 153424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), url, callback)); 154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) recursive_operation_delegate_.reset( 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new RemoveOperationDelegate( 159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) file_system_context(), url, 160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DidFinishOperation, 161424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), callback))); 162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch recursive_operation_delegate_->Run(); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::Write( 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<FileWriterDelegate> writer_delegate, 1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<net::URLRequest> blob_request, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WriteCallback& callback) { 1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(SetPendingOperationType(kOperationWrite)); 1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) file_writer_delegate_ = writer_delegate.Pass(); 1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) file_writer_delegate_->Start( 1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) blob_request.Pass(), 174424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DidWrite, 175424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), url, callback)); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::Truncate(const FileSystemURL& url, int64 length, 179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const StatusCallback& callback) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(SetPendingOperationType(kOperationTruncate)); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetUsageAndQuotaThenRunTask( 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DoTruncate, 184424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), url, callback, length), 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(callback, base::File::FILE_ERROR_FAILED)); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::TouchFile(const FileSystemURL& url, 189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::Time& last_access_time, 190a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::Time& last_modified_time, 191a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const StatusCallback& callback) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(SetPendingOperationType(kOperationTouchFile)); 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) async_file_util_->Touch( 194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) operation_context_.Pass(), url, 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_access_time, last_modified_time, 196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DidFinishOperation, 197424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), callback)); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 200a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::OpenFile(const FileSystemURL& url, 201a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int file_flags, 202a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const OpenFileCallback& callback) { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(SetPendingOperationType(kOperationOpenFile)); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (file_flags & 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (base::File::FLAG_TEMPORARY | base::File::FLAG_HIDDEN)) { 207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(base::File(base::File::FILE_ERROR_FAILED), 2080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::Closure()); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetUsageAndQuotaThenRunTask( 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, 213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DoOpenFile, 214424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, callback, file_flags), 216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(callback, Passed(base::File(base::File::FILE_ERROR_FAILED)), 2170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::Closure())); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We can only get here on a write or truncate that's not yet completed. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We don't support cancelling any other operation at this time. 222a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::Cancel(const StatusCallback& cancel_callback) { 223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(cancel_callback_.is_null()); 224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) cancel_callback_ = cancel_callback; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (file_writer_delegate_.get()) { 227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK_EQ(kOperationWrite, pending_operation_); 228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // This will call DidWrite() with ABORT status code. 229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) file_writer_delegate_->Cancel(); 230d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } else if (recursive_operation_delegate_) { 231d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // This will call DidFinishOperation() with ABORT status code. 232d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) recursive_operation_delegate_->Cancel(); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // For truncate we have no way to cancel the inflight operation (for now). 235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Let it just run and dispatch cancel callback later. 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(kOperationTruncate, pending_operation_); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 240a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::CreateSnapshotFile( 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SnapshotFileCallback& callback) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(SetPendingOperationType(kOperationCreateSnapshotFile)); 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) async_file_util_->CreateSnapshotFile( 245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) operation_context_.Pass(), url, callback); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 248a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::CopyInForeignFile( 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& src_local_disk_file_path, 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& dest_url, 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StatusCallback& callback) { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(SetPendingOperationType(kOperationCopyInForeignFile)); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetUsageAndQuotaThenRunTask( 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest_url, 255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DoCopyInForeignFile, 256424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), src_local_disk_file_path, dest_url, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback), 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(callback, base::File::FILE_ERROR_FAILED)); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 261a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::RemoveFile( 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& url, 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StatusCallback& callback) { 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(SetPendingOperationType(kOperationRemove)); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) async_file_util_->DeleteFile( 266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) operation_context_.Pass(), url, 267a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DidFinishOperation, 268424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), callback)); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 271a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::RemoveDirectory( 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& url, 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StatusCallback& callback) { 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(SetPendingOperationType(kOperationRemove)); 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) async_file_util_->DeleteDirectory( 276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) operation_context_.Pass(), url, 277a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DidFinishOperation, 278424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), callback)); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::CopyFileLocal( 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& src_url, 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& dest_url, 28468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CopyOrMoveOption option, 28558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const CopyFileProgressCallback& progress_callback, 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StatusCallback& callback) { 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(SetPendingOperationType(kOperationCopy)); 28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(src_url.IsInSameFileSystem(dest_url)); 28958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetUsageAndQuotaThenRunTask( 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dest_url, 292a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DoCopyFileLocal, 29368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) weak_factory_.GetWeakPtr(), src_url, dest_url, option, 29458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) progress_callback, callback), 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(callback, base::File::FILE_ERROR_FAILED)); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 298a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::MoveFileLocal( 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& src_url, 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& dest_url, 30168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CopyOrMoveOption option, 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StatusCallback& callback) { 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(SetPendingOperationType(kOperationMove)); 30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(src_url.IsInSameFileSystem(dest_url)); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetUsageAndQuotaThenRunTask( 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dest_url, 307a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DoMoveFileLocal, 30868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) weak_factory_.GetWeakPtr(), 30968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) src_url, dest_url, option, callback), 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(callback, base::File::FILE_ERROR_FAILED)); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::File::Error FileSystemOperationImpl::SyncGetPlatformPath( 314424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const FileSystemURL& url, 315424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::FilePath* platform_path) { 316424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DCHECK(SetPendingOperationType(kOperationGetLocalPath)); 317424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!file_system_context()->IsSandboxFileSystem(url.type())) 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::File::FILE_ERROR_INVALID_OPERATION; 319424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) FileSystemFileUtil* file_util = 320424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) file_system_context()->sandbox_delegate()->sync_file_util(); 321424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) file_util->GetLocalFilePath(operation_context_.get(), url, platform_path); 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::File::FILE_OK; 323424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 324424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 32558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)FileSystemOperationImpl::FileSystemOperationImpl( 32658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const FileSystemURL& url, 32758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FileSystemContext* file_system_context, 32858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<FileSystemOperationContext> operation_context) 32958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : file_system_context_(file_system_context), 33058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) operation_context_(operation_context.Pass()), 33158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) async_file_util_(NULL), 33258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) pending_operation_(kOperationNone), 33358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) weak_factory_(this) { 33458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(operation_context_.get()); 33558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) operation_context_->DetachUserDataThread(); 33658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) async_file_util_ = file_system_context_->GetAsyncFileUtil(url.type()); 33758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(async_file_util_); 33858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 33958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 340a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::GetUsageAndQuotaThenRunTask( 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& task, 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& error_callback) { 34403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::QuotaManagerProxy* quota_manager_proxy = 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_system_context()->quota_manager_proxy(); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!quota_manager_proxy || 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !file_system_context()->GetQuotaUtil(url.type())) { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we don't have the quota manager or the requested filesystem type 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // does not support quota, we should be able to let it go. 350868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) operation_context_->set_allowed_bytes_growth(kint64max); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) task.Run(); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(quota_manager_proxy); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(quota_manager_proxy->quota_manager()); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) quota_manager_proxy->quota_manager()->GetUsageAndQuota( 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url.origin(), 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemTypeToQuotaStorageType(url.type()), 360a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DidGetUsageAndQuotaAndRunTask, 361424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), task, error_callback)); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 364a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::DidGetUsageAndQuotaAndRunTask( 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& task, 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& error_callback, 36703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::QuotaStatusCode status, 36803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int64 usage, 36903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int64 quota) { 37003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (status != storage::kQuotaStatusOk) { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Got unexpected quota error : " << status; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_callback.Run(); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 376868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) operation_context_->set_allowed_bytes_growth(quota - usage); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) task.Run(); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 380a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::DoCreateFile( 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StatusCallback& callback, 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool exclusive) { 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) async_file_util_->EnsureFileExists( 385868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) operation_context_.Pass(), url, 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind( 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exclusive ? 388a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &FileSystemOperationImpl::DidEnsureFileExistsExclusive : 389a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &FileSystemOperationImpl::DidEnsureFileExistsNonExclusive, 390424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), callback)); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 393a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::DoCreateDirectory( 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StatusCallback& callback, 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool exclusive, bool recursive) { 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) async_file_util_->CreateDirectory( 398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) operation_context_.Pass(), 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url, exclusive, recursive, 400a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DidFinishOperation, 401424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), callback)); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 404a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::DoCopyFileLocal( 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& src_url, 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& dest_url, 40768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CopyOrMoveOption option, 40858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const CopyFileProgressCallback& progress_callback, 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StatusCallback& callback) { 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) async_file_util_->CopyFileLocal( 41168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) operation_context_.Pass(), src_url, dest_url, option, progress_callback, 412a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DidFinishOperation, 413424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), callback)); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 416a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::DoMoveFileLocal( 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& src_url, 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& dest_url, 41968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CopyOrMoveOption option, 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StatusCallback& callback) { 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) async_file_util_->MoveFileLocal( 42268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) operation_context_.Pass(), src_url, dest_url, option, 423a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DidFinishOperation, 424424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), callback)); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 427a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::DoCopyInForeignFile( 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& src_local_disk_file_path, 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& dest_url, 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StatusCallback& callback) { 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) async_file_util_->CopyInForeignFile( 432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) operation_context_.Pass(), 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) src_local_disk_file_path, dest_url, 434a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DidFinishOperation, 435424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), callback)); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 438a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::DoTruncate(const FileSystemURL& url, 439a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const StatusCallback& callback, 440a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 length) { 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) async_file_util_->Truncate( 442868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) operation_context_.Pass(), url, length, 443a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DidFinishOperation, 444424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), callback)); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 447a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::DoOpenFile(const FileSystemURL& url, 448a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const OpenFileCallback& callback, 449a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int file_flags) { 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) async_file_util_->CreateOrOpen( 451868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) operation_context_.Pass(), url, file_flags, 452a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DidOpenFile, 453424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), callback)); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 456a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::DidEnsureFileExistsExclusive( 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StatusCallback& callback, 4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error rv, bool created) { 4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (rv == base::File::FILE_OK && !created) { 4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback.Run(base::File::FILE_ERROR_EXISTS); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 462868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DidFinishOperation(callback, rv); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 466a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::DidEnsureFileExistsNonExclusive( 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StatusCallback& callback, 4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error rv, bool /* created */) { 469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DidFinishOperation(callback, rv); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 472a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::DidFinishOperation( 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StatusCallback& callback, 4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error rv) { 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cancel_callback_.is_null()) { 476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) StatusCallback cancel_callback = cancel_callback_; 47758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) callback.Run(rv); 47858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 47958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Return OK only if we succeeded to stop the operation. 4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cancel_callback.Run(rv == base::File::FILE_ERROR_ABORT ? 4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::FILE_OK : 4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::FILE_ERROR_INVALID_OPERATION); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(rv); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 488a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::DidDirectoryExists( 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StatusCallback& callback, 4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error rv, 4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::File::Info& file_info) { 4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (rv == base::File::FILE_OK && !file_info.is_directory) 4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rv = base::File::FILE_ERROR_NOT_A_DIRECTORY; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(rv); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 497a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::DidFileExists( 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StatusCallback& callback, 4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error rv, 5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::File::Info& file_info) { 5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (rv == base::File::FILE_OK && file_info.is_directory) 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rv = base::File::FILE_ERROR_NOT_A_FILE; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(rv); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 506a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::DidDeleteRecursively( 507eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const FileSystemURL& url, 508eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const StatusCallback& callback, 5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error rv) { 5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (rv == base::File::FILE_ERROR_INVALID_OPERATION) { 511eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Recursive removal is not supported on this platform. 512eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(!recursive_operation_delegate_); 513eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch recursive_operation_delegate_.reset( 514eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch new RemoveOperationDelegate( 515eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch file_system_context(), url, 516a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::Bind(&FileSystemOperationImpl::DidFinishOperation, 517424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) weak_factory_.GetWeakPtr(), callback))); 518eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch recursive_operation_delegate_->RunRecursively(); 519eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 520eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 521eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 522eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch callback.Run(rv); 523eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 524eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 525a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::DidWrite( 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 527868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const WriteCallback& write_callback, 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error rv, 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 bytes, 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileWriterDelegate::WriteProgressStatus write_status) { 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool complete = ( 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_status != FileWriterDelegate::SUCCESS_IO_PENDING); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (complete && write_status != FileWriterDelegate::ERROR_WRITE_NOT_STARTED) { 534868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(operation_context_); 535868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) operation_context_->change_observers()->Notify( 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &FileChangeObserver::OnModifyFile, MakeTuple(url)); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 539868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) StatusCallback cancel_callback = cancel_callback_; 540868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) write_callback.Run(rv, bytes, complete); 541868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!cancel_callback.is_null()) 5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cancel_callback.Run(base::File::FILE_OK); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void FileSystemOperationImpl::DidOpenFile( 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const OpenFileCallback& callback, 547cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::File file, 5487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::Closure& on_close_callback) { 549cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(file.Pass(), on_close_callback); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 552a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool FileSystemOperationImpl::SetPendingOperationType(OperationType type) { 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pending_operation_ != kOperationNone) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_operation_ = type; 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace storage 560