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