12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 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/async_file_util_adapter.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <vector> 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sequenced_task_runner.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/task_runner_util.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/thread_task_runner_handle.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_context.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_file_util.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_operation_context.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_url.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/blob/shareable_file_reference.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/fileapi/file_system_util.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Bind; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Callback; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Owned; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Unretained; 2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::ShareableFileReference; 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EnsureFileExistsHelper { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EnsureFileExistsHelper() : error_(base::File::FILE_OK), created_(false) {} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunWork(FileSystemFileUtil* file_util, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemOperationContext* context, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_ = file_util->EnsureFileExists(context, url, &created_); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Reply(const AsyncFileUtil::EnsureFileExistsCallback& callback) { 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch callback.Run(error_, created_); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error_; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool created_; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(EnsureFileExistsHelper); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GetFileInfoHelper { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFileInfoHelper() 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : error_(base::File::FILE_OK) {} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetFileInfo(FileSystemFileUtil* file_util, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemOperationContext* context, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url) { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_ = file_util->GetFileInfo(context, url, &file_info_, &platform_path_); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateSnapshotFile(FileSystemFileUtil* file_util, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemOperationContext* context, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url) { 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_file_ = file_util->CreateSnapshotFile( 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) context, url, &error_, &file_info_, &platform_path_); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ReplyFileInfo(const AsyncFileUtil::GetFileInfoCallback& callback) { 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch callback.Run(error_, file_info_); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ReplySnapshotFile( 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const AsyncFileUtil::CreateSnapshotFileCallback& callback) { 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch callback.Run(error_, file_info_, platform_path_, 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ShareableFileReference::GetOrCreate(scoped_file_.Pass())); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error_; 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Info file_info_; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath platform_path_; 8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::ScopedFile scoped_file_; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(GetFileInfoHelper); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ReadDirectoryHelper(FileSystemFileUtil* file_util, 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FileSystemOperationContext* context, 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const FileSystemURL& url, 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::SingleThreadTaskRunner* origin_loop, 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const AsyncFileUtil::ReadDirectoryCallback& callback) { 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::File::Info file_info; 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::FilePath platform_path; 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::File::Error error = file_util->GetFileInfo( 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) context, url, &file_info, &platform_path); 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (error == base::File::FILE_OK && !file_info.is_directory) 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) error = base::File::FILE_ERROR_NOT_A_DIRECTORY; 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::vector<DirectoryEntry> entries; 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (error != base::File::FILE_OK) { 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) origin_loop->PostTask( 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FROM_HERE, base::Bind(callback, error, entries, false /* has_more */)); 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Note: Increasing this value may make some tests in LayoutTests meaningless. 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // (Namely, read-directory-many.html and read-directory-sync-many.html are 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // assuming that they are reading much more entries than this constant.) 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const size_t kResultChunkSize = 100; 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> file_enum( 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) file_util->CreateFileEnumerator(context, url)); 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::FilePath current; 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) while (!(current = file_enum->Next()).empty()) { 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DirectoryEntry entry; 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) entry.is_directory = file_enum->IsDirectory(); 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) entry.name = VirtualPath::BaseName(current).value(); 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) entry.size = file_enum->Size(); 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) entry.last_modified_time = file_enum->LastModifiedTime(); 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) entries.push_back(entry); 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (entries.size() == kResultChunkSize) { 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) origin_loop->PostTask( 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FROM_HERE, base::Bind(callback, base::File::FILE_OK, entries, 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) true /* has_more */)); 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) entries.clear(); 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) origin_loop->PostTask( 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FROM_HERE, base::Bind(callback, base::File::FILE_OK, entries, 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) false /* has_more */)); 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RunCreateOrOpenCallback( 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FileSystemOperationContext* context, 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const AsyncFileUtil::CreateOrOpenCallback& callback, 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::File file) { 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(file.Pass(), base::Closure()); 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AsyncFileUtilAdapter::AsyncFileUtilAdapter( 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FileSystemFileUtil* sync_file_util) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : sync_file_util_(sync_file_util) { 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(sync_file_util_.get()); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AsyncFileUtilAdapter::~AsyncFileUtilAdapter() { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AsyncFileUtilAdapter::CreateOrOpen( 154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<FileSystemOperationContext> context, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int file_flags, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CreateOrOpenCallback& callback) { 158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FileSystemOperationContext* context_ptr = context.release(); 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::PostTaskAndReplyWithResult( 160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) context_ptr->task_runner(), 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FROM_HERE, 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Bind(&FileSystemFileUtil::CreateOrOpen, Unretained(sync_file_util_.get()), 163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) context_ptr, url, file_flags), 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Bind(&RunCreateOrOpenCallback, base::Owned(context_ptr), callback)); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AsyncFileUtilAdapter::EnsureFileExists( 168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<FileSystemOperationContext> context, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EnsureFileExistsCallback& callback) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnsureFileExistsHelper* helper = new EnsureFileExistsHelper; 172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FileSystemOperationContext* context_ptr = context.release(); 1737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const bool success = context_ptr->task_runner()->PostTaskAndReply( 1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Bind(&EnsureFileExistsHelper::RunWork, Unretained(helper), 1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) sync_file_util_.get(), base::Owned(context_ptr), url), 1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Bind(&EnsureFileExistsHelper::Reply, Owned(helper), callback)); 1787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(success); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AsyncFileUtilAdapter::CreateDirectory( 182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<FileSystemOperationContext> context, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool exclusive, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool recursive, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StatusCallback& callback) { 187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FileSystemOperationContext* context_ptr = context.release(); 1887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const bool success = base::PostTaskAndReplyWithResult( 189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) context_ptr->task_runner(), FROM_HERE, 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Bind(&FileSystemFileUtil::CreateDirectory, 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Unretained(sync_file_util_.get()), 192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Owned(context_ptr), url, exclusive, recursive), 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback); 1947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(success); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AsyncFileUtilAdapter::GetFileInfo( 198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<FileSystemOperationContext> context, 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GetFileInfoCallback& callback) { 201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FileSystemOperationContext* context_ptr = context.release(); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetFileInfoHelper* helper = new GetFileInfoHelper; 2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const bool success = context_ptr->task_runner()->PostTaskAndReply( 2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Bind(&GetFileInfoHelper::GetFileInfo, Unretained(helper), 2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) sync_file_util_.get(), base::Owned(context_ptr), url), 2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Bind(&GetFileInfoHelper::ReplyFileInfo, Owned(helper), callback)); 2087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(success); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AsyncFileUtilAdapter::ReadDirectory( 212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<FileSystemOperationContext> context, 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ReadDirectoryCallback& callback) { 215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FileSystemOperationContext* context_ptr = context.release(); 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const bool success = context_ptr->task_runner()->PostTask( 2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Bind(&ReadDirectoryHelper, 219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sync_file_util_.get(), base::Owned(context_ptr), url, 220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::ThreadTaskRunnerHandle::Get(), callback)); 2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(success); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AsyncFileUtilAdapter::Touch( 225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<FileSystemOperationContext> context, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& last_access_time, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& last_modified_time, 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StatusCallback& callback) { 230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FileSystemOperationContext* context_ptr = context.release(); 2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const bool success = base::PostTaskAndReplyWithResult( 232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) context_ptr->task_runner(), FROM_HERE, 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Bind(&FileSystemFileUtil::Touch, Unretained(sync_file_util_.get()), 234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Owned(context_ptr), url, 235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) last_access_time, last_modified_time), 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback); 2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(success); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AsyncFileUtilAdapter::Truncate( 241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<FileSystemOperationContext> context, 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 length, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StatusCallback& callback) { 245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FileSystemOperationContext* context_ptr = context.release(); 2467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const bool success = base::PostTaskAndReplyWithResult( 247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) context_ptr->task_runner(), FROM_HERE, 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Bind(&FileSystemFileUtil::Truncate, Unretained(sync_file_util_.get()), 249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Owned(context_ptr), url, length), 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback); 2517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(success); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AsyncFileUtilAdapter::CopyFileLocal( 255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<FileSystemOperationContext> context, 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& src_url, 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& dest_url, 25868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CopyOrMoveOption option, 25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const CopyFileProgressCallback& progress_callback, 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StatusCallback& callback) { 26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(hidehiko): Support progress_callback. 262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FileSystemOperationContext* context_ptr = context.release(); 2637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const bool success = base::PostTaskAndReplyWithResult( 264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) context_ptr->task_runner(), FROM_HERE, 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Bind(&FileSystemFileUtil::CopyOrMoveFile, 26668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Unretained(sync_file_util_.get()), base::Owned(context_ptr), 26768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) src_url, dest_url, option, true /* copy */), 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback); 2697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(success); 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AsyncFileUtilAdapter::MoveFileLocal( 273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<FileSystemOperationContext> context, 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& src_url, 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& dest_url, 27668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CopyOrMoveOption option, 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StatusCallback& callback) { 278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FileSystemOperationContext* context_ptr = context.release(); 2797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const bool success = base::PostTaskAndReplyWithResult( 280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) context_ptr->task_runner(), FROM_HERE, 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Bind(&FileSystemFileUtil::CopyOrMoveFile, 28268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Unretained(sync_file_util_.get()), base::Owned(context_ptr), 28368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) src_url, dest_url, option, false /* copy */), 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback); 2857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(success); 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AsyncFileUtilAdapter::CopyInForeignFile( 289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<FileSystemOperationContext> context, 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& src_file_path, 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& dest_url, 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StatusCallback& callback) { 293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FileSystemOperationContext* context_ptr = context.release(); 2947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const bool success = base::PostTaskAndReplyWithResult( 295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) context_ptr->task_runner(), FROM_HERE, 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Bind(&FileSystemFileUtil::CopyInForeignFile, 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Unretained(sync_file_util_.get()), 298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Owned(context_ptr), src_file_path, dest_url), 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback); 3007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(success); 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AsyncFileUtilAdapter::DeleteFile( 304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<FileSystemOperationContext> context, 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& url, 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StatusCallback& callback) { 307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FileSystemOperationContext* context_ptr = context.release(); 3087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const bool success = base::PostTaskAndReplyWithResult( 309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) context_ptr->task_runner(), FROM_HERE, 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Bind(&FileSystemFileUtil::DeleteFile, 311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Unretained(sync_file_util_.get()), 312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Owned(context_ptr), url), 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback); 3147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(success); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AsyncFileUtilAdapter::DeleteDirectory( 318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<FileSystemOperationContext> context, 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& url, 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StatusCallback& callback) { 321868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FileSystemOperationContext* context_ptr = context.release(); 3227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const bool success = base::PostTaskAndReplyWithResult( 323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) context_ptr->task_runner(), FROM_HERE, 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Bind(&FileSystemFileUtil::DeleteDirectory, 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Unretained(sync_file_util_.get()), 326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Owned(context_ptr), url), 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback); 3287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(success); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AsyncFileUtilAdapter::DeleteRecursively( 332eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<FileSystemOperationContext> context, 333eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const FileSystemURL& url, 334eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const StatusCallback& callback) { 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback.Run(base::File::FILE_ERROR_INVALID_OPERATION); 336eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 337eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid AsyncFileUtilAdapter::CreateSnapshotFile( 339868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<FileSystemOperationContext> context, 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileSystemURL& url, 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CreateSnapshotFileCallback& callback) { 342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FileSystemOperationContext* context_ptr = context.release(); 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFileInfoHelper* helper = new GetFileInfoHelper; 3447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const bool success = context_ptr->task_runner()->PostTaskAndReply( 3454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 3464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Bind(&GetFileInfoHelper::CreateSnapshotFile, Unretained(helper), 3474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) sync_file_util_.get(), base::Owned(context_ptr), url), 3484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Bind(&GetFileInfoHelper::ReplySnapshotFile, Owned(helper), callback)); 3497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(success); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace storage 353