Home | History | Annotate | Download | only in quic
      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