1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file.
4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/chromeos/file_system_provider/provided_file_system.h"
6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include <vector>
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/debug/trace_event.h"
100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/files/file.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/file_system_provider/notification_manager.h"
1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/operations/abort.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/operations/close_file.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/operations/copy_entry.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/file_system_provider/operations/create_directory.h"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/operations/create_file.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/file_system_provider/operations/delete_entry.h"
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/operations/get_metadata.h"
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/operations/move_entry.h"
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/operations/open_file.h"
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/operations/read_directory.h"
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/operations/read_file.h"
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/operations/truncate.h"
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/chromeos/file_system_provider/operations/unmount.h"
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/file_system_provider/operations/write_file.h"
260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/chromeos/file_system_provider/request_manager.h"
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/profiles/profile.h"
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/common/extensions/api/file_system_provider.h"
290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "extensions/browser/event_router.h"
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace net {
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class IOBuffer;
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace net
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace chromeos {
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace file_system_provider {
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace {
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Dicards the result of Abort() when called from the destructor.
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void EmptyStatusCallback(base::File::Error /* result */) {
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace
44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
450529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochProvidedFileSystem::ProvidedFileSystem(
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Profile* profile,
470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const ProvidedFileSystemInfo& file_system_info)
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : profile_(profile),
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      event_router_(extensions::EventRouter::Get(profile)),  // May be NULL.
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      file_system_info_(file_system_info),
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      notification_manager_(
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          new NotificationManager(profile_, file_system_info_)),
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      request_manager_(notification_manager_.get()),
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      weak_ptr_factory_(this) {
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystem::~ProvidedFileSystem() {
5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const std::vector<int> request_ids = request_manager_.GetActiveRequestIds();
5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  for (size_t i = 0; i < request_ids.size(); ++i) {
6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    Abort(request_ids[i], base::Bind(&EmptyStatusCallback));
6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystem::AbortCallback ProvidedFileSystem::RequestUnmount(
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::AsyncFileUtil::StatusCallback& callback) {
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const int request_id = request_manager_.CreateRequest(
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      REQUEST_UNMOUNT,
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      scoped_ptr<RequestManager::HandlerInterface>(
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          new operations::Unmount(event_router_, file_system_info_, callback)));
7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!request_id) {
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    callback.Run(base::File::FILE_ERROR_SECURITY);
7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return AbortCallback();
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return base::Bind(
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystem::AbortCallback ProvidedFileSystem::GetMetadata(
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const base::FilePath& entry_path,
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    MetadataFieldMask fields,
8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const GetMetadataCallback& callback) {
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const int request_id = request_manager_.CreateRequest(
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      GET_METADATA,
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      scoped_ptr<RequestManager::HandlerInterface>(new operations::GetMetadata(
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          event_router_, file_system_info_, entry_path, fields, callback)));
8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!request_id) {
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    callback.Run(make_scoped_ptr<EntryMetadata>(NULL),
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 base::File::FILE_ERROR_SECURITY);
9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return AbortCallback();
91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return base::Bind(
9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystem::AbortCallback ProvidedFileSystem::ReadDirectory(
98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const base::FilePath& directory_path,
9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::AsyncFileUtil::ReadDirectoryCallback& callback) {
10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const int request_id = request_manager_.CreateRequest(
10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      READ_DIRECTORY,
10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      scoped_ptr<RequestManager::HandlerInterface>(
10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          new operations::ReadDirectory(
10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              event_router_, file_system_info_, directory_path, callback)));
10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!request_id) {
106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    callback.Run(base::File::FILE_ERROR_SECURITY,
10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                 storage::AsyncFileUtil::EntryList(),
108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                 false /* has_more */);
10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return AbortCallback();
110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return base::Bind(
11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystem::AbortCallback ProvidedFileSystem::ReadFile(
11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    int file_handle,
11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    net::IOBuffer* buffer,
11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    int64 offset,
12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    int length,
12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const ReadChunkReceivedCallback& callback) {
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TRACE_EVENT1(
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "file_system_provider", "ProvidedFileSystem::ReadFile", "length", length);
12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const int request_id = request_manager_.CreateRequest(
12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      READ_FILE,
12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      make_scoped_ptr<RequestManager::HandlerInterface>(
12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          new operations::ReadFile(event_router_,
12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   file_system_info_,
12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   file_handle,
13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   buffer,
13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   offset,
13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   length,
13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   callback)));
13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!request_id) {
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    callback.Run(0 /* chunk_length */,
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 false /* has_more */,
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 base::File::FILE_ERROR_SECURITY);
13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return AbortCallback();
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return base::Bind(
14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
14503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystem::AbortCallback ProvidedFileSystem::OpenFile(
14603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const base::FilePath& file_path,
14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    OpenFileMode mode,
14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const OpenFileCallback& callback) {
14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const int request_id = request_manager_.CreateRequest(
15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      OPEN_FILE,
15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      scoped_ptr<RequestManager::HandlerInterface>(new operations::OpenFile(
15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          event_router_, file_system_info_, file_path, mode, callback)));
15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!request_id) {
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    callback.Run(0 /* file_handle */, base::File::FILE_ERROR_SECURITY);
15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return AbortCallback();
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
15703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return base::Bind(
15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystem::AbortCallback ProvidedFileSystem::CloseFile(
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    int file_handle,
16403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::AsyncFileUtil::StatusCallback& callback) {
16503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const int request_id = request_manager_.CreateRequest(
16603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      CLOSE_FILE,
16703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      scoped_ptr<RequestManager::HandlerInterface>(new operations::CloseFile(
16803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          event_router_, file_system_info_, file_handle, callback)));
16903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!request_id) {
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    callback.Run(base::File::FILE_ERROR_SECURITY);
17103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return AbortCallback();
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
17303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
17403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return base::Bind(
17503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
17803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystem::AbortCallback ProvidedFileSystem::CreateDirectory(
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::FilePath& directory_path,
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool recursive,
18103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::AsyncFileUtil::StatusCallback& callback) {
18203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const int request_id = request_manager_.CreateRequest(
18303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      CREATE_DIRECTORY,
18403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      scoped_ptr<RequestManager::HandlerInterface>(
18503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          new operations::CreateDirectory(event_router_,
18603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                          file_system_info_,
18703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                          directory_path,
18803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                          recursive,
18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                          callback)));
19003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!request_id) {
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    callback.Run(base::File::FILE_ERROR_SECURITY);
19203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return AbortCallback();
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
19403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return base::Bind(
19603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
19903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystem::AbortCallback ProvidedFileSystem::DeleteEntry(
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::FilePath& entry_path,
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool recursive,
20203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::AsyncFileUtil::StatusCallback& callback) {
20303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const int request_id = request_manager_.CreateRequest(
20403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      DELETE_ENTRY,
20503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      scoped_ptr<RequestManager::HandlerInterface>(new operations::DeleteEntry(
20603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          event_router_, file_system_info_, entry_path, recursive, callback)));
20703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!request_id) {
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    callback.Run(base::File::FILE_ERROR_SECURITY);
20903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return AbortCallback();
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
21103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
21203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return base::Bind(
21303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
21603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystem::AbortCallback ProvidedFileSystem::CreateFile(
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const base::FilePath& file_path,
21803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::AsyncFileUtil::StatusCallback& callback) {
21903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const int request_id = request_manager_.CreateRequest(
22003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      CREATE_FILE,
22103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      scoped_ptr<RequestManager::HandlerInterface>(new operations::CreateFile(
22203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          event_router_, file_system_info_, file_path, callback)));
22303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!request_id) {
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    callback.Run(base::File::FILE_ERROR_SECURITY);
22503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return AbortCallback();
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
22703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
22803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return base::Bind(
22903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
23203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystem::AbortCallback ProvidedFileSystem::CopyEntry(
2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const base::FilePath& source_path,
2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const base::FilePath& target_path,
23503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::AsyncFileUtil::StatusCallback& callback) {
23603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const int request_id = request_manager_.CreateRequest(
23703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      COPY_ENTRY,
23803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      scoped_ptr<RequestManager::HandlerInterface>(
23903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          new operations::CopyEntry(event_router_,
24003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                    file_system_info_,
24103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                    source_path,
24203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                    target_path,
24303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                    callback)));
24403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!request_id) {
2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    callback.Run(base::File::FILE_ERROR_SECURITY);
24603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return AbortCallback();
2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
24803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
24903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return base::Bind(
25003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
25303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystem::AbortCallback ProvidedFileSystem::WriteFile(
2545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    int file_handle,
2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    net::IOBuffer* buffer,
2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    int64 offset,
2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    int length,
25803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::AsyncFileUtil::StatusCallback& callback) {
2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TRACE_EVENT1("file_system_provider",
2605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               "ProvidedFileSystem::WriteFile",
2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               "length",
2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               length);
26303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const int request_id = request_manager_.CreateRequest(
26403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      WRITE_FILE,
26503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      make_scoped_ptr<RequestManager::HandlerInterface>(
26603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          new operations::WriteFile(event_router_,
26703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                    file_system_info_,
26803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                    file_handle,
26903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                    make_scoped_refptr(buffer),
27003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                    offset,
27103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                    length,
27203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                    callback)));
27303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!request_id) {
2745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    callback.Run(base::File::FILE_ERROR_SECURITY);
27503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return AbortCallback();
2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
27703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
27803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return base::Bind(
27903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
28203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystem::AbortCallback ProvidedFileSystem::MoveEntry(
2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const base::FilePath& source_path,
2845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const base::FilePath& target_path,
28503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::AsyncFileUtil::StatusCallback& callback) {
28603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const int request_id = request_manager_.CreateRequest(
28703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      MOVE_ENTRY,
28803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      scoped_ptr<RequestManager::HandlerInterface>(
28903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          new operations::MoveEntry(event_router_,
29003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                    file_system_info_,
29103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                    source_path,
29203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                    target_path,
29303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                    callback)));
29403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!request_id) {
2955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    callback.Run(base::File::FILE_ERROR_SECURITY);
29603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return AbortCallback();
2975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
29803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
29903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return base::Bind(
30003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
3015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
30303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)ProvidedFileSystem::AbortCallback ProvidedFileSystem::Truncate(
3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const base::FilePath& file_path,
3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    int64 length,
30603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::AsyncFileUtil::StatusCallback& callback) {
30703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const int request_id = request_manager_.CreateRequest(
30803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      TRUNCATE,
30903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      scoped_ptr<RequestManager::HandlerInterface>(new operations::Truncate(
31003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          event_router_, file_system_info_, file_path, length, callback)));
31103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!request_id) {
3125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    callback.Run(base::File::FILE_ERROR_SECURITY);
31303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return AbortCallback();
3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
31503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
31603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return base::Bind(
31703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      &ProvidedFileSystem::Abort, weak_ptr_factory_.GetWeakPtr(), request_id);
3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst ProvidedFileSystemInfo& ProvidedFileSystem::GetFileSystemInfo() const {
3210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return file_system_info_;
3220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3240529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochRequestManager* ProvidedFileSystem::GetRequestManager() {
3250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return &request_manager_;
3260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)base::WeakPtr<ProvidedFileSystemInterface> ProvidedFileSystem::GetWeakPtr() {
329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return weak_ptr_factory_.GetWeakPtr();
330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
33203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void ProvidedFileSystem::Abort(
33303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    int operation_request_id,
33403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::AsyncFileUtil::StatusCallback& callback) {
33503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  request_manager_.RejectRequest(operation_request_id,
33603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                 make_scoped_ptr(new RequestValue()),
33703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                 base::File::FILE_ERROR_ABORT);
33803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!request_manager_.CreateRequest(
33903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          ABORT,
34003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          scoped_ptr<RequestManager::HandlerInterface>(
34103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              new operations::Abort(event_router_,
34203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                    file_system_info_,
34303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                    operation_request_id,
34403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                    callback)))) {
34503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    callback.Run(base::File::FILE_ERROR_SECURITY);
34603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
34703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
34803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
349effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace file_system_provider
350effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace chromeos
351