166f3657fSopenharmony_ci/*
266f3657fSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
366f3657fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
466f3657fSopenharmony_ci * you may not use this file except in compliance with the License.
566f3657fSopenharmony_ci * You may obtain a copy of the License at
666f3657fSopenharmony_ci *
766f3657fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
866f3657fSopenharmony_ci *
966f3657fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1066f3657fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1166f3657fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1266f3657fSopenharmony_ci * See the License for the specific language governing permissions and
1366f3657fSopenharmony_ci * limitations under the License.
1466f3657fSopenharmony_ci */
1566f3657fSopenharmony_ci
1666f3657fSopenharmony_ci#include "dscreen_hidumper.h"
1766f3657fSopenharmony_ci
1866f3657fSopenharmony_ci#include "dscreen_errcode.h"
1966f3657fSopenharmony_ci#include "dscreen_log.h"
2066f3657fSopenharmony_ci#include "dscreen_util.h"
2166f3657fSopenharmony_ci
2266f3657fSopenharmony_cinamespace OHOS {
2366f3657fSopenharmony_cinamespace DistributedHardware {
2466f3657fSopenharmony_ciIMPLEMENT_SINGLE_INSTANCE(DscreenHidumper);
2566f3657fSopenharmony_ci
2666f3657fSopenharmony_cinamespace {
2766f3657fSopenharmony_ciconst std::string ARGS_HELP = "-h";
2866f3657fSopenharmony_ciconst std::string ARGS_DUMP_SCREEN_DATA = "--dump";
2966f3657fSopenharmony_ciconst std::string ARGS_DUMP_SCREEN_DATA_RESTART = "--redump";
3066f3657fSopenharmony_ciconst std::string ARGS_DUMP_SCREEN_DATA_STOP = "--stopdump";
3166f3657fSopenharmony_ci
3266f3657fSopenharmony_ciconst std::map<std::string, HidumpFlag> ARGS_MAP = {
3366f3657fSopenharmony_ci    { ARGS_HELP, HidumpFlag::GET_HELP },
3466f3657fSopenharmony_ci    { ARGS_DUMP_SCREEN_DATA, HidumpFlag::DUMP_SCREEN_DATA },
3566f3657fSopenharmony_ci    { ARGS_DUMP_SCREEN_DATA_RESTART, HidumpFlag::DUMP_SCREEN_DATA_RESTART },
3666f3657fSopenharmony_ci    { ARGS_DUMP_SCREEN_DATA_STOP, HidumpFlag::DUMP_SCREEN_DATA_STOP },
3766f3657fSopenharmony_ci};
3866f3657fSopenharmony_ci}
3966f3657fSopenharmony_ci
4066f3657fSopenharmony_ciDscreenHidumper::DscreenHidumper()
4166f3657fSopenharmony_ci{
4266f3657fSopenharmony_ci    DHLOGI("Distributed screen hidumper constructed.");
4366f3657fSopenharmony_ci}
4466f3657fSopenharmony_ci
4566f3657fSopenharmony_ciDscreenHidumper::~DscreenHidumper()
4666f3657fSopenharmony_ci{
4766f3657fSopenharmony_ci    DHLOGI("Distributed screen hidumper deconstructed.");
4866f3657fSopenharmony_ci}
4966f3657fSopenharmony_ci
5066f3657fSopenharmony_cibool DscreenHidumper::Dump(const std::vector<std::string> &args, std::string &result)
5166f3657fSopenharmony_ci{
5266f3657fSopenharmony_ci    DHLOGI("Distributed screen hidumper dump args.size():%{public}zu.", args.size());
5366f3657fSopenharmony_ci    result.clear();
5466f3657fSopenharmony_ci    int32_t argsSize = static_cast<int32_t>(args.size());
5566f3657fSopenharmony_ci    for (int32_t i = 0; i < argsSize; i++) {
5666f3657fSopenharmony_ci        DHLOGI("Distributed screen hidumper dump args[%{public}d]: %{public}s.", i, args.at(i).c_str());
5766f3657fSopenharmony_ci    }
5866f3657fSopenharmony_ci
5966f3657fSopenharmony_ci    if (args.empty()) {
6066f3657fSopenharmony_ci        ShowHelp(result);
6166f3657fSopenharmony_ci        return true;
6266f3657fSopenharmony_ci    }
6366f3657fSopenharmony_ci
6466f3657fSopenharmony_ci    if (args.size() > 1) {
6566f3657fSopenharmony_ci        ShowIllegalInfomation(result);
6666f3657fSopenharmony_ci        return true;
6766f3657fSopenharmony_ci    }
6866f3657fSopenharmony_ci
6966f3657fSopenharmony_ci    return ProcessDump(args[0], result) == DH_SUCCESS;
7066f3657fSopenharmony_ci}
7166f3657fSopenharmony_ci
7266f3657fSopenharmony_ciint32_t DscreenHidumper::ProcessDump(const std::string &args, std::string &result)
7366f3657fSopenharmony_ci{
7466f3657fSopenharmony_ci    DHLOGI("Process dump.");
7566f3657fSopenharmony_ci    HidumpFlag hidumpFlag = HidumpFlag::UNKNOWN;
7666f3657fSopenharmony_ci    auto operatorIter = ARGS_MAP.find(args);
7766f3657fSopenharmony_ci    if (operatorIter != ARGS_MAP.end()) {
7866f3657fSopenharmony_ci        hidumpFlag = operatorIter->second;
7966f3657fSopenharmony_ci    }
8066f3657fSopenharmony_ci
8166f3657fSopenharmony_ci    if (hidumpFlag == HidumpFlag::GET_HELP) {
8266f3657fSopenharmony_ci        ShowHelp(result);
8366f3657fSopenharmony_ci        return DH_SUCCESS;
8466f3657fSopenharmony_ci    }
8566f3657fSopenharmony_ci    result.clear();
8666f3657fSopenharmony_ci    switch (hidumpFlag) {
8766f3657fSopenharmony_ci        case HidumpFlag::DUMP_SCREEN_DATA: {
8866f3657fSopenharmony_ci            return DumpScreenData(result);
8966f3657fSopenharmony_ci        }
9066f3657fSopenharmony_ci        case HidumpFlag::DUMP_SCREEN_DATA_RESTART: {
9166f3657fSopenharmony_ci            return ReDumpScreenData(result);
9266f3657fSopenharmony_ci        }
9366f3657fSopenharmony_ci        case HidumpFlag::DUMP_SCREEN_DATA_STOP: {
9466f3657fSopenharmony_ci            SetFlagFalse();
9566f3657fSopenharmony_ci            return DH_SUCCESS;
9666f3657fSopenharmony_ci        }
9766f3657fSopenharmony_ci        default: {
9866f3657fSopenharmony_ci            return ShowIllegalInfomation(result);
9966f3657fSopenharmony_ci        }
10066f3657fSopenharmony_ci    }
10166f3657fSopenharmony_ci}
10266f3657fSopenharmony_ci
10366f3657fSopenharmony_ciint32_t DscreenHidumper::DumpScreenData(std::string &result)
10466f3657fSopenharmony_ci{
10566f3657fSopenharmony_ci    DHLOGI("Dump screen data.");
10666f3657fSopenharmony_ci
10766f3657fSopenharmony_ci    if (access(DUMP_FILE_PATH.c_str(), 0) < 0) {
10866f3657fSopenharmony_ci        if (mkdir(DUMP_FILE_PATH.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) {
10966f3657fSopenharmony_ci            DHLOGI("Create dir err.");
11066f3657fSopenharmony_ci            DHLOGI("dir path : %{public}s", DUMP_FILE_PATH.c_str());
11166f3657fSopenharmony_ci            return DSCREEN_BAD_VALUE;
11266f3657fSopenharmony_ci        }
11366f3657fSopenharmony_ci    }
11466f3657fSopenharmony_ci
11566f3657fSopenharmony_ci    if (fileFullFlag_ == false) {
11666f3657fSopenharmony_ci        result.append("Dump...");
11766f3657fSopenharmony_ci        hidumperFlag_ = true;
11866f3657fSopenharmony_ci    } else {
11966f3657fSopenharmony_ci        result.append("File oversize 300M : stop dump, use parameter \"--redump\" to clear dumpfile and redump");
12066f3657fSopenharmony_ci    }
12166f3657fSopenharmony_ci    return DH_SUCCESS;
12266f3657fSopenharmony_ci}
12366f3657fSopenharmony_ci
12466f3657fSopenharmony_ciint32_t DscreenHidumper::ReDumpScreenData(std::string &result)
12566f3657fSopenharmony_ci{
12666f3657fSopenharmony_ci    DHLOGI("Redump screen data.");
12766f3657fSopenharmony_ci
12866f3657fSopenharmony_ci    if (access(DUMP_FILE_PATH.c_str(), 0) < 0) {
12966f3657fSopenharmony_ci        if (mkdir(DUMP_FILE_PATH.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) {
13066f3657fSopenharmony_ci            DHLOGI("Create dir err.");
13166f3657fSopenharmony_ci            DHLOGI("dir path : %{public}s", DUMP_FILE_PATH.c_str());
13266f3657fSopenharmony_ci            return DSCREEN_BAD_VALUE;
13366f3657fSopenharmony_ci        }
13466f3657fSopenharmony_ci    }
13566f3657fSopenharmony_ci    SetFileFlagFalse();
13666f3657fSopenharmony_ci    SetReDumpFlagTrue();
13766f3657fSopenharmony_ci    result.append("ReDumpStart...");
13866f3657fSopenharmony_ci    hidumperFlag_ = true;
13966f3657fSopenharmony_ci    SetTransReDumpFlagTrue();
14066f3657fSopenharmony_ci    return DH_SUCCESS;
14166f3657fSopenharmony_ci}
14266f3657fSopenharmony_ci
14366f3657fSopenharmony_cibool DscreenHidumper::GetFlagStatus()
14466f3657fSopenharmony_ci{
14566f3657fSopenharmony_ci    return hidumperFlag_;
14666f3657fSopenharmony_ci}
14766f3657fSopenharmony_ci
14866f3657fSopenharmony_civoid DscreenHidumper::SetFlagFalse()
14966f3657fSopenharmony_ci{
15066f3657fSopenharmony_ci    hidumperFlag_ = false;
15166f3657fSopenharmony_ci}
15266f3657fSopenharmony_ci
15366f3657fSopenharmony_cibool DscreenHidumper::GetFileFlag()
15466f3657fSopenharmony_ci{
15566f3657fSopenharmony_ci    return fileFullFlag_;
15666f3657fSopenharmony_ci}
15766f3657fSopenharmony_ci
15866f3657fSopenharmony_civoid DscreenHidumper::SetFileFlagFalse()
15966f3657fSopenharmony_ci{
16066f3657fSopenharmony_ci    fileFullFlag_ = false;
16166f3657fSopenharmony_ci}
16266f3657fSopenharmony_ci
16366f3657fSopenharmony_civoid DscreenHidumper::SetFileFlagTrue()
16466f3657fSopenharmony_ci{
16566f3657fSopenharmony_ci    fileFullFlag_ = true;
16666f3657fSopenharmony_ci}
16766f3657fSopenharmony_ci
16866f3657fSopenharmony_cibool DscreenHidumper::GetReDumpFlag()
16966f3657fSopenharmony_ci{
17066f3657fSopenharmony_ci    return reDumpFlag_;
17166f3657fSopenharmony_ci}
17266f3657fSopenharmony_ci
17366f3657fSopenharmony_civoid DscreenHidumper::SetReDumpFlagFalse()
17466f3657fSopenharmony_ci{
17566f3657fSopenharmony_ci    reDumpFlag_ = false;
17666f3657fSopenharmony_ci}
17766f3657fSopenharmony_ci
17866f3657fSopenharmony_civoid DscreenHidumper::SetReDumpFlagTrue()
17966f3657fSopenharmony_ci{
18066f3657fSopenharmony_ci    reDumpFlag_ = true;
18166f3657fSopenharmony_ci}
18266f3657fSopenharmony_ci
18366f3657fSopenharmony_cibool DscreenHidumper::GetTransReDumpFlag()
18466f3657fSopenharmony_ci{
18566f3657fSopenharmony_ci    return transReDumpFlag_;
18666f3657fSopenharmony_ci}
18766f3657fSopenharmony_ci
18866f3657fSopenharmony_civoid DscreenHidumper::SetTransReDumpFlagFalse()
18966f3657fSopenharmony_ci{
19066f3657fSopenharmony_ci    transReDumpFlag_ = false;
19166f3657fSopenharmony_ci}
19266f3657fSopenharmony_ci
19366f3657fSopenharmony_civoid DscreenHidumper::SetTransReDumpFlagTrue()
19466f3657fSopenharmony_ci{
19566f3657fSopenharmony_ci    transReDumpFlag_ = true;
19666f3657fSopenharmony_ci}
19766f3657fSopenharmony_ci
19866f3657fSopenharmony_civoid DscreenHidumper::ShowHelp(std::string &result)
19966f3657fSopenharmony_ci{
20066f3657fSopenharmony_ci    DHLOGI("Show help.");
20166f3657fSopenharmony_ci    result.append("Usage:dump  <command> [options]\n")
20266f3657fSopenharmony_ci        .append("Description:\n")
20366f3657fSopenharmony_ci        .append("-h            ")
20466f3657fSopenharmony_ci        .append(": show help\n")
20566f3657fSopenharmony_ci        .append("--dump        ")
20666f3657fSopenharmony_ci        .append(": dump screen data in /data/data/dscreen\n")
20766f3657fSopenharmony_ci        .append("--redump      ")
20866f3657fSopenharmony_ci        .append(": clear file and restart dump screen data\n")
20966f3657fSopenharmony_ci        .append("--stopdump    ")
21066f3657fSopenharmony_ci        .append(": stop dump screen data\n");
21166f3657fSopenharmony_ci}
21266f3657fSopenharmony_ci
21366f3657fSopenharmony_ciint32_t DscreenHidumper::ShowIllegalInfomation(std::string &result)
21466f3657fSopenharmony_ci{
21566f3657fSopenharmony_ci    DHLOGI("Show illegal information.");
21666f3657fSopenharmony_ci    result.append("unknown command, -h for help.");
21766f3657fSopenharmony_ci    return DH_SUCCESS;
21866f3657fSopenharmony_ci}
21966f3657fSopenharmony_ci
22066f3657fSopenharmony_civoid DscreenHidumper::SaveFile(std::string file, const VideoData &video)
22166f3657fSopenharmony_ci{
22266f3657fSopenharmony_ci    DHLOGE("Saving File.");
22366f3657fSopenharmony_ci    std::string fileName = DUMP_FILE_PATH + "/" + file + std::to_string(video.width) + ")_height(" +
22466f3657fSopenharmony_ci         std::to_string(video.height) + ")_" + video.format + ".jpg";
22566f3657fSopenharmony_ci    DHLOGE("fileName = %{public}s", fileName.c_str());
22666f3657fSopenharmony_ci    if (GetReDumpFlag() == true) {
22766f3657fSopenharmony_ci        std::remove(fileName.c_str());
22866f3657fSopenharmony_ci        SetReDumpFlagFalse();
22966f3657fSopenharmony_ci    }
23066f3657fSopenharmony_ci    std::ofstream ofs(fileName, std::ios::binary | std::ios::out | std::ios::app);
23166f3657fSopenharmony_ci
23266f3657fSopenharmony_ci    if (!ofs.is_open()) {
23366f3657fSopenharmony_ci        DHLOGE("open file failed.");
23466f3657fSopenharmony_ci        return;
23566f3657fSopenharmony_ci    }
23666f3657fSopenharmony_ci    DHLOGE("open Hidumper SaveFile file success.");
23766f3657fSopenharmony_ci    ofs.seekp(0, std::ios::end);
23866f3657fSopenharmony_ci    std::ofstream::pos_type fileSize = ofs.tellp();
23966f3657fSopenharmony_ci    if (fileSize < 0) {
24066f3657fSopenharmony_ci        DHLOGE("filesize get err");
24166f3657fSopenharmony_ci        fileSize = 0;
24266f3657fSopenharmony_ci    }
24366f3657fSopenharmony_ci    if ((static_cast<size_t>(fileSize) + video.size) < DUMP_FILE_MAX_SIZE) {
24466f3657fSopenharmony_ci        SetFileFlagFalse();
24566f3657fSopenharmony_ci        ofs.write(reinterpret_cast<const char *>(video.data), video.size);
24666f3657fSopenharmony_ci    } else {
24766f3657fSopenharmony_ci        SetFileFlagTrue();
24866f3657fSopenharmony_ci    }
24966f3657fSopenharmony_ci    ofs.close();
25066f3657fSopenharmony_ci}
25166f3657fSopenharmony_ci} // namespace DistributedHardware
25266f3657fSopenharmony_ci} // namespace OHOS