/*
 *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef RTC_BASE_FILE_H_
#define RTC_BASE_FILE_H_

#include <stdint.h>

#include <string>

#include "rtc_base/constructormagic.h"
#include "rtc_base/pathutils.h"
#include "rtc_base/platform_file.h"

namespace rtc {

// This class wraps the platform specific APIs for simple file interactions.
//
// The various read and write methods are best effort, i.e. if an underlying
// call does not manage to read/write all the data more calls will be performed,
// until an error is detected or all data is read/written.
class File {
 public:
  // Wraps the given PlatformFile. This class is then responsible for closing
  // the file, which will be done in the destructor if Close is never called.
  explicit File(PlatformFile);
  // The default constructor produces a closed file.
  File();
  ~File();

  File(File&& other);
  File& operator=(File&& other);

  // Open and Create give files with both reading and writing enabled.
  static File Open(const std::string& path);
  static File Open(Pathname&& path);
  static File Open(const Pathname& path);
  // If the file already exists it will be overwritten.
  static File Create(const std::string& path);
  static File Create(Pathname&& path);
  static File Create(const Pathname& path);

  // Remove a file in the file system.
  static bool Remove(const std::string& path);
  static bool Remove(Pathname&& path);
  static bool Remove(const Pathname& path);

  size_t Write(const uint8_t* data, size_t length);
  size_t Read(uint8_t* buffer, size_t length);

  // The current position in the file after a call to these methods is platform
  // dependent (MSVC gives position offset+length, most other
  // compilers/platforms do not alter the position), i.e. do not depend on it,
  // do a Seek before any subsequent Read/Write.
  size_t WriteAt(const uint8_t* data, size_t length, size_t offset);
  size_t ReadAt(uint8_t* buffer, size_t length, size_t offset);

  // Attempt to position the file at the given offset from the start.
  // Returns true if successful, false otherwise.
  bool Seek(size_t offset);

  // Attempt to close the file. Returns true if successful, false otherwise,
  // most notably when the file is already closed.
  bool Close();

  bool IsOpen();

 private:
  PlatformFile file_;
  RTC_DISALLOW_COPY_AND_ASSIGN(File);
};

}  // namespace rtc

#endif  // RTC_BASE_FILE_H_
