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(); 35 36 ~GDBRemoteCommunicationServer() override; 37 38 void 39 RegisterPacketHandler(StringExtractorGDBRemote::ServerPacketType packet_type, 40 PacketHandler handler); 41 42 PacketResult GetPacketAndSendResponse(Timeout<std::micro> timeout, 43 Status &error, bool &interrupt, 44 bool &quit); 45 46 protected: 47 std::map<StringExtractorGDBRemote::ServerPacketType, PacketHandler> 48 m_packet_handlers; 49 bool m_exit_now; // use in asynchronous handling to indicate process should 50 // exit. 51 52 bool m_send_error_strings = false; // If the client enables this then 53 // we will send error strings as well. 54 55 PacketResult Handle_QErrorStringEnable(StringExtractorGDBRemote &packet); 56 57 PacketResult SendErrorResponse(const Status &error); 58 59 PacketResult SendErrorResponse(llvm::Error error); 60 61 PacketResult SendUnimplementedResponse(const char *packet); 62 63 PacketResult SendErrorResponse(uint8_t error); 64 65 PacketResult SendIllFormedResponse(const StringExtractorGDBRemote &packet, 66 const char *error_message); 67 68 PacketResult SendOKResponse(); 69 70 /// Serialize and send a JSON object response. 71 PacketResult SendJSONResponse(const llvm::json::Value &value); 72 73 /// Serialize and send a JSON object response, or respond with an error if the 74 /// input object is an \a llvm::Error. 75 PacketResult SendJSONResponse(llvm::Expected<llvm::json::Value> value); 76 77 private: 78 GDBRemoteCommunicationServer(const GDBRemoteCommunicationServer &) = delete; 79 const GDBRemoteCommunicationServer & 80 operator=(const GDBRemoteCommunicationServer &) = delete; 81 }; 82 83 } // namespace process_gdb_remote 84 } // namespace lldb_private 85 86 #endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONSERVER_H 87