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