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