130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Copyright 2014 The Chromium Authors. All rights reserved. 230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Use of this source code is governed by a BSD-style license that can be 330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// found in the LICENSE file. 430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifndef NET_SOCKET_WEBSOCKET_TRANSPORT_CONNECT_SUB_JOB_H_ 630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define NET_SOCKET_WEBSOCKET_TRANSPORT_CONNECT_SUB_JOB_H_ 730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "base/compiler_specific.h" 930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "base/macros.h" 1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "base/memory/scoped_ptr.h" 1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "net/base/address_list.h" 1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "net/base/load_states.h" 1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "net/socket/websocket_endpoint_lock_manager.h" 1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "net/socket/websocket_transport_client_socket_pool.h" 1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace net { 1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass BoundNetLog; 1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass ClientSocketFactory; 2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass IPEndPoint; 2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass StreamSocket; 2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Attempts to connect to a subset of the addresses required by a 2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// WebSocketTransportConnectJob, specifically either the IPv4 or IPv6 2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// addresses. Each address is tried in turn, and parent_job->OnSubJobComplete() 2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// is called when the first address succeeds or the last address fails. 2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass WebSocketTransportConnectSubJob 2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun : public WebSocketEndpointLockManager::Waiter { 2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public: 3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun typedef WebSocketTransportConnectJob::SubJobType SubJobType; 3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun WebSocketTransportConnectSubJob(const AddressList& addresses, 3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun WebSocketTransportConnectJob* parent_job, 3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun SubJobType type); 35 36 virtual ~WebSocketTransportConnectSubJob(); 37 38 // Start connecting. 39 int Start(); 40 41 bool started() { return next_state_ != STATE_NONE; } 42 43 LoadState GetLoadState() const; 44 45 SubJobType type() const { return type_; } 46 47 scoped_ptr<StreamSocket> PassSocket() { return transport_socket_.Pass(); } 48 49 // Implementation of WebSocketEndpointLockManager::EndpointWaiter. 50 virtual void GotEndpointLock() OVERRIDE; 51 52 private: 53 enum State { 54 STATE_NONE, 55 STATE_OBTAIN_LOCK, 56 STATE_OBTAIN_LOCK_COMPLETE, 57 STATE_TRANSPORT_CONNECT, 58 STATE_TRANSPORT_CONNECT_COMPLETE, 59 STATE_DONE, 60 }; 61 62 ClientSocketFactory* client_socket_factory() const; 63 64 const BoundNetLog& net_log() const; 65 66 const IPEndPoint& CurrentAddress() const; 67 68 void OnIOComplete(int result); 69 int DoLoop(int result); 70 int DoEndpointLock(); 71 int DoEndpointLockComplete(); 72 int DoTransportConnect(); 73 int DoTransportConnectComplete(int result); 74 75 WebSocketTransportConnectJob* const parent_job_; 76 77 const AddressList addresses_; 78 size_t current_address_index_; 79 80 State next_state_; 81 const SubJobType type_; 82 83 scoped_ptr<StreamSocket> transport_socket_; 84 85 DISALLOW_COPY_AND_ASSIGN(WebSocketTransportConnectSubJob); 86}; 87 88} // namespace net 89 90#endif // NET_SOCKET_WEBSOCKET_TRANSPORT_CONNECT_SUB_JOB_H_ 91