1fb726d48Sopenharmony_ci/* 2fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd. 3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License. 5fb726d48Sopenharmony_ci * You may obtain a copy of the License at 6fb726d48Sopenharmony_ci * 7fb726d48Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8fb726d48Sopenharmony_ci * 9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and 13fb726d48Sopenharmony_ci * limitations under the License. 14fb726d48Sopenharmony_ci */ 15fb726d48Sopenharmony_ci 16fb726d48Sopenharmony_ciimport { SpRecordTrace } from '../trace/component/SpRecordTrace'; 17fb726d48Sopenharmony_ciimport { CmdConstant } from './CmdConstant'; 18fb726d48Sopenharmony_ciimport { HdcDeviceManager } from '../hdc/HdcDeviceManager'; 19fb726d48Sopenharmony_ci 20fb726d48Sopenharmony_ciexport class Cmd { 21fb726d48Sopenharmony_ci static CmdSendPostUtils(uri: string, callback: Function, requestData: unknown): void { 22fb726d48Sopenharmony_ci // @ts-ignore 23fb726d48Sopenharmony_ci if (window.useWb) { 24fb726d48Sopenharmony_ci return; 25fb726d48Sopenharmony_ci } 26fb726d48Sopenharmony_ci fetch(uri, { 27fb726d48Sopenharmony_ci method: 'POST', 28fb726d48Sopenharmony_ci headers: { 29fb726d48Sopenharmony_ci 'Content-Type': 'application/json', 30fb726d48Sopenharmony_ci }, 31fb726d48Sopenharmony_ci body: JSON.stringify(requestData), 32fb726d48Sopenharmony_ci }).then((response): void => { 33fb726d48Sopenharmony_ci if (response.ok) { 34fb726d48Sopenharmony_ci let result = response.text(); 35fb726d48Sopenharmony_ci result.then((output) => { 36fb726d48Sopenharmony_ci callback(output); 37fb726d48Sopenharmony_ci }); 38fb726d48Sopenharmony_ci } 39fb726d48Sopenharmony_ci }); 40fb726d48Sopenharmony_ci } 41fb726d48Sopenharmony_ci 42fb726d48Sopenharmony_ci /** 43fb726d48Sopenharmony_ci * exec objdump to disassembling binary and find addr to show 100 line 44fb726d48Sopenharmony_ci * @param command obj dump command 45fb726d48Sopenharmony_ci * @param addr addr of select line 46fb726d48Sopenharmony_ci * @param callback result callback 47fb726d48Sopenharmony_ci */ 48fb726d48Sopenharmony_ci static execObjDump(command: string, addr: string, callback: Function): void { 49fb726d48Sopenharmony_ci // @ts-ignore 50fb726d48Sopenharmony_ci if (window.useWb) { 51fb726d48Sopenharmony_ci return; 52fb726d48Sopenharmony_ci } 53fb726d48Sopenharmony_ci const data = { cmd: command, addr: addr }; 54fb726d48Sopenharmony_ci let uri = `http://${window.location.host.split(':')[0]}:${window.location.port}/exec`; 55fb726d48Sopenharmony_ci Cmd.CmdSendPostUtils(uri, callback, data); 56fb726d48Sopenharmony_ci } 57fb726d48Sopenharmony_ci 58fb726d48Sopenharmony_ci static execHdcCmd(command: string, callback: Function): void { 59fb726d48Sopenharmony_ci // @ts-ignore 60fb726d48Sopenharmony_ci if (window.useWb) { 61fb726d48Sopenharmony_ci return; 62fb726d48Sopenharmony_ci } 63fb726d48Sopenharmony_ci const data = { 64fb726d48Sopenharmony_ci cmd: command, 65fb726d48Sopenharmony_ci tag: 'shell', 66fb726d48Sopenharmony_ci }; 67fb726d48Sopenharmony_ci let uri = `http://${window.location.host.split(':')[0]}:${window.location.port}/hdcCmd`; 68fb726d48Sopenharmony_ci Cmd.CmdSendPostUtils(uri, callback, data); 69fb726d48Sopenharmony_ci } 70fb726d48Sopenharmony_ci 71fb726d48Sopenharmony_ci static async execFileRecv(command: string, filePath: string, callback: Function): Promise<void> { 72fb726d48Sopenharmony_ci // @ts-ignore 73fb726d48Sopenharmony_ci if (window.useWb) { 74fb726d48Sopenharmony_ci return; 75fb726d48Sopenharmony_ci } 76fb726d48Sopenharmony_ci let fileName = filePath.substring(filePath.lastIndexOf('/') + 1); 77fb726d48Sopenharmony_ci const data = { 78fb726d48Sopenharmony_ci cmd: command, 79fb726d48Sopenharmony_ci tag: 'file', 80fb726d48Sopenharmony_ci fileName: fileName, 81fb726d48Sopenharmony_ci }; 82fb726d48Sopenharmony_ci let uri = `http://${window.location.host.split(':')[0]}:${window.location.port}/hdcCmd`; 83fb726d48Sopenharmony_ci let buf = await fetch(uri, { 84fb726d48Sopenharmony_ci method: 'POST', 85fb726d48Sopenharmony_ci headers: { 86fb726d48Sopenharmony_ci 'Content-Type': 'application/json', 87fb726d48Sopenharmony_ci }, 88fb726d48Sopenharmony_ci body: JSON.stringify(data), 89fb726d48Sopenharmony_ci }).then((res) => res.arrayBuffer()); 90fb726d48Sopenharmony_ci callback(buf); 91fb726d48Sopenharmony_ci } 92fb726d48Sopenharmony_ci 93fb726d48Sopenharmony_ci static execHdcTraceCmd(command: string, serialNumber: string, callback: Function): void { 94fb726d48Sopenharmony_ci // @ts-ignore 95fb726d48Sopenharmony_ci if (window.useWb) { 96fb726d48Sopenharmony_ci return; 97fb726d48Sopenharmony_ci } 98fb726d48Sopenharmony_ci const data = { 99fb726d48Sopenharmony_ci cmd: command, 100fb726d48Sopenharmony_ci tag: 'hiprofiler_cmd', 101fb726d48Sopenharmony_ci serialNumber: serialNumber, 102fb726d48Sopenharmony_ci }; 103fb726d48Sopenharmony_ci let uri = `http://${window.location.host.split(':')[0]}:${window.location.port}/hdcCmd`; 104fb726d48Sopenharmony_ci Cmd.CmdSendPostUtils(uri, callback, data); 105fb726d48Sopenharmony_ci } 106fb726d48Sopenharmony_ci 107fb726d48Sopenharmony_ci static formatString(string: string, params: string[]): string { 108fb726d48Sopenharmony_ci if (params.length === 0) { 109fb726d48Sopenharmony_ci return string; 110fb726d48Sopenharmony_ci } 111fb726d48Sopenharmony_ci for (let i = 0; i < params.length; i++) { 112fb726d48Sopenharmony_ci string = string.replace(new RegExp('\\{' + i + '\\}', 'g'), params[i]); 113fb726d48Sopenharmony_ci } 114fb726d48Sopenharmony_ci return string; 115fb726d48Sopenharmony_ci } 116fb726d48Sopenharmony_ci 117fb726d48Sopenharmony_ci static showSaveFile(callback: Function): void { 118fb726d48Sopenharmony_ci // @ts-ignore 119fb726d48Sopenharmony_ci if (window.useWb) { 120fb726d48Sopenharmony_ci return; 121fb726d48Sopenharmony_ci } 122fb726d48Sopenharmony_ci let uri = `http://${window.location.host.split(':')[0]}:${window.location.port}/showSaveDialog`; 123fb726d48Sopenharmony_ci fetch(uri, { 124fb726d48Sopenharmony_ci method: 'GET', 125fb726d48Sopenharmony_ci }).then((response) => { 126fb726d48Sopenharmony_ci if (response.ok) { 127fb726d48Sopenharmony_ci let result = response.text(); 128fb726d48Sopenharmony_ci result.then((output) => { 129fb726d48Sopenharmony_ci callback(output); 130fb726d48Sopenharmony_ci }); 131fb726d48Sopenharmony_ci } 132fb726d48Sopenharmony_ci }); 133fb726d48Sopenharmony_ci } 134fb726d48Sopenharmony_ci 135fb726d48Sopenharmony_ci static uploadFile(fd: FormData, callback: Function): void { 136fb726d48Sopenharmony_ci // @ts-ignore 137fb726d48Sopenharmony_ci if (window.useWb) { 138fb726d48Sopenharmony_ci return; 139fb726d48Sopenharmony_ci } 140fb726d48Sopenharmony_ci let uri = `http://${window.location.host.split(':')[0]}:${window.location.port}/upload`; 141fb726d48Sopenharmony_ci fetch(uri, { 142fb726d48Sopenharmony_ci method: 'POST', 143fb726d48Sopenharmony_ci body: fd, 144fb726d48Sopenharmony_ci }).then((response): void => { 145fb726d48Sopenharmony_ci callback(response); 146fb726d48Sopenharmony_ci }); 147fb726d48Sopenharmony_ci } 148fb726d48Sopenharmony_ci 149fb726d48Sopenharmony_ci static copyFile(fileName: string, distFile: string, callback: Function): void { 150fb726d48Sopenharmony_ci // @ts-ignore 151fb726d48Sopenharmony_ci if (window.useWb) { 152fb726d48Sopenharmony_ci return; 153fb726d48Sopenharmony_ci } 154fb726d48Sopenharmony_ci const data = { 155fb726d48Sopenharmony_ci filename: fileName, 156fb726d48Sopenharmony_ci distfile: distFile, 157fb726d48Sopenharmony_ci }; 158fb726d48Sopenharmony_ci let uri = `http://${window.location.host.split(':')[0]}:${window.location.port}/copyfile`; 159fb726d48Sopenharmony_ci fetch(uri, { 160fb726d48Sopenharmony_ci method: 'POST', 161fb726d48Sopenharmony_ci headers: { 162fb726d48Sopenharmony_ci 'Content-Type': 'application/json', 163fb726d48Sopenharmony_ci }, 164fb726d48Sopenharmony_ci body: JSON.stringify(data), 165fb726d48Sopenharmony_ci }).then((response): void => { 166fb726d48Sopenharmony_ci callback(response); 167fb726d48Sopenharmony_ci }); 168fb726d48Sopenharmony_ci } 169fb726d48Sopenharmony_ci 170fb726d48Sopenharmony_ci static async openFileDialog(): Promise<string> { 171fb726d48Sopenharmony_ci // @ts-ignore 172fb726d48Sopenharmony_ci if (window.useWb) { 173fb726d48Sopenharmony_ci return ''; 174fb726d48Sopenharmony_ci } 175fb726d48Sopenharmony_ci let uri = `http://${window.location.host.split(':')[0]}:${window.location.port}/showOpenDialog`; 176fb726d48Sopenharmony_ci let res = await fetch(uri, { method: 'POST' }); 177fb726d48Sopenharmony_ci let result = res.ok ? await res.text() : ''; 178fb726d48Sopenharmony_ci return result; 179fb726d48Sopenharmony_ci } 180fb726d48Sopenharmony_ci 181fb726d48Sopenharmony_ci static convertOutProcessList(res: string): string[] { 182fb726d48Sopenharmony_ci let processData: string[] = []; 183fb726d48Sopenharmony_ci if (res) { 184fb726d48Sopenharmony_ci let lineValues: string[] = res.replace(/\r\n/g, '\r').replace(/\n/g, '\r').split(/\r/); 185fb726d48Sopenharmony_ci for (let lineVal of lineValues) { 186fb726d48Sopenharmony_ci lineVal = lineVal.trim(); 187fb726d48Sopenharmony_ci if (lineVal.indexOf('__progname') !== -1 || lineVal.indexOf('CMD') !== -1 || lineVal.length === 0) { 188fb726d48Sopenharmony_ci continue; 189fb726d48Sopenharmony_ci } else { 190fb726d48Sopenharmony_ci let process: string[] = lineVal.split(' '); 191fb726d48Sopenharmony_ci if (process.length === 2) { 192fb726d48Sopenharmony_ci processData.push(`${process[1]}(${process[0]})`); 193fb726d48Sopenharmony_ci } 194fb726d48Sopenharmony_ci } 195fb726d48Sopenharmony_ci } 196fb726d48Sopenharmony_ci } 197fb726d48Sopenharmony_ci return processData; 198fb726d48Sopenharmony_ci } 199fb726d48Sopenharmony_ci static convertOutPackageList(res: string): string[] { 200fb726d48Sopenharmony_ci let packageData: string[] = []; 201fb726d48Sopenharmony_ci res ? (packageData = res.replace(/\r\n/g, '\r').replace(/\n\t/g, '\r').split(/\r/)) : []; 202fb726d48Sopenharmony_ci packageData.shift(); 203fb726d48Sopenharmony_ci return packageData; 204fb726d48Sopenharmony_ci } 205fb726d48Sopenharmony_ci 206fb726d48Sopenharmony_ci static getDebugProcess(): Promise<string[]> { 207fb726d48Sopenharmony_ci return new Promise((resolve, reject) => { 208fb726d48Sopenharmony_ci if (SpRecordTrace.isVscode) { 209fb726d48Sopenharmony_ci let cmd = Cmd.formatString(CmdConstant.CMD_GET_DEBUG_PROCESS_DEVICES, [SpRecordTrace.serialNumber]); 210fb726d48Sopenharmony_ci Cmd.execHdcCmd(cmd, (res: string) => { 211fb726d48Sopenharmony_ci resolve(Cmd.convertOutProcessList(res)); 212fb726d48Sopenharmony_ci }); 213fb726d48Sopenharmony_ci } else { 214fb726d48Sopenharmony_ci HdcDeviceManager.connect(SpRecordTrace.serialNumber).then((conn) => { 215fb726d48Sopenharmony_ci if (conn) { 216fb726d48Sopenharmony_ci HdcDeviceManager.shellResultAsString(CmdConstant.CMD_GET_DEBUG_PROCESS, false).then((res) => { 217fb726d48Sopenharmony_ci resolve(Cmd.convertOutProcessList(res)); 218fb726d48Sopenharmony_ci }); 219fb726d48Sopenharmony_ci } else { 220fb726d48Sopenharmony_ci reject(-1); 221fb726d48Sopenharmony_ci } 222fb726d48Sopenharmony_ci }); 223fb726d48Sopenharmony_ci } 224fb726d48Sopenharmony_ci }); 225fb726d48Sopenharmony_ci } 226fb726d48Sopenharmony_ci 227fb726d48Sopenharmony_ci static getProcess(): Promise<string[]> { 228fb726d48Sopenharmony_ci return new Promise((resolve, reject): void => { 229fb726d48Sopenharmony_ci if (SpRecordTrace.isVscode) { 230fb726d48Sopenharmony_ci let cmd = Cmd.formatString(CmdConstant.CMD_GET_PROCESS_DEVICES, [SpRecordTrace.serialNumber]); 231fb726d48Sopenharmony_ci Cmd.execHdcCmd(cmd, (res: string): void => { 232fb726d48Sopenharmony_ci resolve(Cmd.convertOutProcessList(res)); 233fb726d48Sopenharmony_ci }); 234fb726d48Sopenharmony_ci } else { 235fb726d48Sopenharmony_ci HdcDeviceManager.connect(SpRecordTrace.serialNumber).then((conn): void => { 236fb726d48Sopenharmony_ci if (conn) { 237fb726d48Sopenharmony_ci HdcDeviceManager.shellResultAsString(CmdConstant.CMD_GET_PROCESS, false).then((res): void => { 238fb726d48Sopenharmony_ci resolve(Cmd.convertOutProcessList(res)); 239fb726d48Sopenharmony_ci }); 240fb726d48Sopenharmony_ci } else { 241fb726d48Sopenharmony_ci reject(-1); 242fb726d48Sopenharmony_ci } 243fb726d48Sopenharmony_ci }); 244fb726d48Sopenharmony_ci } 245fb726d48Sopenharmony_ci }); 246fb726d48Sopenharmony_ci } 247fb726d48Sopenharmony_ci static getPackage(): Promise<string[]> { 248fb726d48Sopenharmony_ci return new Promise((resolve, reject): void => { 249fb726d48Sopenharmony_ci HdcDeviceManager.connect(SpRecordTrace.serialNumber).then((conn) => { 250fb726d48Sopenharmony_ci if (conn) { 251fb726d48Sopenharmony_ci HdcDeviceManager.shellResultAsString(CmdConstant.CMD_GET_PACKAGE, false).then((res): void => { 252fb726d48Sopenharmony_ci resolve(Cmd.convertOutPackageList(res)); 253fb726d48Sopenharmony_ci }); 254fb726d48Sopenharmony_ci } else { 255fb726d48Sopenharmony_ci reject(-1); 256fb726d48Sopenharmony_ci } 257fb726d48Sopenharmony_ci }); 258fb726d48Sopenharmony_ci }); 259fb726d48Sopenharmony_ci } 260fb726d48Sopenharmony_ci} 261