Home | History | Annotate | Download | only in src
      1 // Copyright 2017 The Chromium OS Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef SRC_PUFF_WRITER_H_
      6 #define SRC_PUFF_WRITER_H_
      7 
      8 #include <cstddef>
      9 #include <cstdint>
     10 
     11 #include "puffin/src/include/puffin/common.h"
     12 #include "puffin/src/puff_data.h"
     13 
     14 namespace puffin {
     15 
     16 // An abstract class for writing data into a puffed buffer. Data can be
     17 // literals, lengths, distances, or metadata. Extensions of this class can
     18 // define how the puffed data should reside in the puffed buffer.
     19 class PuffWriterInterface {
     20  public:
     21   virtual ~PuffWriterInterface() = default;
     22 
     23   // Inserts data. This function does not need to check for the validity of data
     24   // . e.g. length > 285, etc.
     25   //
     26   // |pd|          IN   The data to put into the puffed buffer. |pd.type|
     27   //                    defines the type of the data.
     28   // Returns false if it fails.
     29   virtual bool Insert(const PuffData& pd) = 0;
     30 
     31   // Fluesh any buffer or internal state to the output.
     32   // Returns false if it fails.
     33   virtual bool Flush() = 0;
     34 
     35   // Returns the number of bytes processed and written into the puff buffer.
     36   virtual size_t Size() = 0;
     37 };
     38 
     39 class BufferPuffWriter : public PuffWriterInterface {
     40  public:
     41   // Sets the parameters of puff buffer.
     42   //
     43   // |puff_buf|  IN  The input puffed stream. It is owned by the caller and must
     44   //                 be valid during the lifetime of the object.
     45   // |puff_size| IN  The size of the puffed stream.
     46   BufferPuffWriter(uint8_t* puff_buf, size_t puff_size)
     47       : puff_buf_out_(puff_buf),
     48         puff_size_(puff_size),
     49         index_(0),
     50         len_index_(0),
     51         cur_literals_length_(0),
     52         state_(State::kWritingNonLiteral) {}
     53 
     54   ~BufferPuffWriter() override = default;
     55 
     56   bool Insert(const PuffData& pd) override;
     57   bool Flush() override;
     58   size_t Size() override;
     59 
     60  private:
     61   // Flushes the literals into the output and resets the state.
     62   bool FlushLiterals();
     63 
     64   // The pointer to the puffed stream. This should not be deallocated.
     65   uint8_t* puff_buf_out_;
     66 
     67   // The size of the puffed buffer.
     68   size_t puff_size_;
     69 
     70   // The offset to the next data in the buffer.
     71   size_t index_;
     72 
     73   // Marks where the length of data should be written after the |index_| has
     74   // moved forward.
     75   size_t len_index_;
     76 
     77   // The number of literals currently been written (or cached).
     78   size_t cur_literals_length_;
     79 
     80   // States when writing into the puffed buffer.
     81   enum class State {
     82     kWritingNonLiteral = 0,
     83     kWritingSmallLiteral,
     84     kWritingLargeLiteral,
     85   } state_;
     86 
     87   DISALLOW_COPY_AND_ASSIGN(BufferPuffWriter);
     88 };
     89 
     90 }  // namespace puffin
     91 
     92 #endif  // SRC_PUFF_WRITER_H_
     93