//===-- Acceptor.h ----------------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef lldb_server_Acceptor_h_
#define lldb_server_Acceptor_h_

#include "lldb/Host/Socket.h"
#include "lldb/Utility/Connection.h"
#include "lldb/Utility/Status.h"

#include <functional>
#include <memory>
#include <string>

namespace llvm {
class StringRef;
}

namespace lldb_private {
namespace lldb_server {

class Acceptor {
public:
  virtual ~Acceptor() = default;

  Status Listen(int backlog);

  Status Accept(const bool child_processes_inherit, Connection *&conn);

  static std::unique_ptr<Acceptor> Create(llvm::StringRef name,
                                          const bool child_processes_inherit,
                                          Status &error);

  Socket::SocketProtocol GetSocketProtocol() const;

  const char *GetSocketScheme() const;

  // Returns either TCP port number as string or domain socket path.
  // Empty string is returned in case of error.
  std::string GetLocalSocketId() const;

private:
  typedef std::function<std::string()> LocalSocketIdFunc;

  Acceptor(std::unique_ptr<Socket> &&listener_socket, llvm::StringRef name,
           const LocalSocketIdFunc &local_socket_id);

  const std::unique_ptr<Socket> m_listener_socket_up;
  const std::string m_name;
  const LocalSocketIdFunc m_local_socket_id;
};

} // namespace lldb_server
} // namespace lldb_private

#endif // lldb_server_Acceptor_h_
