| // Copyright (c) 2012 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. | 
 |  | 
 | #include "quic/core/quic_crypto_handshaker.h" | 
 |  | 
 | #include "quic/core/quic_session.h" | 
 |  | 
 | namespace quic { | 
 |  | 
 | #define ENDPOINT \ | 
 |   (session()->perspective() == Perspective::IS_SERVER ? "Server: " : "Client: ") | 
 |  | 
 | QuicCryptoHandshaker::QuicCryptoHandshaker(QuicCryptoStream* stream, | 
 |                                            QuicSession* session) | 
 |     : stream_(stream), session_(session), last_sent_handshake_message_tag_(0) { | 
 |   crypto_framer_.set_visitor(this); | 
 | } | 
 |  | 
 | QuicCryptoHandshaker::~QuicCryptoHandshaker() {} | 
 |  | 
 | void QuicCryptoHandshaker::SendHandshakeMessage( | 
 |     const CryptoHandshakeMessage& message, | 
 |     EncryptionLevel level) { | 
 |   QUIC_DVLOG(1) << ENDPOINT << "Sending " << message.DebugString(); | 
 |   session()->NeuterUnencryptedData(); | 
 |   session()->OnCryptoHandshakeMessageSent(message); | 
 |   last_sent_handshake_message_tag_ = message.tag(); | 
 |   const QuicData& data = message.GetSerialized(); | 
 |   stream_->WriteCryptoData(session_->use_write_or_buffer_data_at_level() | 
 |                                ? level | 
 |                                : session_->connection()->encryption_level(), | 
 |                            data.AsStringPiece()); | 
 | } | 
 |  | 
 | void QuicCryptoHandshaker::OnError(CryptoFramer* framer) { | 
 |   QUIC_DLOG(WARNING) << "Error processing crypto data: " | 
 |                      << QuicErrorCodeToString(framer->error()); | 
 | } | 
 |  | 
 | void QuicCryptoHandshaker::OnHandshakeMessage( | 
 |     const CryptoHandshakeMessage& message) { | 
 |   QUIC_DVLOG(1) << ENDPOINT << "Received " << message.DebugString(); | 
 |   session()->OnCryptoHandshakeMessageReceived(message); | 
 | } | 
 |  | 
 | CryptoMessageParser* QuicCryptoHandshaker::crypto_message_parser() { | 
 |   return &crypto_framer_; | 
 | } | 
 |  | 
 | size_t QuicCryptoHandshaker::BufferSizeLimitForLevel(EncryptionLevel) const { | 
 |   return GetQuicFlag(FLAGS_quic_max_buffered_crypto_bytes); | 
 | } | 
 |  | 
 | #undef ENDPOINT  // undef for jumbo builds | 
 | }  // namespace quic |