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