| // 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. |
| |
| #ifndef NET_QUIC_QUIC_STREAM_FACTORY_H_ |
| #define NET_QUIC_QUIC_STREAM_FACTORY_H_ |
| |
| #include <map> |
| |
| #include "base/callback.h" |
| #include "base/memory/weak_ptr.h" |
| #include "net/base/address_list.h" |
| #include "net/base/completion_callback.h" |
| #include "net/base/host_port_pair.h" |
| #include "net/base/net_log.h" |
| #include "net/proxy/proxy_server.h" |
| #include "net/quic/quic_http_stream.h" |
| #include "net/quic/quic_protocol.h" |
| |
| namespace net { |
| |
| class HostResolver; |
| class ClientSocketFactory; |
| class QuicClock; |
| class QuicClientSession; |
| class QuicStreamFactory; |
| |
| // Encapsulates a pending request for a QuicHttpStream. |
| // If the request is still pending when it is destroyed, it will |
| // cancel the request with the factory. |
| class NET_EXPORT_PRIVATE QuicStreamRequest { |
| public: |
| explicit QuicStreamRequest(QuicStreamFactory* factory); |
| ~QuicStreamRequest(); |
| |
| int Request(const HostPortProxyPair& host_port_proxy_pair, |
| const BoundNetLog& net_log, |
| const CompletionCallback& callback); |
| |
| void OnRequestComplete(int rv); |
| |
| scoped_ptr<QuicHttpStream> ReleaseStream(); |
| |
| void set_stream(scoped_ptr<QuicHttpStream> stream); |
| |
| const BoundNetLog& net_log() const{ |
| return net_log_; |
| } |
| |
| private: |
| QuicStreamFactory* factory_; |
| HostPortProxyPair host_port_proxy_pair_; |
| BoundNetLog net_log_; |
| CompletionCallback callback_; |
| scoped_ptr<QuicHttpStream> stream_; |
| |
| DISALLOW_COPY_AND_ASSIGN(QuicStreamRequest); |
| }; |
| |
| // A factory for creating new QuicHttpStreams on top of a pool of |
| // QuicClientSessions. |
| class NET_EXPORT_PRIVATE QuicStreamFactory { |
| public: |
| typedef base::Callback<uint64()> RandomUint64Callback; |
| |
| QuicStreamFactory(HostResolver* host_resolver, |
| ClientSocketFactory* client_socket_factory, |
| const RandomUint64Callback& random_uint64_callback, |
| QuicClock* clock); |
| virtual ~QuicStreamFactory(); |
| |
| // Creates a new QuicHttpStream to |host_port_proxy_pair| which will be |
| // owned by |request|. If a matching session already exists, this |
| // method will return OK. If no matching session exists, this will |
| // return ERR_IO_PENDING and will invoke OnRequestComplete asynchronously. |
| int Create(const HostPortProxyPair& host_port_proxy_pair, |
| const BoundNetLog& net_log, |
| QuicStreamRequest* request); |
| |
| // Returns a newly created QuicHttpStream owned by the caller, if a |
| // matching session already exists. Returns NULL otherwise. |
| scoped_ptr<QuicHttpStream> CreateIfSessionExists( |
| const HostPortProxyPair& host_port_proxy_pair, |
| const BoundNetLog& net_log); |
| |
| // Called by a session when it becomes idle. |
| void OnIdleSession(QuicClientSession* session); |
| |
| // Called by a session after it shuts down. |
| void OnSessionClose(QuicClientSession* session); |
| |
| // Cancels a pending request. |
| void CancelRequest(QuicStreamRequest* request); |
| |
| private: |
| class Job; |
| |
| typedef std::map<HostPortProxyPair, QuicClientSession*> SessionMap; |
| typedef std::set<HostPortProxyPair> AliasSet; |
| typedef std::map<QuicClientSession*, AliasSet> SessionAliasMap; |
| typedef std::set<QuicClientSession*> SessionSet; |
| typedef std::map<HostPortProxyPair, Job*> JobMap; |
| typedef std::map<QuicStreamRequest*, Job*> RequestMap; |
| typedef std::set<QuicStreamRequest*> RequestSet; |
| typedef std::map<Job*, RequestSet> JobRequestsMap; |
| |
| void OnJobComplete(Job* job, int rv); |
| bool HasActiveSession(const HostPortProxyPair& host_port_proxy_pair); |
| bool HasActiveJob(const HostPortProxyPair& host_port_proxy_pair); |
| QuicClientSession* CreateSession(const AddressList& address_list_, |
| const BoundNetLog& net_log); |
| void ActivateSession(const HostPortProxyPair& host_port_proxy_pair, |
| QuicClientSession* session); |
| |
| HostResolver* host_resolver_; |
| ClientSocketFactory* client_socket_factory_; |
| RandomUint64Callback random_uint64_callback_; |
| scoped_ptr<QuicClock> clock_; |
| |
| // Contains owning pointers to all sessions that currently exist. |
| SessionSet all_sessions_; |
| // Contains non-owning pointers to currently active session |
| // (not going away session, once they're implemented). |
| SessionMap active_sessions_; |
| SessionAliasMap session_aliases_; |
| |
| JobMap active_jobs_; |
| JobRequestsMap job_requests_map_; |
| RequestMap active_requests_; |
| |
| base::WeakPtrFactory<QuicStreamFactory> weak_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(QuicStreamFactory); |
| }; |
| |
| } // namespace net |
| |
| #endif // NET_QUIC_QUIC_STREAM_FACTORY_H_ |