// 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 #include #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 QuicRandom; 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 ReleaseStream(); void set_stream(scoped_ptr stream); const BoundNetLog& net_log() const{ return net_log_; } private: QuicStreamFactory* factory_; HostPortProxyPair host_port_proxy_pair_; BoundNetLog net_log_; CompletionCallback callback_; scoped_ptr 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: QuicStreamFactory(HostResolver* host_resolver, ClientSocketFactory* client_socket_factory, QuicRandom* random_generator, 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 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); // Closes all current sessions. void CloseAllSessions(int error); base::Value* QuicStreamFactoryInfoToValue() const; private: class Job; typedef std::map SessionMap; typedef std::set AliasSet; typedef std::map SessionAliasMap; typedef std::set SessionSet; typedef std::map JobMap; typedef std::map RequestMap; typedef std::set RequestSet; typedef std::map 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 std::string& host, 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_; QuicRandom* random_generator_; scoped_ptr 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 weak_factory_; DISALLOW_COPY_AND_ASSIGN(QuicStreamFactory); }; } // namespace net #endif // NET_QUIC_QUIC_STREAM_FACTORY_H_