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