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