• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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