1// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
2//
3// SPDX-License-Identifier: GPL-3.0-or-later
4
5#ifndef RAWDEBUGSESSION_H
6#define RAWDEBUGSESSION_H
7
8#include "dap/session.h"
9#include "dap/protocol.h"
10#include "dap/future.h"
11
12#include <QObject>
13
14#include <memory>
15#include <any>
16
17namespace dap {
18
19/**
20 * @brief RawDebugSession is implemented by orignal
21 * DAP protocol,used by top level class DapDebugger.
22 */
23class RawDebugSession : public QObject
24{
25 Q_OBJECT
26public:
27 template<typename T>
28 using promiseEx = future<ResponseOrError<typename T::Response>>;
29
30 using ErrorHandler = std::function<void(const std::string&)>;
31
32 // value type returned.
33 #define Promise RawDebugSession::promiseEx
34
35 explicit RawDebugSession(std::shared_ptr<Session>&, QObject *parent = nullptr);
36
37 bool initialize();
38
39 void start();
40 Promise<InitializeRequest> initialize(const InitializeRequest &request);
41 bool disconnect(const DisconnectRequest &request);
42
43 Promise<LaunchRequest> launch(const LaunchRequest &request);
44 Promise<AttachRequest> attach(const AttachRequest &request);
45
46 bool terminate(bool restart);
47 bool restart(const RestartRequest &request);
48 Promise<NextRequest> next(const NextRequest &request);
49 Promise<StepInRequest> stepIn(const StepInRequest &request);
50 Promise<StepOutRequest> stepOut(const StepOutRequest &request);
51 Promise<ContinueRequest> continueDbg(const ContinueRequest &request);
52 Promise<PauseRequest> pause(const PauseRequest &args);
53 Promise<TerminateThreadsRequest> terminateThreads(const TerminateThreadsRequest &request);
54 Promise<SetVariableRequest> setVariable(const SetVariableRequest &request);
55 Promise<SetExpressionRequest> setExpression(const SetExpressionRequest &request);
56 Promise<RestartFrameRequest> restartFrame(const RestartFrameRequest &request);
57 Promise<StepInTargetsRequest> stepInTargets(const StepInTargetsRequest &request);
58 Promise<CompletionsRequest> completions(const CompletionsRequest &request);
59 Promise<SetBreakpointsRequest> setBreakpoints(const SetBreakpointsRequest &request);
60 Promise<SetFunctionBreakpointsRequest> setFunctionBreakpoints(const SetFunctionBreakpointsRequest &request);
61 Promise<DataBreakpointInfoRequest> dataBreakpointInfo(const DataBreakpointInfoRequest &request);
62 Promise<SetDataBreakpointsRequest> setDataBreakpoints(const SetDataBreakpointsRequest &request);
63 Promise<SetExceptionBreakpointsRequest> setExceptionBreakpoints(const SetExceptionBreakpointsRequest &request);
64 Promise<BreakpointLocationsRequest> breakpointLocations(const BreakpointLocationsRequest &request);
65 Promise<ConfigurationDoneRequest> configurationDone();
66 Promise<StackTraceRequest> stackTrace(const StackTraceRequest &request);
67 Promise<ExceptionInfoRequest> exceptionInfo(const ExceptionInfoRequest &request);
68 Promise<ScopesRequest> scopes(const ScopesRequest &request);
69 Promise<VariablesRequest> variables(const VariablesRequest &request);
70 Promise<SourceRequest> source(const SourceRequest &request);
71 Promise<LoadedSourcesRequest> loadedSources(const LoadedSourcesRequest &request);
72 Promise<ThreadsRequest> threads();
73 Promise<EvaluateRequest> evaluate(const EvaluateRequest &request);
74 Promise<StepBackRequest> stepBack(const StepBackRequest &request);
75 Promise<ReverseContinueRequest> reverseContinue(const ReverseContinueRequest &request);
76 Promise<GotoTargetsRequest> gotoTargets(const GotoTargetsRequest &request);
77 Promise<GotoRequest> goto_(const GotoRequest &request);
78 Promise<SetInstructionBreakpointsRequest> setInstructionBreakpoints(const SetInstructionBreakpointsRequest &request);
79 Promise<DisassembleRequest> disassemble(const DisassembleRequest &request);
80 Promise<CancelRequest> cancel(const CancelRequest &request);
81
82 const dap::Capabilities &capabilities() const;
83 bool shutdown(optional<boolean> terminateDebuggee, optional<boolean> restart = false);
84
85 bool readyForBreakpoints() const;
86 void setReadyForBreakpoints(bool bReady);
87signals:
88
89public slots:
90
91private:
92 void registerHandlers();
93 void mergeCapabilities(const InitializeResponse &capabilities);
94
95 // Send sends the request to the debugger, waits for the request to complete,
96 // and then assigns the response to |res|.
97 // Returns true on success, false on error.
98 template <typename REQUEST, typename RESPONSE>
99 bool send(const REQUEST& request, RESPONSE* res);
100
101 // Send sends the request to the debugger, and waits for the request to
102 // complete.
103 // Returns true on success, false on error.
104 template <typename REQUEST>
105 bool syncSend(const REQUEST& request);
106
107 // Send sends the request to the debugger and return future result.
108 template <typename REQUEST>
109 Promise<REQUEST> send(const REQUEST &request);
110
111 void onError(const std::string& error);
112
113 /**
114 * private parameters.
115 */
116 ErrorHandler errHandler;
117
118 std::shared_ptr<Session> session;
119
120 bool allThreadsContinued = true;
121 bool _readyForBreakpoints = false;
122 Capabilities _capabilities;
123
124 // shutdown
125 bool inShutdown = false;
126 bool terminated = false;
127};
128
129} // end dap namespace.
130
131#endif // RAWDEBUGSESSION_H
132