// Copyright (c) 2016 The WebM 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 INCLUDE_WEBM_FILE_READER_H_
#define INCLUDE_WEBM_FILE_READER_H_

#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <memory>

#include "reader.h"
#include "status.h"

/**
 \file
 A `Reader` implementation that reads from a `FILE*`.
 */

namespace webm {

/**
 A `Reader` implementation that can read from `FILE*` resources.
 */
class FileReader : public Reader {
 public:
  /**
   Constructs a new, empty reader.
   */
  FileReader() = default;

  /**
   Constructs a new reader, using the provided file as the data source.

   Ownership of the file is taken, and `std::fclose()` will be called when the
   object is destroyed.

   \param file The file to use as a data source. Must not be null. The file will
   be closed (via `std::fclose()`) when the `FileReader`'s destructor runs.
   */
  explicit FileReader(FILE* file);

  /**
   Constructs a new reader by moving the provided reader into the new reader.

   \param other The source reader to move. After moving, it will be reset to an
   empty stream.
   */
  FileReader(FileReader&& other);

  /**
   Moves the provided reader into this reader.

   \param other The source reader to move. After moving, it will be reset to an
   empty stream. May be equal to `*this`, in which case this is a no-op.
   \return `*this`.
   */
  FileReader& operator=(FileReader&& other);

  Status Read(std::size_t num_to_read, std::uint8_t* buffer,
              std::uint64_t* num_actually_read) override;

  Status Skip(std::uint64_t num_to_skip,
              std::uint64_t* num_actually_skipped) override;

  std::uint64_t Position() const override;

 private:
  struct FileCloseFunctor {
    void operator()(FILE* file) const {
      if (file)
        std::fclose(file);
    }
  };

  std::unique_ptr<FILE, FileCloseFunctor> file_;

  // We can't rely on ftell() for the position (since it only returns long, and
  // doesn't work on things like pipes); we need to manually track the reading
  // position.
  std::uint64_t position_ = 0;
};

}  // namespace webm

#endif  // INCLUDE_WEBM_FILE_READER_H_
