| // Copyright 2018 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 SERVICES_NETWORK_TCP_BOUND_SOCKET_H_ |
| #define SERVICES_NETWORK_TCP_BOUND_SOCKET_H_ |
| |
| #include <memory> |
| |
| #include "base/component_export.h" |
| #include "base/macros.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/weak_ptr.h" |
| #include "mojo/public/cpp/bindings/binding_set.h" |
| #include "mojo/public/cpp/bindings/interface_request.h" |
| #include "net/base/ip_endpoint.h" |
| #include "net/socket/tcp_socket.h" |
| #include "net/traffic_annotation/network_traffic_annotation.h" |
| #include "services/network/public/mojom/tcp_socket.mojom.h" |
| #include "services/network/tcp_server_socket.h" |
| |
| namespace net { |
| class IPEndPoint; |
| class NetLog; |
| } // namespace net |
| |
| namespace network { |
| class SocketFactory; |
| |
| // A socket bound to an address. Can be converted into either a TCPServerSocket |
| // or a TCPConnectedSocket. |
| class COMPONENT_EXPORT(NETWORK_SERVICE) TCPBoundSocket |
| : public mojom::TCPBoundSocket { |
| public: |
| // Constructs a TCPBoundSocket. |socket_factory| must outlive |this|. When a |
| // new connection is accepted, |socket_factory| will be notified to take |
| // ownership of the connection. |
| TCPBoundSocket(SocketFactory* socket_factory, |
| net::NetLog* net_log, |
| const net::NetworkTrafficAnnotationTag& traffic_annotation); |
| ~TCPBoundSocket() override; |
| |
| // Attempts to bind a socket to the specified address. Returns net::OK on |
| // success, setting |local_addr_out| to the bound address. Returns a network |
| // error code on failure. Must be called before Listen() or Connect(). |
| int Bind(const net::IPEndPoint& local_addr, net::IPEndPoint* local_addr_out); |
| |
| // Sets the id used to remove the socket from the owning BindingSet. Must be |
| // called before Listen() or Connect(). |
| void set_id(mojo::BindingId binding_id) { binding_id_ = binding_id; } |
| |
| // mojom::TCPBoundSocket implementation. |
| void Listen(uint32_t backlog, |
| mojom::TCPServerSocketRequest request, |
| ListenCallback callback) override; |
| void Connect(const net::AddressList& remote_addr, |
| mojom::TCPConnectedSocketOptionsPtr tcp_connected_socket_options, |
| mojom::TCPConnectedSocketRequest request, |
| mojom::SocketObserverPtr observer, |
| ConnectCallback callback) override; |
| |
| private: |
| void OnConnectComplete(int result, |
| const base::Optional<net::IPEndPoint>& local_addr, |
| const base::Optional<net::IPEndPoint>& peer_addr, |
| mojo::ScopedDataPipeConsumerHandle receive_stream, |
| mojo::ScopedDataPipeProducerHandle send_stream); |
| |
| virtual int ListenInternal(int backlog); |
| |
| net::IPEndPoint bind_address_; |
| |
| mojo::BindingId binding_id_ = -1; |
| SocketFactory* const socket_factory_; |
| std::unique_ptr<net::TCPSocket> socket_; |
| const net::NetworkTrafficAnnotationTag traffic_annotation_; |
| |
| mojom::TCPConnectedSocketRequest connected_socket_request_; |
| ConnectCallback connect_callback_; |
| |
| // Takes ownership of |socket_| if Connect() is called. |
| std::unique_ptr<TCPConnectedSocket> connecting_socket_; |
| |
| base::WeakPtrFactory<TCPBoundSocket> weak_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(TCPBoundSocket); |
| }; |
| |
| } // namespace network |
| |
| #endif // SERVICES_NETWORK_TCP_BOUND_SOCKET_H_ |