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