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 // A server specific QuicSession subclass. 6 7 #ifndef NET_TOOLS_QUIC_QUIC_SERVER_SESSION_H_ 8 #define NET_TOOLS_QUIC_QUIC_SERVER_SESSION_H_ 9 10 #include <set> 11 #include <vector> 12 13 #include "base/basictypes.h" 14 #include "base/containers/hash_tables.h" 15 #include "base/memory/scoped_ptr.h" 16 #include "net/quic/quic_crypto_server_stream.h" 17 #include "net/quic/quic_protocol.h" 18 #include "net/quic/quic_session.h" 19 20 namespace net { 21 22 class QuicBlockedWriterInterface; 23 class QuicConfig; 24 class QuicConnection; 25 class QuicCryptoServerConfig; 26 class ReliableQuicStream; 27 28 namespace tools { 29 30 namespace test { 31 class QuicServerSessionPeer; 32 } // namespace test 33 34 // An interface from the session to the entity owning the session. 35 // This lets the session notify its owner (the Dispatcher) when the connection 36 // is closed or blocked. 37 class QuicServerSessionVisitor { 38 public: 39 virtual ~QuicServerSessionVisitor() {} 40 41 virtual void OnConnectionClosed(QuicConnectionId connection_id, 42 QuicErrorCode error) = 0; 43 virtual void OnWriteBlocked(QuicBlockedWriterInterface* writer) = 0; 44 }; 45 46 class QuicServerSession : public QuicSession { 47 public: 48 QuicServerSession(const QuicConfig& config, 49 QuicConnection* connection, 50 QuicServerSessionVisitor* visitor); 51 52 // Override the base class to notify the owner of the connection close. 53 virtual void OnConnectionClosed(QuicErrorCode error, bool from_peer) OVERRIDE; 54 virtual void OnWriteBlocked() OVERRIDE; 55 56 virtual ~QuicServerSession(); 57 58 virtual void InitializeSession(const QuicCryptoServerConfig& crypto_config); 59 60 const QuicCryptoServerStream* crypto_stream() const { 61 return crypto_stream_.get(); 62 } 63 64 protected: 65 // QuicSession methods: 66 virtual QuicDataStream* CreateIncomingDataStream(QuicStreamId id) OVERRIDE; 67 virtual QuicDataStream* CreateOutgoingDataStream() OVERRIDE; 68 virtual QuicCryptoServerStream* GetCryptoStream() OVERRIDE; 69 70 // If we should create an incoming stream, returns true. Otherwise 71 // does error handling, including communicating the error to the client and 72 // possibly closing the connection, and returns false. 73 virtual bool ShouldCreateIncomingDataStream(QuicStreamId id); 74 75 virtual QuicCryptoServerStream* CreateQuicCryptoServerStream( 76 const QuicCryptoServerConfig& crypto_config); 77 78 private: 79 friend class test::QuicServerSessionPeer; 80 81 scoped_ptr<QuicCryptoServerStream> crypto_stream_; 82 QuicServerSessionVisitor* visitor_; 83 84 DISALLOW_COPY_AND_ASSIGN(QuicServerSession); 85 }; 86 87 } // namespace tools 88 } // namespace net 89 90 #endif // NET_TOOLS_QUIC_QUIC_SERVER_SESSION_H_ 91