1e509ee18Sopenharmony_ci/*
2e509ee18Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3e509ee18Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e509ee18Sopenharmony_ci * you may not use this file except in compliance with the License.
5e509ee18Sopenharmony_ci * You may obtain a copy of the License at
6e509ee18Sopenharmony_ci *
7e509ee18Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e509ee18Sopenharmony_ci *
9e509ee18Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e509ee18Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e509ee18Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e509ee18Sopenharmony_ci * See the License for the specific language governing permissions and
13e509ee18Sopenharmony_ci * limitations under the License.
14e509ee18Sopenharmony_ci */
15e509ee18Sopenharmony_ci
16e509ee18Sopenharmony_ci#include "tooling/client/domain/debugger_client.h"
17e509ee18Sopenharmony_ci
18e509ee18Sopenharmony_ci#include <map>
19e509ee18Sopenharmony_ci
20e509ee18Sopenharmony_ci#include "common/log_wrapper.h"
21e509ee18Sopenharmony_ci#include "tooling/client/manager/breakpoint_manager.h"
22e509ee18Sopenharmony_ci#include "tooling/client/manager/source_manager.h"
23e509ee18Sopenharmony_ci#include "tooling/client/manager/stack_manager.h"
24e509ee18Sopenharmony_ci#include "tooling/base/pt_json.h"
25e509ee18Sopenharmony_ci#include "tooling/client/session/session.h"
26e509ee18Sopenharmony_ci
27e509ee18Sopenharmony_ciusing PtJson = panda::ecmascript::tooling::PtJson;
28e509ee18Sopenharmony_cinamespace OHOS::ArkCompiler::Toolchain {
29e509ee18Sopenharmony_cibool DebuggerClient::DispatcherCmd(const std::string &cmd)
30e509ee18Sopenharmony_ci{
31e509ee18Sopenharmony_ci    std::map<std::string, std::function<int()>> dispatcherTable {
32e509ee18Sopenharmony_ci        { "break", std::bind(&DebuggerClient::BreakCommand, this)},
33e509ee18Sopenharmony_ci        { "backtrack", std::bind(&DebuggerClient::BacktrackCommand, this)},
34e509ee18Sopenharmony_ci        { "continue", std::bind(&DebuggerClient::ResumeCommand, this)},
35e509ee18Sopenharmony_ci        { "delete", std::bind(&DebuggerClient::DeleteCommand, this)},
36e509ee18Sopenharmony_ci        { "jump", std::bind(&DebuggerClient::JumpCommand, this)},
37e509ee18Sopenharmony_ci        { "disable", std::bind(&DebuggerClient::DisableCommand, this)},
38e509ee18Sopenharmony_ci        { "display", std::bind(&DebuggerClient::DisplayCommand, this)},
39e509ee18Sopenharmony_ci        { "enable", std::bind(&DebuggerClient::EnableCommand, this)},
40e509ee18Sopenharmony_ci        { "finish", std::bind(&DebuggerClient::FinishCommand, this)},
41e509ee18Sopenharmony_ci        { "frame", std::bind(&DebuggerClient::FrameCommand, this)},
42e509ee18Sopenharmony_ci        { "ignore", std::bind(&DebuggerClient::IgnoreCommand, this)},
43e509ee18Sopenharmony_ci        { "infobreakpoints", std::bind(&DebuggerClient::InfobreakpointsCommand, this)},
44e509ee18Sopenharmony_ci        { "infosource", std::bind(&DebuggerClient::InfosourceCommand, this)},
45e509ee18Sopenharmony_ci        { "list", std::bind(&DebuggerClient::ListCommand, this)},
46e509ee18Sopenharmony_ci        { "next", std::bind(&DebuggerClient::NextCommand, this)},
47e509ee18Sopenharmony_ci        { "ptype", std::bind(&DebuggerClient::PtypeCommand, this)},
48e509ee18Sopenharmony_ci        { "run", std::bind(&DebuggerClient::RunCommand, this)},
49e509ee18Sopenharmony_ci        { "setvar", std::bind(&DebuggerClient::SetvarCommand, this)},
50e509ee18Sopenharmony_ci        { "step", std::bind(&DebuggerClient::StepCommand, this)},
51e509ee18Sopenharmony_ci        { "undisplay", std::bind(&DebuggerClient::UndisplayCommand, this)},
52e509ee18Sopenharmony_ci        { "watch", std::bind(&DebuggerClient::WatchCommand, this)},
53e509ee18Sopenharmony_ci        { "resume", std::bind(&DebuggerClient::ResumeCommand, this)},
54e509ee18Sopenharmony_ci        { "step-into", std::bind(&DebuggerClient::StepIntoCommand, this)},
55e509ee18Sopenharmony_ci        { "step-out", std::bind(&DebuggerClient::StepOutCommand, this)},
56e509ee18Sopenharmony_ci        { "step-over", std::bind(&DebuggerClient::StepOverCommand, this)},
57e509ee18Sopenharmony_ci    };
58e509ee18Sopenharmony_ci
59e509ee18Sopenharmony_ci    auto entry = dispatcherTable.find(cmd);
60e509ee18Sopenharmony_ci    if (entry != dispatcherTable.end()) {
61e509ee18Sopenharmony_ci        entry->second();
62e509ee18Sopenharmony_ci        LOGI("DebuggerClient DispatcherCmd cmd: %{public}s", cmd.c_str());
63e509ee18Sopenharmony_ci        return true;
64e509ee18Sopenharmony_ci    }
65e509ee18Sopenharmony_ci
66e509ee18Sopenharmony_ci    LOGI("unknown command: %{public}s", cmd.c_str());
67e509ee18Sopenharmony_ci    return false;
68e509ee18Sopenharmony_ci}
69e509ee18Sopenharmony_ci
70e509ee18Sopenharmony_ciint DebuggerClient::BreakCommand()
71e509ee18Sopenharmony_ci{
72e509ee18Sopenharmony_ci    Session *session = SessionManager::getInstance().GetSessionById(sessionId_);
73e509ee18Sopenharmony_ci    uint32_t id = session->GetMessageId();
74e509ee18Sopenharmony_ci
75e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> request = PtJson::CreateObject();
76e509ee18Sopenharmony_ci    request->Add("id", id);
77e509ee18Sopenharmony_ci    request->Add("method", "Debugger.setBreakpointByUrl");
78e509ee18Sopenharmony_ci
79e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> params = PtJson::CreateObject();
80e509ee18Sopenharmony_ci    params->Add("columnNumber", breakPointInfoList_.back().columnNumber);
81e509ee18Sopenharmony_ci    params->Add("lineNumber", breakPointInfoList_.back().lineNumber);
82e509ee18Sopenharmony_ci    params->Add("url", breakPointInfoList_.back().url.c_str());
83e509ee18Sopenharmony_ci    request->Add("params", params);
84e509ee18Sopenharmony_ci
85e509ee18Sopenharmony_ci    std::string message = request->Stringify();
86e509ee18Sopenharmony_ci    if (session->ClientSendReq(message)) {
87e509ee18Sopenharmony_ci        session->GetDomainManager().SetDomainById(id, "Debugger");
88e509ee18Sopenharmony_ci    }
89e509ee18Sopenharmony_ci    return 0;
90e509ee18Sopenharmony_ci}
91e509ee18Sopenharmony_ci
92e509ee18Sopenharmony_ciint DebuggerClient::BacktrackCommand()
93e509ee18Sopenharmony_ci{
94e509ee18Sopenharmony_ci    return 0;
95e509ee18Sopenharmony_ci}
96e509ee18Sopenharmony_ci
97e509ee18Sopenharmony_ciint DebuggerClient::DeleteCommand()
98e509ee18Sopenharmony_ci{
99e509ee18Sopenharmony_ci    Session *session = SessionManager::getInstance().GetSessionById(sessionId_);
100e509ee18Sopenharmony_ci    uint32_t id = session->GetMessageId();
101e509ee18Sopenharmony_ci
102e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> request = PtJson::CreateObject();
103e509ee18Sopenharmony_ci    request->Add("id", id);
104e509ee18Sopenharmony_ci    request->Add("method", "Debugger.removeBreakpoint");
105e509ee18Sopenharmony_ci
106e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> params = PtJson::CreateObject();
107e509ee18Sopenharmony_ci    std::string breakpointId = breakPointInfoList_.back().url;
108e509ee18Sopenharmony_ci    params->Add("breakpointId", breakpointId.c_str());
109e509ee18Sopenharmony_ci    request->Add("params", params);
110e509ee18Sopenharmony_ci
111e509ee18Sopenharmony_ci    std::string message = request->Stringify();
112e509ee18Sopenharmony_ci    if (session->ClientSendReq(message)) {
113e509ee18Sopenharmony_ci        session->GetDomainManager().SetDomainById(id, "Debugger");
114e509ee18Sopenharmony_ci    }
115e509ee18Sopenharmony_ci    return 0;
116e509ee18Sopenharmony_ci}
117e509ee18Sopenharmony_ci
118e509ee18Sopenharmony_ciint DebuggerClient::DisableCommand()
119e509ee18Sopenharmony_ci{
120e509ee18Sopenharmony_ci    Session *session = SessionManager::getInstance().GetSessionById(sessionId_);
121e509ee18Sopenharmony_ci    uint32_t id = session->GetMessageId();
122e509ee18Sopenharmony_ci
123e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> request = PtJson::CreateObject();
124e509ee18Sopenharmony_ci    request->Add("id", id);
125e509ee18Sopenharmony_ci    request->Add("method", "Debugger.disable");
126e509ee18Sopenharmony_ci
127e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> params = PtJson::CreateObject();
128e509ee18Sopenharmony_ci    request->Add("params", params);
129e509ee18Sopenharmony_ci
130e509ee18Sopenharmony_ci    std::string message = request->Stringify();
131e509ee18Sopenharmony_ci    if (session->ClientSendReq(message)) {
132e509ee18Sopenharmony_ci        session->GetDomainManager().SetDomainById(id, "Debugger");
133e509ee18Sopenharmony_ci    }
134e509ee18Sopenharmony_ci    return 0;
135e509ee18Sopenharmony_ci}
136e509ee18Sopenharmony_ci
137e509ee18Sopenharmony_ciint DebuggerClient::DisplayCommand()
138e509ee18Sopenharmony_ci{
139e509ee18Sopenharmony_ci    return 0;
140e509ee18Sopenharmony_ci}
141e509ee18Sopenharmony_ci
142e509ee18Sopenharmony_ciint DebuggerClient::EnableCommand()
143e509ee18Sopenharmony_ci{
144e509ee18Sopenharmony_ci    Session *session = SessionManager::getInstance().GetSessionById(sessionId_);
145e509ee18Sopenharmony_ci    uint32_t id = session->GetMessageId();
146e509ee18Sopenharmony_ci
147e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> request = PtJson::CreateObject();
148e509ee18Sopenharmony_ci    request->Add("id", id);
149e509ee18Sopenharmony_ci    request->Add("method", "Debugger.enable");
150e509ee18Sopenharmony_ci
151e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> params = PtJson::CreateObject();
152e509ee18Sopenharmony_ci    request->Add("params", params);
153e509ee18Sopenharmony_ci
154e509ee18Sopenharmony_ci    std::string message = request->Stringify();
155e509ee18Sopenharmony_ci    if (session->ClientSendReq(message)) {
156e509ee18Sopenharmony_ci        session->GetDomainManager().SetDomainById(id, "Debugger");
157e509ee18Sopenharmony_ci    }
158e509ee18Sopenharmony_ci    return 0;
159e509ee18Sopenharmony_ci}
160e509ee18Sopenharmony_ci
161e509ee18Sopenharmony_ciint DebuggerClient::FinishCommand()
162e509ee18Sopenharmony_ci{
163e509ee18Sopenharmony_ci    return 0;
164e509ee18Sopenharmony_ci}
165e509ee18Sopenharmony_ci
166e509ee18Sopenharmony_ciint DebuggerClient::FrameCommand()
167e509ee18Sopenharmony_ci{
168e509ee18Sopenharmony_ci    return 0;
169e509ee18Sopenharmony_ci}
170e509ee18Sopenharmony_ci
171e509ee18Sopenharmony_ciint DebuggerClient::IgnoreCommand()
172e509ee18Sopenharmony_ci{
173e509ee18Sopenharmony_ci    return 0;
174e509ee18Sopenharmony_ci}
175e509ee18Sopenharmony_ci
176e509ee18Sopenharmony_ciint DebuggerClient::InfobreakpointsCommand()
177e509ee18Sopenharmony_ci{
178e509ee18Sopenharmony_ci    return 0;
179e509ee18Sopenharmony_ci}
180e509ee18Sopenharmony_ci
181e509ee18Sopenharmony_ciint DebuggerClient::InfosourceCommand()
182e509ee18Sopenharmony_ci{
183e509ee18Sopenharmony_ci    return 0;
184e509ee18Sopenharmony_ci}
185e509ee18Sopenharmony_ci
186e509ee18Sopenharmony_ciint DebuggerClient::JumpCommand()
187e509ee18Sopenharmony_ci{
188e509ee18Sopenharmony_ci    return 0;
189e509ee18Sopenharmony_ci}
190e509ee18Sopenharmony_ci
191e509ee18Sopenharmony_ciint DebuggerClient::NextCommand()
192e509ee18Sopenharmony_ci{
193e509ee18Sopenharmony_ci    return 0;
194e509ee18Sopenharmony_ci}
195e509ee18Sopenharmony_ci
196e509ee18Sopenharmony_ciint DebuggerClient::ListCommand()
197e509ee18Sopenharmony_ci{
198e509ee18Sopenharmony_ci    return 0;
199e509ee18Sopenharmony_ci}
200e509ee18Sopenharmony_ci
201e509ee18Sopenharmony_ciint DebuggerClient::PtypeCommand()
202e509ee18Sopenharmony_ci{
203e509ee18Sopenharmony_ci    return 0;
204e509ee18Sopenharmony_ci}
205e509ee18Sopenharmony_ci
206e509ee18Sopenharmony_ciint DebuggerClient::RunCommand()
207e509ee18Sopenharmony_ci{
208e509ee18Sopenharmony_ci    return 0;
209e509ee18Sopenharmony_ci}
210e509ee18Sopenharmony_ci
211e509ee18Sopenharmony_ciint DebuggerClient::SetvarCommand()
212e509ee18Sopenharmony_ci{
213e509ee18Sopenharmony_ci    return 0;
214e509ee18Sopenharmony_ci}
215e509ee18Sopenharmony_ci
216e509ee18Sopenharmony_ciint DebuggerClient::StepCommand()
217e509ee18Sopenharmony_ci{
218e509ee18Sopenharmony_ci    return 0;
219e509ee18Sopenharmony_ci}
220e509ee18Sopenharmony_ci
221e509ee18Sopenharmony_ciint DebuggerClient::UndisplayCommand()
222e509ee18Sopenharmony_ci{
223e509ee18Sopenharmony_ci    return 0;
224e509ee18Sopenharmony_ci}
225e509ee18Sopenharmony_ci
226e509ee18Sopenharmony_ciint DebuggerClient::WatchCommand()
227e509ee18Sopenharmony_ci{
228e509ee18Sopenharmony_ci    return 0;
229e509ee18Sopenharmony_ci}
230e509ee18Sopenharmony_ci
231e509ee18Sopenharmony_ciint DebuggerClient::ResumeCommand()
232e509ee18Sopenharmony_ci{
233e509ee18Sopenharmony_ci    Session *session = SessionManager::getInstance().GetSessionById(sessionId_);
234e509ee18Sopenharmony_ci    uint32_t id = session->GetMessageId();
235e509ee18Sopenharmony_ci
236e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> request = PtJson::CreateObject();
237e509ee18Sopenharmony_ci    request->Add("id", id);
238e509ee18Sopenharmony_ci    request->Add("method", "Debugger.resume");
239e509ee18Sopenharmony_ci
240e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> params = PtJson::CreateObject();
241e509ee18Sopenharmony_ci    request->Add("params", params);
242e509ee18Sopenharmony_ci
243e509ee18Sopenharmony_ci    std::string message = request->Stringify();
244e509ee18Sopenharmony_ci    if (session->ClientSendReq(message)) {
245e509ee18Sopenharmony_ci        session->GetDomainManager().SetDomainById(id, "Debugger");
246e509ee18Sopenharmony_ci    }
247e509ee18Sopenharmony_ci    return 0;
248e509ee18Sopenharmony_ci}
249e509ee18Sopenharmony_ci
250e509ee18Sopenharmony_ciint DebuggerClient::StepIntoCommand()
251e509ee18Sopenharmony_ci{
252e509ee18Sopenharmony_ci    Session *session = SessionManager::getInstance().GetSessionById(sessionId_);
253e509ee18Sopenharmony_ci    uint32_t id = session->GetMessageId();
254e509ee18Sopenharmony_ci
255e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> request = PtJson::CreateObject();
256e509ee18Sopenharmony_ci    request->Add("id", id);
257e509ee18Sopenharmony_ci    request->Add("method", "Debugger.stepInto");
258e509ee18Sopenharmony_ci
259e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> params = PtJson::CreateObject();
260e509ee18Sopenharmony_ci    request->Add("params", params);
261e509ee18Sopenharmony_ci
262e509ee18Sopenharmony_ci    std::string message = request->Stringify();
263e509ee18Sopenharmony_ci    if (session->ClientSendReq(message)) {
264e509ee18Sopenharmony_ci        session->GetDomainManager().SetDomainById(id, "Debugger");
265e509ee18Sopenharmony_ci    }
266e509ee18Sopenharmony_ci    return 0;
267e509ee18Sopenharmony_ci}
268e509ee18Sopenharmony_ci
269e509ee18Sopenharmony_ciint DebuggerClient::StepOutCommand()
270e509ee18Sopenharmony_ci{
271e509ee18Sopenharmony_ci    Session *session = SessionManager::getInstance().GetSessionById(sessionId_);
272e509ee18Sopenharmony_ci    uint32_t id = session->GetMessageId();
273e509ee18Sopenharmony_ci
274e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> request = PtJson::CreateObject();
275e509ee18Sopenharmony_ci    request->Add("id", id);
276e509ee18Sopenharmony_ci    request->Add("method", "Debugger.stepOut");
277e509ee18Sopenharmony_ci
278e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> params = PtJson::CreateObject();
279e509ee18Sopenharmony_ci    request->Add("params", params);
280e509ee18Sopenharmony_ci
281e509ee18Sopenharmony_ci    std::string message = request->Stringify();
282e509ee18Sopenharmony_ci    if (session->ClientSendReq(message)) {
283e509ee18Sopenharmony_ci        session->GetDomainManager().SetDomainById(id, "Debugger");
284e509ee18Sopenharmony_ci    }
285e509ee18Sopenharmony_ci    return 0;
286e509ee18Sopenharmony_ci}
287e509ee18Sopenharmony_ci
288e509ee18Sopenharmony_ciint DebuggerClient::StepOverCommand()
289e509ee18Sopenharmony_ci{
290e509ee18Sopenharmony_ci    Session *session = SessionManager::getInstance().GetSessionById(sessionId_);
291e509ee18Sopenharmony_ci    uint32_t id = session->GetMessageId();
292e509ee18Sopenharmony_ci
293e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> request = PtJson::CreateObject();
294e509ee18Sopenharmony_ci    request->Add("id", id);
295e509ee18Sopenharmony_ci    request->Add("method", "Debugger.stepOver");
296e509ee18Sopenharmony_ci
297e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> params = PtJson::CreateObject();
298e509ee18Sopenharmony_ci    request->Add("params", params);
299e509ee18Sopenharmony_ci
300e509ee18Sopenharmony_ci    std::string message = request->Stringify();
301e509ee18Sopenharmony_ci    if (session->ClientSendReq(message)) {
302e509ee18Sopenharmony_ci        session->GetDomainManager().SetDomainById(id, "Debugger");
303e509ee18Sopenharmony_ci    }
304e509ee18Sopenharmony_ci    return 0;
305e509ee18Sopenharmony_ci}
306e509ee18Sopenharmony_ci
307e509ee18Sopenharmony_civoid DebuggerClient::AddBreakPointInfo(const std::string& url, const int& lineNumber, const int& columnNumber)
308e509ee18Sopenharmony_ci{
309e509ee18Sopenharmony_ci    BreakPointInfo breakPointInfo;
310e509ee18Sopenharmony_ci    breakPointInfo.url = url;
311e509ee18Sopenharmony_ci    breakPointInfo.lineNumber = lineNumber - 1;
312e509ee18Sopenharmony_ci    breakPointInfo.columnNumber = columnNumber;
313e509ee18Sopenharmony_ci    breakPointInfoList_.emplace_back(breakPointInfo);
314e509ee18Sopenharmony_ci}
315e509ee18Sopenharmony_ci
316e509ee18Sopenharmony_civoid DebuggerClient::RecvReply(std::unique_ptr<PtJson> json)
317e509ee18Sopenharmony_ci{
318e509ee18Sopenharmony_ci    if (json == nullptr) {
319e509ee18Sopenharmony_ci        LOGE("arkdb: json parse error");
320e509ee18Sopenharmony_ci        return;
321e509ee18Sopenharmony_ci    }
322e509ee18Sopenharmony_ci
323e509ee18Sopenharmony_ci    if (!json->IsObject()) {
324e509ee18Sopenharmony_ci        LOGE("arkdb: json parse format error");
325e509ee18Sopenharmony_ci        json->ReleaseRoot();
326e509ee18Sopenharmony_ci        return;
327e509ee18Sopenharmony_ci    }
328e509ee18Sopenharmony_ci
329e509ee18Sopenharmony_ci    std::string wholeMethod;
330e509ee18Sopenharmony_ci    std::string method;
331e509ee18Sopenharmony_ci    Result ret = json->GetString("method", &wholeMethod);
332e509ee18Sopenharmony_ci    if (ret != Result::SUCCESS) {
333e509ee18Sopenharmony_ci        LOGE("arkdb: find method error");
334e509ee18Sopenharmony_ci    }
335e509ee18Sopenharmony_ci
336e509ee18Sopenharmony_ci    Session *session = SessionManager::getInstance().GetSessionById(sessionId_);
337e509ee18Sopenharmony_ci    SourceManager &sourceManager = session->GetSourceManager();
338e509ee18Sopenharmony_ci    WatchManager &watchManager = session->GetWatchManager();
339e509ee18Sopenharmony_ci
340e509ee18Sopenharmony_ci    std::string::size_type length = wholeMethod.length();
341e509ee18Sopenharmony_ci    std::string::size_type indexPoint = 0;
342e509ee18Sopenharmony_ci    indexPoint = wholeMethod.find_first_of('.', 0);
343e509ee18Sopenharmony_ci    method = wholeMethod.substr(indexPoint + 1, length);
344e509ee18Sopenharmony_ci    if (method == "paused") {
345e509ee18Sopenharmony_ci        PausedReply(std::move(json));
346e509ee18Sopenharmony_ci        return;
347e509ee18Sopenharmony_ci    } else if (method == "scriptParsed") {
348e509ee18Sopenharmony_ci        sourceManager.EnableReply(std::move(json));
349e509ee18Sopenharmony_ci        return;
350e509ee18Sopenharmony_ci    } else if (method == "resumed") {
351e509ee18Sopenharmony_ci        watchManager.DebugFalseState();
352e509ee18Sopenharmony_ci        return;
353e509ee18Sopenharmony_ci    } else {
354e509ee18Sopenharmony_ci        LOGI("arkdb: Debugger reply is: %{public}s", json->Stringify().c_str());
355e509ee18Sopenharmony_ci    }
356e509ee18Sopenharmony_ci    handleResponse(std::move(json));
357e509ee18Sopenharmony_ci}
358e509ee18Sopenharmony_ci
359e509ee18Sopenharmony_civoid DebuggerClient::PausedReply(const std::unique_ptr<PtJson> json)
360e509ee18Sopenharmony_ci{
361e509ee18Sopenharmony_ci    if (json == nullptr) {
362e509ee18Sopenharmony_ci        LOGE("arkdb: json parse error");
363e509ee18Sopenharmony_ci        return;
364e509ee18Sopenharmony_ci    }
365e509ee18Sopenharmony_ci
366e509ee18Sopenharmony_ci    if (!json->IsObject()) {
367e509ee18Sopenharmony_ci        LOGE("arkdb: json parse format error");
368e509ee18Sopenharmony_ci        json->ReleaseRoot();
369e509ee18Sopenharmony_ci        return;
370e509ee18Sopenharmony_ci    }
371e509ee18Sopenharmony_ci
372e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> params;
373e509ee18Sopenharmony_ci    Result ret = json->GetObject("params", &params);
374e509ee18Sopenharmony_ci    if (ret != Result::SUCCESS) {
375e509ee18Sopenharmony_ci        LOGE("arkdb: find params error");
376e509ee18Sopenharmony_ci        return;
377e509ee18Sopenharmony_ci    }
378e509ee18Sopenharmony_ci
379e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> callFrames;
380e509ee18Sopenharmony_ci    ret = params->GetArray("callFrames", &callFrames);
381e509ee18Sopenharmony_ci    if (ret != Result::SUCCESS) {
382e509ee18Sopenharmony_ci        LOGE("arkdb: find callFrames error");
383e509ee18Sopenharmony_ci        return;
384e509ee18Sopenharmony_ci    }
385e509ee18Sopenharmony_ci
386e509ee18Sopenharmony_ci    std::map<int32_t, std::unique_ptr<CallFrame>> data;
387e509ee18Sopenharmony_ci    for (int32_t i = 0; i < callFrames->GetSize(); i++) {
388e509ee18Sopenharmony_ci        std::unique_ptr<CallFrame> callFrameInfo = CallFrame::Create(*(callFrames->Get(i)));
389e509ee18Sopenharmony_ci        data.emplace(i + 1, std::move(callFrameInfo));
390e509ee18Sopenharmony_ci    }
391e509ee18Sopenharmony_ci
392e509ee18Sopenharmony_ci    Session *session = SessionManager::getInstance().GetSessionById(sessionId_);
393e509ee18Sopenharmony_ci    StackManager& stackManager = session->GetStackManager();
394e509ee18Sopenharmony_ci    SourceManager &sourceManager = session->GetSourceManager();
395e509ee18Sopenharmony_ci    WatchManager &watchManager = session->GetWatchManager();
396e509ee18Sopenharmony_ci    stackManager.ClearCallFrame();
397e509ee18Sopenharmony_ci    stackManager.SetCallFrames(std::move(data));
398e509ee18Sopenharmony_ci    sourceManager.GetDebugSources(callFrames->Get(0));
399e509ee18Sopenharmony_ci    watchManager.RequestWatchInfo(callFrames->Get(0));
400e509ee18Sopenharmony_ci    watchManager.DebugTrueState();
401e509ee18Sopenharmony_ci}
402e509ee18Sopenharmony_ci
403e509ee18Sopenharmony_civoid DebuggerClient::handleResponse(std::unique_ptr<PtJson> json)
404e509ee18Sopenharmony_ci{
405e509ee18Sopenharmony_ci    Session *session = SessionManager::getInstance().GetSessionById(sessionId_);
406e509ee18Sopenharmony_ci    SourceManager &sourceManager = session->GetSourceManager();
407e509ee18Sopenharmony_ci    WatchManager &watchManager = session->GetWatchManager();
408e509ee18Sopenharmony_ci    BreakPointManager& breakpoint = session->GetBreakPointManager();
409e509ee18Sopenharmony_ci    std::unique_ptr<PtJson> result;
410e509ee18Sopenharmony_ci    Result ret = json->GetObject("result", &result);
411e509ee18Sopenharmony_ci    if (ret != Result::SUCCESS) {
412e509ee18Sopenharmony_ci        LOGE("arkdb: find result error");
413e509ee18Sopenharmony_ci        return;
414e509ee18Sopenharmony_ci    }
415e509ee18Sopenharmony_ci    int32_t id;
416e509ee18Sopenharmony_ci    ret = json->GetInt("id", &id);
417e509ee18Sopenharmony_ci    if (ret == Result::SUCCESS) {
418e509ee18Sopenharmony_ci        std::string scriptSource;
419e509ee18Sopenharmony_ci        ret = result->GetString("scriptSource", &scriptSource);
420e509ee18Sopenharmony_ci        if (ret == Result::SUCCESS) {
421e509ee18Sopenharmony_ci            sourceManager.SetFileSource(id, scriptSource);
422e509ee18Sopenharmony_ci            return;
423e509ee18Sopenharmony_ci        }
424e509ee18Sopenharmony_ci    }
425e509ee18Sopenharmony_ci    std::string breakpointId;
426e509ee18Sopenharmony_ci    ret = result->GetString("breakpointId", &breakpointId);
427e509ee18Sopenharmony_ci    if (ret == Result::SUCCESS) {
428e509ee18Sopenharmony_ci        breakpoint.Createbreaklocation(std::move(json));
429e509ee18Sopenharmony_ci        return;
430e509ee18Sopenharmony_ci    }
431e509ee18Sopenharmony_ci    if (watchManager.HandleWatchResult(std::move(json), id)) {
432e509ee18Sopenharmony_ci        return;
433e509ee18Sopenharmony_ci    }
434e509ee18Sopenharmony_ci    return;
435e509ee18Sopenharmony_ci}
436e509ee18Sopenharmony_ci} // OHOS::ArkCompiler::Toolchain