blob: 9f8d94729654bcf2a1ff85e81d5c4affa73e34c6 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef NET_QUIC_P2P_QUIC_P2P_SESSION_H_
#define NET_QUIC_P2P_QUIC_P2P_SESSION_H_
#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
#include "base/strings/string_piece.h"
#include "net/quic/p2p/quic_p2p_stream.h"
#include "net/quic/quic_client_session_base.h"
#include "net/quic/quic_protocol.h"
namespace net {
class QuicConfig;
class QuicConnection;
class QuicP2PCryptoStream;
class QuicP2PCryptoConfig;
class Socket;
class IOBuffer;
// QuicP2PSession represents a QUIC session over peer-to-peer transport
// specified by |socket|. There is no handshake performed by this class, i.e.
// the handshake is expected to happen out-of-bound before QuicP2PSession is
// created. The out-of-bound handshake should generate the following parameters
// passed to the constructor:
// 1. Negotiated QuicConfig.
// 2. Secret key exchanged with the peer on the other end of the |socket|.
// This key is passed to the constructor as part of the |crypto_config|.
class NET_EXPORT QuicP2PSession : public QuicSession {
public:
class Delegate {
public:
virtual void OnIncomingStream(QuicP2PStream* stream) = 0;
virtual void OnConnectionClosed(QuicErrorCode error) = 0;
};
// |config| must be already negotiated. |crypto_config| contains a secret key
// shared with the peer.
QuicP2PSession(const QuicConfig& config,
const QuicP2PCryptoConfig& crypto_config,
scoped_ptr<QuicConnection> connection,
scoped_ptr<Socket> socket);
~QuicP2PSession() override;
// QuicSession overrides.
void Initialize() override;
QuicP2PStream* CreateOutgoingDynamicStream(
net::SpdyPriority priority) override;
// QuicConnectionVisitorInterface overrides.
void OnConnectionClosed(QuicErrorCode error, bool from_peer) override;
void SetDelegate(Delegate* delegate);
protected:
// QuicSession overrides.
QuicCryptoStream* GetCryptoStream() override;
QuicP2PStream* CreateIncomingDynamicStream(QuicStreamId id) override;
QuicP2PSession* CreateDataStream(QuicStreamId id);
private:
enum ReadState {
READ_STATE_DO_READ,
READ_STATE_DO_READ_COMPLETE,
};
void DoReadLoop(int result);
int DoRead();
int DoReadComplete(int result);
scoped_ptr<Socket> socket_;
scoped_ptr<QuicP2PCryptoStream> crypto_stream_;
Delegate* delegate_ = nullptr;
ReadState read_state_ = READ_STATE_DO_READ;
scoped_refptr<IOBuffer> read_buffer_;
DISALLOW_COPY_AND_ASSIGN(QuicP2PSession);
};
} // namespace net
#endif // NET_QUIC_P2P_QUIC_P2P_SESSION_H_