| // 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_ |