1 /*
2 * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
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
16 #include "hidumper.h"
17
18 #include "dinput_errcode.h"
19 #include "dinput_log.h"
20 #include "dinput_softbus_define.h"
21 #include "dinput_utils_tool.h"
22
23 namespace OHOS {
24 namespace DistributedHardware {
25 namespace DistributedInput {
26 IMPLEMENT_SINGLE_INSTANCE(HiDumper);
27 namespace {
28 const std::string ARGS_HELP = "-h";
29 const std::string ARGS_NODE_INFO = "-nodeinfo";
30 const std::string ARGS_SESSION_INFO = "-sessioninfo";
31
32 const std::map<std::string, HiDumperFlag> ARGS_MAP = {
33 {ARGS_HELP, HiDumperFlag::GET_HELP},
34 {ARGS_NODE_INFO, HiDumperFlag::GET_NODE_INFO},
35 {ARGS_SESSION_INFO, HiDumperFlag::GET_SESSION_INFO},
36 };
37
38 const std::map<SessionStatus, std::string> SESSION_STATUS = {
39 {SessionStatus::CLOSED, "closed"},
40 {SessionStatus::OPENING, "opening"},
41 {SessionStatus::OPENED, "opened"},
42 {SessionStatus::CLOSING, "closing"},
43 };
44 }
45
HiDump(const std::vector<std::string> & args,std::string & result)46 bool HiDumper::HiDump(const std::vector<std::string> &args, std::string &result)
47 {
48 if (args.empty()) {
49 DHLOGE("args is empty");
50 return false;
51 }
52
53 result.clear();
54 int32_t argsSize = static_cast<int32_t>(args.size());
55 for (int32_t i = 0; i < argsSize; i++) {
56 DHLOGI("HiDumper Dump args[%{public}d]: %{public}s.", i, args.at(i).c_str());
57 }
58 if (ProcessDump(args[0], result) != DH_SUCCESS) {
59 return false;
60 }
61 return true;
62 }
63
ProcessDump(const std::string & args,std::string & result)64 int32_t HiDumper::ProcessDump(const std::string &args, std::string &result)
65 {
66 DHLOGI("ProcessDump Dump.");
67 int32_t ret = ERR_DH_INPUT_HIDUMP_INVALID_ARGS;
68 result.clear();
69
70 std::map<std::string, HiDumperFlag>::const_iterator operatorIter;
71 {
72 std::lock_guard<std::mutex> lock(operationMutex_);
73 operatorIter = ARGS_MAP.find(args);
74 if (operatorIter == ARGS_MAP.end()) {
75 result.append("unknown command");
76 DHLOGI("ProcessDump");
77 return ret;
78 }
79 }
80
81 HiDumperFlag hidumperFlag = operatorIter->second;
82 switch (hidumperFlag) {
83 case HiDumperFlag::GET_HELP: {
84 ret = ShowHelp(result);
85 break;
86 }
87 case HiDumperFlag::GET_NODE_INFO: {
88 ret = GetAllNodeInfos(result);
89 break;
90 }
91 case HiDumperFlag::GET_SESSION_INFO: {
92 ret = GetSessionInfo(result);
93 break;
94 }
95 default:
96 break;
97 }
98 return ret;
99 }
100
GetAllNodeInfos(std::string & result)101 int32_t HiDumper::GetAllNodeInfos(std::string &result)
102 {
103 DHLOGI("GetAllNodeInfos Dump.");
104 std::lock_guard<std::mutex> node_lock(nodeMutex_);
105 for (auto iter = nodeInfos_.begin(); iter != nodeInfos_.end(); iter++) {
106 result.append("\n{");
107 result.append("\n deviceid : ");
108 result.append(GetAnonyString((*iter).devId));
109 result.append("\n nodename : ");
110 result.append((*iter).virNodeName);
111 result.append("\n dhId : ");
112 result.append(GetAnonyString((*iter).inputDhId));
113 result.append("\n},");
114 }
115 return DH_SUCCESS;
116 }
117
DeleteNodeInfo(const std::string & deviceId,const std::string & dhId)118 void HiDumper::DeleteNodeInfo(const std::string &deviceId, const std::string &dhId)
119 {
120 DHLOGI("DeleteNodeInfo Dump.");
121 std::lock_guard<std::mutex> node_lock(nodeMutex_);
122 for (auto iter = nodeInfos_.begin(); iter != nodeInfos_.end();) {
123 if ((*iter).devId.compare(deviceId) == 0 && (*iter).inputDhId.compare(dhId) == 0) {
124 iter = nodeInfos_.erase(iter);
125 } else {
126 iter++;
127 }
128 }
129 }
130
GetSessionInfo(std::string & result)131 int32_t HiDumper::GetSessionInfo(std::string &result)
132 {
133 DHLOGI("GetSessionInfo Dump.");
134 std::lock_guard<std::mutex> lock(sessionMutex_);
135 for (auto iter = sessionInfos_.begin(); iter != sessionInfos_.end(); iter++) {
136 result.append("\n{");
137 result.append("\n remotedevid : ");
138 result.append(GetAnonyString(iter->first));
139 result.append("\n sessionid : ");
140 result.append(std::to_string(iter->second.sesId));
141 result.append("\n mysessionname : ");
142 result.append(iter->second.mySesName);
143 result.append("\n peersessionname : ");
144 result.append(iter->second.peerSesName);
145
146 std::string sessionStatus("");
147 auto item = SESSION_STATUS.find(iter->second.sessionState);
148 if (item == SESSION_STATUS.end()) {
149 sessionStatus = "unknown state";
150 } else {
151 sessionStatus = SESSION_STATUS.find(iter->second.sessionState)->second;
152 }
153 result.append("\n sessionstate : ");
154 result.append(sessionStatus);
155 result.append("\n},");
156 }
157 return DH_SUCCESS;
158 }
159
DeleteSessionInfo(const std::string & remoteDevId)160 void HiDumper::DeleteSessionInfo(const std::string &remoteDevId)
161 {
162 DHLOGI("DeleteSessionInfo Dump.");
163 std::lock_guard<std::mutex> session_lock(sessionMutex_);
164 auto iter = sessionInfos_.find(remoteDevId);
165 if (iter == sessionInfos_.end()) {
166 DHLOGI("remote deviceid does not exist");
167 return;
168 } else {
169 sessionInfos_.erase(iter);
170 }
171 }
172
ShowHelp(std::string & result)173 int32_t HiDumper::ShowHelp(std::string &result)
174 {
175 DHLOGI("ShowHelp Dump.");
176 result.append("Usage:dump <command> [options]\n")
177 .append("Description:\n")
178 .append("-nodeinfo ")
179 .append("dump all input node information in the system\n")
180 .append("-sessioninfo ")
181 .append("dump all input session information in the system\n");
182 return DH_SUCCESS;
183 }
184
SaveNodeInfo(const std::string & deviceId,const std::string & nodeName,const std::string & dhId)185 void HiDumper::SaveNodeInfo(const std::string &deviceId, const std::string &nodeName, const std::string &dhId)
186 {
187 std::lock_guard<std::mutex> node_lock(nodeMutex_);
188 NodeInfo nodeInfo = {
189 .devId = deviceId,
190 .virNodeName = nodeName,
191 .inputDhId = dhId,
192 };
193 nodeInfos_.push_back(nodeInfo);
194 }
195
CreateSessionInfo(const std::string & remoteDevId,const int32_t & sessionId,const std::string & mySessionName,const std::string & peerSessionName,const SessionStatus & sessionStatus)196 void HiDumper::CreateSessionInfo(const std::string &remoteDevId, const int32_t &sessionId,
197 const std::string &mySessionName, const std::string &peerSessionName, const SessionStatus &sessionStatus)
198 {
199 std::lock_guard<std::mutex> session_lock(sessionMutex_);
200 auto iter = sessionInfos_.find(remoteDevId);
201 if (iter == sessionInfos_.end()) {
202 SessionInfo sessionInfo = {
203 .sesId = sessionId,
204 .mySesName = mySessionName,
205 .peerSesName = peerSessionName,
206 .sessionState = sessionStatus,
207 };
208 sessionInfos_[remoteDevId] = sessionInfo;
209 }
210 }
211
SetSessionStatus(const std::string & remoteDevId,const SessionStatus & sessionStatus)212 void HiDumper::SetSessionStatus(const std::string &remoteDevId, const SessionStatus &sessionStatus)
213 {
214 std::lock_guard<std::mutex> session_lock(sessionMutex_);
215 auto iter = sessionInfos_.find(remoteDevId);
216 if (iter == sessionInfos_.end()) {
217 DHLOGI("remote deviceid does not exist");
218 return;
219 }
220 sessionInfos_[remoteDevId].sessionState = sessionStatus;
221 }
222 } // namespace DistributedInput
223 } // namespace DistributedHardware
224 } // namespace OHOS
225
226