1336823Sdim//===-- StringExtractorGDBRemote.h ------------------------------*- C++ -*-===// 2336823Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6336823Sdim// 7336823Sdim//===----------------------------------------------------------------------===// 8336823Sdim 9336823Sdim#ifndef LLDB_UTILITY_STRINGEXTRACTORGDBREMOTE_H 10336823Sdim#define LLDB_UTILITY_STRINGEXTRACTORGDBREMOTE_H 11336823Sdim 12336823Sdim#include "lldb/Utility/Status.h" 13336823Sdim#include "lldb/Utility/StringExtractor.h" 14344779Sdim#include "llvm/ADT/StringRef.h" 15336823Sdim 16336823Sdim#include <string> 17336823Sdim 18344779Sdim#include <stddef.h> 19344779Sdim#include <stdint.h> 20336823Sdim 21336823Sdimclass StringExtractorGDBRemote : public StringExtractor { 22336823Sdimpublic: 23336823Sdim typedef bool (*ResponseValidatorCallback)( 24336823Sdim void *baton, const StringExtractorGDBRemote &response); 25336823Sdim 26336823Sdim StringExtractorGDBRemote() : StringExtractor(), m_validator(nullptr) {} 27336823Sdim 28336823Sdim StringExtractorGDBRemote(llvm::StringRef str) 29336823Sdim : StringExtractor(str), m_validator(nullptr) {} 30336823Sdim 31336823Sdim StringExtractorGDBRemote(const char *cstr) 32336823Sdim : StringExtractor(cstr), m_validator(nullptr) {} 33336823Sdim 34336823Sdim bool ValidateResponse() const; 35336823Sdim 36336823Sdim void CopyResponseValidator(const StringExtractorGDBRemote &rhs); 37336823Sdim 38336823Sdim void SetResponseValidator(ResponseValidatorCallback callback, void *baton); 39336823Sdim 40336823Sdim void SetResponseValidatorToOKErrorNotSupported(); 41336823Sdim 42336823Sdim void SetResponseValidatorToASCIIHexBytes(); 43336823Sdim 44336823Sdim void SetResponseValidatorToJSON(); 45336823Sdim 46336823Sdim enum ServerPacketType { 47336823Sdim eServerPacketType_nack = 0, 48336823Sdim eServerPacketType_ack, 49336823Sdim eServerPacketType_invalid, 50336823Sdim eServerPacketType_unimplemented, 51336823Sdim eServerPacketType_interrupt, // CTRL+c packet or "\x03" 52336823Sdim eServerPacketType_A, // Program arguments packet 53336823Sdim eServerPacketType_qfProcessInfo, 54336823Sdim eServerPacketType_qsProcessInfo, 55336823Sdim eServerPacketType_qC, 56336823Sdim eServerPacketType_qEcho, 57336823Sdim eServerPacketType_qGroupName, 58336823Sdim eServerPacketType_qHostInfo, 59336823Sdim eServerPacketType_qLaunchGDBServer, 60336823Sdim eServerPacketType_qQueryGDBServer, 61336823Sdim eServerPacketType_qKillSpawnedProcess, 62336823Sdim eServerPacketType_qLaunchSuccess, 63336823Sdim eServerPacketType_qModuleInfo, 64336823Sdim eServerPacketType_qProcessInfoPID, 65336823Sdim eServerPacketType_qSpeedTest, 66336823Sdim eServerPacketType_qUserName, 67336823Sdim eServerPacketType_qGetWorkingDir, 68336823Sdim eServerPacketType_qFileLoadAddress, 69336823Sdim eServerPacketType_QEnvironment, 70336823Sdim eServerPacketType_QEnableErrorStrings, 71336823Sdim eServerPacketType_QLaunchArch, 72336823Sdim eServerPacketType_QSetDisableASLR, 73336823Sdim eServerPacketType_QSetDetachOnError, 74336823Sdim eServerPacketType_QSetSTDIN, 75336823Sdim eServerPacketType_QSetSTDOUT, 76336823Sdim eServerPacketType_QSetSTDERR, 77336823Sdim eServerPacketType_QSetWorkingDir, 78336823Sdim eServerPacketType_QStartNoAckMode, 79336823Sdim eServerPacketType_qPlatform_shell, 80336823Sdim eServerPacketType_qPlatform_mkdir, 81336823Sdim eServerPacketType_qPlatform_chmod, 82336823Sdim eServerPacketType_vFile_open, 83336823Sdim eServerPacketType_vFile_close, 84336823Sdim eServerPacketType_vFile_pread, 85336823Sdim eServerPacketType_vFile_pwrite, 86336823Sdim eServerPacketType_vFile_size, 87336823Sdim eServerPacketType_vFile_mode, 88336823Sdim eServerPacketType_vFile_exists, 89336823Sdim eServerPacketType_vFile_md5, 90336823Sdim eServerPacketType_vFile_stat, 91336823Sdim eServerPacketType_vFile_symlink, 92336823Sdim eServerPacketType_vFile_unlink, 93336823Sdim // debug server packages 94336823Sdim eServerPacketType_QEnvironmentHexEncoded, 95336823Sdim eServerPacketType_QListThreadsInStopReply, 96336823Sdim eServerPacketType_QPassSignals, 97336823Sdim eServerPacketType_QRestoreRegisterState, 98336823Sdim eServerPacketType_QSaveRegisterState, 99336823Sdim eServerPacketType_QSetLogging, 100336823Sdim eServerPacketType_QSetMaxPacketSize, 101336823Sdim eServerPacketType_QSetMaxPayloadSize, 102336823Sdim eServerPacketType_QSetEnableAsyncProfiling, 103336823Sdim eServerPacketType_QSyncThreadState, 104336823Sdim eServerPacketType_QThreadSuffixSupported, 105336823Sdim 106336823Sdim eServerPacketType_jThreadsInfo, 107336823Sdim eServerPacketType_qsThreadInfo, 108336823Sdim eServerPacketType_qfThreadInfo, 109336823Sdim eServerPacketType_qGetPid, 110336823Sdim eServerPacketType_qGetProfileData, 111336823Sdim eServerPacketType_qGDBServerVersion, 112336823Sdim eServerPacketType_qMemoryRegionInfo, 113336823Sdim eServerPacketType_qMemoryRegionInfoSupported, 114336823Sdim eServerPacketType_qProcessInfo, 115336823Sdim eServerPacketType_qRcmd, 116336823Sdim eServerPacketType_qRegisterInfo, 117336823Sdim eServerPacketType_qShlibInfoAddr, 118336823Sdim eServerPacketType_qStepPacketSupported, 119336823Sdim eServerPacketType_qSupported, 120336823Sdim eServerPacketType_qSyncThreadStateSupported, 121336823Sdim eServerPacketType_qThreadExtraInfo, 122336823Sdim eServerPacketType_qThreadStopInfo, 123336823Sdim eServerPacketType_qVAttachOrWaitSupported, 124336823Sdim eServerPacketType_qWatchpointSupportInfo, 125336823Sdim eServerPacketType_qWatchpointSupportInfoSupported, 126353358Sdim eServerPacketType_qXfer, 127336823Sdim 128336823Sdim eServerPacketType_jSignalsInfo, 129336823Sdim eServerPacketType_jModulesInfo, 130336823Sdim 131336823Sdim eServerPacketType_vAttach, 132336823Sdim eServerPacketType_vAttachWait, 133336823Sdim eServerPacketType_vAttachOrWait, 134336823Sdim eServerPacketType_vAttachName, 135336823Sdim eServerPacketType_vCont, 136336823Sdim eServerPacketType_vCont_actions, // vCont? 137336823Sdim 138336823Sdim eServerPacketType_stop_reason, // '?' 139336823Sdim 140336823Sdim eServerPacketType_c, 141336823Sdim eServerPacketType_C, 142336823Sdim eServerPacketType_D, 143336823Sdim eServerPacketType_g, 144336823Sdim eServerPacketType_G, 145336823Sdim eServerPacketType_H, 146336823Sdim eServerPacketType_I, // stdin notification 147336823Sdim eServerPacketType_k, 148336823Sdim eServerPacketType_m, 149336823Sdim eServerPacketType_M, 150336823Sdim eServerPacketType_p, 151336823Sdim eServerPacketType_P, 152336823Sdim eServerPacketType_s, 153336823Sdim eServerPacketType_S, 154336823Sdim eServerPacketType_T, 155336823Sdim eServerPacketType_x, 156336823Sdim eServerPacketType_X, 157336823Sdim eServerPacketType_Z, 158336823Sdim eServerPacketType_z, 159336823Sdim 160336823Sdim eServerPacketType__M, 161336823Sdim eServerPacketType__m, 162336823Sdim eServerPacketType_notify, // '%' notification 163336823Sdim 164336823Sdim eServerPacketType_jTraceStart, 165336823Sdim eServerPacketType_jTraceBufferRead, 166336823Sdim eServerPacketType_jTraceMetaRead, 167336823Sdim eServerPacketType_jTraceStop, 168336823Sdim eServerPacketType_jTraceConfigRead, 169336823Sdim }; 170336823Sdim 171336823Sdim ServerPacketType GetServerPacketType() const; 172336823Sdim 173336823Sdim enum ResponseType { eUnsupported = 0, eAck, eNack, eError, eOK, eResponse }; 174336823Sdim 175336823Sdim ResponseType GetResponseType() const; 176336823Sdim 177336823Sdim bool IsOKResponse() const; 178336823Sdim 179336823Sdim bool IsUnsupportedResponse() const; 180336823Sdim 181336823Sdim bool IsNormalResponse() const; 182336823Sdim 183336823Sdim bool IsErrorResponse() const; 184336823Sdim 185336823Sdim // Returns zero if the packet isn't a EXX packet where XX are two hex digits. 186336823Sdim // Otherwise the error encoded in XX is returned. 187336823Sdim uint8_t GetError(); 188336823Sdim 189336823Sdim lldb_private::Status GetStatus(); 190336823Sdim 191336823Sdim size_t GetEscapedBinaryData(std::string &str); 192336823Sdim 193336823Sdimprotected: 194336823Sdim ResponseValidatorCallback m_validator; 195336823Sdim void *m_validator_baton; 196336823Sdim}; 197336823Sdim 198336823Sdim#endif // LLDB_UTILITY_STRINGEXTRACTORGDBREMOTE_H 199