// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef STORAGE_BROWSER_FILEAPI_NATIVE_FILE_UTIL_H_
#define STORAGE_BROWSER_FILEAPI_NATIVE_FILE_UTIL_H_

#include <stdint.h>

#include <memory>

#include "base/files/file.h"
#include "base/files/file_path.h"
#include "base/macros.h"
#include "storage/browser/fileapi/file_system_file_util.h"
#include "storage/browser/storage_browser_export.h"

namespace base {
class Time;
}

namespace storage {

// A thin wrapper class for accessing the OS native filesystem.
// This performs common error checks necessary to implement FileUtil family
// in addition to perform native filesystem operations.
//
// For the error checks it performs please see the comment for
// FileSystemFileUtil interface
// (storage/browser/fileapi/file_system_file_util.h).
//
// Note that all the methods of this class are static and this does NOT
// inherit from FileSystemFileUtil.
class STORAGE_EXPORT NativeFileUtil {
 public:
  enum CopyOrMoveMode {
    COPY_NOSYNC,
    COPY_SYNC,
    MOVE
  };

  static CopyOrMoveMode CopyOrMoveModeForDestination(
      const FileSystemURL& dest_url, bool copy);

  static base::File CreateOrOpen(const base::FilePath& path, int file_flags);
  static base::File::Error EnsureFileExists(const base::FilePath& path,
                                            bool* created);
  static base::File::Error CreateDirectory(const base::FilePath& path,
                                           bool exclusive,
                                           bool recursive);
  static base::File::Error GetFileInfo(const base::FilePath& path,
                                       base::File::Info* file_info);
  static std::unique_ptr<FileSystemFileUtil::AbstractFileEnumerator>
  CreateFileEnumerator(const base::FilePath& root_path, bool recursive);
  static base::File::Error Touch(const base::FilePath& path,
                                 const base::Time& last_access_time,
                                 const base::Time& last_modified_time);
  static base::File::Error Truncate(const base::FilePath& path, int64_t length);
  static bool PathExists(const base::FilePath& path);
  static bool DirectoryExists(const base::FilePath& path);
  static base::File::Error CopyOrMoveFile(
      const base::FilePath& src_path,
      const base::FilePath& dest_path,
      FileSystemOperation::CopyOrMoveOption option,
      CopyOrMoveMode mode);
  static base::File::Error DeleteFile(const base::FilePath& path);
  static base::File::Error DeleteDirectory(const base::FilePath& path);

 private:
  DISALLOW_IMPLICIT_CONSTRUCTORS(NativeFileUtil);
};

}  // namespace storage

#endif  // STORAGE_BROWSER_FILEAPI_NATIVE_FILE_UTIL_H_
