#ifndef NET_WEBSOCKETS_WEBSOCKET_DEFLATER_H_
#define NET_WEBSOCKETS_WEBSOCKET_DEFLATER_H_
#include <stddef.h>
#include <memory>
#include <vector>
#include "base/containers/circular_deque.h"
#include "base/containers/span.h"
#include "base/memory/scoped_refptr.h"
#include "net/base/net_export.h"
extern "C" struct z_stream_s;
namespace net {
class IOBufferWithSize;
class NET_EXPORT_PRIVATE WebSocketDeflater {
public:
enum ContextTakeOverMode {
DO_NOT_TAKE_OVER_CONTEXT,
TAKE_OVER_CONTEXT,
NUM_CONTEXT_TAKEOVER_MODE_TYPES,
};
explicit WebSocketDeflater(ContextTakeOverMode mode);
WebSocketDeflater(const WebSocketDeflater&) = delete;
WebSocketDeflater& operator=(const WebSocketDeflater&) = delete;
~WebSocketDeflater();
bool Initialize(int window_bits);
bool AddBytes(base::span<const uint8_t> data);
bool Finish();
void PushSyncMark();
scoped_refptr<IOBufferWithSize> GetOutput(size_t size);
size_t CurrentOutputSize() const { return buffer_.size(); }
private:
void ResetContext();
int Deflate(int flush);
std::unique_ptr<z_stream_s> stream_;
ContextTakeOverMode mode_;
base::circular_deque<uint8_t> buffer_;
std::vector<uint8_t> fixed_buffer_;
bool are_bytes_added_ = false;
};
}
#endif