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