1 /*
2 * Copyright (c) 2021-2023 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 "distributed_input_sink_transport.h"
17
18 #include <cinttypes>
19
20 #include "linux/input.h"
21
22 #include "distributed_hardware_fwk_kit.h"
23 #include "securec.h"
24
25 #include "constants_dinput.h"
26 #include "dinput_context.h"
27 #include "dinput_errcode.h"
28 #include "dinput_log.h"
29 #include "dinput_softbus_define.h"
30 #include "dinput_utils_tool.h"
31 #include "hidumper.h"
32 #include "session.h"
33 #include "softbus_bus_center.h"
34
35 #include "distributed_input_transport_base.h"
36
37 namespace OHOS {
38 namespace DistributedHardware {
39 namespace DistributedInput {
DistributedInputSinkTransport()40 DistributedInputSinkTransport::DistributedInputSinkTransport() : mySessionName_("")
41 {
42 std::shared_ptr<AppExecFwk::EventRunner> runner = AppExecFwk::EventRunner::Create(true);
43 eventHandler_ = std::make_shared<DistributedInputSinkTransport::DInputSinkEventHandler>(runner);
44 DHLOGI("DistributedInputSinkTransport ctor.");
45 }
46
~DistributedInputSinkTransport()47 DistributedInputSinkTransport::~DistributedInputSinkTransport()
48 {
49 DHLOGI("DistributedInputSinkTransport dtor.");
50 (void)RemoveSessionServer(DINPUT_PKG_NAME.c_str(), mySessionName_.c_str());
51 }
52
DInputSinkEventHandler(const std::shared_ptr<AppExecFwk::EventRunner> & runner)53 DistributedInputSinkTransport::DInputSinkEventHandler::DInputSinkEventHandler(
54 const std::shared_ptr<AppExecFwk::EventRunner> &runner) : AppExecFwk::EventHandler(runner)
55 {
56 }
57
GetInstance()58 DistributedInputSinkTransport &DistributedInputSinkTransport::GetInstance()
59 {
60 static DistributedInputSinkTransport instance;
61 return instance;
62 }
63
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)64 void DistributedInputSinkTransport::DInputSinkEventHandler::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event)
65 {
66 DHLOGI("ProcessEvent");
67 EHandlerMsgType eventId = static_cast<EHandlerMsgType>(event->GetInnerEventId());
68 switch (eventId) {
69 case EHandlerMsgType::DINPUT_SINK_EVENT_HANDLER_MSG: {
70 std::shared_ptr<nlohmann::json> innerMsg = event->GetSharedObject<nlohmann::json>();
71 nlohmann::json jsonStr;
72 jsonStr[DINPUT_SOFTBUS_KEY_CMD_TYPE] = TRANS_SINK_MSG_BODY_DATA;
73 jsonStr[DINPUT_SOFTBUS_KEY_INPUT_DATA] = innerMsg->dump();
74 std::string smsg = jsonStr.dump();
75 RecordEventLog(innerMsg);
76 int32_t sessionId = DistributedInputSinkSwitch::GetInstance().GetSwitchOpenedSession();
77 if (sessionId > 0) {
78 DistributedInputSinkTransport::GetInstance().SendMessage(sessionId, smsg);
79 } else {
80 DHLOGE("ProcessEvent can't send input data, because no session switch on.");
81 }
82 break;
83 }
84 default:
85 DHLOGE("ProcessEvent error, because eventId is unkonwn.");
86 break;
87 }
88 }
89
Init()90 int32_t DistributedInputSinkTransport::Init()
91 {
92 DHLOGI("Init");
93
94 int32_t ret = DistributedInputTransportBase::GetInstance().Init();
95 if (ret != DH_SUCCESS) {
96 DHLOGE("Init Sink Transport Failed");
97 return ret;
98 }
99
100 statuslistener_ = std::make_shared<DInputTransbaseSinkListener>(this);
101 DistributedInputTransportBase::GetInstance().RegisterSinkHandleSessionCallback(statuslistener_);
102 RegRespFunMap();
103 return DH_SUCCESS;
104 }
105
GetEventHandler()106 std::shared_ptr<DistributedInputSinkTransport::DInputSinkEventHandler> DistributedInputSinkTransport::GetEventHandler()
107 {
108 DHLOGI("GetEventHandler");
109 return eventHandler_;
110 }
111
RegistSinkRespCallback(std::shared_ptr<DInputSinkTransCallback> callback)112 void DistributedInputSinkTransport::RegistSinkRespCallback(std::shared_ptr<DInputSinkTransCallback> callback)
113 {
114 DHLOGI("RegistSinkRespCallback");
115 callback_ = callback;
116 }
117
RespPrepareRemoteInput(const int32_t sessionId,std::string & smsg)118 int32_t DistributedInputSinkTransport::RespPrepareRemoteInput(
119 const int32_t sessionId, std::string &smsg)
120 {
121 if (sessionId > 0) {
122 DHLOGI("RespPrepareRemoteInput sessionId: %d, smsg:%s.", sessionId, SetAnonyId(smsg).c_str());
123 int32_t ret = SendMessage(sessionId, smsg);
124 if (ret != DH_SUCCESS) {
125 DHLOGE("RespPrepareRemoteInput error, SendMessage fail.");
126 return ERR_DH_INPUT_SERVER_SINK_TRANSPORT_RESPPREPARE_FAIL;
127 }
128 return DH_SUCCESS;
129 } else {
130 DHLOGE("RespPrepareRemoteInput error, sessionId <= 0.");
131 return ERR_DH_INPUT_SERVER_SINK_TRANSPORT_RESPPREPARE_FAIL;
132 }
133 }
134
RespUnprepareRemoteInput(const int32_t sessionId,std::string & smsg)135 int32_t DistributedInputSinkTransport::RespUnprepareRemoteInput(const int32_t sessionId, std::string &smsg)
136 {
137 if (sessionId > 0) {
138 DHLOGI("RespUnprepareRemoteInput sessionId: %d, smsg:%s.", sessionId, SetAnonyId(smsg).c_str());
139 int32_t ret = SendMessage(sessionId, smsg);
140 if (ret != DH_SUCCESS) {
141 DHLOGE("RespUnprepareRemoteInput error, SendMessage fail.");
142 return ERR_DH_INPUT_SERVER_SINK_TRANSPORT_RESPUNPREPARE_FAIL;
143 }
144 return DH_SUCCESS;
145 } else {
146 DHLOGE("RespUnprepareRemoteInput error, sessionId <= 0.");
147 return ERR_DH_INPUT_SERVER_SINK_TRANSPORT_RESPUNPREPARE_FAIL;
148 }
149 }
150
RespStartRemoteInput(const int32_t sessionId,std::string & smsg)151 int32_t DistributedInputSinkTransport::RespStartRemoteInput(const int32_t sessionId, std::string &smsg)
152 {
153 if (sessionId > 0) {
154 DHLOGI("RespStartRemoteInput sessionId: %d, smsg:%s.", sessionId, SetAnonyId(smsg).c_str());
155 int32_t ret = SendMessage(sessionId, smsg);
156 if (ret != DH_SUCCESS) {
157 DHLOGE("RespStartRemoteInput error, SendMessage fail.");
158 return ERR_DH_INPUT_SERVER_SINK_TRANSPORT_RESPSTART_FAIL;
159 }
160 return DH_SUCCESS;
161 } else {
162 DHLOGE("RespStartRemoteInput error, sessionId <= 0.");
163 return ERR_DH_INPUT_SERVER_SINK_TRANSPORT_RESPSTART_FAIL;
164 }
165 }
166
RespStopRemoteInput(const int32_t sessionId,std::string & smsg)167 int32_t DistributedInputSinkTransport::RespStopRemoteInput(const int32_t sessionId, std::string &smsg)
168 {
169 if (sessionId > 0) {
170 DHLOGI("RespStopRemoteInput sessionId: %d, smsg:%s.", sessionId, SetAnonyId(smsg).c_str());
171 int32_t ret = SendMessage(sessionId, smsg);
172 if (ret != DH_SUCCESS) {
173 DHLOGE("RespStopRemoteInput error, SendMessage fail.");
174 return ERR_DH_INPUT_SERVER_SINK_TRANSPORT_RESPSTOP_FAIL;
175 }
176 return DH_SUCCESS;
177 } else {
178 DHLOGE("RespStopRemoteInput error, sessionId <= 0.");
179 return ERR_DH_INPUT_SERVER_SINK_TRANSPORT_RESPSTOP_FAIL;
180 }
181 }
182
RespLatency(const int32_t sessionId,std::string & smsg)183 int32_t DistributedInputSinkTransport::RespLatency(const int32_t sessionId, std::string &smsg)
184 {
185 if (sessionId <= 0) {
186 DHLOGE("RespLatency error, sessionId <= 0.");
187 return ERR_DH_INPUT_SERVER_SINK_TRANSPORT_RESP_LATENCY_FAIL;
188 }
189
190 int32_t ret = SendMessage(sessionId, smsg);
191 if (ret != DH_SUCCESS) {
192 DHLOGE("RespLatency error, SendMessage fail.");
193 return ERR_DH_INPUT_SERVER_SINK_TRANSPORT_RESP_LATENCY_FAIL;
194 }
195
196 DHLOGI("RespLatency sessionId: %d, smsg:%s.", sessionId, SetAnonyId(smsg).c_str());
197 return DH_SUCCESS;
198 }
199
SendKeyStateNodeMsg(const int32_t sessionId,const std::string & dhId,const uint32_t btnCode)200 void DistributedInputSinkTransport::SendKeyStateNodeMsg(const int32_t sessionId, const std::string &dhId,
201 const uint32_t btnCode)
202 {
203 if (sessionId <= 0) {
204 DHLOGE("SendKeyStateNodeMsg error, sessionId <= 0.");
205 return;
206 }
207 DHLOGI("SendKeyStateNodeMsg sessionId: %d, btnCode: %d.", sessionId, btnCode);
208 nlohmann::json jsonStr;
209 jsonStr[DINPUT_SOFTBUS_KEY_CMD_TYPE] = TRANS_SINK_MSG_KEY_STATE;
210 jsonStr[DINPUT_SOFTBUS_KEY_KEYSTATE_DHID] = dhId;
211 jsonStr[DINPUT_SOFTBUS_KEY_KEYSTATE_TYPE] = EV_KEY;
212 jsonStr[DINPUT_SOFTBUS_KEY_KEYSTATE_CODE] = btnCode;
213 jsonStr[DINPUT_SOFTBUS_KEY_KEYSTATE_VALUE] = KEY_DOWN_STATE;
214 std::string msg = jsonStr.dump();
215 int32_t ret = SendMessage(sessionId, msg);
216 if (ret != DH_SUCCESS) {
217 DHLOGE("SendKeyStateNodeMsg error, SendMessage fail.");
218 }
219 }
220
SendMessage(int32_t sessionId,std::string & message)221 int32_t DistributedInputSinkTransport::SendMessage(int32_t sessionId, std::string &message)
222 {
223 return DistributedInputTransportBase::GetInstance().SendMsg(sessionId, message);
224 }
225
DInputTransbaseSinkListener(DistributedInputSinkTransport * transport)226 DistributedInputSinkTransport::DInputTransbaseSinkListener::DInputTransbaseSinkListener(
227 DistributedInputSinkTransport *transport)
228 {
229 sinkTransportObj_ = transport;
230 DHLOGI("DInputTransbaseSinkListener init.");
231 }
232
~DInputTransbaseSinkListener()233 DistributedInputSinkTransport::DInputTransbaseSinkListener::~DInputTransbaseSinkListener()
234 {
235 sinkTransportObj_ = nullptr;
236 DHLOGI("DInputTransbaseSinkListener destory.");
237 }
238
NotifyPrepareRemoteInput(int32_t sessionId,const nlohmann::json & recMsg)239 void DistributedInputSinkTransport::NotifyPrepareRemoteInput(int32_t sessionId, const nlohmann::json &recMsg)
240 {
241 DHLOGI("OnBytesReceived cmdType is TRANS_SOURCE_MSG_PREPARE.");
242 if (!IsString(recMsg, DINPUT_SOFTBUS_KEY_DEVICE_ID)) {
243 DHLOGE("The key is invaild.");
244 return;
245 }
246 std::string deviceId = recMsg[DINPUT_SOFTBUS_KEY_DEVICE_ID];
247 DHLOGI("OnBytesReceived cmdType is TRANS_SOURCE_MSG_PREPARE deviceId:%s.",
248 GetAnonyString(deviceId).c_str());
249 callback_->OnPrepareRemoteInput(sessionId, deviceId);
250 }
251
NotifyUnprepareRemoteInput(int32_t sessionId,const nlohmann::json & recMsg)252 void DistributedInputSinkTransport::NotifyUnprepareRemoteInput(int32_t sessionId, const nlohmann::json &recMsg)
253 {
254 if (!IsString(recMsg, DINPUT_SOFTBUS_KEY_DEVICE_ID)) {
255 DHLOGE("The key is invaild.");
256 return;
257 }
258 std::string deviceId = recMsg[DINPUT_SOFTBUS_KEY_DEVICE_ID];
259 DHLOGI("OnBytesReceived cmdType TRANS_SOURCE_MSG_UNPREPARE deviceId:%s.",
260 GetAnonyString(deviceId).c_str());
261 callback_->OnUnprepareRemoteInput(sessionId);
262 }
263
NotifyStartRemoteInput(int32_t sessionId,const nlohmann::json & recMsg)264 void DistributedInputSinkTransport::NotifyStartRemoteInput(int32_t sessionId, const nlohmann::json &recMsg)
265 {
266 if (!IsString(recMsg, DINPUT_SOFTBUS_KEY_DEVICE_ID) ||
267 !IsUInt32(recMsg, DINPUT_SOFTBUS_KEY_INPUT_TYPE)) {
268 DHLOGE("The key is invaild.");
269 return;
270 }
271 std::string deviceId = recMsg[DINPUT_SOFTBUS_KEY_DEVICE_ID];
272 uint32_t inputTypes = recMsg[DINPUT_SOFTBUS_KEY_INPUT_TYPE];
273 DHLOGI("OnBytesRecei,ved cmdType is TRANS_SOURCE_MSG_START_TYPE deviceId:%s inputTypes:%d .",
274 GetAnonyString(deviceId).c_str(), inputTypes);
275 callback_->OnStartRemoteInput(sessionId, inputTypes);
276 }
277
NotifyStopRemoteInput(int32_t sessionId,const nlohmann::json & recMsg)278 void DistributedInputSinkTransport::NotifyStopRemoteInput(int32_t sessionId, const nlohmann::json &recMsg)
279 {
280 if (!IsString(recMsg, DINPUT_SOFTBUS_KEY_DEVICE_ID) ||
281 !IsUInt32(recMsg, DINPUT_SOFTBUS_KEY_INPUT_TYPE)) {
282 DHLOGE("The key is invaild.");
283 return;
284 }
285 std::string deviceId = recMsg[DINPUT_SOFTBUS_KEY_DEVICE_ID];
286 uint32_t inputTypes = recMsg[DINPUT_SOFTBUS_KEY_INPUT_TYPE];
287 DHLOGI("OnBytesReceived cmdType is TRANS_SOURCE_MSG_STOP_TYPE deviceId:%s.", GetAnonyString(deviceId).c_str());
288 callback_->OnStopRemoteInput(sessionId, inputTypes);
289 }
290
NotifyLatency(int32_t sessionId,const nlohmann::json & recMsg)291 void DistributedInputSinkTransport::NotifyLatency(int32_t sessionId, const nlohmann::json &recMsg)
292 {
293 if (!IsString(recMsg, DINPUT_SOFTBUS_KEY_DEVICE_ID)) {
294 DHLOGE("The key is invaild.");
295 return;
296 }
297
298 nlohmann::json jsonStr;
299 jsonStr[DINPUT_SOFTBUS_KEY_CMD_TYPE] = TRANS_SINK_MSG_LATENCY;
300 jsonStr[DINPUT_SOFTBUS_KEY_RESP_VALUE] = true;
301 std::string smsg = jsonStr.dump();
302 RespLatency(sessionId, smsg);
303 }
304
NotifyStartRemoteInputDhid(int32_t sessionId,const nlohmann::json & recMsg)305 void DistributedInputSinkTransport::NotifyStartRemoteInputDhid(int32_t sessionId, const nlohmann::json &recMsg)
306 {
307 if (!IsString(recMsg, DINPUT_SOFTBUS_KEY_DEVICE_ID) ||
308 !IsString(recMsg, DINPUT_SOFTBUS_KEY_VECTOR_DHID)) {
309 DHLOGE("The key is invaild.");
310 return;
311 }
312 std::string deviceId = recMsg[DINPUT_SOFTBUS_KEY_DEVICE_ID];
313 std::string strTmp = recMsg[DINPUT_SOFTBUS_KEY_VECTOR_DHID];
314 DHLOGI("OnBytesReceived cmdType is TRANS_SOURCE_MSG_START_DHID deviceId:%s .",
315 GetAnonyString(deviceId).c_str());
316 callback_->OnStartRemoteInputDhid(sessionId, strTmp);
317 }
318
NotifyStopRemoteInputDhid(int32_t sessionId,const nlohmann::json & recMsg)319 void DistributedInputSinkTransport::NotifyStopRemoteInputDhid(int32_t sessionId, const nlohmann::json &recMsg)
320 {
321 if (!IsString(recMsg, DINPUT_SOFTBUS_KEY_DEVICE_ID) ||
322 !IsString(recMsg, DINPUT_SOFTBUS_KEY_VECTOR_DHID)) {
323 DHLOGE("The key is invaild.");
324 return;
325 }
326 std::string deviceId = recMsg[DINPUT_SOFTBUS_KEY_DEVICE_ID];
327 std::string strTmp = recMsg[DINPUT_SOFTBUS_KEY_VECTOR_DHID];
328 DHLOGE("OnBytesReceived cmdType is TRANS_SOURCE_MSG_STOP_DHID deviceId:%s.",
329 GetAnonyString(deviceId).c_str());
330 callback_->OnStopRemoteInputDhid(sessionId, strTmp);
331 }
332
NotifyRelayPrepareRemoteInput(int32_t sessionId,const nlohmann::json & recMsg)333 void DistributedInputSinkTransport::NotifyRelayPrepareRemoteInput(int32_t sessionId, const nlohmann::json &recMsg)
334 {
335 if (!IsString(recMsg, DINPUT_SOFTBUS_KEY_DEVICE_ID) ||
336 !IsInt32(recMsg, DINPUT_SOFTBUS_KEY_SESSION_ID)) {
337 DHLOGE("The key is invaild.");
338 return;
339 }
340 std::string deviceId = recMsg[DINPUT_SOFTBUS_KEY_DEVICE_ID];
341 int32_t toSrcSessionId = recMsg[DINPUT_SOFTBUS_KEY_SESSION_ID];
342 DHLOGI("OnBytesReceived cmdType is TRANS_SOURCE_MSG_PREPARE_FOR_REL deviceId:%s.",
343 GetAnonyString(deviceId).c_str());
344 callback_->OnRelayPrepareRemoteInput(toSrcSessionId, sessionId, deviceId);
345 }
346
NotifyRelayUnprepareRemoteInput(int32_t sessionId,const nlohmann::json & recMsg)347 void DistributedInputSinkTransport::NotifyRelayUnprepareRemoteInput(int32_t sessionId, const nlohmann::json &recMsg)
348 {
349 if (!IsString(recMsg, DINPUT_SOFTBUS_KEY_DEVICE_ID) ||
350 !IsInt32(recMsg, DINPUT_SOFTBUS_KEY_SESSION_ID)) {
351 DHLOGE("The key is invaild.");
352 return;
353 }
354 std::string deviceId = recMsg[DINPUT_SOFTBUS_KEY_DEVICE_ID];
355 int32_t toSrcSessionId = recMsg[DINPUT_SOFTBUS_KEY_SESSION_ID];
356 DHLOGI("OnBytesReceived cmdType is TRANS_SOURCE_MSG_UNPREPARE_FOR_REL deviceId:%s.",
357 GetAnonyString(deviceId).c_str());
358 callback_->OnRelayUnprepareRemoteInput(toSrcSessionId, sessionId, deviceId);
359 }
360
NotifyRelayStartDhidRemoteInput(int32_t sessionId,const nlohmann::json & recMsg)361 void DistributedInputSinkTransport::NotifyRelayStartDhidRemoteInput(int32_t sessionId, const nlohmann::json &recMsg)
362 {
363 if (!IsString(recMsg, DINPUT_SOFTBUS_KEY_DEVICE_ID) ||
364 !IsInt32(recMsg, DINPUT_SOFTBUS_KEY_SESSION_ID) ||
365 !IsString(recMsg, DINPUT_SOFTBUS_KEY_VECTOR_DHID)) {
366 DHLOGE("The key is invaild.");
367 return;
368 }
369 std::string deviceId = recMsg[DINPUT_SOFTBUS_KEY_DEVICE_ID];
370 int32_t toSrcSessionId = recMsg[DINPUT_SOFTBUS_KEY_SESSION_ID];
371 std::string dhids = recMsg[DINPUT_SOFTBUS_KEY_VECTOR_DHID];
372 DHLOGI("OnBytesReceived cmdType is TRANS_SOURCE_MSG_START_DHID_FOR_REL deviceId:%s.",
373 GetAnonyString(deviceId).c_str());
374 callback_->OnRelayStartDhidRemoteInput(toSrcSessionId, sessionId, deviceId, dhids);
375 }
376
NotifyRelayStopDhidRemoteInput(int32_t sessionId,const nlohmann::json & recMsg)377 void DistributedInputSinkTransport::NotifyRelayStopDhidRemoteInput(int32_t sessionId, const nlohmann::json &recMsg)
378 {
379 if (!IsString(recMsg, DINPUT_SOFTBUS_KEY_DEVICE_ID) ||
380 !IsInt32(recMsg, DINPUT_SOFTBUS_KEY_SESSION_ID) ||
381 !IsString(recMsg, DINPUT_SOFTBUS_KEY_VECTOR_DHID)) {
382 DHLOGE("The key is invaild.");
383 return;
384 }
385 std::string deviceId = recMsg[DINPUT_SOFTBUS_KEY_DEVICE_ID];
386 int32_t toSrcSessionId = recMsg[DINPUT_SOFTBUS_KEY_SESSION_ID];
387 std::string dhids = recMsg[DINPUT_SOFTBUS_KEY_VECTOR_DHID];
388 DHLOGI("OnBytesReceived cmdType is TRANS_SOURCE_MSG_STOP_DHID_FOR_REL deviceId:%s.",
389 GetAnonyString(deviceId).c_str());
390 callback_->OnRelayStopDhidRemoteInput(toSrcSessionId, sessionId, deviceId, dhids);
391 }
392
NotifyRelayStartTypeRemoteInput(int32_t sessionId,const nlohmann::json & recMsg)393 void DistributedInputSinkTransport::NotifyRelayStartTypeRemoteInput(int32_t sessionId, const nlohmann::json &recMsg)
394 {
395 if (!IsString(recMsg, DINPUT_SOFTBUS_KEY_DEVICE_ID) ||
396 !IsInt32(recMsg, DINPUT_SOFTBUS_KEY_SESSION_ID) ||
397 !IsUInt32(recMsg, DINPUT_SOFTBUS_KEY_INPUT_TYPE)) {
398 DHLOGE("The key is invaild.");
399 return;
400 }
401 std::string deviceId = recMsg[DINPUT_SOFTBUS_KEY_DEVICE_ID];
402 int32_t toSrcSessionId = recMsg[DINPUT_SOFTBUS_KEY_SESSION_ID];
403 uint32_t inputTypes = recMsg[DINPUT_SOFTBUS_KEY_INPUT_TYPE];
404 DHLOGI("OnBytesReceived cmdType is TRANS_SOURCE_MSG_START_TYPE_FOR_REL deviceId:%s.",
405 GetAnonyString(deviceId).c_str());
406 callback_->OnRelayStartTypeRemoteInput(toSrcSessionId, sessionId, deviceId, inputTypes);
407 }
408
NotifyRelayStopTypeRemoteInput(int32_t sessionId,const nlohmann::json & recMsg)409 void DistributedInputSinkTransport::NotifyRelayStopTypeRemoteInput(int32_t sessionId, const nlohmann::json &recMsg)
410 {
411 if (!IsString(recMsg, DINPUT_SOFTBUS_KEY_DEVICE_ID) ||
412 !IsInt32(recMsg, DINPUT_SOFTBUS_KEY_SESSION_ID) ||
413 !IsUInt32(recMsg, DINPUT_SOFTBUS_KEY_INPUT_TYPE)) {
414 DHLOGE("The key is invaild.");
415 return;
416 }
417 std::string deviceId = recMsg[DINPUT_SOFTBUS_KEY_DEVICE_ID];
418 int32_t toSrcSessionId = recMsg[DINPUT_SOFTBUS_KEY_SESSION_ID];
419 uint32_t inputTypes = recMsg[DINPUT_SOFTBUS_KEY_INPUT_TYPE];
420 DHLOGI("OnBytesReceived cmdType is TRANS_SOURCE_MSG_STOP_TYPE_FOR_REL deviceId:%s.",
421 GetAnonyString(deviceId).c_str());
422 callback_->OnRelayStopTypeRemoteInput(toSrcSessionId, sessionId, deviceId, inputTypes);
423 }
424
NotifySessionClosed(int32_t sessionId)425 void DistributedInputSinkTransport::DInputTransbaseSinkListener::NotifySessionClosed(int32_t sessionId)
426 {
427 DistributedInputSinkSwitch::GetInstance().RemoveSession(sessionId);
428 }
429
HandleSessionData(int32_t sessionId,const std::string & message)430 void DistributedInputSinkTransport::DInputTransbaseSinkListener::HandleSessionData(int32_t sessionId,
431 const std::string &message)
432 {
433 DistributedInputSinkTransport::GetInstance().HandleData(sessionId, message);
434 }
435
RegRespFunMap()436 void DistributedInputSinkTransport::RegRespFunMap()
437 {
438 memberFuncMap_[TRANS_SOURCE_MSG_PREPARE] = &DistributedInputSinkTransport::NotifyPrepareRemoteInput;
439 memberFuncMap_[TRANS_SOURCE_MSG_UNPREPARE] = &DistributedInputSinkTransport::NotifyUnprepareRemoteInput;
440 memberFuncMap_[TRANS_SOURCE_MSG_START_TYPE] = &DistributedInputSinkTransport::NotifyStartRemoteInput;
441 memberFuncMap_[TRANS_SOURCE_MSG_STOP_TYPE] = &DistributedInputSinkTransport::NotifyStopRemoteInput;
442 memberFuncMap_[TRANS_SOURCE_MSG_LATENCY] = &DistributedInputSinkTransport::NotifyLatency;
443 memberFuncMap_[TRANS_SOURCE_MSG_START_DHID] = &DistributedInputSinkTransport::NotifyStartRemoteInputDhid;
444 memberFuncMap_[TRANS_SOURCE_MSG_STOP_DHID] = &DistributedInputSinkTransport::NotifyStopRemoteInputDhid;
445 memberFuncMap_[TRANS_SOURCE_MSG_PREPARE_FOR_REL] = &DistributedInputSinkTransport::NotifyRelayPrepareRemoteInput;
446 memberFuncMap_[TRANS_SOURCE_MSG_UNPREPARE_FOR_REL] =
447 &DistributedInputSinkTransport::NotifyRelayUnprepareRemoteInput;
448 memberFuncMap_[TRANS_SOURCE_MSG_START_DHID_FOR_REL] =
449 &DistributedInputSinkTransport::NotifyRelayStartDhidRemoteInput;
450 memberFuncMap_[TRANS_SOURCE_MSG_STOP_DHID_FOR_REL] =
451 &DistributedInputSinkTransport::NotifyRelayStopDhidRemoteInput;
452 memberFuncMap_[TRANS_SOURCE_MSG_START_TYPE_FOR_REL] =
453 &DistributedInputSinkTransport::NotifyRelayStartTypeRemoteInput;
454 memberFuncMap_[TRANS_SOURCE_MSG_STOP_TYPE_FOR_REL] =
455 &DistributedInputSinkTransport::NotifyRelayStopTypeRemoteInput;
456 }
457
HandleData(int32_t sessionId,const std::string & message)458 void DistributedInputSinkTransport::HandleData(int32_t sessionId, const std::string &message)
459 {
460 if (callback_ == nullptr) {
461 DHLOGE("OnBytesReceived the callback_ is null, the message:%s abort.", SetAnonyId(message).c_str());
462 return;
463 }
464
465 nlohmann::json recMsg = nlohmann::json::parse(message, nullptr, false);
466 if (recMsg.is_discarded()) {
467 DHLOGE("recMsg parse failed!");
468 return;
469 }
470 if (!IsUInt32(recMsg, DINPUT_SOFTBUS_KEY_CMD_TYPE)) {
471 DHLOGE("softbus cmd key is invalid");
472 return;
473 }
474 uint32_t cmdType = recMsg[DINPUT_SOFTBUS_KEY_CMD_TYPE];
475 auto iter = memberFuncMap_.find(cmdType);
476 if (iter == memberFuncMap_.end()) {
477 DHLOGE("OnBytesReceived cmdType %u is undefined.", cmdType);
478 return;
479 }
480 SinkTransportFunc &func = iter->second;
481 (this->*func)(sessionId, recMsg);
482 }
483
CloseAllSession()484 void DistributedInputSinkTransport::CloseAllSession()
485 {
486 std::vector<int32_t> vecSession = DistributedInputSinkSwitch::GetInstance().GetAllSessionId();
487 DHLOGI("CloseAllSession session vector size is %d", vecSession.size());
488 for (size_t kIndex = 0; kIndex < vecSession.size(); ++kIndex) {
489 CloseSession(vecSession[kIndex]);
490 DHLOGI("CloseAllSession [%d] sessionid is %s", kIndex, GetAnonyInt32(vecSession[kIndex]).c_str());
491 }
492
493 // clear session data
494 DistributedInputSinkSwitch::GetInstance().InitSwitch();
495 }
496
RecordEventLog(const std::shared_ptr<nlohmann::json> & events)497 void DistributedInputSinkTransport::DInputSinkEventHandler::RecordEventLog(
498 const std::shared_ptr<nlohmann::json> &events)
499 {
500 for (nlohmann::json::const_iterator iter = events->cbegin(); iter != events->cend(); ++iter) {
501 nlohmann::json event = *iter;
502 std::string eventType = "";
503 int32_t evType = event[INPUT_KEY_TYPE];
504 switch (evType) {
505 case EV_KEY:
506 eventType = "EV_KEY";
507 break;
508 case EV_REL:
509 eventType = "EV_REL";
510 break;
511 case EV_ABS:
512 eventType = "EV_ABS";
513 break;
514 default:
515 eventType = "other type";
516 break;
517 }
518 int64_t when = event[INPUT_KEY_WHEN];
519 int32_t code = event[INPUT_KEY_CODE];
520 int32_t value = event[INPUT_KEY_VALUE];
521 std::string path = event[INPUT_KEY_PATH];
522 DHLOGD("2.E2E-Test Sink softBus send, EventType: %s, Code: %d, Value: %d, Path: %s, When: %" PRId64 "",
523 eventType.c_str(), code, value, path.c_str(), when);
524 }
525 }
526 } // namespace DistributedInput
527 } // namespace DistributedHardware
528 } // namespace OHOS
529