1 /*
2 * Copyright (c) 2024-2025 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 "dm_comm_tool.h"
17 #include "device_manager_service.h"
18 #include "dm_anonymous.h"
19 #include "dm_constants.h"
20 #include "dm_error_type.h"
21 #include "dm_transport.h"
22 #include "dm_transport_msg.h"
23 #include "dm_log.h"
24 #include "dm_softbus_cache.h"
25 #include "multiple_user_connector.h"
26 #include "parameter.h"
27
28 namespace OHOS {
29 namespace DistributedHardware {
30 // send local foreground userids msg
31 constexpr int32_t DM_COMM_SEND_LOCAL_USERIDS = 1;
32 // if receive remote device send foreground userids, response local foreground uerids
33 // This msg no need response
34 constexpr int32_t DM_COMM_RSP_LOCAL_USERIDS = 2;
35 constexpr int32_t DM_COMM_SEND_USER_STOP = 3;
36 constexpr int32_t DM_COMM_RSP_USER_STOP = 4;
37 constexpr int32_t DM_COMM_ACCOUNT_LOGOUT = 5;
38 constexpr int32_t DM_COMM_SEND_LOCAL_APP_UNINSTALL = 6;
39 constexpr int32_t DM_COMM_SEND_LOCAL_APP_UNBIND = 7;
40 constexpr int32_t DM_COMM_RSP_APP_UNINSTALL = 8;
41 constexpr int32_t DM_COMM_RSP_APP_UNBIND = 9;
42 constexpr const char* EVENT_TASK = "EventTask";
43 const char* const USER_STOP_MSG_KEY = "stopUserId";
44
DMCommTool()45 DMCommTool::DMCommTool() : dmTransportPtr_(nullptr)
46 {
47 LOGI("Ctor DMCommTool");
48 }
49
Init()50 void DMCommTool::Init()
51 {
52 LOGI("Init DMCommTool");
53 eventQueue_ = std::make_shared<ffrt::queue>(EVENT_TASK);
54 dmTransportPtr_ = std::make_shared<DMTransport>(shared_from_this());
55 std::shared_ptr<AppExecFwk::EventRunner> runner = AppExecFwk::EventRunner::Create(true);
56 eventHandler_ = std::make_shared<DMCommTool::DMCommToolEventHandler>(runner, shared_from_this());
57 dmTransportPtr_->Init();
58 }
59
UnInit()60 void DMCommTool::UnInit()
61 {
62 LOGI("UnInit DMCommTool");
63 if (dmTransportPtr_ == nullptr) {
64 LOGI("dmTransportPtr_ is null");
65 return;
66 }
67 dmTransportPtr_->UnInit();
68 }
69
GetInstance()70 std::shared_ptr<DMCommTool> DMCommTool::GetInstance()
71 {
72 static std::shared_ptr<DMCommTool> instance = std::make_shared<DMCommTool>();
73 return instance;
74 }
75
SendUserIds(const std::string rmtNetworkId,const std::vector<uint32_t> & foregroundUserIds,const std::vector<uint32_t> & backgroundUserIds)76 int32_t DMCommTool::SendUserIds(const std::string rmtNetworkId,
77 const std::vector<uint32_t> &foregroundUserIds, const std::vector<uint32_t> &backgroundUserIds)
78 {
79 if (!IsIdLengthValid(rmtNetworkId) || dmTransportPtr_ == nullptr) {
80 LOGE("param invalid, networkId: %{public}s, foreground userids size: %{public}d",
81 GetAnonyString(rmtNetworkId).c_str(), static_cast<int32_t>(foregroundUserIds.size()));
82 return ERR_DM_INPUT_PARA_INVALID;
83 }
84 int32_t socketId;
85 if (dmTransportPtr_->StartSocket(rmtNetworkId, socketId) != DM_OK || socketId <= 0) {
86 LOGE("Start socket error");
87 return ERR_DM_FAILED;
88 }
89
90 UserIdsMsg userIdsMsg(foregroundUserIds, backgroundUserIds, true);
91 cJSON *root = cJSON_CreateObject();
92 if (root == nullptr) {
93 LOGE("Create cJSON object failed.");
94 return ERR_DM_FAILED;
95 }
96 ToJson(root, userIdsMsg);
97 char *msg = cJSON_PrintUnformatted(root);
98 if (msg == nullptr) {
99 cJSON_Delete(root);
100 return ERR_DM_FAILED;
101 }
102 std::string msgStr(msg);
103 cJSON_Delete(root);
104 cJSON_free(msg);
105 CommMsg commMsg(DM_COMM_SEND_LOCAL_USERIDS, msgStr);
106 std::string payload = GetCommMsgString(commMsg);
107
108 int32_t ret = dmTransportPtr_->Send(rmtNetworkId, payload, socketId);
109 if (ret != DM_OK) {
110 LOGE("Send local foreground userids failed, ret: %{public}d", ret);
111 return ERR_DM_FAILED;
112 }
113 LOGI("Send local foreground userids success");
114 return DM_OK;
115 }
116
SendUninstAppObj(int32_t userId,int32_t tokenId,const std::string & networkId)117 int32_t DMCommTool::SendUninstAppObj(int32_t userId, int32_t tokenId, const std::string &networkId)
118 {
119 LOGI("SendUninstAppObj, userId: %{public}s, tokenId: %{public}s", GetAnonyInt32(userId).c_str(),
120 GetAnonyInt32(tokenId).c_str());
121 if (!IsIdLengthValid(networkId)) {
122 LOGE("param invalid, networkId: %{public}s", GetAnonyString(networkId).c_str());
123 return ERR_DM_INPUT_PARA_INVALID;
124 }
125 if (dmTransportPtr_ == nullptr) {
126 LOGE("dmTransportPtr_ is null");
127 return ERR_DM_FAILED;
128 }
129 int32_t socketId = 0;
130 if (dmTransportPtr_->StartSocket(networkId, socketId) != DM_OK || socketId <= 0) {
131 LOGE("Start socket error");
132 return ERR_DM_FAILED;
133 }
134
135 UninstAppMsg uninstAppMsg(userId, tokenId);
136 cJSON *root = cJSON_CreateObject();
137 if (root == nullptr) {
138 LOGE("Create cJSON object failed.");
139 return ERR_DM_FAILED;
140 }
141 ToJson(root, uninstAppMsg);
142 char *msg = cJSON_PrintUnformatted(root);
143 if (msg == nullptr) {
144 cJSON_Delete(root);
145 return ERR_DM_FAILED;
146 }
147 std::string msgStr(msg);
148 cJSON_Delete(root);
149 cJSON_free(msg);
150 CommMsg commMsg(DM_COMM_SEND_LOCAL_APP_UNINSTALL, msgStr);
151 std::string payload = GetCommMsgString(commMsg);
152
153 int32_t ret = dmTransportPtr_->Send(networkId, payload, socketId);
154 if (ret != DM_OK) {
155 LOGE("Send local foreground userids failed, ret: %{public}d", ret);
156 return ERR_DM_FAILED;
157 }
158 LOGI("Send local foreground userids success");
159 return DM_OK;
160 }
161
RspAppUninstall(const std::string & rmtNetworkId,int32_t socketId)162 int32_t DMCommTool::RspAppUninstall(const std::string &rmtNetworkId, int32_t socketId)
163 {
164 LOGI("RspAppUninstall Start.");
165 if (dmTransportPtr_ == nullptr) {
166 LOGE("dmTransportPtr_ is null");
167 return ERR_DM_FAILED;
168 }
169 std::string msgStr("");
170 CommMsg commMsg(DM_COMM_RSP_APP_UNINSTALL, msgStr);
171 std::string payload = GetCommMsgString(commMsg);
172
173 if (dmTransportPtr_ == nullptr) {
174 LOGE("dmTransportPtr_ is null");
175 return ERR_DM_FAILED;
176 }
177 int32_t ret = dmTransportPtr_->Send(rmtNetworkId, payload, socketId);
178 if (ret != DM_OK) {
179 LOGE("RspAppUninstall failed, ret: %{public}d", ret);
180 return ERR_DM_FAILED;
181 }
182
183 LOGI("RspAppUninstall success");
184 return DM_OK;
185 }
186
RspAppUnbind(const std::string & rmtNetworkId,int32_t socketId)187 int32_t DMCommTool::RspAppUnbind(const std::string &rmtNetworkId, int32_t socketId)
188 {
189 LOGI("RspAppUnbind Start.");
190 if (dmTransportPtr_ == nullptr) {
191 LOGE("dmTransportPtr_ is null");
192 return ERR_DM_FAILED;
193 }
194 std::string msgStr("");
195 CommMsg commMsg(DM_COMM_RSP_APP_UNBIND, msgStr);
196 std::string payload = GetCommMsgString(commMsg);
197
198 if (dmTransportPtr_ == nullptr) {
199 LOGE("dmTransportPtr_ is null");
200 return ERR_DM_FAILED;
201 }
202 int32_t ret = dmTransportPtr_->Send(rmtNetworkId, payload, socketId);
203 if (ret != DM_OK) {
204 LOGE("RspAppUnbind failed, ret: %{public}d", ret);
205 return ERR_DM_FAILED;
206 }
207
208 LOGI("RspAppUnbind success");
209 return DM_OK;
210 }
211
SendUnBindAppObj(int32_t userId,int32_t tokenId,const std::string & extra,const std::string & networkId,const std::string & udid)212 int32_t DMCommTool::SendUnBindAppObj(int32_t userId, int32_t tokenId, const std::string &extra,
213 const std::string &networkId, const std::string &udid)
214 {
215 LOGI("DMCommTool::SendUnBindAppObj, userId: %{public}s, tokenId: %{public}s, extra: %{public}s, udid: %{public}s",
216 GetAnonyInt32(userId).c_str(), GetAnonyInt32(tokenId).c_str(), GetAnonyString(extra).c_str(),
217 GetAnonyString(udid).c_str());
218 if (!IsIdLengthValid(networkId)) {
219 LOGE("param invalid, networkId: %{public}s", GetAnonyString(networkId).c_str());
220 return ERR_DM_INPUT_PARA_INVALID;
221 }
222
223 if (dmTransportPtr_ == nullptr) {
224 LOGE("dmTransportPtr_ is null");
225 return ERR_DM_FAILED;
226 }
227 int32_t socketId;
228 if (dmTransportPtr_->StartSocket(networkId, socketId) != DM_OK || socketId <= 0) {
229 LOGE("Start socket error");
230 return ERR_DM_FAILED;
231 }
232
233 UnBindAppMsg unBindAppMsg(userId, tokenId, extra, udid);
234 cJSON *root = cJSON_CreateObject();
235 if (root == nullptr) {
236 LOGE("Create cJSON object failed.");
237 return ERR_DM_FAILED;
238 }
239 ToJson(root, unBindAppMsg);
240 char *msg = cJSON_PrintUnformatted(root);
241 if (msg == nullptr) {
242 cJSON_Delete(root);
243 return ERR_DM_FAILED;
244 }
245 std::string msgStr(msg);
246 cJSON_Delete(root);
247 cJSON_free(msg);
248 CommMsg commMsg(DM_COMM_SEND_LOCAL_APP_UNBIND, msgStr);
249 std::string payload = GetCommMsgString(commMsg);
250
251 int32_t ret = dmTransportPtr_->Send(networkId, payload, socketId);
252 if (ret != DM_OK) {
253 LOGE("Send local foreground userids failed, ret: %{public}d", ret);
254 return ERR_DM_FAILED;
255 }
256
257 LOGI("Send local foreground userids success");
258 return DM_OK;
259 }
260
RspLocalFrontOrBackUserIds(const std::string & rmtNetworkId,const std::vector<uint32_t> & foregroundUserIds,const std::vector<uint32_t> & backgroundUserIds,int32_t socketId)261 void DMCommTool::RspLocalFrontOrBackUserIds(const std::string &rmtNetworkId,
262 const std::vector<uint32_t> &foregroundUserIds, const std::vector<uint32_t> &backgroundUserIds, int32_t socketId)
263 {
264 UserIdsMsg userIdsMsg(foregroundUserIds, backgroundUserIds, true);
265 if (dmTransportPtr_ == nullptr) {
266 LOGE("dmTransportPtr_ is null.");
267 return;
268 }
269 cJSON *root = cJSON_CreateObject();
270 if (root == nullptr) {
271 LOGE("Create cJSON object failed: root is null.");
272 return;
273 }
274 ToJson(root, userIdsMsg);
275 char *msg = cJSON_PrintUnformatted(root);
276 if (msg == nullptr) {
277 cJSON_Delete(root);
278 return;
279 }
280 std::string msgStr(msg);
281 cJSON_Delete(root);
282 cJSON_free(msg);
283 CommMsg commMsg(DM_COMM_RSP_LOCAL_USERIDS, msgStr);
284 std::string payload = GetCommMsgString(commMsg);
285
286 int32_t ret = dmTransportPtr_->Send(rmtNetworkId, payload, socketId);
287 if (ret != DM_OK) {
288 LOGE("Response local foreground userids failed, ret: %{public}d", ret);
289 return;
290 }
291 LOGI("Response local foreground userids success");
292 }
293
DMCommToolEventHandler(const std::shared_ptr<AppExecFwk::EventRunner> runner,std::shared_ptr<DMCommTool> dmCommToolPtr)294 DMCommTool::DMCommToolEventHandler::DMCommToolEventHandler(const std::shared_ptr<AppExecFwk::EventRunner> runner,
295 std::shared_ptr<DMCommTool> dmCommToolPtr) : AppExecFwk::EventHandler(runner), dmCommToolWPtr_(dmCommToolPtr)
296 {
297 LOGI("Ctor DMCommToolEventHandler");
298 }
299
ParseUserIdsMsg(std::shared_ptr<InnerCommMsg> commMsg,UserIdsMsg & userIdsMsg)300 void DMCommTool::DMCommToolEventHandler::ParseUserIdsMsg(std::shared_ptr<InnerCommMsg> commMsg, UserIdsMsg &userIdsMsg)
301 {
302 CHECK_NULL_VOID(commMsg);
303 std::string payload = commMsg->commMsg->msg;
304 cJSON *root = cJSON_Parse(payload.c_str());
305 if (root == NULL) {
306 LOGE("the msg is not json format");
307 return;
308 }
309 FromJson(root, userIdsMsg);
310 cJSON_Delete(root);
311 }
312
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)313 void DMCommTool::DMCommToolEventHandler::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event)
314 {
315 uint32_t eventId = event->GetInnerEventId();
316 std::shared_ptr<InnerCommMsg> commMsg = event->GetSharedObject<InnerCommMsg>();
317 CHECK_NULL_VOID(commMsg);
318 UserIdsMsg userIdsMsg;
319 ParseUserIdsMsg(commMsg, userIdsMsg);
320 if (dmCommToolWPtr_.expired()) {
321 LOGE("dmCommToolWPtr_ is expired");
322 return;
323 }
324 std::shared_ptr<DMCommTool> dmCommToolPtr = dmCommToolWPtr_.lock();
325 HandleEvent(dmCommToolPtr, eventId, commMsg, userIdsMsg);
326 }
327
HandleEvent(const std::shared_ptr<DMCommTool> & dmCommToolPtr,uint32_t eventId,const std::shared_ptr<InnerCommMsg> & commMsg,const UserIdsMsg & userIdsMsg)328 void DMCommTool::DMCommToolEventHandler::HandleEvent(const std::shared_ptr<DMCommTool> &dmCommToolPtr, uint32_t eventId,
329 const std::shared_ptr<InnerCommMsg> &commMsg, const UserIdsMsg &userIdsMsg)
330 {
331 CHECK_NULL_VOID(dmCommToolPtr);
332 HandleLocalUserIdEvent(dmCommToolPtr, eventId, commMsg, userIdsMsg);
333 switch (eventId) {
334 case DM_COMM_SEND_USER_STOP: {
335 dmCommToolPtr->ProcessReceiveUserStopEvent(commMsg);
336 break;
337 }
338 case DM_COMM_RSP_USER_STOP: {
339 dmCommToolPtr->ProcessResponseUserStopEvent(commMsg);
340 break;
341 }
342 case DM_COMM_ACCOUNT_LOGOUT: {
343 dmCommToolPtr->ProcessReceiveLogoutEvent(commMsg);
344 break;
345 }
346 case DM_COMM_SEND_LOCAL_APP_UNINSTALL: {
347 dmCommToolPtr->ProcessReceiveUninstAppEvent(commMsg);
348 break;
349 }
350 case DM_COMM_SEND_LOCAL_APP_UNBIND: {
351 dmCommToolPtr->ProcessReceiveUnBindAppEvent(commMsg);
352 break;
353 }
354 case DM_COMM_RSP_APP_UNINSTALL: {
355 dmCommToolPtr->ProcessReceiveRspAppUninstallEvent(commMsg);
356 break;
357 }
358 case DM_COMM_RSP_APP_UNBIND: {
359 dmCommToolPtr->ProcessReceiveRspAppUnbindEvent(commMsg);
360 break;
361 }
362 default:
363 LOGE("event is undefined, id is %{public}d", eventId);
364 break;
365 }
366 }
367
HandleLocalUserIdEvent(const std::shared_ptr<DMCommTool> & dmCommToolPtr,uint32_t eventId,const std::shared_ptr<InnerCommMsg> & commMsg,const UserIdsMsg & userIdsMsg)368 void DMCommTool::DMCommToolEventHandler::HandleLocalUserIdEvent(const std::shared_ptr<DMCommTool> &dmCommToolPtr,
369 uint32_t eventId, const std::shared_ptr<InnerCommMsg> &commMsg, const UserIdsMsg &userIdsMsg)
370 {
371 CHECK_NULL_VOID(dmCommToolPtr);
372 switch (eventId) {
373 case DM_COMM_SEND_LOCAL_USERIDS: {
374 if (userIdsMsg.isNewEvent) {
375 dmCommToolPtr->ProcessReceiveCommonEvent(commMsg);
376 } else {
377 dmCommToolPtr->ProcessReceiveUserIdsEvent(commMsg);
378 }
379 break;
380 }
381 case DM_COMM_RSP_LOCAL_USERIDS: {
382 if (userIdsMsg.isNewEvent) {
383 dmCommToolPtr->ProcessResponseCommonEvent(commMsg);
384 } else {
385 dmCommToolPtr->ProcessResponseUserIdsEvent(commMsg);
386 }
387 break;
388 }
389 default:
390 break;
391 }
392 }
393
ProcessReceiveCommonEvent(const std::shared_ptr<InnerCommMsg> commMsg)394 void DMCommTool::ProcessReceiveCommonEvent(const std::shared_ptr<InnerCommMsg> commMsg)
395 {
396 LOGI("ProcessReceiveCommonEvent, process and rsp local userid");
397 std::string rmtUdid = "";
398 SoftbusCache::GetInstance().GetUdidFromCache(commMsg->remoteNetworkId.c_str(), rmtUdid);
399 if (rmtUdid.empty()) {
400 LOGE("Can not find remote udid by networkid: %{public}s", GetAnonyString(commMsg->remoteNetworkId).c_str());
401 return;
402 }
403
404 std::string payload = commMsg->commMsg->msg;
405 cJSON *root = cJSON_Parse(payload.c_str());
406 if (root == NULL) {
407 LOGE("the msg is not json format");
408 return;
409 }
410 UserIdsMsg userIdsMsg;
411 FromJson(root, userIdsMsg);
412 cJSON_Delete(root);
413 uint32_t totalUserNum = static_cast<uint32_t>(userIdsMsg.foregroundUserIds.size()) +
414 static_cast<uint32_t>(userIdsMsg.backgroundUserIds.size());
415
416 // step1: send back local userids
417 std::vector<int32_t> foregroundUserIds;
418 MultipleUserConnector::GetForegroundUserIds(foregroundUserIds);
419 std::vector<int32_t> backgroundUserIds;
420 MultipleUserConnector::GetBackgroundUserIds(backgroundUserIds);
421 MultipleUserConnector::ClearLockedUser(foregroundUserIds, backgroundUserIds);
422 std::vector<uint32_t> foregroundUserIdsU32;
423 std::vector<uint32_t> backgroundUserIdsU32;
424 for (auto const &u : foregroundUserIds) {
425 foregroundUserIdsU32.push_back(static_cast<uint32_t>(u));
426 }
427 for (auto const &u : backgroundUserIds) {
428 backgroundUserIdsU32.push_back(static_cast<uint32_t>(u));
429 }
430 RspLocalFrontOrBackUserIds(commMsg->remoteNetworkId, foregroundUserIdsU32, backgroundUserIdsU32,
431 commMsg->socketId);
432
433 DeviceManagerService::GetInstance().ProcessCommonUserStatusEvent(userIdsMsg.foregroundUserIds,
434 userIdsMsg.backgroundUserIds, rmtUdid);
435 }
436
ProcessResponseCommonEvent(const std::shared_ptr<InnerCommMsg> commMsg)437 void DMCommTool::ProcessResponseCommonEvent(const std::shared_ptr<InnerCommMsg> commMsg)
438 {
439 LOGI("process receive remote userids response");
440 // step1: close socket
441 this->dmTransportPtr_->StopSocket(commMsg->remoteNetworkId);
442
443 std::string rmtUdid = "";
444 SoftbusCache::GetInstance().GetUdidFromCache(commMsg->remoteNetworkId.c_str(), rmtUdid);
445 if (rmtUdid.empty()) {
446 LOGE("Can not find remote udid by networkid: %{public}s", GetAnonyString(commMsg->remoteNetworkId).c_str());
447 return;
448 }
449
450 std::string payload = commMsg->commMsg->msg;
451 cJSON *root = cJSON_Parse(payload.c_str());
452 if (root == NULL) {
453 LOGE("the msg is not json format");
454 return;
455 }
456 UserIdsMsg userIdsMsg;
457 FromJson(root, userIdsMsg);
458 cJSON_Delete(root);
459 DeviceManagerService::GetInstance().ProcessCommonUserStatusEvent(userIdsMsg.foregroundUserIds,
460 userIdsMsg.backgroundUserIds, rmtUdid);
461 }
462
ProcessReceiveUserIdsEvent(const std::shared_ptr<InnerCommMsg> commMsg)463 void DMCommTool::ProcessReceiveUserIdsEvent(const std::shared_ptr<InnerCommMsg> commMsg)
464 {
465 LOGI("Receive remote userids, process and rsp local userid");
466 std::string rmtUdid = "";
467 SoftbusCache::GetInstance().GetUdidFromCache(commMsg->remoteNetworkId.c_str(), rmtUdid);
468 if (rmtUdid.empty()) {
469 LOGE("Can not find remote udid by networkid: %{public}s", GetAnonyString(commMsg->remoteNetworkId).c_str());
470 return;
471 }
472
473 std::string payload = commMsg->commMsg->msg;
474 cJSON *root = cJSON_Parse(payload.c_str());
475 if (root == NULL) {
476 LOGE("the msg is not json format");
477 return;
478 }
479 UserIdsMsg userIdsMsg;
480 FromJson(root, userIdsMsg);
481 cJSON_Delete(root);
482 uint32_t totalUserNum = static_cast<uint32_t>(userIdsMsg.foregroundUserIds.size()) +
483 static_cast<uint32_t>(userIdsMsg.backgroundUserIds.size());
484
485 // step1: send back local userids
486 std::vector<int32_t> foregroundUserIds;
487 std::vector<int32_t> backgroundUserIds;
488 MultipleUserConnector::GetForegroundUserIds(foregroundUserIds);
489 MultipleUserConnector::GetBackgroundUserIds(backgroundUserIds);
490 if (DeviceManagerService::GetInstance().IsPC()) {
491 MultipleUserConnector::ClearLockedUser(foregroundUserIds, backgroundUserIds);
492 }
493 std::vector<uint32_t> foregroundUserIdsU32;
494 std::vector<uint32_t> backgroundUserIdsU32;
495 for (auto const &u : foregroundUserIds) {
496 foregroundUserIdsU32.push_back(static_cast<uint32_t>(u));
497 }
498 for (auto const &u : backgroundUserIds) {
499 backgroundUserIdsU32.push_back(static_cast<uint32_t>(u));
500 }
501 RspLocalFrontOrBackUserIds(commMsg->remoteNetworkId, foregroundUserIdsU32, backgroundUserIdsU32,
502 commMsg->socketId);
503
504 if (userIdsMsg.foregroundUserIds.empty()) {
505 LOGE("Parse but get none remote foreground userids");
506 } else {
507 // step2: process remote foreground/background userids
508 DeviceManagerService::GetInstance().ProcessSyncUserIds(userIdsMsg.foregroundUserIds,
509 userIdsMsg.backgroundUserIds, rmtUdid);
510 }
511 }
512
ProcessReceiveUninstAppEvent(const std::shared_ptr<InnerCommMsg> & commMsg)513 void DMCommTool::ProcessReceiveUninstAppEvent(const std::shared_ptr<InnerCommMsg> &commMsg)
514 {
515 if (commMsg == nullptr || commMsg->commMsg == nullptr) {
516 LOGE("commMsg or commMsg->commMsg is null");
517 return;
518 }
519 LOGI("DMCommTool::ProcessReceiveUninstAppEvent commMsg = %{public}s",
520 GetAnonyString(commMsg->commMsg->msg).c_str());
521 std::string payload = commMsg->commMsg->msg;
522 cJSON *root = cJSON_Parse(payload.c_str());
523 if (root == NULL) {
524 LOGE("the msg is not json format");
525 return;
526 }
527 UninstAppMsg uninstAppMsg;
528 FromJson(root, uninstAppMsg);
529 cJSON_Delete(root);
530 RspAppUninstall(commMsg->remoteNetworkId, commMsg->socketId);
531
532 if (uninstAppMsg.userId_ == -1 || uninstAppMsg.tokenId_ == -1) {
533 LOGE("param invalid, userId: %{public}d, tokenId: %{public}s",
534 uninstAppMsg.userId_, GetAnonyInt32(uninstAppMsg.tokenId_).c_str());
535 return;
536 } else {
537 DeviceManagerService::GetInstance().ProcessUninstApp(uninstAppMsg.userId_,
538 uninstAppMsg.tokenId_);
539 }
540 }
541
ProcessReceiveUnBindAppEvent(const std::shared_ptr<InnerCommMsg> & commMsg)542 void DMCommTool::ProcessReceiveUnBindAppEvent(const std::shared_ptr<InnerCommMsg> &commMsg)
543 {
544 if (commMsg == nullptr || commMsg->commMsg == nullptr) {
545 LOGE("commMsg or commMsg->commMsg is null");
546 return;
547 }
548 LOGI("DMCommTool::ProcessReceiveUnBindAppEvent Receive remote uninstall app");
549 std::string payload = commMsg->commMsg->msg;
550 cJSON *root = cJSON_Parse(payload.c_str());
551 if (root == NULL) {
552 LOGE("the msg is not json format");
553 return;
554 }
555 UnBindAppMsg unBindAppMsg;
556 FromJson(root, unBindAppMsg);
557 cJSON_Delete(root);
558 RspAppUnbind(commMsg->remoteNetworkId, commMsg->socketId);
559
560 if (unBindAppMsg.userId_ == -1 || unBindAppMsg.tokenId_ == -1) {
561 LOGE("param invalid, userId: %{public}d, tokenId: %{public}s",
562 unBindAppMsg.userId_, GetAnonyInt32(unBindAppMsg.tokenId_).c_str());
563 return;
564 } else {
565 DeviceManagerService::GetInstance().ProcessUnBindApp(unBindAppMsg.userId_,
566 unBindAppMsg.tokenId_, unBindAppMsg.extra_, unBindAppMsg.udid_);
567 }
568 }
569
StopSocket(const std::string & networkId)570 void DMCommTool::StopSocket(const std::string &networkId)
571 {
572 LOGI("DMCommTool::StopSocket, networkId = %{public}s", GetAnonyString(networkId).c_str());
573 if (dmTransportPtr_ == nullptr) {
574 LOGE("dmTransportPtr_ is null");
575 return;
576 }
577 dmTransportPtr_->StopSocket(networkId);
578 }
579
ProcessReceiveRspAppUninstallEvent(const std::shared_ptr<InnerCommMsg> commMsg)580 void DMCommTool::ProcessReceiveRspAppUninstallEvent(const std::shared_ptr<InnerCommMsg> commMsg)
581 {
582 if (commMsg == nullptr || commMsg->remoteNetworkId == "") {
583 LOGE("commMsg or commMsg->remoteNetworkId is null");
584 return;
585 }
586 LOGI("DMCommTool::ProcessReceiveRspAppUninstallEvent Start.");
587 if (dmTransportPtr_ == nullptr) {
588 LOGE("dmTransportPtr_ is null");
589 return;
590 }
591 this->dmTransportPtr_->StopSocket(commMsg->remoteNetworkId);
592 std::string rmtUdid = "";
593 SoftbusCache::GetInstance().GetUdidFromCache(commMsg->remoteNetworkId.c_str(), rmtUdid);
594 if (rmtUdid.empty()) {
595 LOGE("Can not find remote udid by networkid.");
596 return;
597 }
598 DeviceManagerService::GetInstance().ProcessReceiveRspAppUninstall(rmtUdid);
599 }
600
ProcessReceiveRspAppUnbindEvent(const std::shared_ptr<InnerCommMsg> commMsg)601 void DMCommTool::ProcessReceiveRspAppUnbindEvent(const std::shared_ptr<InnerCommMsg> commMsg)
602 {
603 if (commMsg == nullptr || commMsg->remoteNetworkId == "") {
604 LOGE("commMsg or commMsg->remoteNetworkId is null");
605 return;
606 }
607 if (dmTransportPtr_ == nullptr) {
608 LOGE("dmTransportPtr_ is null");
609 return;
610 }
611 LOGI("DMCommTool::ProcessReceiveRspAppUnbindEvent Start.");
612 this->dmTransportPtr_->StopSocket(commMsg->remoteNetworkId);
613 std::string rmtUdid = "";
614 SoftbusCache::GetInstance().GetUdidFromCache(commMsg->remoteNetworkId.c_str(), rmtUdid);
615 if (rmtUdid.empty()) {
616 LOGE("Can not find remote udid by networkid.");
617 return;
618 }
619 DeviceManagerService::GetInstance().ProcessReceiveRspAppUnbind(rmtUdid);
620 }
621
ProcessResponseUserIdsEvent(const std::shared_ptr<InnerCommMsg> commMsg)622 void DMCommTool::ProcessResponseUserIdsEvent(const std::shared_ptr<InnerCommMsg> commMsg)
623 {
624 LOGI("process receive remote userids response");
625 // step1: close socket
626 this->dmTransportPtr_->StopSocket(commMsg->remoteNetworkId);
627
628 std::string rmtUdid = "";
629 SoftbusCache::GetInstance().GetUdidFromCache(commMsg->remoteNetworkId.c_str(), rmtUdid);
630 if (rmtUdid.empty()) {
631 LOGE("Can not find remote udid by networkid.");
632 return;
633 }
634
635 std::string payload = commMsg->commMsg->msg;
636 cJSON *root = cJSON_Parse(payload.c_str());
637 if (root == NULL) {
638 LOGE("the msg is not json format");
639 return;
640 }
641 UserIdsMsg userIdsMsg;
642 FromJson(root, userIdsMsg);
643 cJSON_Delete(root);
644 if (userIdsMsg.foregroundUserIds.empty()) {
645 LOGE("Parse but get none remote userids");
646 return;
647 }
648 // step2: process remote foreground/background userids
649 if (!userIdsMsg.foregroundUserIds.empty()) {
650 DeviceManagerService::GetInstance().ProcessSyncUserIds(userIdsMsg.foregroundUserIds,
651 userIdsMsg.backgroundUserIds, rmtUdid);
652 } else {
653 LOGE("Receive remote foreground userid empty");
654 }
655 }
656
GetEventHandler()657 std::shared_ptr<DMCommTool::DMCommToolEventHandler> DMCommTool::GetEventHandler()
658 {
659 return this->eventHandler_;
660 }
661
GetDMTransportPtr()662 const std::shared_ptr<DMTransport> DMCommTool::GetDMTransportPtr()
663 {
664 return this->dmTransportPtr_;
665 }
666
CreateUserStopMessage(int32_t stopUserId,std::string & msgStr)667 int32_t DMCommTool::CreateUserStopMessage(int32_t stopUserId, std::string &msgStr)
668 {
669 cJSON *root = cJSON_CreateObject();
670 if (root == nullptr) {
671 LOGE("Create cJSON object failed.");
672 return ERR_DM_FAILED;
673 }
674 cJSON *numberObj = cJSON_CreateNumber(stopUserId);
675 if (numberObj == nullptr) {
676 cJSON_Delete(root);
677 return ERR_DM_FAILED;
678 }
679 if (!cJSON_AddItemToObject(root, USER_STOP_MSG_KEY, numberObj)) {
680 LOGE("add numberObj to root failed.");
681 cJSON_Delete(numberObj);
682 cJSON_Delete(root);
683 return ERR_DM_FAILED;
684 }
685 char *msg = cJSON_PrintUnformatted(root);
686 if (msg == nullptr) {
687 cJSON_Delete(root);
688 return ERR_DM_FAILED;
689 }
690 msgStr = std::string(msg);
691 cJSON_free(msg);
692 cJSON_Delete(root);
693 return DM_OK;
694 }
695
ParseUserStopMessage(const std::string & msgStr,int32_t & stopUserId)696 int32_t DMCommTool::ParseUserStopMessage(const std::string &msgStr, int32_t &stopUserId)
697 {
698 cJSON *root = cJSON_Parse(msgStr.c_str());
699 if (root == NULL) {
700 LOGE("the msg is not json format");
701 return ERR_DM_FAILED;
702 }
703 cJSON *stopUserIdObj = cJSON_GetObjectItem(root, USER_STOP_MSG_KEY);
704 if (stopUserIdObj == NULL || !cJSON_IsNumber(stopUserIdObj)) {
705 LOGE("parse stopUserId id failed.");
706 cJSON_Delete(root);
707 return ERR_DM_FAILED;
708 }
709 stopUserId = static_cast<int32_t>(stopUserIdObj->valueint);
710 cJSON_Delete(root);
711 return DM_OK;
712 }
713
SendUserStop(const std::string rmtNetworkId,int32_t stopUserId)714 int32_t DMCommTool::SendUserStop(const std::string rmtNetworkId, int32_t stopUserId)
715 {
716 std::string msgStr;
717 int32_t ret = CreateUserStopMessage(stopUserId, msgStr);
718 if (ret != DM_OK) {
719 LOGE("error ret: %{public}d", ret);
720 return ret;
721 }
722 return SendMsg(rmtNetworkId, DM_COMM_SEND_USER_STOP, msgStr);
723 }
724
SendMsg(const std::string rmtNetworkId,int32_t msgType,const std::string & msg)725 int32_t DMCommTool::SendMsg(const std::string rmtNetworkId, int32_t msgType, const std::string &msg)
726 {
727 if (!IsIdLengthValid(rmtNetworkId) || dmTransportPtr_ == nullptr) {
728 LOGE("param invalid, networkId: %{public}s", GetAnonyString(rmtNetworkId).c_str());
729 return ERR_DM_INPUT_PARA_INVALID;
730 }
731 int32_t socketId;
732 if (dmTransportPtr_->StartSocket(rmtNetworkId, socketId) != DM_OK || socketId <= 0) {
733 LOGE("Start socket error");
734 return ERR_DM_FAILED;
735 }
736 CommMsg commMsg(msgType, msg);
737 std::string payload = GetCommMsgString(commMsg);
738 int32_t ret = dmTransportPtr_->Send(rmtNetworkId, payload, socketId);
739 if (ret != DM_OK) {
740 LOGE("SendMsg failed, ret: %{public}d", ret);
741 return ERR_DM_FAILED;
742 }
743 LOGI("SendMsg success");
744 return DM_OK;
745 }
746
ProcessReceiveUserStopEvent(const std::shared_ptr<InnerCommMsg> commMsg)747 void DMCommTool::ProcessReceiveUserStopEvent(const std::shared_ptr<InnerCommMsg> commMsg)
748 {
749 LOGI("start");
750 CHECK_NULL_VOID(commMsg);
751 std::string rmtUdid = "";
752 SoftbusCache::GetInstance().GetUdidFromCache(commMsg->remoteNetworkId.c_str(), rmtUdid);
753 if (rmtUdid.empty()) {
754 LOGE("Can not find remote udid by networkid: %{public}s", GetAnonyString(commMsg->remoteNetworkId).c_str());
755 return;
756 }
757 int32_t stopUserId = -1;
758 int32_t ret = ParseUserStopMessage(commMsg->commMsg->msg, stopUserId);
759 if (ret != DM_OK) {
760 LOGE("ParseUserStopMessage error ret: %{public}d", ret);
761 return;
762 }
763 RspUserStop(commMsg->remoteNetworkId, commMsg->socketId, stopUserId);
764 DeviceManagerService::GetInstance().HandleUserStop(stopUserId, rmtUdid);
765 }
766
RspUserStop(const std::string rmtNetworkId,int32_t socketId,int32_t stopUserId)767 void DMCommTool::RspUserStop(const std::string rmtNetworkId, int32_t socketId, int32_t stopUserId)
768 {
769 std::string msgStr = "";
770 CHECK_NULL_VOID(dmTransportPtr_);
771 int32_t ret = CreateUserStopMessage(stopUserId, msgStr);
772 if (ret != DM_OK || msgStr.empty()) {
773 LOGE("error ret: %{public}d", ret);
774 return;
775 }
776 CommMsg commMsg(DM_COMM_RSP_USER_STOP, msgStr);
777 std::string payload = GetCommMsgString(commMsg);
778 ret = dmTransportPtr_->Send(rmtNetworkId, payload, socketId);
779 if (ret != DM_OK) {
780 LOGE("failed, ret: %{public}d", ret);
781 return;
782 }
783 LOGI("success");
784 }
785
ProcessResponseUserStopEvent(const std::shared_ptr<InnerCommMsg> commMsg)786 void DMCommTool::ProcessResponseUserStopEvent(const std::shared_ptr<InnerCommMsg> commMsg)
787 {
788 LOGI("start");
789 CHECK_NULL_VOID(commMsg);
790 this->dmTransportPtr_->StopSocket(commMsg->remoteNetworkId);
791 std::string rmtUdid = "";
792 SoftbusCache::GetInstance().GetUdidFromCache(commMsg->remoteNetworkId.c_str(), rmtUdid);
793 if (rmtUdid.empty()) {
794 LOGE("Can not find remote udid by networkid: %{public}s", GetAnonyString(commMsg->remoteNetworkId).c_str());
795 return;
796 }
797 int32_t stopUserId = -1;
798 int32_t ret = ParseUserStopMessage(commMsg->commMsg->msg, stopUserId);
799 if (ret != DM_OK) {
800 LOGE("ParseUserStopMessage error ret: %{public}d", ret);
801 return;
802 }
803 std::vector<std::string> acceptEventUdids;
804 acceptEventUdids.push_back(rmtUdid);
805 char localDeviceId[DEVICE_UUID_LENGTH] = {0};
806 GetDevUdid(localDeviceId, DEVICE_UUID_LENGTH);
807 std::string localUdid = static_cast<std::string>(localDeviceId);
808 DeviceManagerService::GetInstance().HandleUserStop(stopUserId, localUdid, acceptEventUdids);
809 }
810
SendLogoutAccountInfo(const std::string & rmtNetworkId,const std::string & accountId,int32_t userId)811 int32_t DMCommTool::SendLogoutAccountInfo(const std::string &rmtNetworkId,
812 const std::string &accountId, int32_t userId)
813 {
814 if (!IsIdLengthValid(rmtNetworkId) || accountId.empty() || dmTransportPtr_ == nullptr) {
815 LOGE("param invalid, networkId: %{public}s, userId: %{public}d",
816 GetAnonyString(rmtNetworkId).c_str(), userId);
817 return ERR_DM_INPUT_PARA_INVALID;
818 }
819 LOGI("Start, send networkId: %{public}s", GetAnonyString(rmtNetworkId).c_str());
820 int32_t socketId = 0;
821 if (dmTransportPtr_->StartSocket(rmtNetworkId, socketId) != DM_OK || socketId <= 0) {
822 LOGE("Start socket error");
823 return ERR_DM_FAILED;
824 }
825
826 cJSON *root = cJSON_CreateObject();
827 if (root == nullptr) {
828 LOGE("Create cJSON object failed.");
829 return ERR_DM_FAILED;
830 }
831 LogoutAccountMsg LogoutAccountMsg(accountId, userId);
832 ToJson(root, LogoutAccountMsg);
833 char *msg = cJSON_PrintUnformatted(root);
834 if (msg == nullptr) {
835 cJSON_Delete(root);
836 return ERR_DM_FAILED;
837 }
838 std::string msgStr(msg);
839 cJSON_Delete(root);
840 cJSON_free(msg);
841 CommMsg commMsg(DM_COMM_ACCOUNT_LOGOUT, msgStr);
842 std::string payload = GetCommMsgString(commMsg);
843
844 int32_t ret = dmTransportPtr_->Send(rmtNetworkId, payload, socketId);
845 if (ret != DM_OK) {
846 LOGE("Send account logout failed, ret: %{public}d", ret);
847 return ERR_DM_FAILED;
848 }
849 LOGI("Send account logout success");
850 return DM_OK;
851 }
852
ProcessReceiveLogoutEvent(const std::shared_ptr<InnerCommMsg> commMsg)853 void DMCommTool::ProcessReceiveLogoutEvent(const std::shared_ptr<InnerCommMsg> commMsg)
854 {
855 CHECK_NULL_VOID(commMsg);
856 CHECK_NULL_VOID(dmTransportPtr_);
857 this->dmTransportPtr_->StopSocket(commMsg->remoteNetworkId);
858 LOGI("Receive remote logout, networkId: %{public}s", GetAnonyString(commMsg->remoteNetworkId).c_str());
859 std::string rmtUdid = "";
860 SoftbusCache::GetInstance().GetUdidFromCache(commMsg->remoteNetworkId.c_str(), rmtUdid);
861 if (rmtUdid.empty()) {
862 LOGE("Can not find remote udid by networkid: %{public}s", GetAnonyString(commMsg->remoteNetworkId).c_str());
863 return;
864 }
865
866 CHECK_NULL_VOID(commMsg->commMsg);
867 std::string payload = commMsg->commMsg->msg;
868 cJSON *root = cJSON_Parse(payload.c_str());
869 if (root == NULL) {
870 LOGE("the msg is not json format");
871 return;
872 }
873 LogoutAccountMsg logoutAccountMsg;
874 FromJson(root, logoutAccountMsg);
875 cJSON_Delete(root);
876
877 if (logoutAccountMsg.accountId.empty() || logoutAccountMsg.userId == -1) {
878 LOGE("param invalid, accountId: %{public}s, userId: %{public}d",
879 GetAnonyString(logoutAccountMsg.accountId).c_str(), logoutAccountMsg.userId);
880 return;
881 }
882 DeviceManagerService::GetInstance().ProcessSyncAccountLogout(logoutAccountMsg.accountId,
883 rmtUdid, logoutAccountMsg.userId);
884 LOGI("process remote logout success.");
885 }
886
StartCommonEvent(std::string commonEventType,EventCallback eventCallback)887 int32_t DMCommTool::StartCommonEvent(std::string commonEventType, EventCallback eventCallback)
888 {
889 if (commonEventType.empty() || eventCallback == nullptr) {
890 LOGE("StartCommonEvent input value invalid");
891 return ERR_DM_INPUT_PARA_INVALID;
892 }
893 CHECK_NULL_RETURN(eventQueue_, ERR_DM_POINT_NULL);
894 LOGI("StartCommonEvent start eventType: %{public}s", commonEventType.c_str());
895 std::lock_guard<std::mutex> locker(eventMutex_);
896 auto taskFunc = [eventCallback] () { eventCallback(); };
897 eventQueue_->submit(taskFunc);
898 return DM_OK;
899 }
900 } // DistributedHardware
901 } // OHOS