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