15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/local_file_util.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/file_enumerator.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_util_proxy.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/async_file_util_adapter.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_context.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_operation_context.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_url.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/native_file_util.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/fileapi/file_system_types.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/fileapi/file_system_util.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)AsyncFileUtil* AsyncFileUtil::CreateForLocalFileSystem() { 22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return new AsyncFileUtilAdapter(new LocalFileUtil()); 23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LocalFileEnumerator : public FileSystemFileUtil::AbstractFileEnumerator { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LocalFileEnumerator(const base::FilePath& platform_root_path, 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& virtual_root_path, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int file_type) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : file_enum_(platform_root_path, false /* recursive */, file_type), 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) platform_root_path_(platform_root_path), 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual_root_path_(virtual_root_path) { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~LocalFileEnumerator() {} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual base::FilePath Next() OVERRIDE; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int64 Size() OVERRIDE; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual base::Time LastModifiedTime() OVERRIDE; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsDirectory() OVERRIDE; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FileEnumerator file_enum_; 44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FileEnumerator::FileInfo file_util_info_; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath platform_root_path_; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath virtual_root_path_; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath LocalFileEnumerator::Next() { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath next = file_enum_.Next(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't return symlinks. 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) while (!next.empty() && base::IsLink(next)) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next = file_enum_.Next(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (next.empty()) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return next; 56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) file_util_info_ = file_enum_.GetInfo(); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) platform_root_path_.AppendRelativePath(next, &path); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return virtual_root_path_.Append(path); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int64 LocalFileEnumerator::Size() { 64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return file_util_info_.GetSize(); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Time LocalFileEnumerator::LastModifiedTime() { 68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return file_util_info_.GetLastModifiedTime(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LocalFileEnumerator::IsDirectory() { 72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return file_util_info_.IsDirectory(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)LocalFileUtil::LocalFileUtil() {} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)LocalFileUtil::~LocalFileUtil() {} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)base::File LocalFileUtil::CreateOrOpen( 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemOperationContext* context, 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const FileSystemURL& url, int file_flags) { 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_path; 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error = GetLocalFilePath(context, url, &file_path); 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (error != base::File::FILE_OK) 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return base::File(error); 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Disallow opening files in symlinked paths. 87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (base::IsLink(file_path)) 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return base::File(base::File::FILE_ERROR_NOT_FOUND); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return NativeFileUtil::CreateOrOpen(file_path, file_flags); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::File::Error LocalFileUtil::EnsureFileExists( 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemOperationContext* context, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* created) { 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_path; 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error = GetLocalFilePath(context, url, &file_path); 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (error != base::File::FILE_OK) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NativeFileUtil::EnsureFileExists(file_path, created); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::File::Error LocalFileUtil::CreateDirectory( 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemOperationContext* context, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool exclusive, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool recursive) { 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_path; 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error = GetLocalFilePath(context, url, &file_path); 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (error != base::File::FILE_OK) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NativeFileUtil::CreateDirectory(file_path, exclusive, recursive); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::File::Error LocalFileUtil::GetFileInfo( 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemOperationContext* context, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Info* file_info, 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* platform_file_path) { 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_path; 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error = GetLocalFilePath(context, url, &file_path); 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (error != base::File::FILE_OK) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should not follow symbolic links in sandboxed file system. 126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (base::IsLink(file_path)) 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::File::FILE_ERROR_NOT_FOUND; 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = NativeFileUtil::GetFileInfo(file_path, file_info); 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (error == base::File::FILE_OK) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *platform_file_path = file_path; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> LocalFileUtil:: 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateFileEnumerator( 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemOperationContext* context, 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const FileSystemURL& root_url) { 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_path; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetLocalFilePath(context, root_url, &file_path) != 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::FILE_OK) { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return make_scoped_ptr(new EmptyFileEnumerator) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .PassAs<FileSystemFileUtil::AbstractFileEnumerator>(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return make_scoped_ptr(new LocalFileEnumerator( 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) file_path, root_url.path(), 147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FileEnumerator::FILES | base::FileEnumerator::DIRECTORIES)) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .PassAs<FileSystemFileUtil::AbstractFileEnumerator>(); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::File::Error LocalFileUtil::GetLocalFilePath( 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemOperationContext* context, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* local_file_path) { 155d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(local_file_path); 156d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(url.is_valid()); 157d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (url.path().empty()) { 158d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Root direcory case, which should not be accessed. 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::File::FILE_ERROR_ACCESS_DENIED; 160d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 161d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) *local_file_path = url.path(); 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::File::FILE_OK; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::File::Error LocalFileUtil::Touch( 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemOperationContext* context, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& last_access_time, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& last_modified_time) { 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_path; 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error = GetLocalFilePath(context, url, &file_path); 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (error != base::File::FILE_OK) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NativeFileUtil::Touch(file_path, last_access_time, last_modified_time); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::File::Error LocalFileUtil::Truncate( 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemOperationContext* context, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 length) { 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_path; 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error = GetLocalFilePath(context, url, &file_path); 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (error != base::File::FILE_OK) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NativeFileUtil::Truncate(file_path, length); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::File::Error LocalFileUtil::CopyOrMoveFile( 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemOperationContext* context, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& src_url, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& dest_url, 19268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CopyOrMoveOption option, 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool copy) { 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath src_file_path; 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error = GetLocalFilePath(context, src_url, &src_file_path); 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (error != base::File::FILE_OK) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_file_path; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error = GetLocalFilePath(context, dest_url, &dest_file_path); 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (error != base::File::FILE_OK) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return NativeFileUtil::CopyOrMoveFile( 20503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) src_file_path, 20603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) dest_file_path, 20703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) option, 20803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::NativeFileUtil::CopyOrMoveModeForDestination(dest_url, copy)); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::File::Error LocalFileUtil::CopyInForeignFile( 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemOperationContext* context, 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& src_file_path, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& dest_url) { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (src_file_path.empty()) 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::File::FILE_ERROR_INVALID_OPERATION; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dest_file_path; 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error = 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetLocalFilePath(context, dest_url, &dest_file_path); 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (error != base::File::FILE_OK) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error; 22368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return NativeFileUtil::CopyOrMoveFile( 22403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) src_file_path, 22503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) dest_file_path, 22603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) FileSystemOperation::OPTION_NONE, 22703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::NativeFileUtil::CopyOrMoveModeForDestination(dest_url, 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) true /* copy */)); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::File::Error LocalFileUtil::DeleteFile( 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemOperationContext* context, 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url) { 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_path; 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error = GetLocalFilePath(context, url, &file_path); 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (error != base::File::FILE_OK) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NativeFileUtil::DeleteFile(file_path); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::File::Error LocalFileUtil::DeleteDirectory( 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemOperationContext* context, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url) { 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath file_path; 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error = GetLocalFilePath(context, url, &file_path); 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (error != base::File::FILE_OK) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error; 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NativeFileUtil::DeleteDirectory(file_path); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)storage::ScopedFile LocalFileUtil::CreateSnapshotFile( 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FileSystemOperationContext* context, 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileSystemURL& url, 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error* error, 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Info* file_info, 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath* platform_path) { 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(file_info); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We're just returning the local file information. 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *error = GetFileInfo(context, url, file_info, platform_path); 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (*error == base::File::FILE_OK && file_info->is_directory) 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *error = base::File::FILE_ERROR_NOT_A_FILE; 26203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return storage::ScopedFile(); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace storage 266