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", ¶ms); 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