/*
 *  Copyright (c) 2011 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 WEBRTC_SYSTEM_WRAPPERS_INCLUDE_FILE_WRAPPER_H_
#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_FILE_WRAPPER_H_

#include <stddef.h>
#include <stdio.h>

#include "webrtc/common_types.h"
#include "webrtc/rtc_base/criticalsection.h"
#include "webrtc/typedefs.h"

// Implementation of an InStream and OutStream that can read (exclusive) or
// write from/to a file.

namespace webrtc {

// TODO(tommi): Remove the base classes, rename to rtc::File and move to base.
class FileWrapper : public InStream, public OutStream {
 public:
  static const size_t kMaxFileNameSize = 1024;

  // Factory methods.
  // TODO(tommi): Remove Create().
  static FileWrapper* Create();
  static FileWrapper Open(const char* file_name_utf8, bool read_only);

  FileWrapper(FILE* file, size_t max_size);
  ~FileWrapper() override;

  // Support for move semantics.
  FileWrapper(FileWrapper&& other);
  FileWrapper& operator=(FileWrapper&& other);

  // Returns true if a file has been opened.
  bool is_open() const { return file_ != nullptr; }

  // Opens a file in read or write mode, decided by the read_only parameter.
  bool OpenFile(const char* file_name_utf8, bool read_only);

  // Initializes the wrapper from an existing handle.  The wrapper
  // takes ownership of |handle| and closes it in CloseFile().
  bool OpenFromFileHandle(FILE* handle);

  void CloseFile();

  // Limits the file size to |bytes|. Writing will fail after the cap
  // is hit. Pass zero to use an unlimited size.
  // TODO(tommi): Could we move this out into a separate class?
  void SetMaxFileSize(size_t bytes);

  // Flush any pending writes.  Note: Flushing when closing, is not required.
  int Flush();

  // Rewinds the file to the start.
  int Rewind() override;
  int Read(void* buf, size_t length) override;
  bool Write(const void* buf, size_t length) override;

 private:
  FileWrapper();

  void CloseFileImpl();
  int FlushImpl();

  // TODO(tommi): Remove the lock.
  rtc::CriticalSection lock_;

  FILE* file_ = nullptr;
  size_t position_ = 0;
  size_t max_size_in_bytes_ = 0;

  // Copying is not supported.
  FileWrapper(const FileWrapper&) = delete;
  FileWrapper& operator=(const FileWrapper&) = delete;
};

}  // namespace webrtc

#endif  // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_FILE_WRAPPER_H_
