1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/tools/quic/quic_client_session.h"
6
7#include "base/logging.h"
8#include "net/quic/crypto/crypto_protocol.h"
9#include "net/quic/quic_server_id.h"
10#include "net/tools/quic/quic_spdy_client_stream.h"
11
12using std::string;
13
14namespace net {
15namespace tools {
16
17QuicClientSession::QuicClientSession(const QuicConfig& config,
18                                     QuicConnection* connection)
19    : QuicClientSessionBase(connection, config) {
20}
21
22QuicClientSession::~QuicClientSession() {
23}
24
25void QuicClientSession::InitializeSession(
26    const QuicServerId& server_id,
27    QuicCryptoClientConfig* crypto_config) {
28  QuicClientSessionBase::InitializeSession();
29  crypto_stream_.reset(
30      new QuicCryptoClientStream(server_id, this, NULL, crypto_config));
31}
32
33void QuicClientSession::OnProofValid(
34    const QuicCryptoClientConfig::CachedState& /*cached*/) {
35}
36
37void QuicClientSession::OnProofVerifyDetailsAvailable(
38    const ProofVerifyDetails& /*verify_details*/) {
39}
40
41QuicSpdyClientStream* QuicClientSession::CreateOutgoingDataStream() {
42  if (!crypto_stream_->encryption_established()) {
43    DVLOG(1) << "Encryption not active so no outgoing stream created.";
44    return NULL;
45  }
46  if (GetNumOpenStreams() >= get_max_open_streams()) {
47    DVLOG(1) << "Failed to create a new outgoing stream. "
48             << "Already " << GetNumOpenStreams() << " open.";
49    return NULL;
50  }
51  if (goaway_received()) {
52    DVLOG(1) << "Failed to create a new outgoing stream. "
53             << "Already received goaway.";
54    return NULL;
55  }
56  QuicSpdyClientStream* stream
57      = new QuicSpdyClientStream(GetNextStreamId(), this);
58  ActivateStream(stream);
59  return stream;
60}
61
62QuicCryptoClientStream* QuicClientSession::GetCryptoStream() {
63  return crypto_stream_.get();
64}
65
66bool QuicClientSession::CryptoConnect() {
67  DCHECK(flow_controller());
68  return crypto_stream_->CryptoConnect();
69}
70
71int QuicClientSession::GetNumSentClientHellos() const {
72  return crypto_stream_->num_sent_client_hellos();
73}
74
75QuicDataStream* QuicClientSession::CreateIncomingDataStream(
76    QuicStreamId id) {
77  DLOG(ERROR) << "Server push not supported";
78  return NULL;
79}
80
81}  // namespace tools
82}  // namespace net
83