| // Copyright 2017 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SRC_PUFF_WRITER_H_ |
| #define SRC_PUFF_WRITER_H_ |
| |
| #include <cstddef> |
| #include <cstdint> |
| |
| #include "puffin/src/include/puffin/common.h" |
| #include "puffin/src/puff_data.h" |
| |
| namespace puffin { |
| |
| // An abstract class for writing data into a puffed buffer. Data can be |
| // literals, lengths, distances, or metadata. Extensions of this class can |
| // define how the puffed data should reside in the puffed buffer. |
| class PuffWriterInterface { |
| public: |
| virtual ~PuffWriterInterface() = default; |
| |
| // Inserts data. This function does not need to check for the validity of data |
| // . e.g. length > 285, etc. |
| // |
| // |pd| IN The data to put into the puffed buffer. |pd.type| |
| // defines the type of the data. |
| // Returns false if it fails. |
| virtual bool Insert(const PuffData& pd) = 0; |
| |
| // Fluesh any buffer or internal state to the output. |
| // Returns false if it fails. |
| virtual bool Flush() = 0; |
| |
| // Returns the number of bytes processed and written into the puff buffer. |
| virtual size_t Size() = 0; |
| }; |
| |
| class BufferPuffWriter : public PuffWriterInterface { |
| public: |
| // Sets the parameters of puff buffer. |
| // |
| // |puff_buf| IN The input puffed stream. It is owned by the caller and must |
| // be valid during the lifetime of the object. |
| // |puff_size| IN The size of the puffed stream. |
| BufferPuffWriter(uint8_t* puff_buf, size_t puff_size) |
| : puff_buf_out_(puff_buf), |
| puff_size_(puff_size), |
| index_(0), |
| len_index_(0), |
| cur_literals_length_(0), |
| state_(State::kWritingNonLiteral) {} |
| |
| ~BufferPuffWriter() override = default; |
| |
| bool Insert(const PuffData& pd) override; |
| bool Flush() override; |
| size_t Size() override; |
| |
| private: |
| // Flushes the literals into the output and resets the state. |
| bool FlushLiterals(); |
| |
| // The pointer to the puffed stream. This should not be deallocated. |
| uint8_t* puff_buf_out_; |
| |
| // The size of the puffed buffer. |
| size_t puff_size_; |
| |
| // The offset to the next data in the buffer. |
| size_t index_; |
| |
| // Marks where the length of data should be written after the |index_| has |
| // moved forward. |
| size_t len_index_; |
| |
| // The number of literals currently been written (or cached). |
| size_t cur_literals_length_; |
| |
| // States when writing into the puffed buffer. |
| enum class State { |
| kWritingNonLiteral = 0, |
| kWritingSmallLiteral, |
| kWritingLargeLiteral, |
| } state_; |
| |
| DISALLOW_COPY_AND_ASSIGN(BufferPuffWriter); |
| }; |
| |
| } // namespace puffin |
| |
| #endif // SRC_PUFF_WRITER_H_ |