1/*
2 * Copyright (c) Huawei Technologies Co., Ltd. 2024. All rights reserved.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15#include "include/navigation.h"
16#include <iostream>
17#include "include/sp_utils.h"
18#include "include/startup_delay.h"
19#include "include/sp_log.h"
20#include "include/common.h"
21
22namespace OHOS {
23namespace SmartPerf {
24std::map<std::string, std::string> Navigation::ItemData()
25{
26    std::map<std::string, std::string> result = Navigation::GetNavInfo();
27    LOGI("Navigation::ItemData map size(%u)", result.size());
28    return result;
29}
30
31void Navigation::SetProcessId(const std::string &pid)
32{
33    processId = pid;
34}
35
36std::map<std::string, std::string> Navigation::GetNavInfo() const
37{
38    std::map<std::string, std::string> navInfo;
39    std::string winId = "";
40    winId = GetWinId(processId);
41    if (winId != "-1") {
42        navInfo = GetNavResult(winId);
43    } else {
44        navInfo["navPathName"] = "No Navigation Info";
45    }
46    return navInfo;
47}
48
49std::map<std::string, std::string> Navigation::GetNavResult(std::string winId) const
50{
51    std::map<std::string, std::string> navInfo;
52    std::string nameStr = "No Navigation Info";
53    std::string cmd = HIDUMPER_CMD_MAP.at(HidumperCmd::DUMPER_NAV) + winId + " -navigation'";
54    if (cmd.empty()) {
55        navInfo["navPathName"] = nameStr;
56        return navInfo;
57    }
58    FILE *navfd = popen(cmd.c_str(), "r");
59    if (navfd == nullptr) {
60        navInfo["navPathName"] = nameStr;
61        return navInfo;
62    }
63    char buf[4096] = {'\0'};
64    while ((fgets(buf, sizeof(buf), navfd)) != nullptr) {
65        std::string line = buf;
66        if (line.find("]{ name:") != std::string::npos) {
67            size_t pos = line.find("]{ name:");
68            size_t pos2 = line.find_last_of("}");
69            if (line.find(",") != std::string::npos) {
70                size_t pos1 = line.find(",");
71                nameStr = line.substr(pos + paramTen, pos1 - pos - paramEleven);
72            } else {
73                nameStr = line.substr(pos + paramTen, pos2 - pos - paramTwelve);
74            }
75        }
76    }
77    pclose(navfd);
78    navInfo["navPathName"] = nameStr;
79    return navInfo;
80}
81
82std::string Navigation::GetWinId(std::string navPid) const
83{
84    std::string wid;
85    const std::string cmd = HIDUMPER_CMD_MAP.at(HidumperCmd::DUMPER_A_A);
86    FILE *fd = popen(cmd.c_str(), "r");
87    if (fd == nullptr) {
88        return wid = -1;
89    }
90    char buf[1024] = {'\0'};
91    while ((fgets(buf, sizeof(buf), fd)) != nullptr) {
92        std::string line = buf;
93        if (line.find("---") != std::string::npos || line.length() <= 1 ||
94            line.find("WindowName") != std::string::npos) {
95            continue;
96        }
97        std::vector<std::string> params;
98        SPUtils::StrSplit(line, " ", params);
99        if (static_cast<int>(params.size()) > paramThree) {
100            if (params[paramTwo] == navPid) {
101                wid = params[paramThree];
102                break;
103            }
104        }
105    }
106    pclose(fd);
107    return wid;
108}
109}
110}
111