15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: This code is not shared between Google and Chrome. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_QUIC_QUIC_RELIABLE_CLIENT_STREAM_H_ 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_QUIC_QUIC_RELIABLE_CLIENT_STREAM_H_ 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/ip_endpoint.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/upload_data_stream.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_request_info.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_info.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_stream.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/quic_data_stream.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QuicClientSession; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A client-initiated ReliableQuicStream. Instances of this class 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// are owned by the QuicClientSession which created them. 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NET_EXPORT_PRIVATE QuicReliableClientStream : public QuicDataStream { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delegate handles protocol specific behavior of a quic stream. 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class NET_EXPORT_PRIVATE Delegate { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Delegate() {} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when data is received. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns network error code. OK when it successfully receives data. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnDataReceived(const char* data, int length) = 0; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the stream is closed by the peer. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnClose(QuicErrorCode error) = 0; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when the stream is closed because of an error. 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnError(int error) = 0; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Returns true if sending of headers has completed. 41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual bool HasSendHeadersComplete() = 0; 42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Delegate() {} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Delegate); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicReliableClientStream(QuicStreamId id, 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicSession* session, 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BoundNetLog& net_log); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~QuicReliableClientStream(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // QuicDataStream 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual uint32 ProcessData(const char* data, uint32 data_len) OVERRIDE; 58ab8f6f0bd665d3c1ff476eb06c58c42630e462d4Ben Murdoch virtual void OnClose() OVERRIDE; 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void OnCanWrite() OVERRIDE; 60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual QuicPriority EffectivePriority() const OVERRIDE; 61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // While the server's set_priority shouldn't be called externally, the creator 63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // of client-side streams should be able to set the priority. 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) using QuicDataStream::set_priority; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int WriteStreamData(base::StringPiece data, 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool fin, 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const CompletionCallback& callback); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set new |delegate|. |delegate| must not be NULL. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this stream has already received data, OnDataReceived() will be 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // called on the delegate. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetDelegate(Delegate* delegate); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Delegate* GetDelegate() { return delegate_; } 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnError(int error); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Returns true if the stream can possible write data. (The socket may 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // turn out to be write blocked, of course). If the stream can not write, 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // this method returns false, and |callback| will be invoked when 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // it becomes writable. 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool CanWrite(const CompletionCallback& callback); 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BoundNetLog& net_log() const { return net_log_; } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) using QuicDataStream::HasBufferedData; 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BoundNetLog net_log_; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Delegate* delegate_; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CompletionCallback callback_; 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(QuicReliableClientStream); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NET_QUIC_QUIC_RELIABLE_CLIENT_STREAM_H_ 98