12d4d9a4dSopenharmony_ci/*
22d4d9a4dSopenharmony_ci * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
32d4d9a4dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
42d4d9a4dSopenharmony_ci * you may not use this file except in compliance with the License.
52d4d9a4dSopenharmony_ci * You may obtain a copy of the License at
62d4d9a4dSopenharmony_ci *
72d4d9a4dSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
82d4d9a4dSopenharmony_ci *
92d4d9a4dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
102d4d9a4dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
112d4d9a4dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
122d4d9a4dSopenharmony_ci * See the License for the specific language governing permissions and
132d4d9a4dSopenharmony_ci * limitations under the License.
142d4d9a4dSopenharmony_ci */
152d4d9a4dSopenharmony_ci
162d4d9a4dSopenharmony_ci#include "hidumper.h"
172d4d9a4dSopenharmony_ci
182d4d9a4dSopenharmony_ci#include "dinput_errcode.h"
192d4d9a4dSopenharmony_ci#include "dinput_log.h"
202d4d9a4dSopenharmony_ci#include "dinput_softbus_define.h"
212d4d9a4dSopenharmony_ci#include "dinput_utils_tool.h"
222d4d9a4dSopenharmony_ci
232d4d9a4dSopenharmony_cinamespace OHOS {
242d4d9a4dSopenharmony_cinamespace DistributedHardware {
252d4d9a4dSopenharmony_cinamespace DistributedInput {
262d4d9a4dSopenharmony_ciIMPLEMENT_SINGLE_INSTANCE(HiDumper);
272d4d9a4dSopenharmony_cinamespace {
282d4d9a4dSopenharmony_ci    const std::string ARGS_HELP = "-h";
292d4d9a4dSopenharmony_ci    const std::string ARGS_NODE_INFO = "-nodeinfo";
302d4d9a4dSopenharmony_ci    const std::string ARGS_SESSION_INFO = "-sessioninfo";
312d4d9a4dSopenharmony_ci
322d4d9a4dSopenharmony_ci    const std::map<std::string, HiDumperFlag> ARGS_MAP = {
332d4d9a4dSopenharmony_ci        {ARGS_HELP, HiDumperFlag::GET_HELP},
342d4d9a4dSopenharmony_ci        {ARGS_NODE_INFO, HiDumperFlag::GET_NODE_INFO},
352d4d9a4dSopenharmony_ci        {ARGS_SESSION_INFO, HiDumperFlag::GET_SESSION_INFO},
362d4d9a4dSopenharmony_ci    };
372d4d9a4dSopenharmony_ci
382d4d9a4dSopenharmony_ci    const std::map<SessionStatus, std::string> SESSION_STATUS = {
392d4d9a4dSopenharmony_ci        {SessionStatus::CLOSED, "closed"},
402d4d9a4dSopenharmony_ci        {SessionStatus::OPENING, "opening"},
412d4d9a4dSopenharmony_ci        {SessionStatus::OPENED, "opened"},
422d4d9a4dSopenharmony_ci        {SessionStatus::CLOSING, "closing"},
432d4d9a4dSopenharmony_ci    };
442d4d9a4dSopenharmony_ci}
452d4d9a4dSopenharmony_ci
462d4d9a4dSopenharmony_cibool HiDumper::HiDump(const std::vector<std::string> &args, std::string &result)
472d4d9a4dSopenharmony_ci{
482d4d9a4dSopenharmony_ci    if (args.empty()) {
492d4d9a4dSopenharmony_ci        DHLOGE("args is empty");
502d4d9a4dSopenharmony_ci        return false;
512d4d9a4dSopenharmony_ci    }
522d4d9a4dSopenharmony_ci
532d4d9a4dSopenharmony_ci    result.clear();
542d4d9a4dSopenharmony_ci    int32_t argsSize = static_cast<int32_t>(args.size());
552d4d9a4dSopenharmony_ci    for (int32_t i = 0; i < argsSize; i++) {
562d4d9a4dSopenharmony_ci        DHLOGI("HiDumper Dump args[%{public}d]: %{public}s.", i, args.at(i).c_str());
572d4d9a4dSopenharmony_ci    }
582d4d9a4dSopenharmony_ci    if (ProcessDump(args[0], result) != DH_SUCCESS) {
592d4d9a4dSopenharmony_ci        return false;
602d4d9a4dSopenharmony_ci    }
612d4d9a4dSopenharmony_ci    return true;
622d4d9a4dSopenharmony_ci}
632d4d9a4dSopenharmony_ci
642d4d9a4dSopenharmony_ciint32_t HiDumper::ProcessDump(const std::string &args, std::string &result)
652d4d9a4dSopenharmony_ci{
662d4d9a4dSopenharmony_ci    DHLOGI("ProcessDump Dump.");
672d4d9a4dSopenharmony_ci    int32_t ret = ERR_DH_INPUT_HIDUMP_INVALID_ARGS;
682d4d9a4dSopenharmony_ci    result.clear();
692d4d9a4dSopenharmony_ci
702d4d9a4dSopenharmony_ci    std::map<std::string, HiDumperFlag>::const_iterator operatorIter;
712d4d9a4dSopenharmony_ci    {
722d4d9a4dSopenharmony_ci        std::lock_guard<std::mutex> lock(operationMutex_);
732d4d9a4dSopenharmony_ci        operatorIter = ARGS_MAP.find(args);
742d4d9a4dSopenharmony_ci        if (operatorIter == ARGS_MAP.end()) {
752d4d9a4dSopenharmony_ci            result.append("unknown command");
762d4d9a4dSopenharmony_ci            DHLOGI("ProcessDump");
772d4d9a4dSopenharmony_ci            return ret;
782d4d9a4dSopenharmony_ci        }
792d4d9a4dSopenharmony_ci    }
802d4d9a4dSopenharmony_ci
812d4d9a4dSopenharmony_ci    HiDumperFlag hidumperFlag = operatorIter->second;
822d4d9a4dSopenharmony_ci    switch (hidumperFlag) {
832d4d9a4dSopenharmony_ci        case HiDumperFlag::GET_HELP: {
842d4d9a4dSopenharmony_ci            ret = ShowHelp(result);
852d4d9a4dSopenharmony_ci            break;
862d4d9a4dSopenharmony_ci        }
872d4d9a4dSopenharmony_ci        case HiDumperFlag::GET_NODE_INFO: {
882d4d9a4dSopenharmony_ci            ret = GetAllNodeInfos(result);
892d4d9a4dSopenharmony_ci            break;
902d4d9a4dSopenharmony_ci        }
912d4d9a4dSopenharmony_ci        case HiDumperFlag::GET_SESSION_INFO: {
922d4d9a4dSopenharmony_ci            ret = GetSessionInfo(result);
932d4d9a4dSopenharmony_ci            break;
942d4d9a4dSopenharmony_ci        }
952d4d9a4dSopenharmony_ci        default:
962d4d9a4dSopenharmony_ci            break;
972d4d9a4dSopenharmony_ci    }
982d4d9a4dSopenharmony_ci    return ret;
992d4d9a4dSopenharmony_ci}
1002d4d9a4dSopenharmony_ci
1012d4d9a4dSopenharmony_ciint32_t HiDumper::GetAllNodeInfos(std::string &result)
1022d4d9a4dSopenharmony_ci{
1032d4d9a4dSopenharmony_ci    DHLOGI("GetAllNodeInfos Dump.");
1042d4d9a4dSopenharmony_ci    std::lock_guard<std::mutex> node_lock(nodeMutex_);
1052d4d9a4dSopenharmony_ci    for (auto iter = nodeInfos_.begin(); iter != nodeInfos_.end(); iter++) {
1062d4d9a4dSopenharmony_ci        result.append("\n{");
1072d4d9a4dSopenharmony_ci        result.append("\n   deviceid :   ");
1082d4d9a4dSopenharmony_ci        result.append(GetAnonyString((*iter).devId));
1092d4d9a4dSopenharmony_ci        result.append("\n   nodename :   ");
1102d4d9a4dSopenharmony_ci        result.append((*iter).virNodeName);
1112d4d9a4dSopenharmony_ci        result.append("\n   dhId :   ");
1122d4d9a4dSopenharmony_ci        result.append(GetAnonyString((*iter).inputDhId));
1132d4d9a4dSopenharmony_ci        result.append("\n},");
1142d4d9a4dSopenharmony_ci    }
1152d4d9a4dSopenharmony_ci    return DH_SUCCESS;
1162d4d9a4dSopenharmony_ci}
1172d4d9a4dSopenharmony_ci
1182d4d9a4dSopenharmony_civoid HiDumper::DeleteNodeInfo(const std::string &deviceId, const std::string &dhId)
1192d4d9a4dSopenharmony_ci{
1202d4d9a4dSopenharmony_ci    DHLOGI("DeleteNodeInfo Dump.");
1212d4d9a4dSopenharmony_ci    std::lock_guard<std::mutex> node_lock(nodeMutex_);
1222d4d9a4dSopenharmony_ci    for (auto iter = nodeInfos_.begin(); iter != nodeInfos_.end();) {
1232d4d9a4dSopenharmony_ci        if ((*iter).devId.compare(deviceId) == 0 && (*iter).inputDhId.compare(dhId) == 0) {
1242d4d9a4dSopenharmony_ci            iter = nodeInfos_.erase(iter);
1252d4d9a4dSopenharmony_ci        } else {
1262d4d9a4dSopenharmony_ci            iter++;
1272d4d9a4dSopenharmony_ci        }
1282d4d9a4dSopenharmony_ci    }
1292d4d9a4dSopenharmony_ci}
1302d4d9a4dSopenharmony_ci
1312d4d9a4dSopenharmony_ciint32_t HiDumper::GetSessionInfo(std::string &result)
1322d4d9a4dSopenharmony_ci{
1332d4d9a4dSopenharmony_ci    DHLOGI("GetSessionInfo Dump.");
1342d4d9a4dSopenharmony_ci    std::lock_guard<std::mutex> lock(sessionMutex_);
1352d4d9a4dSopenharmony_ci    for (auto iter = sessionInfos_.begin(); iter != sessionInfos_.end(); iter++) {
1362d4d9a4dSopenharmony_ci        result.append("\n{");
1372d4d9a4dSopenharmony_ci        result.append("\n   remotedevid :   ");
1382d4d9a4dSopenharmony_ci        result.append(GetAnonyString(iter->first));
1392d4d9a4dSopenharmony_ci        result.append("\n   sessionid :   ");
1402d4d9a4dSopenharmony_ci        result.append(std::to_string(iter->second.sesId));
1412d4d9a4dSopenharmony_ci        result.append("\n   mysessionname :   ");
1422d4d9a4dSopenharmony_ci        result.append(iter->second.mySesName);
1432d4d9a4dSopenharmony_ci        result.append("\n   peersessionname :   ");
1442d4d9a4dSopenharmony_ci        result.append(iter->second.peerSesName);
1452d4d9a4dSopenharmony_ci
1462d4d9a4dSopenharmony_ci        std::string sessionStatus("");
1472d4d9a4dSopenharmony_ci        auto item = SESSION_STATUS.find(iter->second.sessionState);
1482d4d9a4dSopenharmony_ci        if (item == SESSION_STATUS.end()) {
1492d4d9a4dSopenharmony_ci            sessionStatus = "unknown state";
1502d4d9a4dSopenharmony_ci        } else {
1512d4d9a4dSopenharmony_ci            sessionStatus = SESSION_STATUS.find(iter->second.sessionState)->second;
1522d4d9a4dSopenharmony_ci        }
1532d4d9a4dSopenharmony_ci        result.append("\n   sessionstate :   ");
1542d4d9a4dSopenharmony_ci        result.append(sessionStatus);
1552d4d9a4dSopenharmony_ci        result.append("\n},");
1562d4d9a4dSopenharmony_ci    }
1572d4d9a4dSopenharmony_ci    return DH_SUCCESS;
1582d4d9a4dSopenharmony_ci}
1592d4d9a4dSopenharmony_ci
1602d4d9a4dSopenharmony_civoid HiDumper::DeleteSessionInfo(const std::string &remoteDevId)
1612d4d9a4dSopenharmony_ci{
1622d4d9a4dSopenharmony_ci    DHLOGI("DeleteSessionInfo Dump.");
1632d4d9a4dSopenharmony_ci    std::lock_guard<std::mutex> session_lock(sessionMutex_);
1642d4d9a4dSopenharmony_ci    auto iter = sessionInfos_.find(remoteDevId);
1652d4d9a4dSopenharmony_ci    if (iter == sessionInfos_.end()) {
1662d4d9a4dSopenharmony_ci        DHLOGI("remote deviceid does not exist");
1672d4d9a4dSopenharmony_ci        return;
1682d4d9a4dSopenharmony_ci    } else {
1692d4d9a4dSopenharmony_ci        sessionInfos_.erase(iter);
1702d4d9a4dSopenharmony_ci    }
1712d4d9a4dSopenharmony_ci}
1722d4d9a4dSopenharmony_ci
1732d4d9a4dSopenharmony_ciint32_t HiDumper::ShowHelp(std::string &result)
1742d4d9a4dSopenharmony_ci{
1752d4d9a4dSopenharmony_ci    DHLOGI("ShowHelp Dump.");
1762d4d9a4dSopenharmony_ci    result.append("Usage:dump  <command> [options]\n")
1772d4d9a4dSopenharmony_ci        .append("Description:\n")
1782d4d9a4dSopenharmony_ci        .append("-nodeinfo        ")
1792d4d9a4dSopenharmony_ci        .append("dump all input node information in the system\n")
1802d4d9a4dSopenharmony_ci        .append("-sessioninfo     ")
1812d4d9a4dSopenharmony_ci        .append("dump all input session information in the system\n");
1822d4d9a4dSopenharmony_ci    return DH_SUCCESS;
1832d4d9a4dSopenharmony_ci}
1842d4d9a4dSopenharmony_ci
1852d4d9a4dSopenharmony_civoid HiDumper::SaveNodeInfo(const std::string &deviceId, const std::string &nodeName, const std::string &dhId)
1862d4d9a4dSopenharmony_ci{
1872d4d9a4dSopenharmony_ci    std::lock_guard<std::mutex> node_lock(nodeMutex_);
1882d4d9a4dSopenharmony_ci    NodeInfo nodeInfo = {
1892d4d9a4dSopenharmony_ci        .devId = deviceId,
1902d4d9a4dSopenharmony_ci        .virNodeName = nodeName,
1912d4d9a4dSopenharmony_ci        .inputDhId = dhId,
1922d4d9a4dSopenharmony_ci    };
1932d4d9a4dSopenharmony_ci    nodeInfos_.push_back(nodeInfo);
1942d4d9a4dSopenharmony_ci}
1952d4d9a4dSopenharmony_ci
1962d4d9a4dSopenharmony_civoid HiDumper::CreateSessionInfo(const std::string &remoteDevId, const int32_t &sessionId,
1972d4d9a4dSopenharmony_ci    const std::string &mySessionName, const std::string &peerSessionName, const SessionStatus &sessionStatus)
1982d4d9a4dSopenharmony_ci{
1992d4d9a4dSopenharmony_ci    std::lock_guard<std::mutex> session_lock(sessionMutex_);
2002d4d9a4dSopenharmony_ci    auto iter = sessionInfos_.find(remoteDevId);
2012d4d9a4dSopenharmony_ci    if (iter == sessionInfos_.end()) {
2022d4d9a4dSopenharmony_ci        SessionInfo sessionInfo = {
2032d4d9a4dSopenharmony_ci            .sesId = sessionId,
2042d4d9a4dSopenharmony_ci            .mySesName = mySessionName,
2052d4d9a4dSopenharmony_ci            .peerSesName = peerSessionName,
2062d4d9a4dSopenharmony_ci            .sessionState = sessionStatus,
2072d4d9a4dSopenharmony_ci        };
2082d4d9a4dSopenharmony_ci        sessionInfos_[remoteDevId] = sessionInfo;
2092d4d9a4dSopenharmony_ci    }
2102d4d9a4dSopenharmony_ci}
2112d4d9a4dSopenharmony_ci
2122d4d9a4dSopenharmony_civoid HiDumper::SetSessionStatus(const std::string &remoteDevId, const SessionStatus &sessionStatus)
2132d4d9a4dSopenharmony_ci{
2142d4d9a4dSopenharmony_ci    std::lock_guard<std::mutex> session_lock(sessionMutex_);
2152d4d9a4dSopenharmony_ci    auto iter = sessionInfos_.find(remoteDevId);
2162d4d9a4dSopenharmony_ci    if (iter == sessionInfos_.end()) {
2172d4d9a4dSopenharmony_ci        DHLOGI("remote deviceid does not exist");
2182d4d9a4dSopenharmony_ci        return;
2192d4d9a4dSopenharmony_ci    }
2202d4d9a4dSopenharmony_ci    sessionInfos_[remoteDevId].sessionState = sessionStatus;
2212d4d9a4dSopenharmony_ci}
2222d4d9a4dSopenharmony_ci} // namespace DistributedInput
2232d4d9a4dSopenharmony_ci} // namespace DistributedHardware
2242d4d9a4dSopenharmony_ci} // namespace OHOS
2252d4d9a4dSopenharmony_ci
226