11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file.
41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#ifndef NET_WEBSOCKETS_WEBSOCKET_DEFLATE_PREDICTOR_H_
61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define NET_WEBSOCKETS_WEBSOCKET_DEFLATE_PREDICTOR_H_
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/basictypes.h"
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/memory/scoped_vector.h"
101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "net/base/net_export.h"
111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace net {
131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)struct WebSocketFrame;
151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// WebSocketDeflatePredictor is an interface class used for judging whether
171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// a WebSocketDeflateStream should compress a message or not.
181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class NET_EXPORT_PRIVATE WebSocketDeflatePredictor {
191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public:
201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  enum Result {
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Deflate and send the message.
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DEFLATE,
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Do not deflate and send the original message.
241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DO_NOT_DEFLATE,
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Try compressing the message and send the smaller one of the original
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // and the compressed message.
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Returning this result implies that the deflater is running on
281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // DoNotTakeOverContext mode and the entire message is visible.
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    TRY_DEFLATE,
301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  };
311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual ~WebSocketDeflatePredictor() {}
331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Predicts and returns whether the deflater should deflate the message
351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // which begins with |frames[frame_index]| or not.
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // |frames[(frame_index + 1):]| consists of future frames if any.
371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // |frames[frame_index]| must be the first frame of a data message,
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // but future frames may contain control message frames.
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // |frames[frame_index]| cannot be recorded yet and all preceding
401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // data frames have to be already recorded when this method is called.
411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual Result Predict(const ScopedVector<WebSocketFrame>& frames,
421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                         size_t frame_index) = 0;
431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Records frame data for future prediction.
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Only data frames should be recorded. Do not pass control frames' data.
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // All input data frames for the stream must be recorded in order.
471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void RecordInputDataFrame(const WebSocketFrame* frame) = 0;
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Records frame data for future prediction.
501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Only data frames should be recorded. Do not pass control frames' data.
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // All data frames written by the stream must be recorded in order
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // regardless of whether they are compressed or not.
531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void RecordWrittenDataFrame(const WebSocketFrame* frame) = 0;
541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace net
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif  // NET_WEBSOCKETS_WEBSOCKET_DEFLATE_PREDICTOR_H_
59