#ifndef NET_SOCKET_TCP_SERVER_SOCKET_H_
#define NET_SOCKET_TCP_SERVER_SOCKET_H_
#include <memory>
#include "net/base/completion_once_callback.h"
#include "net/base/ip_endpoint.h"
#include "net/base/net_export.h"
#include "net/socket/server_socket.h"
#include "net/socket/socket_descriptor.h"
#include "net/socket/tcp_socket.h"
namespace net {
class NetLog;
struct NetLogSource;
class NET_EXPORT TCPServerSocket : public ServerSocket {
public:
TCPServerSocket(NetLog* net_log, const NetLogSource& source);
explicit TCPServerSocket(std::unique_ptr<TCPSocket> socket);
TCPServerSocket(const TCPServerSocket&) = delete;
TCPServerSocket& operator=(const TCPServerSocket&) = delete;
~TCPServerSocket() override;
int AdoptSocket(SocketDescriptor socket);
int Listen(const IPEndPoint& address,
int backlog,
absl::optional<bool> ipv6_only) override;
int GetLocalAddress(IPEndPoint* address) const override;
int Accept(std::unique_ptr<StreamSocket>* socket,
CompletionOnceCallback callback) override;
int Accept(std::unique_ptr<StreamSocket>* socket,
CompletionOnceCallback callback,
IPEndPoint* peer_address) override;
void DetachFromThread();
private:
int ConvertAcceptedSocket(
int result,
std::unique_ptr<StreamSocket>* output_accepted_socket,
IPEndPoint* output_accepted_address);
void OnAcceptCompleted(std::unique_ptr<StreamSocket>* output_accepted_socket,
IPEndPoint* output_accepted_address,
CompletionOnceCallback forward_callback,
int result);
std::unique_ptr<TCPSocket> socket_;
std::unique_ptr<TCPSocket> accepted_socket_;
IPEndPoint accepted_address_;
bool pending_accept_ = false;
};
}
#endif