1//===-- StringExtractorGDBRemote.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_UTILITY_STRINGEXTRACTORGDBREMOTE_H
10#define LLDB_UTILITY_STRINGEXTRACTORGDBREMOTE_H
11
12#include "lldb/Utility/Status.h"
13#include "lldb/Utility/StringExtractor.h"
14#include "llvm/ADT/StringRef.h"
15
16#include <string>
17
18#include <stddef.h>
19#include <stdint.h>
20
21class StringExtractorGDBRemote : public StringExtractor {
22public:
23  typedef bool (*ResponseValidatorCallback)(
24      void *baton, const StringExtractorGDBRemote &response);
25
26  StringExtractorGDBRemote() : StringExtractor(), m_validator(nullptr) {}
27
28  StringExtractorGDBRemote(llvm::StringRef str)
29      : StringExtractor(str), m_validator(nullptr) {}
30
31  StringExtractorGDBRemote(const char *cstr)
32      : StringExtractor(cstr), m_validator(nullptr) {}
33
34  bool ValidateResponse() const;
35
36  void CopyResponseValidator(const StringExtractorGDBRemote &rhs);
37
38  void SetResponseValidator(ResponseValidatorCallback callback, void *baton);
39
40  void SetResponseValidatorToOKErrorNotSupported();
41
42  void SetResponseValidatorToASCIIHexBytes();
43
44  void SetResponseValidatorToJSON();
45
46  enum ServerPacketType {
47    eServerPacketType_nack = 0,
48    eServerPacketType_ack,
49    eServerPacketType_invalid,
50    eServerPacketType_unimplemented,
51    eServerPacketType_interrupt, // CTRL+c packet or "\x03"
52    eServerPacketType_A,         // Program arguments packet
53    eServerPacketType_qfProcessInfo,
54    eServerPacketType_qsProcessInfo,
55    eServerPacketType_qC,
56    eServerPacketType_qEcho,
57    eServerPacketType_qGroupName,
58    eServerPacketType_qHostInfo,
59    eServerPacketType_qLaunchGDBServer,
60    eServerPacketType_qQueryGDBServer,
61    eServerPacketType_qKillSpawnedProcess,
62    eServerPacketType_qLaunchSuccess,
63    eServerPacketType_qModuleInfo,
64    eServerPacketType_qProcessInfoPID,
65    eServerPacketType_qSpeedTest,
66    eServerPacketType_qUserName,
67    eServerPacketType_qGetWorkingDir,
68    eServerPacketType_qFileLoadAddress,
69    eServerPacketType_QEnvironment,
70    eServerPacketType_QEnableErrorStrings,
71    eServerPacketType_QLaunchArch,
72    eServerPacketType_QSetDisableASLR,
73    eServerPacketType_QSetDetachOnError,
74    eServerPacketType_QSetSTDIN,
75    eServerPacketType_QSetSTDOUT,
76    eServerPacketType_QSetSTDERR,
77    eServerPacketType_QSetWorkingDir,
78    eServerPacketType_QStartNoAckMode,
79    eServerPacketType_qPlatform_shell,
80    eServerPacketType_qPlatform_mkdir,
81    eServerPacketType_qPlatform_chmod,
82    eServerPacketType_vFile_open,
83    eServerPacketType_vFile_close,
84    eServerPacketType_vFile_pread,
85    eServerPacketType_vFile_pwrite,
86    eServerPacketType_vFile_size,
87    eServerPacketType_vFile_mode,
88    eServerPacketType_vFile_exists,
89    eServerPacketType_vFile_md5,
90    eServerPacketType_vFile_stat,
91    eServerPacketType_vFile_symlink,
92    eServerPacketType_vFile_unlink,
93    // debug server packages
94    eServerPacketType_QEnvironmentHexEncoded,
95    eServerPacketType_QListThreadsInStopReply,
96    eServerPacketType_QPassSignals,
97    eServerPacketType_QRestoreRegisterState,
98    eServerPacketType_QSaveRegisterState,
99    eServerPacketType_QSetLogging,
100    eServerPacketType_QSetMaxPacketSize,
101    eServerPacketType_QSetMaxPayloadSize,
102    eServerPacketType_QSetEnableAsyncProfiling,
103    eServerPacketType_QSyncThreadState,
104    eServerPacketType_QThreadSuffixSupported,
105
106    eServerPacketType_jThreadsInfo,
107    eServerPacketType_qsThreadInfo,
108    eServerPacketType_qfThreadInfo,
109    eServerPacketType_qGetPid,
110    eServerPacketType_qGetProfileData,
111    eServerPacketType_qGDBServerVersion,
112    eServerPacketType_qMemoryRegionInfo,
113    eServerPacketType_qMemoryRegionInfoSupported,
114    eServerPacketType_qProcessInfo,
115    eServerPacketType_qRcmd,
116    eServerPacketType_qRegisterInfo,
117    eServerPacketType_qShlibInfoAddr,
118    eServerPacketType_qStepPacketSupported,
119    eServerPacketType_qSupported,
120    eServerPacketType_qSyncThreadStateSupported,
121    eServerPacketType_qThreadExtraInfo,
122    eServerPacketType_qThreadStopInfo,
123    eServerPacketType_qVAttachOrWaitSupported,
124    eServerPacketType_qWatchpointSupportInfo,
125    eServerPacketType_qWatchpointSupportInfoSupported,
126    eServerPacketType_qXfer,
127
128    eServerPacketType_jSignalsInfo,
129    eServerPacketType_jModulesInfo,
130
131    eServerPacketType_vAttach,
132    eServerPacketType_vAttachWait,
133    eServerPacketType_vAttachOrWait,
134    eServerPacketType_vAttachName,
135    eServerPacketType_vCont,
136    eServerPacketType_vCont_actions, // vCont?
137
138    eServerPacketType_stop_reason, // '?'
139
140    eServerPacketType_c,
141    eServerPacketType_C,
142    eServerPacketType_D,
143    eServerPacketType_g,
144    eServerPacketType_G,
145    eServerPacketType_H,
146    eServerPacketType_I, // stdin notification
147    eServerPacketType_k,
148    eServerPacketType_m,
149    eServerPacketType_M,
150    eServerPacketType_p,
151    eServerPacketType_P,
152    eServerPacketType_s,
153    eServerPacketType_S,
154    eServerPacketType_T,
155    eServerPacketType_x,
156    eServerPacketType_X,
157    eServerPacketType_Z,
158    eServerPacketType_z,
159
160    eServerPacketType__M,
161    eServerPacketType__m,
162    eServerPacketType_notify, // '%' notification
163
164    eServerPacketType_jTraceStart,
165    eServerPacketType_jTraceBufferRead,
166    eServerPacketType_jTraceMetaRead,
167    eServerPacketType_jTraceStop,
168    eServerPacketType_jTraceConfigRead,
169  };
170
171  ServerPacketType GetServerPacketType() const;
172
173  enum ResponseType { eUnsupported = 0, eAck, eNack, eError, eOK, eResponse };
174
175  ResponseType GetResponseType() const;
176
177  bool IsOKResponse() const;
178
179  bool IsUnsupportedResponse() const;
180
181  bool IsNormalResponse() const;
182
183  bool IsErrorResponse() const;
184
185  // Returns zero if the packet isn't a EXX packet where XX are two hex digits.
186  // Otherwise the error encoded in XX is returned.
187  uint8_t GetError();
188
189  lldb_private::Status GetStatus();
190
191  size_t GetEscapedBinaryData(std::string &str);
192
193protected:
194  ResponseValidatorCallback m_validator;
195  void *m_validator_baton;
196};
197
198#endif // LLDB_UTILITY_STRINGEXTRACTORGDBREMOTE_H
199