xref: /aosp_15_r20/external/cronet/net/websockets/websocket_deflater.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef NET_WEBSOCKETS_WEBSOCKET_DEFLATER_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_WEBSOCKETS_WEBSOCKET_DEFLATER_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include <memory>
11*6777b538SAndroid Build Coastguard Worker #include <vector>
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include "base/containers/circular_deque.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h"
15*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h"
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker extern "C" struct z_stream_s;
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker namespace net {
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker class IOBufferWithSize;
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE WebSocketDeflater {
24*6777b538SAndroid Build Coastguard Worker  public:
25*6777b538SAndroid Build Coastguard Worker   enum ContextTakeOverMode {
26*6777b538SAndroid Build Coastguard Worker     DO_NOT_TAKE_OVER_CONTEXT,
27*6777b538SAndroid Build Coastguard Worker     TAKE_OVER_CONTEXT,
28*6777b538SAndroid Build Coastguard Worker     NUM_CONTEXT_TAKEOVER_MODE_TYPES,
29*6777b538SAndroid Build Coastguard Worker   };
30*6777b538SAndroid Build Coastguard Worker 
31*6777b538SAndroid Build Coastguard Worker   explicit WebSocketDeflater(ContextTakeOverMode mode);
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker   WebSocketDeflater(const WebSocketDeflater&) = delete;
34*6777b538SAndroid Build Coastguard Worker   WebSocketDeflater& operator=(const WebSocketDeflater&) = delete;
35*6777b538SAndroid Build Coastguard Worker 
36*6777b538SAndroid Build Coastguard Worker   ~WebSocketDeflater();
37*6777b538SAndroid Build Coastguard Worker 
38*6777b538SAndroid Build Coastguard Worker   // Returns true if there is no error and false otherwise.
39*6777b538SAndroid Build Coastguard Worker   // This function must be called exactly once before calling any of
40*6777b538SAndroid Build Coastguard Worker   // following methods.
41*6777b538SAndroid Build Coastguard Worker   // |window_bits| must be between 8 and 15 (both inclusive).
42*6777b538SAndroid Build Coastguard Worker   bool Initialize(int window_bits);
43*6777b538SAndroid Build Coastguard Worker 
44*6777b538SAndroid Build Coastguard Worker   // Adds bytes to |stream_|.
45*6777b538SAndroid Build Coastguard Worker   // Returns true if there is no error and false otherwise.
46*6777b538SAndroid Build Coastguard Worker   bool AddBytes(const char* data, size_t size);
47*6777b538SAndroid Build Coastguard Worker 
48*6777b538SAndroid Build Coastguard Worker   // Flushes the current processing data.
49*6777b538SAndroid Build Coastguard Worker   // Returns true if there is no error and false otherwise.
50*6777b538SAndroid Build Coastguard Worker   bool Finish();
51*6777b538SAndroid Build Coastguard Worker 
52*6777b538SAndroid Build Coastguard Worker   // Pushes "\x00\x00\xff\xff" to the end of the buffer.
53*6777b538SAndroid Build Coastguard Worker   void PushSyncMark();
54*6777b538SAndroid Build Coastguard Worker 
55*6777b538SAndroid Build Coastguard Worker   // Returns the current deflated output.
56*6777b538SAndroid Build Coastguard Worker   // If the current output is larger than |size| bytes,
57*6777b538SAndroid Build Coastguard Worker   // returns the first |size| bytes of the current output.
58*6777b538SAndroid Build Coastguard Worker   // The returned bytes will be dropped from the current output and never be
59*6777b538SAndroid Build Coastguard Worker   // returned thereafter.
60*6777b538SAndroid Build Coastguard Worker   scoped_refptr<IOBufferWithSize> GetOutput(size_t size);
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker   // Returns the size of the current deflated output.
CurrentOutputSize()63*6777b538SAndroid Build Coastguard Worker   size_t CurrentOutputSize() const { return buffer_.size(); }
64*6777b538SAndroid Build Coastguard Worker 
65*6777b538SAndroid Build Coastguard Worker  private:
66*6777b538SAndroid Build Coastguard Worker   void ResetContext();
67*6777b538SAndroid Build Coastguard Worker   int Deflate(int flush);
68*6777b538SAndroid Build Coastguard Worker 
69*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<z_stream_s> stream_;
70*6777b538SAndroid Build Coastguard Worker   ContextTakeOverMode mode_;
71*6777b538SAndroid Build Coastguard Worker   base::circular_deque<char> buffer_;
72*6777b538SAndroid Build Coastguard Worker   std::vector<char> fixed_buffer_;
73*6777b538SAndroid Build Coastguard Worker   // true if bytes were added after last Finish().
74*6777b538SAndroid Build Coastguard Worker   bool are_bytes_added_ = false;
75*6777b538SAndroid Build Coastguard Worker };
76*6777b538SAndroid Build Coastguard Worker 
77*6777b538SAndroid Build Coastguard Worker }  // namespace net
78*6777b538SAndroid Build Coastguard Worker 
79*6777b538SAndroid Build Coastguard Worker #endif  // NET_WEBSOCKETS_WEBSOCKET_DEFLATER_H_
80