//===-- GDBRemoteCommunicationServer.h --------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef liblldb_GDBRemoteCommunicationServer_h_
#define liblldb_GDBRemoteCommunicationServer_h_

// C Includes
// C++ Includes
#include <functional>
#include <map>

// Other libraries and framework includes
// Project includes
#include "lldb/lldb-private-forward.h"
#include "GDBRemoteCommunication.h"

class StringExtractorGDBRemote;

namespace lldb_private {
namespace process_gdb_remote {

class ProcessGDBRemote;

class GDBRemoteCommunicationServer : public GDBRemoteCommunication
{
public:
    using PortMap = std::map<uint16_t, lldb::pid_t>;
    using PacketHandler = std::function<PacketResult(StringExtractorGDBRemote &packet,
                                                     Error &error,
                                                     bool &interrupt,
                                                     bool &quit)>;

    GDBRemoteCommunicationServer(const char *comm_name,
                                 const char *listener_name);

    virtual
    ~GDBRemoteCommunicationServer();

    void RegisterPacketHandler(StringExtractorGDBRemote::ServerPacketType packet_type,
                               PacketHandler handler);

    PacketResult
    GetPacketAndSendResponse (uint32_t timeout_usec,
                              Error &error,
                              bool &interrupt, 
                              bool &quit);

    // After connecting, do a little handshake with the client to make sure
    // we are at least communicating
    bool
    HandshakeWithClient ();

protected:
    std::map<StringExtractorGDBRemote::ServerPacketType, PacketHandler> m_packet_handlers;
    bool m_exit_now; // use in asynchronous handling to indicate process should exit.

    PacketResult
    SendUnimplementedResponse (const char *packet);

    PacketResult
    SendErrorResponse (uint8_t error);

    PacketResult
    SendIllFormedResponse (const StringExtractorGDBRemote &packet, const char *error_message);

    PacketResult
    SendOKResponse ();

private:
    //------------------------------------------------------------------
    // For GDBRemoteCommunicationServer only
    //------------------------------------------------------------------
    DISALLOW_COPY_AND_ASSIGN (GDBRemoteCommunicationServer);
};

} // namespace process_gdb_remote
} // namespace lldb_private

#endif  // liblldb_GDBRemoteCommunicationServer_h_
