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