1// Copyright (c) 2011 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_FRAME_HANDLER_H_
6#define NET_WEBSOCKETS_WEBSOCKET_FRAME_HANDLER_H_
7#pragma once
8
9#include <deque>
10#include <vector>
11
12#include "base/basictypes.h"
13#include "base/memory/ref_counted.h"
14
15namespace net {
16
17class IOBuffer;
18class IOBufferWithSize;
19
20// Handles WebSocket frame messages.
21class WebSocketFrameHandler {
22 public:
23  struct FrameInfo {
24    const char* frame_start;
25    int frame_length;
26    const char* message_start;
27    int message_length;
28  };
29
30  WebSocketFrameHandler();
31  ~WebSocketFrameHandler();
32
33  // Appends WebSocket raw data on connection.
34  // For sending, this is data from WebKit.
35  // For receiving, this is data from network.
36  void AppendData(const char* data, int len);
37
38  // Updates current IOBuffer.
39  // If |buffered| is true, it tries to find WebSocket frames.
40  // Otherwise, it just picks the first buffer in |pending_buffers_|.
41  // Returns available size of data, 0 if no more data or current buffer was
42  // not released, and negative if some error occurred.
43  int UpdateCurrentBuffer(bool buffered);
44
45  // Gets current IOBuffer.
46  // For sending, this is data to network.
47  // For receiving, this is data to WebKit.
48  // Returns NULL just after ReleaseCurrentBuffer() was called.
49  IOBuffer* GetCurrentBuffer() { return current_buffer_.get(); }
50  int GetCurrentBufferSize() const { return current_buffer_size_; }
51
52  // Returns original buffer size of current IOBuffer.
53  // This might differ from GetCurrentBufferSize() if frame message is
54  // compressed or decompressed.
55  int GetOriginalBufferSize() const { return original_current_buffer_size_; }
56
57  // Releases current IOBuffer.
58  void ReleaseCurrentBuffer();
59
60  // Parses WebSocket frame in [|buffer|, |buffer|+|size|), fills frame
61  // information in |frame_info|, and returns number of bytes for
62  // complete WebSocket frames.
63  static int ParseWebSocketFrame(const char* buffer, int size,
64                                 std::vector<FrameInfo>* frame_info);
65
66 private:
67  typedef std::deque< scoped_refptr<IOBufferWithSize> > PendingDataQueue;
68
69  scoped_refptr<IOBuffer> current_buffer_;
70  int current_buffer_size_;
71
72  int original_current_buffer_size_;
73
74  // Deque of IOBuffers in pending.
75  PendingDataQueue pending_buffers_;
76
77  DISALLOW_COPY_AND_ASSIGN(WebSocketFrameHandler);
78};
79
80}  // namespace net
81
82#endif  // NET_WEBSOCKETS_WEBSOCKET_FRAME_HANDLER_H_
83