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"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_operation_context.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_url.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/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(
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::FileSystemOperationContext> context,
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const ProvidedFileSystemInterface::GetMetadataCallback& callback) {
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  util::FileSystemURLParser parser(url);
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!parser.Parse()) {
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    callback.Run(make_scoped_ptr<EntryMetadata>(NULL),
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 base::File::FILE_ERROR_INVALID_OPERATION);
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return;
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  parser.file_system()->GetMetadata(
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      parser.file_path(),
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ProvidedFileSystemInterface::METADATA_FIELD_DEFAULT,
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      callback);
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Routes the response of GetFileInfo back to the IO thread with a type
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// conversion.
4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void OnGetFileInfo(const storage::AsyncFileUtil::GetFileInfoCallback& callback,
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   scoped_ptr<EntryMetadata> metadata,
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   base::File::Error result) {
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (result != base::File::FILE_OK) {
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    BrowserThread::PostTask(BrowserThread::IO,
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            FROM_HERE,
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            base::Bind(callback, result, base::File::Info()));
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(metadata.get());
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::File::Info file_info;
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // TODO(mtomasz): Add support for last modified time and creation time.
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // See: crbug.com/388540.
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  file_info.size = metadata->size;
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  file_info.is_directory = metadata->is_directory;
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  file_info.is_symbolic_link = false;  // Not supported.
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  file_info.last_modified = metadata->modification_time;
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  file_info.last_accessed = metadata->modification_time;  // Not supported.
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  file_info.creation_time = metadata->modification_time;  // Not supported.
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BrowserThread::PostTask(BrowserThread::IO,
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          FROM_HERE,
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          base::Bind(callback, base::File::FILE_OK, file_info));
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Executes ReadDirectory on the UI thread.
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ReadDirectoryOnUIThread(
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::FileSystemOperationContext> context,
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::AsyncFileUtil::ReadDirectoryCallback& callback) {
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  util::FileSystemURLParser parser(url);
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!parser.Parse()) {
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    callback.Run(base::File::FILE_ERROR_INVALID_OPERATION,
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                 storage::AsyncFileUtil::EntryList(),
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 false /* has_more */);
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return;
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  parser.file_system()->ReadDirectory(parser.file_path(), callback);
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Routes the response of ReadDirectory back to the IO thread.
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void OnReadDirectory(
9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::AsyncFileUtil::ReadDirectoryCallback& callback,
91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    base::File::Error result,
9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::AsyncFileUtil::EntryList& entry_list,
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    bool has_more) {
94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BrowserThread::PostTask(BrowserThread::IO,
95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          FROM_HERE,
96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          base::Bind(callback, result, entry_list, has_more));
97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Executes CreateDirectory on the UI thread.
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid CreateDirectoryOnUIThread(
10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::FileSystemOperationContext> context,
10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool exclusive,
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool recursive,
10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::AsyncFileUtil::StatusCallback& callback) {
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  util::FileSystemURLParser parser(url);
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!parser.Parse()) {
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    callback.Run(base::File::FILE_ERROR_INVALID_OPERATION);
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  parser.file_system()->CreateDirectory(
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      parser.file_path(), recursive, callback);
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Routes the response of CreateDirectory back to the IO thread.
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid OnCreateDirectory(bool exclusive,
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       const storage::AsyncFileUtil::StatusCallback& callback,
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       base::File::Error result) {
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If the directory already existed and the operation wasn't exclusive, then
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // return success anyway, since it is not an error.
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const base::File::Error error =
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      (result == base::File::FILE_ERROR_EXISTS && !exclusive)
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ? base::File::FILE_OK
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          : result;
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  BrowserThread::PostTask(
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      BrowserThread::IO, FROM_HERE, base::Bind(callback, error));
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Executes DeleteEntry on the UI thread.
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeleteEntryOnUIThread(
13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::FileSystemOperationContext> context,
13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool recursive,
13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::AsyncFileUtil::StatusCallback& callback) {
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  util::FileSystemURLParser parser(url);
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!parser.Parse()) {
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    callback.Run(base::File::FILE_ERROR_INVALID_OPERATION);
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  parser.file_system()->DeleteEntry(parser.file_path(), recursive, callback);
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Routes the response of DeleteEntry back to the IO thread.
14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void OnDeleteEntry(const storage::AsyncFileUtil::StatusCallback& callback,
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   base::File::Error result) {
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  BrowserThread::PostTask(
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      BrowserThread::IO, FROM_HERE, base::Bind(callback, result));
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Executes CreateFile on the UI thread.
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void CreateFileOnUIThread(
15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::FileSystemOperationContext> context,
15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
15703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::AsyncFileUtil::StatusCallback& callback) {
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::FileSystemURLParser parser(url);
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!parser.Parse()) {
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    callback.Run(base::File::FILE_ERROR_INVALID_OPERATION);
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  parser.file_system()->CreateFile(parser.file_path(), callback);
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Routes the response of CreateFile to a callback of EnsureFileExists() on the
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// IO thread.
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void OnCreateFileForEnsureFileExists(
17003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::AsyncFileUtil::EnsureFileExistsCallback& callback,
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    base::File::Error result) {
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const bool created = result == base::File::FILE_OK;
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // If the file already existed, then return success anyway, since it is not
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // an error.
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const base::File::Error error =
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      result == base::File::FILE_ERROR_EXISTS ? base::File::FILE_OK : result;
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BrowserThread::PostTask(
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      BrowserThread::IO, FROM_HERE, base::Bind(callback, error, created));
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Executes CopyEntry on the UI thread.
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void CopyEntryOnUIThread(
18503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::FileSystemOperationContext> context,
18603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& source_url,
18703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& target_url,
18803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::AsyncFileUtil::StatusCallback& callback) {
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::FileSystemURLParser source_parser(source_url);
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::FileSystemURLParser target_parser(target_url);
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!source_parser.Parse() || !target_parser.Parse() ||
1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      source_parser.file_system() != target_parser.file_system()) {
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    callback.Run(base::File::FILE_ERROR_INVALID_OPERATION);
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  target_parser.file_system()->CopyEntry(
1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      source_parser.file_path(), target_parser.file_path(), callback);
2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Routes the response of CopyEntry to a callback of CopyLocalFile() on the
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// IO thread.
20403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void OnCopyEntry(const storage::AsyncFileUtil::StatusCallback& callback,
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 base::File::Error result) {
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BrowserThread::PostTask(
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      BrowserThread::IO, FROM_HERE, base::Bind(callback, result));
2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Executes MoveEntry on the UI thread.
2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void MoveEntryOnUIThread(
21203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::FileSystemOperationContext> context,
21303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& source_url,
21403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& target_url,
21503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::AsyncFileUtil::StatusCallback& callback) {
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::FileSystemURLParser source_parser(source_url);
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::FileSystemURLParser target_parser(target_url);
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!source_parser.Parse() || !target_parser.Parse() ||
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      source_parser.file_system() != target_parser.file_system()) {
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    callback.Run(base::File::FILE_ERROR_INVALID_OPERATION);
2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  target_parser.file_system()->MoveEntry(
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      source_parser.file_path(), target_parser.file_path(), callback);
2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Routes the response of CopyEntry to a callback of MoveLocalFile() on the
2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// IO thread.
23103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void OnMoveEntry(const storage::AsyncFileUtil::StatusCallback& callback,
2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 base::File::Error result) {
2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BrowserThread::PostTask(
2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      BrowserThread::IO, FROM_HERE, base::Bind(callback, result));
2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Executes Truncate on the UI thread.
2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void TruncateOnUIThread(
23903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::FileSystemOperationContext> context,
24003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    int64 length,
24203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::AsyncFileUtil::StatusCallback& callback) {
2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  util::FileSystemURLParser parser(url);
2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (!parser.Parse()) {
2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    callback.Run(base::File::FILE_ERROR_INVALID_OPERATION);
2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  parser.file_system()->Truncate(parser.file_path(), length, callback);
2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Routes the response of Truncate back to the IO thread.
25303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void OnTruncate(const storage::AsyncFileUtil::StatusCallback& callback,
2545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                base::File::Error result) {
2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BrowserThread::PostTask(
2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      BrowserThread::IO, FROM_HERE, base::Bind(callback, result));
2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace
2600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2610529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochProviderAsyncFileUtil::ProviderAsyncFileUtil() {}
2620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2630529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochProviderAsyncFileUtil::~ProviderAsyncFileUtil() {}
2640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::CreateOrOpen(
26603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::FileSystemOperationContext> context,
26703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
2680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    int file_flags,
2690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const CreateOrOpenCallback& callback) {
270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::IO);
271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if ((file_flags & base::File::FLAG_CREATE) ||
272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      (file_flags & base::File::FLAG_OPEN_ALWAYS) ||
273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      (file_flags & base::File::FLAG_CREATE_ALWAYS) ||
274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      (file_flags & base::File::FLAG_OPEN_TRUNCATED)) {
275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    callback.Run(base::File(base::File::FILE_ERROR_ACCESS_DENIED),
2760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                 base::Closure());
2770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return;
2780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
2790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  NOTIMPLEMENTED();
281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  callback.Run(base::File(base::File::FILE_ERROR_INVALID_OPERATION),
2820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch               base::Closure());
2830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
2840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::EnsureFileExists(
28603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::FileSystemOperationContext> context,
28703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
2880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const EnsureFileExistsCallback& callback) {
289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::IO);
2905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BrowserThread::PostTask(
2915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      BrowserThread::UI,
2925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      FROM_HERE,
2935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::Bind(&CreateFileOnUIThread,
2945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 base::Passed(&context),
2955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 url,
2965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 base::Bind(&OnCreateFileForEnsureFileExists, callback)));
2970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
2980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::CreateDirectory(
30003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::FileSystemOperationContext> context,
30103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
3020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    bool exclusive,
3030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    bool recursive,
3040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const StatusCallback& callback) {
305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::IO);
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BrowserThread::PostTask(
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      BrowserThread::UI,
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      FROM_HERE,
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&CreateDirectoryOnUIThread,
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 base::Passed(&context),
3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 url,
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 exclusive,
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 recursive,
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 base::Bind(&OnCreateDirectory, exclusive, callback)));
3150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::GetFileInfo(
31803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::FileSystemOperationContext> context,
31903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
3200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const GetFileInfoCallback& callback) {
321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::IO);
322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BrowserThread::PostTask(BrowserThread::UI,
323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          FROM_HERE,
324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          base::Bind(&GetFileInfoOnUIThread,
325010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     base::Passed(&context),
326010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     url,
327010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     base::Bind(&OnGetFileInfo, callback)));
3280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::ReadDirectory(
33103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::FileSystemOperationContext> context,
33203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
3330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const ReadDirectoryCallback& callback) {
334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::IO);
335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BrowserThread::PostTask(BrowserThread::UI,
336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          FROM_HERE,
337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                          base::Bind(&ReadDirectoryOnUIThread,
338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     base::Passed(&context),
339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     url,
340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     base::Bind(&OnReadDirectory, callback)));
3410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::Touch(
34403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::FileSystemOperationContext> context,
34503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
3460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const base::Time& last_access_time,
3470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const base::Time& last_modified_time,
3480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const StatusCallback& callback) {
349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::IO);
350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  callback.Run(base::File::FILE_ERROR_ACCESS_DENIED);
3510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::Truncate(
35403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::FileSystemOperationContext> context,
35503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
3560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    int64 length,
3570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const StatusCallback& callback) {
358010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::IO);
3595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BrowserThread::PostTask(BrowserThread::UI,
3605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          FROM_HERE,
3615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          base::Bind(&TruncateOnUIThread,
3625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     base::Passed(&context),
3635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     url,
3645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     length,
3655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     base::Bind(&OnTruncate, callback)));
3660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::CopyFileLocal(
36903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::FileSystemOperationContext> context,
37003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& src_url,
37103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& dest_url,
3720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    CopyOrMoveOption option,
3730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const CopyFileProgressCallback& progress_callback,
3740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const StatusCallback& callback) {
375010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::IO);
3765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // TODO(mtomasz): Consier adding support for options (preserving last modified
3775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // time) as well as the progress callback.
3785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BrowserThread::PostTask(BrowserThread::UI,
3795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          FROM_HERE,
3805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          base::Bind(&CopyEntryOnUIThread,
3815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     base::Passed(&context),
3825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     src_url,
3835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     dest_url,
3845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     base::Bind(&OnCopyEntry, callback)));
3850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::MoveFileLocal(
38803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::FileSystemOperationContext> context,
38903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& src_url,
39003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& dest_url,
3910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    CopyOrMoveOption option,
3920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const StatusCallback& callback) {
393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::IO);
3945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // TODO(mtomasz): Consier adding support for options (preserving last modified
3955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // time) as well as the progress callback.
3965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  BrowserThread::PostTask(BrowserThread::UI,
3975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          FROM_HERE,
3985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                          base::Bind(&MoveEntryOnUIThread,
3995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     base::Passed(&context),
4005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     src_url,
4015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     dest_url,
4025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     base::Bind(&OnMoveEntry, callback)));
4030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
4040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::CopyInForeignFile(
40603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::FileSystemOperationContext> context,
4070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const base::FilePath& src_file_path,
40803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& dest_url,
4090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const StatusCallback& callback) {
410010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::IO);
411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  callback.Run(base::File::FILE_ERROR_ACCESS_DENIED);
4120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
4130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::DeleteFile(
41503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::FileSystemOperationContext> context,
41603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
4170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const StatusCallback& callback) {
418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::IO);
419116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  BrowserThread::PostTask(BrowserThread::UI,
420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          FROM_HERE,
421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          base::Bind(&DeleteEntryOnUIThread,
422116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     base::Passed(&context),
423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     url,
424116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     false,  // recursive
425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     base::Bind(&OnDeleteEntry, callback)));
4260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
4270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::DeleteDirectory(
42903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::FileSystemOperationContext> context,
43003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
4310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const StatusCallback& callback) {
432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::IO);
433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  BrowserThread::PostTask(BrowserThread::UI,
434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          FROM_HERE,
435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          base::Bind(&DeleteEntryOnUIThread,
436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     base::Passed(&context),
437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     url,
438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     false,  // recursive
439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     base::Bind(&OnDeleteEntry, callback)));
4400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
4410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::DeleteRecursively(
44303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::FileSystemOperationContext> context,
44403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
4450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const StatusCallback& callback) {
446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::IO);
447116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  BrowserThread::PostTask(BrowserThread::UI,
448116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          FROM_HERE,
449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                          base::Bind(&DeleteEntryOnUIThread,
450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     base::Passed(&context),
451116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     url,
452116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     true,  // recursive
453116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     base::Bind(&OnDeleteEntry, callback)));
4540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
4550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ProviderAsyncFileUtil::CreateSnapshotFile(
45703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<storage::FileSystemOperationContext> context,
45803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemURL& url,
4590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const CreateSnapshotFileCallback& callback) {
460010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::IO);
4610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  NOTIMPLEMENTED();
462cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  callback.Run(base::File::FILE_ERROR_INVALID_OPERATION,
4630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch               base::File::Info(),
4640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch               base::FilePath(),
46503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)               scoped_refptr<storage::ShareableFileReference>());
4660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
4670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace internal
4690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace file_system_provider
4700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace chromeos
471