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