10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file. 40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/chromeos/file_system_provider/fileapi/provider_async_file_util.h" 60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/callback.h" 8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/files/file.h" 90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/files/file_path.h" 100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/logging.h" 11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/mount_path_util.h" 12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/provided_file_system_interface.h" 130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/public/browser/browser_thread.h" 140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "webkit/browser/fileapi/file_system_operation_context.h" 150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "webkit/browser/fileapi/file_system_url.h" 160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "webkit/common/blob/shareable_file_reference.h" 170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochusing content::BrowserThread; 190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace chromeos { 210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace file_system_provider { 220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace internal { 23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace { 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Executes GetFileInfo on the UI thread. 26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void GetFileInfoOnUIThread( 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<fileapi::FileSystemOperationContext> context, 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const fileapi::FileSystemURL& url, 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const fileapi::AsyncFileUtil::GetFileInfoCallback& callback) { 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) util::FileSystemURLParser parser(url); 31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!parser.Parse()) { 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(base::File::FILE_ERROR_INVALID_OPERATION, base::File::Info()); 33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) parser.file_system()->GetMetadata(parser.file_path(), callback); 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Routes the response of GetFileInfo back to the IO thread. 40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void OnGetFileInfo(const fileapi::AsyncFileUtil::GetFileInfoCallback& callback, 41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::File::Error result, 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::File::Info& file_info) { 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BrowserThread::PostTask( 44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BrowserThread::IO, FROM_HERE, base::Bind(callback, result, file_info)); 45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Executes ReadDirectory on the UI thread. 48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ReadDirectoryOnUIThread( 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<fileapi::FileSystemOperationContext> context, 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const fileapi::FileSystemURL& url, 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const fileapi::AsyncFileUtil::ReadDirectoryCallback& callback) { 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) util::FileSystemURLParser parser(url); 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!parser.Parse()) { 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(base::File::FILE_ERROR_INVALID_OPERATION, 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) fileapi::AsyncFileUtil::EntryList(), 56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) false /* has_more */); 57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) parser.file_system()->ReadDirectory(parser.file_path(), callback); 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Routes the response of ReadDirectory back to the IO thread. 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void OnReadDirectory( 65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const fileapi::AsyncFileUtil::ReadDirectoryCallback& callback, 66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::File::Error result, 67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const fileapi::AsyncFileUtil::EntryList& entry_list, 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool has_more) { 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BrowserThread::PostTask(BrowserThread::IO, 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FROM_HERE, 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(callback, result, entry_list, has_more)); 72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace 750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 760529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochProviderAsyncFileUtil::ProviderAsyncFileUtil() {} 770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 780529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochProviderAsyncFileUtil::~ProviderAsyncFileUtil() {} 790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::CreateOrOpen( 810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<fileapi::FileSystemOperationContext> context, 820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const fileapi::FileSystemURL& url, 830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int file_flags, 840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const CreateOrOpenCallback& callback) { 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_CURRENTLY_ON(BrowserThread::IO); 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if ((file_flags & base::File::FLAG_CREATE) || 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (file_flags & base::File::FLAG_OPEN_ALWAYS) || 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (file_flags & base::File::FLAG_CREATE_ALWAYS) || 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (file_flags & base::File::FLAG_OPEN_TRUNCATED)) { 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(base::File(base::File::FILE_ERROR_ACCESS_DENIED), 910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::Closure()); 920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return; 930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch NOTIMPLEMENTED(); 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(base::File(base::File::FILE_ERROR_INVALID_OPERATION), 970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::Closure()); 980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::EnsureFileExists( 1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<fileapi::FileSystemOperationContext> context, 1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const fileapi::FileSystemURL& url, 1030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const EnsureFileExistsCallback& callback) { 104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_CURRENTLY_ON(BrowserThread::IO); 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(base::File::FILE_ERROR_ACCESS_DENIED, false /* created */); 1060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::CreateDirectory( 1090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<fileapi::FileSystemOperationContext> context, 1100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const fileapi::FileSystemURL& url, 1110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool exclusive, 1120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool recursive, 1130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const StatusCallback& callback) { 114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_CURRENTLY_ON(BrowserThread::IO); 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(base::File::FILE_ERROR_ACCESS_DENIED); 1160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::GetFileInfo( 1190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<fileapi::FileSystemOperationContext> context, 1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const fileapi::FileSystemURL& url, 1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const GetFileInfoCallback& callback) { 122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_CURRENTLY_ON(BrowserThread::IO); 123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, 124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FROM_HERE, 125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&GetFileInfoOnUIThread, 126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Passed(&context), 127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url, 128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&OnGetFileInfo, callback))); 1290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::ReadDirectory( 1320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<fileapi::FileSystemOperationContext> context, 1330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const fileapi::FileSystemURL& url, 1340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const ReadDirectoryCallback& callback) { 135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_CURRENTLY_ON(BrowserThread::IO); 136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, 137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FROM_HERE, 138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&ReadDirectoryOnUIThread, 139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Passed(&context), 140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) url, 141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::Bind(&OnReadDirectory, callback))); 1420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::Touch( 1450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<fileapi::FileSystemOperationContext> context, 1460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const fileapi::FileSystemURL& url, 1470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const base::Time& last_access_time, 1480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const base::Time& last_modified_time, 1490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const StatusCallback& callback) { 150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_CURRENTLY_ON(BrowserThread::IO); 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(base::File::FILE_ERROR_ACCESS_DENIED); 1520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::Truncate( 1550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<fileapi::FileSystemOperationContext> context, 1560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const fileapi::FileSystemURL& url, 1570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int64 length, 1580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const StatusCallback& callback) { 159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_CURRENTLY_ON(BrowserThread::IO); 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(base::File::FILE_ERROR_ACCESS_DENIED); 1610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::CopyFileLocal( 1640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<fileapi::FileSystemOperationContext> context, 1650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const fileapi::FileSystemURL& src_url, 1660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const fileapi::FileSystemURL& dest_url, 1670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CopyOrMoveOption option, 1680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const CopyFileProgressCallback& progress_callback, 1690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const StatusCallback& callback) { 170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_CURRENTLY_ON(BrowserThread::IO); 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(base::File::FILE_ERROR_ACCESS_DENIED); 1720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::MoveFileLocal( 1750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<fileapi::FileSystemOperationContext> context, 1760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const fileapi::FileSystemURL& src_url, 1770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const fileapi::FileSystemURL& dest_url, 1780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CopyOrMoveOption option, 1790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const StatusCallback& callback) { 180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_CURRENTLY_ON(BrowserThread::IO); 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(base::File::FILE_ERROR_ACCESS_DENIED); 1820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::CopyInForeignFile( 1850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<fileapi::FileSystemOperationContext> context, 1860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const base::FilePath& src_file_path, 1870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const fileapi::FileSystemURL& dest_url, 1880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const StatusCallback& callback) { 189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_CURRENTLY_ON(BrowserThread::IO); 190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(base::File::FILE_ERROR_ACCESS_DENIED); 1910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::DeleteFile( 1940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<fileapi::FileSystemOperationContext> context, 1950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const fileapi::FileSystemURL& url, 1960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const StatusCallback& callback) { 197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_CURRENTLY_ON(BrowserThread::IO); 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(base::File::FILE_ERROR_ACCESS_DENIED); 1990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::DeleteDirectory( 2020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<fileapi::FileSystemOperationContext> context, 2030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const fileapi::FileSystemURL& url, 2040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const StatusCallback& callback) { 205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_CURRENTLY_ON(BrowserThread::IO); 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(base::File::FILE_ERROR_ACCESS_DENIED); 2070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::DeleteRecursively( 2100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<fileapi::FileSystemOperationContext> context, 2110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const fileapi::FileSystemURL& url, 2120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const StatusCallback& callback) { 213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_CURRENTLY_ON(BrowserThread::IO); 214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(base::File::FILE_ERROR_ACCESS_DENIED); 2150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::CreateSnapshotFile( 2180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_ptr<fileapi::FileSystemOperationContext> context, 2190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const fileapi::FileSystemURL& url, 2200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const CreateSnapshotFileCallback& callback) { 221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_CURRENTLY_ON(BrowserThread::IO); 2220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch NOTIMPLEMENTED(); 223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(base::File::FILE_ERROR_INVALID_OPERATION, 2240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::File::Info(), 2250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::FilePath(), 2260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_refptr<webkit_blob::ShareableFileReference>()); 2270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace internal 2300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace file_system_provider 2310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace chromeos 232