You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.4 KiB
91 lines
2.4 KiB
// 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_
|