// Copyright 2013 The Chromium 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 NET_WEBSOCKETS_WEBSOCKET_DEFLATER_H_ #define NET_WEBSOCKETS_WEBSOCKET_DEFLATER_H_ #include <deque> #include <vector> #include "base/basictypes.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "net/base/net_export.h" extern "C" struct z_stream_s; namespace net { class IOBufferWithSize; class NET_EXPORT_PRIVATE WebSocketDeflater { public: // Do not reorder or remove entries of this enum. The values of them are used // in UMA. enum ContextTakeOverMode { DO_NOT_TAKE_OVER_CONTEXT, TAKE_OVER_CONTEXT, NUM_CONTEXT_TAKEOVER_MODE_TYPES, }; explicit WebSocketDeflater(ContextTakeOverMode mode); ~WebSocketDeflater(); // Returns true if there is no error and false otherwise. // This function must be called exactly once before calling any of // following methods. // |window_bits| must be between 8 and 15 (both inclusive). bool Initialize(int window_bits); // Adds bytes to |stream_|. // Returns true if there is no error and false otherwise. bool AddBytes(const char* data, size_t size); // Flushes the current processing data. // Returns true if there is no error and false otherwise. bool Finish(); // Pushes "\x00\x00\xff\xff" to the end of the buffer. void PushSyncMark(); // Returns the current deflated output. // If the current output is larger than |size| bytes, // returns the first |size| bytes of the current output. // The returned bytes will be dropped from the current output and never be // returned thereafter. scoped_refptr<IOBufferWithSize> GetOutput(size_t size); // Returns the size of the current deflated output. size_t CurrentOutputSize() const { return buffer_.size(); } private: void ResetContext(); int Deflate(int flush); scoped_ptr<z_stream_s> stream_; ContextTakeOverMode mode_; std::deque<char> buffer_; std::vector<char> fixed_buffer_; // true if bytes were added after last Finish(). bool are_bytes_added_; DISALLOW_COPY_AND_ASSIGN(WebSocketDeflater); }; } // namespace net #endif // NET_WEBSOCKETS_WEBSOCKET_DEFLATER_H_