1020a203aSopenharmony_ci/*
2020a203aSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
3020a203aSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4020a203aSopenharmony_ci * you may not use this file except in compliance with the License.
5020a203aSopenharmony_ci * You may obtain a copy of the License at
6020a203aSopenharmony_ci *
7020a203aSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8020a203aSopenharmony_ci *
9020a203aSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10020a203aSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11020a203aSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12020a203aSopenharmony_ci * See the License for the specific language governing permissions and
13020a203aSopenharmony_ci * limitations under the License.
14020a203aSopenharmony_ci */
15020a203aSopenharmony_ci
16020a203aSopenharmony_ci#include "vendor.h"
17020a203aSopenharmony_ci
18020a203aSopenharmony_ci#include "faultlogger_client.h"
19020a203aSopenharmony_ci#include "file_util.h"
20020a203aSopenharmony_ci#include "freeze_json_util.h"
21020a203aSopenharmony_ci#include "hiview_logger.h"
22020a203aSopenharmony_ci#include "string_util.h"
23020a203aSopenharmony_ci#include "time_util.h"
24020a203aSopenharmony_ci#include <regex>
25020a203aSopenharmony_ci
26020a203aSopenharmony_cinamespace OHOS {
27020a203aSopenharmony_cinamespace HiviewDFX {
28020a203aSopenharmony_cinamespace {
29020a203aSopenharmony_ci    static const int MILLISECOND = 1000;
30020a203aSopenharmony_ci    static const int MAX_LINE_NUM = 100;
31020a203aSopenharmony_ci    static const int TIME_STRING_LEN = 16;
32020a203aSopenharmony_ci    static const int MAX_FILE_NUM = 500;
33020a203aSopenharmony_ci    static const int MAX_FOLDER_SIZE = 50 * 1024 * 1024;
34020a203aSopenharmony_ci    static constexpr const char* const TRIGGER_HEADER = ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>";
35020a203aSopenharmony_ci    static constexpr const char* const HEADER = "*******************************************";
36020a203aSopenharmony_ci    static constexpr const char* const HYPHEN = "-";
37020a203aSopenharmony_ci    static constexpr const char* const POSTFIX = ".tmp";
38020a203aSopenharmony_ci    static constexpr const char* const APPFREEZE = "appfreeze";
39020a203aSopenharmony_ci    static constexpr const char* const SYSFREEZE = "sysfreeze";
40020a203aSopenharmony_ci    static constexpr const char* const SYSWARNING = "syswarning";
41020a203aSopenharmony_ci    static constexpr const char* const FREEZE_DETECTOR_PATH = "/data/log/faultlog/";
42020a203aSopenharmony_ci    static constexpr const char* const FAULT_LOGGER_PATH = "/data/log/faultlog/faultlogger/";
43020a203aSopenharmony_ci    static constexpr const char* const COLON = ":";
44020a203aSopenharmony_ci    static constexpr const char* const EVENT_DOMAIN = "DOMAIN";
45020a203aSopenharmony_ci    static constexpr const char* const EVENT_STRINGID = "STRINGID";
46020a203aSopenharmony_ci    static constexpr const char* const EVENT_TIMESTAMP = "TIMESTAMP";
47020a203aSopenharmony_ci    static constexpr const char* const DISPLAY_POWER_INFO = "DisplayPowerInfo:";
48020a203aSopenharmony_ci    static constexpr const char* const FORE_GROUND = "FOREGROUND";
49020a203aSopenharmony_ci}
50020a203aSopenharmony_ci
51020a203aSopenharmony_ciDEFINE_LOG_LABEL(0xD002D01, "FreezeDetector");
52020a203aSopenharmony_cibool Vendor::ReduceRelevanceEvents(std::list<WatchPoint>& list, const FreezeResult& result) const
53020a203aSopenharmony_ci{
54020a203aSopenharmony_ci    HIVIEW_LOGI("before size=%{public}zu", list.size());
55020a203aSopenharmony_ci    if (freezeCommon_ == nullptr) {
56020a203aSopenharmony_ci        return false;
57020a203aSopenharmony_ci    }
58020a203aSopenharmony_ci    if (!freezeCommon_->IsSystemResult(result) && !freezeCommon_->IsApplicationResult(result) &&
59020a203aSopenharmony_ci        !freezeCommon_->IsSysWarningResult(result)) {
60020a203aSopenharmony_ci        list.clear();
61020a203aSopenharmony_ci        return false;
62020a203aSopenharmony_ci    }
63020a203aSopenharmony_ci
64020a203aSopenharmony_ci    // erase if not system event
65020a203aSopenharmony_ci    if (freezeCommon_->IsSystemResult(result)) {
66020a203aSopenharmony_ci        std::list<WatchPoint>::iterator watchPoint;
67020a203aSopenharmony_ci        for (watchPoint = list.begin(); watchPoint != list.end();) {
68020a203aSopenharmony_ci            if (freezeCommon_->IsSystemEvent(watchPoint->GetDomain(), watchPoint->GetStringId())) {
69020a203aSopenharmony_ci                watchPoint++;
70020a203aSopenharmony_ci            } else {
71020a203aSopenharmony_ci                watchPoint = list.erase(watchPoint);
72020a203aSopenharmony_ci            }
73020a203aSopenharmony_ci        }
74020a203aSopenharmony_ci    }
75020a203aSopenharmony_ci
76020a203aSopenharmony_ci    // erase if not application event
77020a203aSopenharmony_ci    if (freezeCommon_->IsApplicationResult(result)) {
78020a203aSopenharmony_ci        std::list<WatchPoint>::iterator watchPoint;
79020a203aSopenharmony_ci        for (watchPoint = list.begin(); watchPoint != list.end();) {
80020a203aSopenharmony_ci            if (freezeCommon_->IsApplicationEvent(watchPoint->GetDomain(), watchPoint->GetStringId())) {
81020a203aSopenharmony_ci                watchPoint++;
82020a203aSopenharmony_ci            } else {
83020a203aSopenharmony_ci                watchPoint = list.erase(watchPoint);
84020a203aSopenharmony_ci            }
85020a203aSopenharmony_ci        }
86020a203aSopenharmony_ci    }
87020a203aSopenharmony_ci
88020a203aSopenharmony_ci    // erase if not sysWarning event
89020a203aSopenharmony_ci    if (freezeCommon_->IsSysWarningResult(result)) {
90020a203aSopenharmony_ci        std::list<WatchPoint>::iterator watchPoint;
91020a203aSopenharmony_ci        for (watchPoint = list.begin(); watchPoint != list.end();) {
92020a203aSopenharmony_ci            if (freezeCommon_->IsSysWarningEvent(watchPoint->GetDomain(), watchPoint->GetStringId())) {
93020a203aSopenharmony_ci                watchPoint++;
94020a203aSopenharmony_ci            } else {
95020a203aSopenharmony_ci                watchPoint = list.erase(watchPoint);
96020a203aSopenharmony_ci            }
97020a203aSopenharmony_ci        }
98020a203aSopenharmony_ci    }
99020a203aSopenharmony_ci
100020a203aSopenharmony_ci    list.sort();
101020a203aSopenharmony_ci    list.unique();
102020a203aSopenharmony_ci    HIVIEW_LOGI("after size=%{public}zu", list.size());
103020a203aSopenharmony_ci    return list.size() != 0;
104020a203aSopenharmony_ci}
105020a203aSopenharmony_ci
106020a203aSopenharmony_cistd::string Vendor::GetTimeString(unsigned long long timestamp) const
107020a203aSopenharmony_ci{
108020a203aSopenharmony_ci    struct tm tm;
109020a203aSopenharmony_ci    time_t ts = static_cast<long long>(timestamp) / MILLISECOND; // ms
110020a203aSopenharmony_ci    localtime_r(&ts, &tm);
111020a203aSopenharmony_ci    char buf[TIME_STRING_LEN] = {0};
112020a203aSopenharmony_ci
113020a203aSopenharmony_ci    strftime(buf, TIME_STRING_LEN - 1, "%Y%m%d%H%M%S", &tm);
114020a203aSopenharmony_ci    return std::string(buf, strlen(buf));
115020a203aSopenharmony_ci}
116020a203aSopenharmony_ci
117020a203aSopenharmony_cistd::string Vendor::SendFaultLog(const WatchPoint &watchPoint, const std::string& logPath,
118020a203aSopenharmony_ci    const std::string& type) const
119020a203aSopenharmony_ci{
120020a203aSopenharmony_ci    if (freezeCommon_ == nullptr) {
121020a203aSopenharmony_ci        return "";
122020a203aSopenharmony_ci    }
123020a203aSopenharmony_ci    std::string packageName = StringUtil::TrimStr(watchPoint.GetPackageName());
124020a203aSopenharmony_ci    std::string processName = StringUtil::TrimStr(watchPoint.GetProcessName());
125020a203aSopenharmony_ci    std::string stringId = watchPoint.GetStringId();
126020a203aSopenharmony_ci    processName = processName.empty() ? (packageName.empty() ? stringId : packageName) : processName;
127020a203aSopenharmony_ci    if (stringId == "SCREEN_ON") {
128020a203aSopenharmony_ci        processName = stringId;
129020a203aSopenharmony_ci    } else {
130020a203aSopenharmony_ci        FormatProcessName(processName);
131020a203aSopenharmony_ci    }
132020a203aSopenharmony_ci
133020a203aSopenharmony_ci    FaultLogInfoInner info;
134020a203aSopenharmony_ci    info.time = watchPoint.GetTimestamp();
135020a203aSopenharmony_ci    info.id = watchPoint.GetUid();
136020a203aSopenharmony_ci    info.pid = watchPoint.GetPid();
137020a203aSopenharmony_ci    info.faultLogType = (type == APPFREEZE) ? FaultLogType::APP_FREEZE : ((type == SYSFREEZE) ?
138020a203aSopenharmony_ci        FaultLogType::SYS_FREEZE : FaultLogType::SYS_WARNING);
139020a203aSopenharmony_ci    info.module = processName;
140020a203aSopenharmony_ci    info.reason = stringId;
141020a203aSopenharmony_ci    std::string disPlayPowerInfo = GetDisPlayPowerInfo();
142020a203aSopenharmony_ci    info.summary = type + ": " + processName + " " + stringId +
143020a203aSopenharmony_ci        " at " + GetTimeString(watchPoint.GetTimestamp()) + "\n";
144020a203aSopenharmony_ci    info.summary += std::string(DISPLAY_POWER_INFO) + disPlayPowerInfo;
145020a203aSopenharmony_ci    info.logPath = logPath;
146020a203aSopenharmony_ci    info.sectionMaps[FreezeCommon::HIREACE_TIME] = watchPoint.GetHitraceTime();
147020a203aSopenharmony_ci    info.sectionMaps[FreezeCommon::SYSRQ_TIME] = watchPoint.GetSysrqTime();
148020a203aSopenharmony_ci    info.sectionMaps[FORE_GROUND] = watchPoint.GetForeGround();
149020a203aSopenharmony_ci    AddFaultLog(info);
150020a203aSopenharmony_ci    return logPath;
151020a203aSopenharmony_ci}
152020a203aSopenharmony_ci
153020a203aSopenharmony_civoid Vendor::DumpEventInfo(std::ostringstream& oss, const std::string& header, const WatchPoint& watchPoint) const
154020a203aSopenharmony_ci{
155020a203aSopenharmony_ci    uint64_t timestamp = watchPoint.GetTimestamp() / TimeUtil::SEC_TO_MILLISEC;
156020a203aSopenharmony_ci    oss << header << std::endl;
157020a203aSopenharmony_ci    oss << std::string(EVENT_DOMAIN) << std::string(COLON) << watchPoint.GetDomain() << std::endl;
158020a203aSopenharmony_ci    oss << std::string(EVENT_STRINGID) << std::string(COLON) << watchPoint.GetStringId() << std::endl;
159020a203aSopenharmony_ci    oss << std::string(EVENT_TIMESTAMP) << std::string(COLON) <<
160020a203aSopenharmony_ci        TimeUtil::TimestampFormatToDate(timestamp, "%Y/%m/%d-%H:%M:%S") <<
161020a203aSopenharmony_ci        ":" << watchPoint.GetTimestamp() % TimeUtil::SEC_TO_MILLISEC << std::endl;
162020a203aSopenharmony_ci    oss << FreezeCommon::EVENT_PID << std::string(COLON) << watchPoint.GetPid() << std::endl;
163020a203aSopenharmony_ci    oss << FreezeCommon::EVENT_UID << std::string(COLON) << watchPoint.GetUid() << std::endl;
164020a203aSopenharmony_ci    oss << FreezeCommon::EVENT_PACKAGE_NAME << std::string(COLON) << watchPoint.GetPackageName() << std::endl;
165020a203aSopenharmony_ci    oss << FreezeCommon::EVENT_PROCESS_NAME << std::string(COLON) << watchPoint.GetProcessName() << std::endl;
166020a203aSopenharmony_ci}
167020a203aSopenharmony_ci
168020a203aSopenharmony_civoid Vendor::MergeFreezeJsonFile(const WatchPoint &watchPoint, const std::vector<WatchPoint>& list) const
169020a203aSopenharmony_ci{
170020a203aSopenharmony_ci    std::ostringstream oss;
171020a203aSopenharmony_ci    for (auto node : list) {
172020a203aSopenharmony_ci        std::string filePath = FreezeJsonUtil::GetFilePath(node.GetPid(), node.GetUid(), node.GetTimestamp());
173020a203aSopenharmony_ci        if (!FileUtil::FileExists(filePath)) {
174020a203aSopenharmony_ci            continue;
175020a203aSopenharmony_ci        }
176020a203aSopenharmony_ci        std::string realPath;
177020a203aSopenharmony_ci        if (!FileUtil::PathToRealPath(filePath, realPath)) {
178020a203aSopenharmony_ci            continue;
179020a203aSopenharmony_ci        }
180020a203aSopenharmony_ci        std::ifstream ifs(realPath, std::ios::in);
181020a203aSopenharmony_ci        if (ifs.is_open()) {
182020a203aSopenharmony_ci            oss << ifs.rdbuf();
183020a203aSopenharmony_ci            ifs.close();
184020a203aSopenharmony_ci        }
185020a203aSopenharmony_ci        FreezeJsonUtil::DelFile(realPath);
186020a203aSopenharmony_ci    }
187020a203aSopenharmony_ci
188020a203aSopenharmony_ci    std::string mergeFilePath = FreezeJsonUtil::GetFilePath(watchPoint.GetPid(),
189020a203aSopenharmony_ci        watchPoint.GetUid(), watchPoint.GetTimestamp());
190020a203aSopenharmony_ci    int jsonFd = FreezeJsonUtil::GetFd(mergeFilePath);
191020a203aSopenharmony_ci    if (jsonFd < 0) {
192020a203aSopenharmony_ci        HIVIEW_LOGE("fail to open FreezeJsonFile! jsonFd: %{public}d", jsonFd);
193020a203aSopenharmony_ci        return;
194020a203aSopenharmony_ci    } else {
195020a203aSopenharmony_ci        HIVIEW_LOGI("success to open FreezeJsonFile! jsonFd: %{public}d", jsonFd);
196020a203aSopenharmony_ci    }
197020a203aSopenharmony_ci    HIVIEW_LOGI("MergeFreezeJsonFile oss size: %{public}zu.", oss.str().size());
198020a203aSopenharmony_ci    FileUtil::SaveStringToFd(jsonFd, oss.str());
199020a203aSopenharmony_ci    FreezeJsonUtil::WriteKeyValue(jsonFd, "domain", watchPoint.GetDomain());
200020a203aSopenharmony_ci    FreezeJsonUtil::WriteKeyValue(jsonFd, "stringId", watchPoint.GetStringId());
201020a203aSopenharmony_ci    FreezeJsonUtil::WriteKeyValue(jsonFd, "timestamp", watchPoint.GetTimestamp());
202020a203aSopenharmony_ci    FreezeJsonUtil::WriteKeyValue(jsonFd, "pid", watchPoint.GetPid());
203020a203aSopenharmony_ci    FreezeJsonUtil::WriteKeyValue(jsonFd, "uid", watchPoint.GetUid());
204020a203aSopenharmony_ci    FreezeJsonUtil::WriteKeyValue(jsonFd, "package_name", watchPoint.GetPackageName());
205020a203aSopenharmony_ci    FreezeJsonUtil::WriteKeyValue(jsonFd, "process_name", watchPoint.GetProcessName());
206020a203aSopenharmony_ci    close(jsonFd);
207020a203aSopenharmony_ci    HIVIEW_LOGI("success to merge FreezeJsonFiles!");
208020a203aSopenharmony_ci}
209020a203aSopenharmony_ci
210020a203aSopenharmony_civoid Vendor::FormatProcessName(std::string& processName)
211020a203aSopenharmony_ci{
212020a203aSopenharmony_ci    std::regex regExpress("[\\/:*?\"<>|]");
213020a203aSopenharmony_ci    bool isLegal = !std::regex_search(processName, regExpress);
214020a203aSopenharmony_ci    if (isLegal) {
215020a203aSopenharmony_ci        return;
216020a203aSopenharmony_ci    }
217020a203aSopenharmony_ci    processName = std::regex_replace(processName, regExpress, "_");
218020a203aSopenharmony_ci    HIVIEW_LOGD("FormatProcessName processName=%{public}s", processName.c_str());
219020a203aSopenharmony_ci}
220020a203aSopenharmony_ci
221020a203aSopenharmony_civoid Vendor::InitLogInfo(const WatchPoint& watchPoint, std::string& type, std::string& retPath,
222020a203aSopenharmony_ci    std::string& tmpLogPath, std::string& tmpLogName) const
223020a203aSopenharmony_ci{
224020a203aSopenharmony_ci    std::string stringId = watchPoint.GetStringId();
225020a203aSopenharmony_ci    std::string timestamp = GetTimeString(watchPoint.GetTimestamp());
226020a203aSopenharmony_ci    long uid = watchPoint.GetUid();
227020a203aSopenharmony_ci    std::string packageName = StringUtil::TrimStr(watchPoint.GetPackageName());
228020a203aSopenharmony_ci    std::string processName = StringUtil::TrimStr(watchPoint.GetProcessName());
229020a203aSopenharmony_ci    processName = processName.empty() ? (packageName.empty() ? stringId : packageName) : processName;
230020a203aSopenharmony_ci    if (stringId == "SCREEN_ON") {
231020a203aSopenharmony_ci        processName = stringId;
232020a203aSopenharmony_ci    } else {
233020a203aSopenharmony_ci        FormatProcessName(processName);
234020a203aSopenharmony_ci    }
235020a203aSopenharmony_ci    type = freezeCommon_->IsApplicationEvent(watchPoint.GetDomain(), watchPoint.GetStringId()) ? APPFREEZE :
236020a203aSopenharmony_ci        (freezeCommon_->IsSystemEvent(watchPoint.GetDomain(), watchPoint.GetStringId()) ? SYSFREEZE : SYSWARNING);
237020a203aSopenharmony_ci    std::string pubLogPathName = type + std::string(HYPHEN) + processName + std::string(HYPHEN) + std::to_string(uid) +
238020a203aSopenharmony_ci        std::string(HYPHEN) + timestamp;
239020a203aSopenharmony_ci    retPath = std::string(FAULT_LOGGER_PATH) + pubLogPathName;
240020a203aSopenharmony_ci    tmpLogName = pubLogPathName + std::string(POSTFIX);
241020a203aSopenharmony_ci    tmpLogPath = std::string(FREEZE_DETECTOR_PATH) + tmpLogName;
242020a203aSopenharmony_ci}
243020a203aSopenharmony_ci
244020a203aSopenharmony_civoid Vendor::InitLogBody(const std::vector<WatchPoint>& list, std::ostringstream& body,
245020a203aSopenharmony_ci    bool& isFileExists) const
246020a203aSopenharmony_ci{
247020a203aSopenharmony_ci    HIVIEW_LOGI("merging list size %{public}zu", list.size());
248020a203aSopenharmony_ci    for (auto node : list) {
249020a203aSopenharmony_ci        std::string filePath = node.GetLogPath();
250020a203aSopenharmony_ci        if (filePath == "nolog" || filePath == "") {
251020a203aSopenharmony_ci            HIVIEW_LOGI("only header, no content:[%{public}s, %{public}s]",
252020a203aSopenharmony_ci                node.GetDomain().c_str(), node.GetStringId().c_str());
253020a203aSopenharmony_ci            DumpEventInfo(body, HEADER, node);
254020a203aSopenharmony_ci            continue;
255020a203aSopenharmony_ci        }
256020a203aSopenharmony_ci
257020a203aSopenharmony_ci        if (FileUtil::FileExists(filePath) == false) {
258020a203aSopenharmony_ci            isFileExists = false;
259020a203aSopenharmony_ci            HIVIEW_LOGE("[%{public}s, %{public}s] File:%{public}s does not exist",
260020a203aSopenharmony_ci                node.GetDomain().c_str(), node.GetStringId().c_str(), filePath.c_str());
261020a203aSopenharmony_ci            return;
262020a203aSopenharmony_ci        }
263020a203aSopenharmony_ci
264020a203aSopenharmony_ci        HIVIEW_LOGI("merging file:%{public}s.", filePath.c_str());
265020a203aSopenharmony_ci        std::string realPath;
266020a203aSopenharmony_ci        if (!FileUtil::PathToRealPath(filePath, realPath)) {
267020a203aSopenharmony_ci            HIVIEW_LOGE("PathToRealPath Failed:%{public}s.", filePath.c_str());
268020a203aSopenharmony_ci            continue;
269020a203aSopenharmony_ci        }
270020a203aSopenharmony_ci        std::ifstream ifs(realPath, std::ios::in);
271020a203aSopenharmony_ci        if (!ifs.is_open()) {
272020a203aSopenharmony_ci            HIVIEW_LOGE("cannot open log file for reading:%{public}s.", realPath.c_str());
273020a203aSopenharmony_ci            DumpEventInfo(body, HEADER, node);
274020a203aSopenharmony_ci            continue;
275020a203aSopenharmony_ci        }
276020a203aSopenharmony_ci
277020a203aSopenharmony_ci        body << std::string(HEADER) << std::endl;
278020a203aSopenharmony_ci        body << ifs.rdbuf();
279020a203aSopenharmony_ci        ifs.close();
280020a203aSopenharmony_ci    }
281020a203aSopenharmony_ci}
282020a203aSopenharmony_ci
283020a203aSopenharmony_cistd::string Vendor::MergeEventLog(
284020a203aSopenharmony_ci    const WatchPoint &watchPoint, const std::vector<WatchPoint>& list,
285020a203aSopenharmony_ci    const std::vector<FreezeResult>& result) const
286020a203aSopenharmony_ci{
287020a203aSopenharmony_ci    if (freezeCommon_ == nullptr) {
288020a203aSopenharmony_ci        return "";
289020a203aSopenharmony_ci    }
290020a203aSopenharmony_ci
291020a203aSopenharmony_ci    std::string type;
292020a203aSopenharmony_ci    std::string retPath;
293020a203aSopenharmony_ci    std::string tmpLogPath;
294020a203aSopenharmony_ci    std::string tmpLogName;
295020a203aSopenharmony_ci    InitLogInfo(watchPoint, type, retPath, tmpLogPath, tmpLogName);
296020a203aSopenharmony_ci
297020a203aSopenharmony_ci    if (FileUtil::FileExists(retPath)) {
298020a203aSopenharmony_ci        HIVIEW_LOGW("filename: %{public}s is existed, direct use.", retPath.c_str());
299020a203aSopenharmony_ci        return retPath;
300020a203aSopenharmony_ci    }
301020a203aSopenharmony_ci
302020a203aSopenharmony_ci    std::ostringstream header;
303020a203aSopenharmony_ci    DumpEventInfo(header, TRIGGER_HEADER, watchPoint);
304020a203aSopenharmony_ci
305020a203aSopenharmony_ci    std::ostringstream body;
306020a203aSopenharmony_ci    bool isFileExists = true;
307020a203aSopenharmony_ci    InitLogBody(list, body, isFileExists);
308020a203aSopenharmony_ci    HIVIEW_LOGI("After Init --body size: %{public}zu.", body.str().size());
309020a203aSopenharmony_ci
310020a203aSopenharmony_ci    if (!isFileExists) {
311020a203aSopenharmony_ci        HIVIEW_LOGE("Failed to open the body file.");
312020a203aSopenharmony_ci        return "";
313020a203aSopenharmony_ci    }
314020a203aSopenharmony_ci
315020a203aSopenharmony_ci    if (type == APPFREEZE) {
316020a203aSopenharmony_ci        MergeFreezeJsonFile(watchPoint, list);
317020a203aSopenharmony_ci    }
318020a203aSopenharmony_ci
319020a203aSopenharmony_ci    int fd = logStore_->CreateLogFile(tmpLogName);
320020a203aSopenharmony_ci    if (fd < 0) {
321020a203aSopenharmony_ci        HIVIEW_LOGE("failed to create tmp log file %{public}s.", tmpLogPath.c_str());
322020a203aSopenharmony_ci        return "";
323020a203aSopenharmony_ci    }
324020a203aSopenharmony_ci
325020a203aSopenharmony_ci    FileUtil::SaveStringToFd(fd, header.str());
326020a203aSopenharmony_ci    FileUtil::SaveStringToFd(fd, body.str());
327020a203aSopenharmony_ci    close(fd);
328020a203aSopenharmony_ci    return SendFaultLog(watchPoint, tmpLogPath, type);
329020a203aSopenharmony_ci}
330020a203aSopenharmony_ci
331020a203aSopenharmony_cibool Vendor::Init()
332020a203aSopenharmony_ci{
333020a203aSopenharmony_ci    if (freezeCommon_ == nullptr) {
334020a203aSopenharmony_ci        return false;
335020a203aSopenharmony_ci    }
336020a203aSopenharmony_ci    logStore_ = std::make_unique<LogStoreEx>(FREEZE_DETECTOR_PATH, true);
337020a203aSopenharmony_ci    logStore_->SetMaxSize(MAX_FOLDER_SIZE);
338020a203aSopenharmony_ci    logStore_->SetMinKeepingFileNumber(MAX_FILE_NUM);
339020a203aSopenharmony_ci    logStore_->Init();
340020a203aSopenharmony_ci    return true;
341020a203aSopenharmony_ci}
342020a203aSopenharmony_ci
343020a203aSopenharmony_cistd::string Vendor::GetDisPlayPowerInfo()
344020a203aSopenharmony_ci{
345020a203aSopenharmony_ci    std::string disPlayPowerInfo;
346020a203aSopenharmony_ci    OHOS::PowerMgr::PowerState powerState = OHOS::PowerMgr::PowerMgrClient::GetInstance().GetState();
347020a203aSopenharmony_ci    disPlayPowerInfo = "powerState:" + GetPowerStateString(powerState) + "\n";
348020a203aSopenharmony_ci    return disPlayPowerInfo;
349020a203aSopenharmony_ci}
350020a203aSopenharmony_ci
351020a203aSopenharmony_cistd::string Vendor::GetPowerStateString(OHOS::PowerMgr::PowerState state)
352020a203aSopenharmony_ci{
353020a203aSopenharmony_ci    switch (state) {
354020a203aSopenharmony_ci        case OHOS::PowerMgr::PowerState::AWAKE:
355020a203aSopenharmony_ci            return std::string("AWAKE");
356020a203aSopenharmony_ci        case OHOS::PowerMgr::PowerState::FREEZE:
357020a203aSopenharmony_ci            return std::string("FREEZE");
358020a203aSopenharmony_ci        case OHOS::PowerMgr::PowerState::INACTIVE:
359020a203aSopenharmony_ci            return std::string("INACTIVE");
360020a203aSopenharmony_ci        case OHOS::PowerMgr::PowerState::STAND_BY:
361020a203aSopenharmony_ci            return std::string("STAND_BY");
362020a203aSopenharmony_ci        case OHOS::PowerMgr::PowerState::DOZE:
363020a203aSopenharmony_ci            return std::string("DOZE");
364020a203aSopenharmony_ci        case OHOS::PowerMgr::PowerState::SLEEP:
365020a203aSopenharmony_ci            return std::string("SLEEP");
366020a203aSopenharmony_ci        case OHOS::PowerMgr::PowerState::HIBERNATE:
367020a203aSopenharmony_ci            return std::string("HIBERNATE");
368020a203aSopenharmony_ci        case OHOS::PowerMgr::PowerState::SHUTDOWN:
369020a203aSopenharmony_ci            return std::string("SHUTDOWN");
370020a203aSopenharmony_ci        case OHOS::PowerMgr::PowerState::UNKNOWN:
371020a203aSopenharmony_ci            return std::string("UNKNOWN");
372020a203aSopenharmony_ci        default:
373020a203aSopenharmony_ci            break;
374020a203aSopenharmony_ci    }
375020a203aSopenharmony_ci    return std::string("UNKNOWN");
376020a203aSopenharmony_ci}
377020a203aSopenharmony_ci} // namespace HiviewDFX
378020a203aSopenharmony_ci} // namespace OHOS
379