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
16extern "C" struct z_stream_s;
17
18namespace net {
19
20class IOBufferWithSize;
21
22class 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