#ifndef SERVICES_NETWORK_TCP_BOUND_SOCKET_H_
#define SERVICES_NETWORK_TCP_BOUND_SOCKET_H_
#include <memory>
#include "base/component_export.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver_set.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 network {
class SocketFactory;
class COMPONENT_EXPORT(NETWORK_SERVICE) TCPBoundSocket
: public mojom::TCPBoundSocket {
public:
TCPBoundSocket(SocketFactory* socket_factory,
net::NetLog* net_log,
const net::NetworkTrafficAnnotationTag& traffic_annotation);
TCPBoundSocket(const TCPBoundSocket&) = delete;
TCPBoundSocket& operator=(const TCPBoundSocket&) = delete;
~TCPBoundSocket() override;
int Bind(const net::IPEndPoint& local_addr, net::IPEndPoint* local_addr_out);
void set_id(mojo::ReceiverId receiver_id) { receiver_id_ = receiver_id; }
void Listen(uint32_t backlog,
mojo::PendingReceiver<mojom::TCPServerSocket> receiver,
ListenCallback callback) override;
void Connect(const net::AddressList& remote_addr,
mojom::TCPConnectedSocketOptionsPtr tcp_connected_socket_options,
mojo::PendingReceiver<mojom::TCPConnectedSocket> receiver,
mojo::PendingRemote<mojom::SocketObserver> observer,
ConnectCallback callback) override;
private:
void OnConnectComplete(int result,
const absl::optional<net::IPEndPoint>& local_addr,
const absl::optional<net::IPEndPoint>& peer_addr,
mojo::ScopedDataPipeConsumerHandle receive_stream,
mojo::ScopedDataPipeProducerHandle send_stream);
virtual int ListenInternal(int backlog);
net::IPEndPoint bind_address_;
mojo::ReceiverId receiver_id_ = -1;
const raw_ptr<SocketFactory> socket_factory_;
std::unique_ptr<net::TCPSocket> socket_;
const net::NetworkTrafficAnnotationTag traffic_annotation_;
mojo::PendingReceiver<mojom::TCPConnectedSocket> connected_socket_receiver_;
ConnectCallback connect_callback_;
std::unique_ptr<TCPConnectedSocket> connecting_socket_;
base::WeakPtrFactory<TCPBoundSocket> weak_factory_{this};
};
}
#endif