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