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