| // Copyright 2023 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROMEOS_ASH_SERVICES_RECORDING_GIF_FILE_WRITER_H_ |
| #define CHROMEOS_ASH_SERVICES_RECORDING_GIF_FILE_WRITER_H_ |
| |
| #include <cstdint> |
| #include <string_view> |
| |
| #include "base/containers/span.h" |
| #include "base/files/file.h" |
| #include "chromeos/ash/services/recording/recording_file_io_helper.h" |
| |
| namespace recording { |
| |
| // Creates a file at the given `gif_file_path`, and provides various APIs to |
| // allow writing bytes to it with various lengths. It also takes care of |
| // handling any IO errors while writing as well as running out of disk space or |
| // DriveFS quota conditions. |
| class GifFileWriter { |
| public: |
| GifFileWriter( |
| mojo::PendingRemote<mojom::DriveFsQuotaDelegate> drive_fs_quota_delegate, |
| const base::FilePath& gif_file_path, |
| RecordingFileIoHelper::Delegate* file_io_helper_delegate); |
| GifFileWriter(const GifFileWriter&) = delete; |
| GifFileWriter& operator=(const GifFileWriter&) = delete; |
| ~GifFileWriter(); |
| |
| // Writes the given `bytes` to the `gif_file_`. |
| void WriteByte(uint8_t byte); |
| |
| // Writes the contents of the given `buffer` to the `gif_file_`. |
| void WriteBuffer(base::span<const uint8_t> buffer); |
| |
| // Writes the given `string` to the `gif_file_`. |
| void WriteString(std::string_view string); |
| |
| // Writes the given 16-bit `value` to the `gif_file_` in little endian format |
| // such that the least significant bit gets written first. |
| void WriteShort(uint16_t value); |
| |
| // Flushes the contents of the file to the underlying storage. |
| void FlushFile(); |
| |
| private: |
| // Writes the given `data` to the `gif_file_` and check for IO errors or disk |
| // space / DriveFS quota issues. |
| void WriteBytesAndCheck(base::span<const uint8_t> data); |
| |
| // The file created at `gif_file_path` to which the output of the GIF encoder |
| // will be written. |
| base::File gif_file_; |
| |
| // A helper that will be used to calculate either the remaining disk space (if |
| // writing to a local file), or the remaining quota if the file exists on |
| // DriveFS. |
| RecordingFileIoHelper file_io_helper_; |
| }; |
| |
| } // namespace recording |
| |
| #endif // CHROMEOS_ASH_SERVICES_RECORDING_GIF_FILE_WRITER_H_ |