1 //===-- GDBRemoteCommunicationServer.h --------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVER_H 10 #define LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVER_H 11 12 #include <functional> 13 #include <map> 14 15 #include "GDBRemoteCommunication.h" 16 #include "lldb/lldb-private-forward.h" 17 18 #include "llvm/Support/Errc.h" 19 #include "llvm/Support/Error.h" 20 21 class StringExtractorGDBRemote; 22 23 namespace lldb_private { 24 namespace process_gdb_remote { 25 26 class ProcessGDBRemote; 27 28 class GDBRemoteCommunicationServer : public GDBRemoteCommunication { 29 public: 30 using PacketHandler = 31 std::function<PacketResult(StringExtractorGDBRemote &packet, 32 Status &error, bool &interrupt, bool &quit)>; 33 34 GDBRemoteCommunicationServer(const char *comm_name, 35 const char *listener_name); 36 37 ~GDBRemoteCommunicationServer() override; 38 39 void 40 RegisterPacketHandler(StringExtractorGDBRemote::ServerPacketType packet_type, 41 PacketHandler handler); 42 43 PacketResult GetPacketAndSendResponse(Timeout<std::micro> timeout, 44 Status &error, bool &interrupt, 45 bool &quit); 46 47 // After connecting, do a little handshake with the client to make sure 48 // we are at least communicating 49 bool HandshakeWithClient(); 50 51 protected: 52 std::map<StringExtractorGDBRemote::ServerPacketType, PacketHandler> 53 m_packet_handlers; 54 bool m_exit_now; // use in asynchronous handling to indicate process should 55 // exit. 56 57 bool m_send_error_strings = false; // If the client enables this then 58 // we will send error strings as well. 59 60 PacketResult Handle_QErrorStringEnable(StringExtractorGDBRemote &packet); 61 62 PacketResult SendErrorResponse(const Status &error); 63 64 PacketResult SendErrorResponse(llvm::Error error); 65 66 PacketResult SendUnimplementedResponse(const char *packet); 67 68 PacketResult SendErrorResponse(uint8_t error); 69 70 PacketResult SendIllFormedResponse(const StringExtractorGDBRemote &packet, 71 const char *error_message); 72 73 PacketResult SendOKResponse(); 74 75 private: 76 GDBRemoteCommunicationServer(const GDBRemoteCommunicationServer &) = delete; 77 const GDBRemoteCommunicationServer & 78 operator=(const GDBRemoteCommunicationServer &) = delete; 79 }; 80 81 } // namespace process_gdb_remote 82 } // namespace lldb_private 83 84 #endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVER_H 85