Home | History | Annotate | Download | only in websockets
      1 // Copyright 2013 The Chromium 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 NET_WEBSOCKETS_WEBSOCKET_DEFLATER_H_
      6 #define NET_WEBSOCKETS_WEBSOCKET_DEFLATER_H_
      7 
      8 #include <deque>
      9 #include <vector>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/memory/ref_counted.h"
     13 #include "base/memory/scoped_ptr.h"
     14 #include "net/base/net_export.h"
     15 
     16 extern "C" struct z_stream_s;
     17 
     18 namespace net {
     19 
     20 class IOBufferWithSize;
     21 
     22 class NET_EXPORT_PRIVATE WebSocketDeflater {
     23  public:
     24   // Do not reorder or remove entries of this enum. The values of them are used
     25   // in UMA.
     26   enum ContextTakeOverMode {
     27     DO_NOT_TAKE_OVER_CONTEXT,
     28     TAKE_OVER_CONTEXT,
     29     NUM_CONTEXT_TAKEOVER_MODE_TYPES,
     30   };
     31 
     32   explicit WebSocketDeflater(ContextTakeOverMode mode);
     33   ~WebSocketDeflater();
     34 
     35   // Returns true if there is no error and false otherwise.
     36   // This function must be called exactly once before calling any of
     37   // following methods.
     38   // |window_bits| must be between 8 and 15 (both inclusive).
     39   bool Initialize(int window_bits);
     40 
     41   // Adds bytes to |stream_|.
     42   // Returns true if there is no error and false otherwise.
     43   bool AddBytes(const char* data, size_t size);
     44 
     45   // Flushes the current processing data.
     46   // Returns true if there is no error and false otherwise.
     47   bool Finish();
     48 
     49   // Pushes "\x00\x00\xff\xff" to the end of the buffer.
     50   void PushSyncMark();
     51 
     52   // Returns the current deflated output.
     53   // If the current output is larger than |size| bytes,
     54   // returns the first |size| bytes of the current output.
     55   // The returned bytes will be dropped from the current output and never be
     56   // returned thereafter.
     57   scoped_refptr<IOBufferWithSize> GetOutput(size_t size);
     58 
     59   // Returns the size of the current deflated output.
     60   size_t CurrentOutputSize() const { return buffer_.size(); }
     61 
     62  private:
     63   void ResetContext();
     64   int Deflate(int flush);
     65 
     66   scoped_ptr<z_stream_s> stream_;
     67   ContextTakeOverMode mode_;
     68   std::deque<char> buffer_;
     69   std::vector<char> fixed_buffer_;
     70   // true if bytes were added after last Finish().
     71   bool are_bytes_added_;
     72 
     73   DISALLOW_COPY_AND_ASSIGN(WebSocketDeflater);
     74 };
     75 
     76 }  // namespace net
     77 
     78 #endif  // NET_WEBSOCKETS_WEBSOCKET_DEFLATER_H_
     79