1 /*
2 * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "client_bus_center_manager.h"
17
18 #include <pthread.h>
19 #include <securec.h>
20
21 #include "anonymizer.h"
22 #include "bus_center_server_proxy.h"
23 #include "common_list.h"
24 #include "lnn_log.h"
25 #include "softbus_adapter_mem.h"
26 #include "softbus_adapter_thread.h"
27 #include "softbus_def.h"
28 #include "softbus_errcode.h"
29 #include "softbus_feature_config.h"
30 #include "softbus_utils.h"
31
32 #define DEFAULT_NODE_STATE_CB_CNT 10
33 #define MAX_IPC_LEN 1024
34
35 static int32_t g_maxNodeStateCbCount;
36 static SoftBusList *g_publishMsgList = NULL;
37 static SoftBusList *g_discoveryMsgList = NULL;
38 static bool g_isInited = false;
39 static SoftBusMutex g_isInitedLock;
40 static char g_regDataLevelChangePkgName[PKG_NAME_SIZE_MAX] = {0};
41
42 typedef struct {
43 ListNode node;
44 ConnectionAddr addr;
45 OnJoinLNNResult cb;
46 } JoinLNNCbListItem;
47
48 typedef struct {
49 ListNode node;
50 char networkId[NETWORK_ID_BUF_LEN];
51 OnLeaveLNNResult cb;
52 } LeaveLNNCbListItem;
53
54 typedef struct {
55 ListNode node;
56 char networkId[NETWORK_ID_BUF_LEN];
57 ITimeSyncCb cb;
58 } TimeSyncCallbackItem;
59
60 typedef struct {
61 ListNode node;
62 INodeStateCb cb;
63 char pkgName[PKG_NAME_SIZE_MAX];
64 } NodeStateCallbackItem;
65
66 typedef struct {
67 ListNode joinLNNCbList;
68 ListNode leaveLNNCbList;
69 ListNode nodeStateCbList;
70 ListNode timeSyncCbList;
71 int32_t nodeStateCbListCnt;
72 IPublishCb publishCb;
73 IRefreshCallback refreshCb;
74 IDataLevelCb dataLevelCb;
75 bool isInit;
76 SoftBusMutex lock;
77 } BusCenterClient;
78
79 typedef struct {
80 char pkgName[PKG_NAME_SIZE_MAX];
81 PublishInfo *info;
82 ListNode node;
83 } DiscPublishMsg;
84
85 typedef struct {
86 char pkgName[PKG_NAME_SIZE_MAX];
87 SubscribeInfo *info;
88 ListNode node;
89 } DiscSubscribeMsg;
90
91 static BusCenterClient g_busCenterClient = {
92 .nodeStateCbListCnt = 0,
93 .publishCb.OnPublishResult = NULL,
94 .refreshCb.OnDeviceFound = NULL,
95 .refreshCb.OnDiscoverResult = NULL,
96 .dataLevelCb.onDataLevelChanged = NULL,
97 .isInit = false,
98 };
99
IsUdidHashEmpty(const ConnectionAddr *addr)100 static bool IsUdidHashEmpty(const ConnectionAddr *addr)
101 {
102 for (uint32_t i = 0; i < UDID_HASH_LEN; i++) {
103 if (addr->info.ble.udidHash[i] != 0) {
104 return false;
105 }
106 }
107 return true;
108 }
109
IsSameConnectionAddr(const ConnectionAddr *addr1, const ConnectionAddr *addr2)110 static bool IsSameConnectionAddr(const ConnectionAddr *addr1, const ConnectionAddr *addr2)
111 {
112 if (addr1->type != addr2->type) {
113 return false;
114 }
115 if (addr1->type == CONNECTION_ADDR_BR) {
116 return strncmp(addr1->info.br.brMac, addr2->info.br.brMac, BT_MAC_LEN) == 0;
117 }
118 if (addr1->type == CONNECTION_ADDR_BLE) {
119 if (IsUdidHashEmpty(addr2)) {
120 return strncmp(addr1->info.ble.bleMac, addr2->info.ble.bleMac, BT_MAC_LEN) == 0;
121 }
122 return memcmp(addr1->info.ble.udidHash, addr2->info.ble.udidHash, UDID_HASH_LEN) == 0 ||
123 strncmp(addr1->info.ble.bleMac, addr2->info.ble.bleMac, BT_MAC_LEN) == 0;
124 }
125 if (addr1->type == CONNECTION_ADDR_WLAN || addr1->type == CONNECTION_ADDR_ETH) {
126 return (strncmp(addr1->info.ip.ip, addr2->info.ip.ip, IP_STR_MAX_LEN) == 0)
127 && (addr1->info.ip.port == addr2->info.ip.port);
128 }
129 if (addr1->type == CONNECTION_ADDR_SESSION) {
130 return ((addr1->info.session.sessionId == addr2->info.session.sessionId) &&
131 (addr1->info.session.channelId == addr2->info.session.channelId) &&
132 (addr1->info.session.type == addr2->info.session.type));
133 }
134 return false;
135 }
136
FindJoinLNNCbItem(ConnectionAddr *addr, OnJoinLNNResult cb)137 static JoinLNNCbListItem *FindJoinLNNCbItem(ConnectionAddr *addr, OnJoinLNNResult cb)
138 {
139 JoinLNNCbListItem *item = NULL;
140
141 LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.joinLNNCbList, JoinLNNCbListItem, node) {
142 if (IsSameConnectionAddr(&item->addr, addr) &&
143 (cb == NULL || cb == item->cb)) {
144 return item;
145 }
146 }
147 return NULL;
148 }
149
AddJoinLNNCbItem(ConnectionAddr *target, OnJoinLNNResult cb)150 static int32_t AddJoinLNNCbItem(ConnectionAddr *target, OnJoinLNNResult cb)
151 {
152 JoinLNNCbListItem *item = NULL;
153
154 item = (JoinLNNCbListItem *)SoftBusMalloc(sizeof(*item));
155 if (item == NULL) {
156 LNN_LOGE(LNN_STATE, "malloc join LNN cb item fail");
157 return SOFTBUS_MALLOC_ERR;
158 }
159 ListInit(&item->node);
160 item->addr = *target;
161 item->cb = cb;
162 ListAdd(&g_busCenterClient.joinLNNCbList, &item->node);
163 return SOFTBUS_OK;
164 }
165
FindLeaveLNNCbItem(const char *networkId, OnLeaveLNNResult cb)166 static LeaveLNNCbListItem *FindLeaveLNNCbItem(const char *networkId, OnLeaveLNNResult cb)
167 {
168 LeaveLNNCbListItem *item = NULL;
169
170 LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.leaveLNNCbList, LeaveLNNCbListItem, node) {
171 if (strcmp(item->networkId, networkId) == 0 &&
172 (cb == NULL || cb == item->cb)) {
173 return item;
174 }
175 }
176 return NULL;
177 }
178
AddLeaveLNNCbItem(const char *networkId, OnLeaveLNNResult cb)179 static int32_t AddLeaveLNNCbItem(const char *networkId, OnLeaveLNNResult cb)
180 {
181 LeaveLNNCbListItem *item = NULL;
182
183 item = (LeaveLNNCbListItem *)SoftBusMalloc(sizeof(*item));
184 if (item == NULL) {
185 LNN_LOGE(LNN_STATE, "malloc join LNN cb item fail");
186 return SOFTBUS_MALLOC_ERR;
187 }
188 ListInit(&item->node);
189 if (strncpy_s(item->networkId, NETWORK_ID_BUF_LEN, networkId, strlen(networkId)) != EOK) {
190 LNN_LOGE(LNN_STATE, "strcpy network id fail");
191 SoftBusFree(item);
192 return SOFTBUS_ERR;
193 }
194 item->cb = cb;
195 ListAdd(&g_busCenterClient.leaveLNNCbList, &item->node);
196 return SOFTBUS_OK;
197 }
198
FindTimeSyncCbItem(const char *networkId, ITimeSyncCb *cb)199 static TimeSyncCallbackItem *FindTimeSyncCbItem(const char *networkId, ITimeSyncCb *cb)
200 {
201 TimeSyncCallbackItem *item = NULL;
202
203 LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.timeSyncCbList, TimeSyncCallbackItem, node) {
204 if (strcmp(item->networkId, networkId) == 0 &&
205 (cb == NULL || cb->onTimeSyncResult == item->cb.onTimeSyncResult)) {
206 return item;
207 }
208 }
209 return NULL;
210 }
211
AddTimeSyncCbItem(const char *networkId, ITimeSyncCb *cb)212 static int32_t AddTimeSyncCbItem(const char *networkId, ITimeSyncCb *cb)
213 {
214 TimeSyncCallbackItem *item = NULL;
215
216 item = (TimeSyncCallbackItem *)SoftBusMalloc(sizeof(*item));
217 if (item == NULL) {
218 LNN_LOGE(LNN_STATE, "malloc time sync cb item fail");
219 return SOFTBUS_MALLOC_ERR;
220 }
221 ListInit(&item->node);
222 if (strncpy_s(item->networkId, NETWORK_ID_BUF_LEN, networkId, strlen(networkId)) != EOK) {
223 LNN_LOGE(LNN_STATE, "strcpy network id fail");
224 SoftBusFree(item);
225 return SOFTBUS_ERR;
226 }
227 item->cb = *cb;
228 ListAdd(&g_busCenterClient.timeSyncCbList, &item->node);
229 return SOFTBUS_OK;
230 }
231
ClearJoinLNNList(void)232 static void ClearJoinLNNList(void)
233 {
234 JoinLNNCbListItem *item = NULL;
235 JoinLNNCbListItem *next = NULL;
236
237 LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_busCenterClient.joinLNNCbList, JoinLNNCbListItem, node) {
238 ListDelete(&item->node);
239 SoftBusFree(item);
240 }
241 }
242
ClearLeaveLNNList(void)243 static void ClearLeaveLNNList(void)
244 {
245 LeaveLNNCbListItem *item = NULL;
246 LeaveLNNCbListItem *next = NULL;
247
248 LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_busCenterClient.leaveLNNCbList, LeaveLNNCbListItem, node) {
249 ListDelete(&item->node);
250 SoftBusFree(item);
251 }
252 }
253
ClearTimeSyncList(ListNode *list)254 static void ClearTimeSyncList(ListNode *list)
255 {
256 TimeSyncCallbackItem *item = NULL;
257 TimeSyncCallbackItem *next = NULL;
258
259 LIST_FOR_EACH_ENTRY_SAFE(item, next, list, TimeSyncCallbackItem, node) {
260 ListDelete(&item->node);
261 SoftBusFree(item);
262 }
263 }
264
ClearNodeStateCbList(ListNode *list)265 static void ClearNodeStateCbList(ListNode *list)
266 {
267 NodeStateCallbackItem *item = NULL;
268 NodeStateCallbackItem *next = NULL;
269
270 LIST_FOR_EACH_ENTRY_SAFE(item, next, list, NodeStateCallbackItem, node) {
271 ListDelete(&item->node);
272 SoftBusFree(item);
273 }
274 }
275
DuplicateNodeStateCbList(ListNode *list)276 static void DuplicateNodeStateCbList(ListNode *list)
277 {
278 NodeStateCallbackItem *item = NULL;
279 NodeStateCallbackItem *copyItem = NULL;
280
281 LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.nodeStateCbList, NodeStateCallbackItem, node) {
282 copyItem = (NodeStateCallbackItem *)SoftBusCalloc(sizeof(NodeStateCallbackItem));
283 if (copyItem == NULL) {
284 LNN_LOGE(LNN_STATE, "malloc node state callback item fail");
285 continue;
286 }
287 if (strncpy_s(copyItem->pkgName, PKG_NAME_SIZE_MAX, item->pkgName, PKG_NAME_SIZE_MAX - 1) != EOK) {
288 LNN_LOGE(LNN_STATE, "copy pkgName fail");
289 SoftBusFree(copyItem);
290 continue;
291 }
292 ListInit(©Item->node);
293 copyItem->cb = item->cb;
294 ListAdd(list, ©Item->node);
295 }
296 }
297
DuplicateTimeSyncResultCbList(ListNode *list, const char *networkId)298 static void DuplicateTimeSyncResultCbList(ListNode *list, const char *networkId)
299 {
300 TimeSyncCallbackItem *item = NULL;
301 TimeSyncCallbackItem *copyItem = NULL;
302
303 LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.timeSyncCbList, TimeSyncCallbackItem, node) {
304 if (strcmp(item->networkId, networkId) != 0) {
305 continue;
306 }
307 copyItem = (TimeSyncCallbackItem *)SoftBusMalloc(sizeof(TimeSyncCallbackItem));
308 if (copyItem == NULL) {
309 LNN_LOGE(LNN_STATE, "malloc time sync callback item fail");
310 continue;
311 }
312 copyItem->cb = item->cb;
313 ListInit(©Item->node);
314 if (strncpy_s(copyItem->networkId, NETWORK_ID_BUF_LEN, item->networkId, strlen(item->networkId)) != EOK) {
315 LNN_LOGE(LNN_STATE, "copy networkId fail");
316 SoftBusFree(copyItem);
317 continue;
318 }
319 ListAdd(list, ©Item->node);
320 }
321 }
322
FreeDiscPublishMsg(DiscPublishMsg **msgNode)323 static void FreeDiscPublishMsg(DiscPublishMsg **msgNode)
324 {
325 if (*msgNode != NULL && (*msgNode)->info != NULL) {
326 SoftBusFree((char *)(*msgNode)->info->capability);
327 SoftBusFree((*msgNode)->info->capabilityData);
328 SoftBusFree((*msgNode)->info);
329 }
330 SoftBusFree(*msgNode);
331 *msgNode = NULL;
332 }
333
FreeDiscSubscribeMsg(DiscSubscribeMsg **msgNode)334 static void FreeDiscSubscribeMsg(DiscSubscribeMsg **msgNode)
335 {
336 if (*msgNode != NULL && (*msgNode)->info != NULL) {
337 SoftBusFree((char *)(*msgNode)->info->capability);
338 SoftBusFree((*msgNode)->info->capabilityData);
339 SoftBusFree((*msgNode)->info);
340 }
341 SoftBusFree(*msgNode);
342 *msgNode = NULL;
343 }
344
BuildDiscPublishMsg(DiscPublishMsg **msgNode, const PublishInfo *info, const char *pkgName)345 static int32_t BuildDiscPublishMsg(DiscPublishMsg **msgNode, const PublishInfo *info, const char *pkgName)
346 {
347 *msgNode = (DiscPublishMsg *)SoftBusCalloc(sizeof(DiscPublishMsg));
348 if (*msgNode == NULL) {
349 LNN_LOGE(LNN_STATE, "calloc msgNode failed");
350 return SOFTBUS_MALLOC_ERR;
351 }
352 (*msgNode)->info = (PublishInfo *)SoftBusCalloc(sizeof(PublishInfo));
353 if ((*msgNode)->info == NULL) {
354 FreeDiscPublishMsg(msgNode);
355 LNN_LOGE(LNN_STATE, "calloc info failed");
356 return SOFTBUS_MALLOC_ERR;
357 }
358 (*msgNode)->info->capability = (char *)SoftBusCalloc(strlen(info->capability) + 1);
359 if ((*msgNode)->info->capability == NULL) {
360 FreeDiscPublishMsg(msgNode);
361 LNN_LOGE(LNN_STATE, "calloc capability failed");
362 return SOFTBUS_MALLOC_ERR;
363 }
364 (*msgNode)->info->publishId = info->publishId;
365 (*msgNode)->info->mode = info->mode;
366 (*msgNode)->info->medium = info->medium;
367 (*msgNode)->info->freq = info->freq;
368 (*msgNode)->info->dataLen = info->dataLen;
369 (*msgNode)->info->ranging = info->ranging;
370 if (strcpy_s((char *)(*msgNode)->info->capability, strlen(info->capability) + 1, info->capability) != EOK ||
371 strcpy_s((*msgNode)->pkgName, PKG_NAME_SIZE_MAX, pkgName) != EOK) {
372 FreeDiscPublishMsg(msgNode);
373 LNN_LOGE(LNN_STATE, "copy capability or pkgName failed");
374 return SOFTBUS_ERR;
375 }
376 if (info->dataLen > 0) {
377 (*msgNode)->info->capabilityData = (unsigned char *)SoftBusCalloc(info->dataLen + 1);
378 if ((*msgNode)->info->capabilityData == NULL) {
379 FreeDiscPublishMsg(msgNode);
380 LNN_LOGE(LNN_STATE, "calloc failed");
381 return SOFTBUS_MALLOC_ERR;
382 }
383 if (strcpy_s((char *)(*msgNode)->info->capabilityData, info->dataLen + 1,
384 (const char *)info->capabilityData) != EOK) {
385 FreeDiscPublishMsg(msgNode);
386 LNN_LOGE(LNN_STATE, "copy capabilityData failed");
387 return SOFTBUS_ERR;
388 }
389 }
390 return SOFTBUS_OK;
391 }
392
BuildDiscSubscribeMsg(DiscSubscribeMsg **msgNode, const SubscribeInfo *info, const char *pkgName)393 static int32_t BuildDiscSubscribeMsg(DiscSubscribeMsg **msgNode, const SubscribeInfo *info, const char *pkgName)
394 {
395 *msgNode = (DiscSubscribeMsg *)SoftBusCalloc(sizeof(DiscSubscribeMsg));
396 if (*msgNode == NULL) {
397 LNN_LOGE(LNN_STATE, "calloc msgNode failed");
398 return SOFTBUS_MALLOC_ERR;
399 }
400 (*msgNode)->info = (SubscribeInfo *)SoftBusCalloc(sizeof(SubscribeInfo));
401 if ((*msgNode)->info == NULL) {
402 FreeDiscSubscribeMsg(msgNode);
403 LNN_LOGE(LNN_STATE, "calloc info failed");
404 return SOFTBUS_MALLOC_ERR;
405 }
406 (*msgNode)->info->capability = (char *)SoftBusCalloc(strlen(info->capability) + 1);
407 if ((*msgNode)->info->capability == NULL) {
408 FreeDiscSubscribeMsg(msgNode);
409 LNN_LOGE(LNN_STATE, "calloc capability failed");
410 return SOFTBUS_MALLOC_ERR;
411 }
412 (*msgNode)->info->subscribeId = info->subscribeId;
413 (*msgNode)->info->mode = info->mode;
414 (*msgNode)->info->medium = info->medium;
415 (*msgNode)->info->freq = info->freq;
416 (*msgNode)->info->dataLen = info->dataLen;
417 if (strcpy_s((char *)(*msgNode)->info->capability, strlen(info->capability) + 1, info->capability) != EOK ||
418 strcpy_s((*msgNode)->pkgName, PKG_NAME_SIZE_MAX, pkgName) != EOK) {
419 FreeDiscSubscribeMsg(msgNode);
420 LNN_LOGE(LNN_STATE, "copy capability or pkgName failed");
421 return SOFTBUS_ERR;
422 }
423 if (info->dataLen > 0) {
424 (*msgNode)->info->capabilityData = (unsigned char *)SoftBusCalloc(info->dataLen + 1);
425 if ((*msgNode)->info->capabilityData == NULL) {
426 FreeDiscSubscribeMsg(msgNode);
427 LNN_LOGE(LNN_STATE, "calloc failed");
428 return SOFTBUS_MALLOC_ERR;
429 }
430 if (strcpy_s((char *)(*msgNode)->info->capabilityData, info->dataLen + 1,
431 (const char *)info->capabilityData) != EOK) {
432 FreeDiscSubscribeMsg(msgNode);
433 LNN_LOGE(LNN_STATE, "copy capabilityData failed");
434 return SOFTBUS_ERR;
435 }
436 }
437 return SOFTBUS_OK;
438 }
439
AddDiscPublishMsg(const char *pkgName, const PublishInfo *info)440 static int32_t AddDiscPublishMsg(const char *pkgName, const PublishInfo *info)
441 {
442 LNN_CHECK_AND_RETURN_RET_LOGW(g_isInited, SOFTBUS_NO_INIT, LNN_STATE, "disc publish list not init");
443 LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexLock(&(g_publishMsgList->lock)) == SOFTBUS_OK,
444 SOFTBUS_LOCK_ERR, LNN_STATE, "lock failed");
445
446 DiscPublishMsg *msgNode = NULL;
447 LIST_FOR_EACH_ENTRY(msgNode, &(g_publishMsgList->list), DiscPublishMsg, node) {
448 if (msgNode->info->publishId == info->publishId &&
449 strcmp(msgNode->info->capability, info->capability) == 0 && strcmp(msgNode->pkgName, pkgName) == 0) {
450 (void)SoftBusMutexUnlock(&(g_publishMsgList->lock));
451 return SOFTBUS_OK;
452 }
453 }
454
455 if (BuildDiscPublishMsg(&msgNode, info, pkgName) != SOFTBUS_OK) {
456 (void)SoftBusMutexUnlock(&(g_publishMsgList->lock));
457 LNN_LOGE(LNN_STATE, "build DiscPublishMsg failed");
458 return SOFTBUS_ERR;
459 }
460 ListTailInsert(&(g_publishMsgList->list), &(msgNode->node));
461 (void)SoftBusMutexUnlock(&(g_publishMsgList->lock));
462 return SOFTBUS_OK;
463 }
464
DeleteDiscPublishMsg(const char *pkgName, int32_t publishId)465 static int32_t DeleteDiscPublishMsg(const char *pkgName, int32_t publishId)
466 {
467 LNN_CHECK_AND_RETURN_RET_LOGW(g_isInited, SOFTBUS_NO_INIT, LNN_STATE, "disc publish list not init");
468 LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexLock(&(g_publishMsgList->lock)) == SOFTBUS_OK,
469 SOFTBUS_LOCK_ERR, LNN_STATE, "lock failed");
470
471 DiscPublishMsg *msgNode = NULL;
472 DiscPublishMsg *next = NULL;
473 LIST_FOR_EACH_ENTRY_SAFE(msgNode, next, &(g_publishMsgList->list), DiscPublishMsg, node) {
474 if (msgNode->info->publishId == publishId && strcmp(msgNode->pkgName, pkgName) == 0) {
475 ListDelete(&(msgNode->node));
476 FreeDiscPublishMsg(&msgNode);
477 break;
478 }
479 }
480 (void)SoftBusMutexUnlock(&(g_publishMsgList->lock));
481 return SOFTBUS_OK;
482 }
483
AddDiscSubscribeMsg(const char *pkgName, const SubscribeInfo *info)484 static int32_t AddDiscSubscribeMsg(const char *pkgName, const SubscribeInfo *info)
485 {
486 LNN_CHECK_AND_RETURN_RET_LOGW(g_isInited, SOFTBUS_NO_INIT, LNN_STATE, "disc subscribe list not init");
487 LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexLock(&(g_discoveryMsgList->lock)) == SOFTBUS_OK,
488 SOFTBUS_LOCK_ERR, LNN_STATE, "lock failed");
489
490 DiscSubscribeMsg *msgNode = NULL;
491 LIST_FOR_EACH_ENTRY(msgNode, &(g_discoveryMsgList->list), DiscSubscribeMsg, node) {
492 if (msgNode->info->subscribeId == info->subscribeId &&
493 strcmp(msgNode->info->capability, info->capability) == 0 && strcmp(msgNode->pkgName, pkgName) == 0) {
494 (void)SoftBusMutexUnlock(&(g_discoveryMsgList->lock));
495 return SOFTBUS_OK;
496 }
497 }
498
499 if (BuildDiscSubscribeMsg(&msgNode, info, pkgName) != SOFTBUS_OK) {
500 (void)SoftBusMutexUnlock(&(g_discoveryMsgList->lock));
501 LNN_LOGE(LNN_STATE, "build DiscSubscribeMsg failed");
502 return SOFTBUS_ERR;
503 }
504 ListTailInsert(&(g_discoveryMsgList->list), &(msgNode->node));
505 (void)SoftBusMutexUnlock(&(g_discoveryMsgList->lock));
506 return SOFTBUS_OK;
507 }
508
DeleteDiscSubscribeMsg(const char *pkgName, int32_t refreshId)509 static int32_t DeleteDiscSubscribeMsg(const char *pkgName, int32_t refreshId)
510 {
511 LNN_CHECK_AND_RETURN_RET_LOGW(g_isInited, SOFTBUS_NO_INIT, LNN_STATE, "disc subscribe list not init");
512 LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexLock(&(g_discoveryMsgList->lock)) == SOFTBUS_OK,
513 SOFTBUS_LOCK_ERR, LNN_STATE, "lock failed");
514
515 DiscSubscribeMsg *msgNode = NULL;
516 DiscSubscribeMsg *next = NULL;
517 LIST_FOR_EACH_ENTRY_SAFE(msgNode, next, &(g_discoveryMsgList->list), DiscSubscribeMsg, node) {
518 if (msgNode->info->subscribeId == refreshId && strcmp(msgNode->pkgName, pkgName) == 0) {
519 ListDelete(&(msgNode->node));
520 FreeDiscSubscribeMsg(&msgNode);
521 break;
522 }
523 }
524 (void)SoftBusMutexUnlock(&(g_discoveryMsgList->lock));
525 return SOFTBUS_OK;
526 }
527
DiscoveryMsgListInitnull528 static int32_t DiscoveryMsgListInit()
529 {
530 if (g_isInited) {
531 LNN_LOGI(LNN_STATE, "disc msg list already init");
532 return SOFTBUS_OK;
533 }
534 LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexInit(&g_isInitedLock, NULL) == SOFTBUS_OK,
535 SOFTBUS_LOCK_ERR, LNN_STATE, "lock init failed");
536 if (SoftBusMutexLock(&g_isInitedLock) != SOFTBUS_OK) {
537 LNN_LOGE(LNN_STATE, "lock failed");
538 (void)SoftBusMutexDestroy(&g_isInitedLock);
539 return SOFTBUS_LOCK_ERR;
540 }
541 g_publishMsgList = CreateSoftBusList();
542 g_discoveryMsgList = CreateSoftBusList();
543 if (g_publishMsgList == NULL || g_discoveryMsgList == NULL) {
544 LNN_LOGE(LNN_STATE, "init disc msg list failed");
545 DestroySoftBusList(g_publishMsgList);
546 DestroySoftBusList(g_discoveryMsgList);
547 g_publishMsgList = NULL;
548 g_discoveryMsgList = NULL;
549 (void)SoftBusMutexUnlock(&g_isInitedLock);
550 return SOFTBUS_ERR;
551 }
552 g_isInited = true;
553 (void)SoftBusMutexUnlock(&g_isInitedLock);
554 static uint32_t callCount = 0;
555 LNN_LOGI(LNN_STATE, "disc list init success, callCount=%{public}u", callCount++);
556 return SOFTBUS_OK;
557 }
558
DiscoveryMsgListDeInitnull559 static int32_t DiscoveryMsgListDeInit()
560 {
561 if (!g_isInited) {
562 LNN_LOGI(LNN_STATE, "disc msg list no need deInit");
563 return SOFTBUS_OK;
564 }
565 (void)SoftBusMutexDestroy(&g_isInitedLock);
566 DestroySoftBusList(g_publishMsgList);
567 DestroySoftBusList(g_discoveryMsgList);
568 g_publishMsgList = NULL;
569 g_discoveryMsgList = NULL;
570 g_isInited = false;
571
572 LNN_LOGI(LNN_STATE, "disc list deinit success");
573 return SOFTBUS_OK;
574 }
575
BusCenterClientDeinit(void)576 void BusCenterClientDeinit(void)
577 {
578 if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
579 LNN_LOGE(LNN_INIT, "lock in deinit");
580 return;
581 }
582 if (DiscoveryMsgListDeInit() != SOFTBUS_OK) {
583 LNN_LOGE(LNN_INIT, "DiscoveryMsgListDeInit fail");
584 (void)SoftBusMutexUnlock(&g_busCenterClient.lock);
585 return;
586 }
587 ClearJoinLNNList();
588 ClearLeaveLNNList();
589 ClearTimeSyncList(&g_busCenterClient.timeSyncCbList);
590 ClearNodeStateCbList(&g_busCenterClient.nodeStateCbList);
591 g_busCenterClient.nodeStateCbListCnt = 0;
592 if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
593 LNN_LOGE(LNN_INIT, "unlock in deinit");
594 }
595 g_busCenterClient.dataLevelCb.onDataLevelChanged = NULL;
596 SoftBusMutexDestroy(&g_busCenterClient.lock);
597 BusCenterServerProxyDeInit();
598 }
599
BusCenterClientInit(void)600 int32_t BusCenterClientInit(void)
601 {
602 if (SoftbusGetConfig(SOFTBUS_INT_MAX_NODE_STATE_CB_CNT,
603 (unsigned char *)&g_maxNodeStateCbCount, sizeof(g_maxNodeStateCbCount)) != SOFTBUS_OK) {
604 LNN_LOGE(LNN_INIT, "Cannot get NodeStateCbCount from config file");
605 g_maxNodeStateCbCount = DEFAULT_NODE_STATE_CB_CNT;
606 }
607 LNN_LOGI(LNN_INIT, "NodeStateCbCount=%{public}u", g_maxNodeStateCbCount);
608
609 if (SoftBusMutexInit(&g_busCenterClient.lock, NULL) != SOFTBUS_OK) {
610 LNN_LOGE(LNN_INIT, "g_busCenterClient.lock init failed");
611 return SOFTBUS_ERR;
612 }
613 if (DiscoveryMsgListInit() != SOFTBUS_OK) {
614 LNN_LOGE(LNN_INIT, "DiscoveryMsgListInit fail");
615 return SOFTBUS_ERR;
616 }
617
618 ListInit(&g_busCenterClient.joinLNNCbList);
619 ListInit(&g_busCenterClient.leaveLNNCbList);
620 ListInit(&g_busCenterClient.nodeStateCbList);
621 ListInit(&g_busCenterClient.timeSyncCbList);
622 g_busCenterClient.isInit = true;
623 if (BusCenterServerProxyInit() != SOFTBUS_OK) {
624 LNN_LOGE(LNN_INIT, "bus center server proxy init failed");
625 BusCenterClientDeinit();
626 return SOFTBUS_ERR;
627 }
628 LNN_LOGI(LNN_INIT, "BusCenterClientInit init OK");
629 return SOFTBUS_OK;
630 }
631
GetAllNodeDeviceInfoInner(const char *pkgName, NodeBasicInfo **info, int32_t *infoNum)632 int32_t GetAllNodeDeviceInfoInner(const char *pkgName, NodeBasicInfo **info, int32_t *infoNum)
633 {
634 int32_t ret = ServerIpcGetAllOnlineNodeInfo(pkgName, (void **)info, sizeof(NodeBasicInfo), infoNum);
635 if (ret != SOFTBUS_OK) {
636 LNN_LOGE(LNN_STATE, "Server GetAllOnlineNodeInfo failed, ret=%{public}d", ret);
637 }
638 return ret;
639 }
640
GetLocalNodeDeviceInfoInner(const char *pkgName, NodeBasicInfo *info)641 int32_t GetLocalNodeDeviceInfoInner(const char *pkgName, NodeBasicInfo *info)
642 {
643 int32_t ret = ServerIpcGetLocalDeviceInfo(pkgName, info, sizeof(*info));
644 if (ret != SOFTBUS_OK) {
645 LNN_LOGE(LNN_STATE, "Server GetLocalNodeDeviceInfo failed, ret=%{public}d", ret);
646 }
647 return ret;
648 }
649
GetNodeKeyInfoInner(const char *pkgName, const char *networkId, NodeDeviceInfoKey key, uint8_t *info, int32_t infoLen)650 int32_t GetNodeKeyInfoInner(const char *pkgName, const char *networkId, NodeDeviceInfoKey key,
651 uint8_t *info, int32_t infoLen)
652 {
653 int32_t ret = ServerIpcGetNodeKeyInfo(pkgName, networkId, key, info, infoLen);
654 if (ret != SOFTBUS_OK) {
655 LNN_LOGE(LNN_STATE, "Server GetNodeKeyInfo failed, ret=%{public}d", ret);
656 }
657 return ret;
658 }
659
SetNodeDataChangeFlagInner(const char *pkgName, const char *networkId, uint16_t dataChangeFlag)660 int32_t SetNodeDataChangeFlagInner(const char *pkgName, const char *networkId, uint16_t dataChangeFlag)
661 {
662 int32_t ret = ServerIpcSetNodeDataChangeFlag(pkgName, networkId, dataChangeFlag);
663 if (ret != SOFTBUS_OK) {
664 LNN_LOGE(LNN_STATE, "Server SetNodeDataChangeFlag failed, ret=%{public}d", ret);
665 }
666 return ret;
667 }
668
RegDataLevelChangeCbInner(const char *pkgName, IDataLevelCb *callback)669 int32_t RegDataLevelChangeCbInner(const char *pkgName, IDataLevelCb *callback)
670 {
671 LNN_LOGI(LNN_STATE, "RegDataLevelChangeCbInner enter");
672 g_busCenterClient.dataLevelCb = *callback;
673 if (strcpy_s(g_regDataLevelChangePkgName, PKG_NAME_SIZE_MAX, pkgName) != EOK) {
674 LNN_LOGE(LNN_STATE, "copy pkgName fail");
675 return SOFTBUS_MEM_ERR;
676 }
677 int32_t ret = ServerIpcRegDataLevelChangeCb(pkgName);
678 if (ret != SOFTBUS_OK) {
679 LNN_LOGE(LNN_STATE, "Server RegDataLevelChangeCb failed, ret=%{public}d", ret);
680 }
681 return ret;
682 }
683
RestartRegDataLevelChange(void)684 void RestartRegDataLevelChange(void)
685 {
686 LNN_LOGI(LNN_STATE, "enter");
687 if (g_regDataLevelChangePkgName[0] == '\0') {
688 LNN_LOGI(LNN_STATE, "restart regDataLevelChange is not used");
689 return;
690 }
691 int32_t ret = ServerIpcRegDataLevelChangeCb(g_regDataLevelChangePkgName);
692 if (ret != SOFTBUS_OK) {
693 LNN_LOGE(LNN_STATE, "Server RegDataLevelChangeCb failed, ret=%{public}d", ret);
694 return;
695 }
696 LNN_LOGI(LNN_STATE, "Server RegDataLevelChangeCb succeed");
697 }
698
UnregDataLevelChangeCbInner(const char *pkgName)699 int32_t UnregDataLevelChangeCbInner(const char *pkgName)
700 {
701 LNN_LOGI(LNN_STATE, "UnregDataLevelChangeCbInner enter");
702 g_busCenterClient.dataLevelCb.onDataLevelChanged = NULL;
703 int32_t ret = ServerIpcUnregDataLevelChangeCb(pkgName);
704 if (ret != SOFTBUS_OK) {
705 LNN_LOGE(LNN_STATE, "Server UnregDataLevelChangeCb failed, ret=%{public}d", ret);
706 }
707 return ret;
708 }
709
SetDataLevelInner(const DataLevel *dataLevel)710 int32_t SetDataLevelInner(const DataLevel *dataLevel)
711 {
712 int32_t ret = ServerIpcSetDataLevel(dataLevel);
713 if (ret != SOFTBUS_OK) {
714 LNN_LOGE(LNN_STATE, "Server SetDataLevel failed, ret=%{public}d", ret);
715 }
716 return ret;
717 }
718
JoinLNNInner(const char *pkgName, ConnectionAddr *target, OnJoinLNNResult cb)719 int32_t JoinLNNInner(const char *pkgName, ConnectionAddr *target, OnJoinLNNResult cb)
720 {
721 if (target == NULL) {
722 LNN_LOGE(LNN_STATE, "target is null");
723 return SOFTBUS_INVALID_PARAM;
724 }
725 int32_t rc;
726
727 if (!g_busCenterClient.isInit) {
728 LNN_LOGE(LNN_STATE, "buscenter client not init");
729 return SOFTBUS_NO_INIT;
730 }
731 if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
732 LNN_LOGE(LNN_STATE, "lock join lnn cb list in join");
733 return SOFTBUS_LOCK_ERR;
734 }
735
736 do {
737 if (FindJoinLNNCbItem(target, cb) != NULL) {
738 LNN_LOGE(LNN_STATE, "join request already exist");
739 rc = SOFTBUS_ALREADY_EXISTED;
740 break;
741 }
742 rc = ServerIpcJoinLNN(pkgName, target, sizeof(*target));
743 if (rc != SOFTBUS_OK) {
744 LNN_LOGE(LNN_STATE, "request join lnn failed, ret=%{public}d", rc);
745 } else {
746 rc = AddJoinLNNCbItem(target, cb);
747 }
748 } while (false);
749 if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
750 LNN_LOGE(LNN_STATE, "unlock join lnn cb list in join");
751 }
752 return rc;
753 }
754
LeaveLNNInner(const char *pkgName, const char *networkId, OnLeaveLNNResult cb)755 int32_t LeaveLNNInner(const char *pkgName, const char *networkId, OnLeaveLNNResult cb)
756 {
757 if (networkId == NULL) {
758 LNN_LOGE(LNN_STATE, "networkId is null");
759 return SOFTBUS_INVALID_PARAM;
760 }
761 int32_t rc;
762
763 if (!g_busCenterClient.isInit) {
764 LNN_LOGE(LNN_STATE, "buscenter client not init");
765 return SOFTBUS_NO_INIT;
766 }
767 if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
768 LNN_LOGE(LNN_STATE, "lock leave lnn cb list in leave");
769 return SOFTBUS_LOCK_ERR;
770 }
771 rc = SOFTBUS_ERR;
772 do {
773 if (FindLeaveLNNCbItem(networkId, cb) != NULL) {
774 LNN_LOGE(LNN_STATE, "leave request already exist");
775 break;
776 }
777 rc = ServerIpcLeaveLNN(pkgName, networkId);
778 if (rc != SOFTBUS_OK) {
779 LNN_LOGE(LNN_STATE, "request leave lnn failed, ret=%{public}d", rc);
780 } else {
781 rc = AddLeaveLNNCbItem(networkId, cb);
782 }
783 } while (false);
784 if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
785 LNN_LOGE(LNN_STATE, "unlock leave lnn cb list in leave");
786 }
787 return rc;
788 }
789
IsSameNodeStateCb(const INodeStateCb *callback1, const INodeStateCb *callback2)790 static bool IsSameNodeStateCb(const INodeStateCb *callback1, const INodeStateCb *callback2)
791 {
792 if (callback1->events != callback2->events) {
793 return false;
794 }
795 if ((callback1->events & EVENT_NODE_STATE_ONLINE) &&
796 callback1->onNodeOnline != callback2->onNodeOnline) {
797 return false;
798 }
799 if ((callback1->events & EVENT_NODE_STATE_OFFLINE) &&
800 callback1->onNodeOffline != callback2->onNodeOffline) {
801 return false;
802 }
803 if ((callback1->events & EVENT_NODE_STATE_INFO_CHANGED) &&
804 callback1->onNodeBasicInfoChanged != callback2->onNodeBasicInfoChanged) {
805 return false;
806 }
807 if ((callback1->events & EVENT_NODE_STATUS_CHANGED) &&
808 callback1->onNodeStatusChanged != callback2->onNodeStatusChanged) {
809 return false;
810 }
811 if ((callback1->events & EVENT_NODE_HICHAIN_PROOF_EXCEPTION) &&
812 callback1->onHichainProofException != callback2->onHichainProofException) {
813 return false;
814 }
815 return true;
816 }
817
RegNodeDeviceStateCbInner(const char *pkgName, INodeStateCb *callback)818 int32_t RegNodeDeviceStateCbInner(const char *pkgName, INodeStateCb *callback)
819 {
820 if (callback == NULL) {
821 LNN_LOGE(LNN_STATE, "callback is null");
822 return SOFTBUS_INVALID_PARAM;
823 }
824 NodeStateCallbackItem *item = NULL;
825 int32_t rc = SOFTBUS_ERR;
826
827 if (!IsValidString(pkgName, PKG_NAME_SIZE_MAX - 1)) {
828 LNN_LOGE(LNN_STATE, "Package name is empty or length exceeds");
829 return SOFTBUS_INVALID_PARAM;
830 }
831 if (!g_busCenterClient.isInit) {
832 LNN_LOGE(LNN_STATE, "buscenter client not init");
833 return SOFTBUS_NO_INIT;
834 }
835 if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
836 LNN_LOGE(LNN_STATE, "lock node state cb list in reg");
837 return SOFTBUS_LOCK_ERR;
838 }
839 LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.nodeStateCbList, NodeStateCallbackItem, node) {
840 if (IsSameNodeStateCb(&item->cb, callback)) {
841 (void)SoftBusMutexUnlock(&g_busCenterClient.lock);
842 LNN_LOGI(LNN_STATE, "warn: reg node state callback repeatedly");
843 return SOFTBUS_OK;
844 }
845 }
846 do {
847 if (g_busCenterClient.nodeStateCbListCnt >= g_maxNodeStateCbCount) {
848 break;
849 }
850 item = (NodeStateCallbackItem *)SoftBusCalloc(sizeof(*item));
851 if (item == NULL) {
852 rc = SOFTBUS_MALLOC_ERR;
853 break;
854 }
855 (void)strncpy_s(item->pkgName, PKG_NAME_SIZE_MAX, pkgName, PKG_NAME_SIZE_MAX - 1);
856 ListInit(&item->node);
857 item->cb = *callback;
858 ListAdd(&g_busCenterClient.nodeStateCbList, &item->node);
859 g_busCenterClient.nodeStateCbListCnt++;
860 rc = SOFTBUS_OK;
861 } while (false);
862 if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
863 LNN_LOGE(LNN_STATE, "unlock node state cb list");
864 }
865 return rc;
866 }
867
UnregNodeDeviceStateCbInner(INodeStateCb *callback)868 int32_t UnregNodeDeviceStateCbInner(INodeStateCb *callback)
869 {
870 if (callback == NULL) {
871 LNN_LOGE(LNN_STATE, "callback is null");
872 return SOFTBUS_INVALID_PARAM;
873 }
874 NodeStateCallbackItem *item = NULL;
875 NodeStateCallbackItem *next = NULL;
876
877 if (!g_busCenterClient.isInit) {
878 LNN_LOGE(LNN_STATE, "buscenter client not init");
879 return SOFTBUS_NO_INIT;
880 }
881 if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
882 LNN_LOGE(LNN_STATE, "lock node state cb list in unreg");
883 return SOFTBUS_LOCK_ERR;
884 }
885 LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_busCenterClient.nodeStateCbList, NodeStateCallbackItem, node) {
886 if (IsSameNodeStateCb(&item->cb, callback)) {
887 ListDelete(&item->node);
888 SoftBusFree(item);
889 g_busCenterClient.nodeStateCbListCnt--;
890 break;
891 }
892 }
893 if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
894 LNN_LOGE(LNN_STATE, "unlock node state cb list in unreg");
895 }
896 return SOFTBUS_OK;
897 }
898
StartTimeSyncInner(const char *pkgName, const char *targetNetworkId, TimeSyncAccuracy accuracy, TimeSyncPeriod period, ITimeSyncCb *cb)899 int32_t StartTimeSyncInner(const char *pkgName, const char *targetNetworkId, TimeSyncAccuracy accuracy,
900 TimeSyncPeriod period, ITimeSyncCb *cb)
901 {
902 int32_t rc = SOFTBUS_ERR;
903
904 if (!g_busCenterClient.isInit) {
905 LNN_LOGE(LNN_STATE, "buscenter client not init");
906 return SOFTBUS_NO_INIT;
907 }
908 if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
909 LNN_LOGE(LNN_STATE, "lock time sync cb list");
910 return SOFTBUS_LOCK_ERR;
911 }
912
913 do {
914 if (FindTimeSyncCbItem(targetNetworkId, cb) != NULL) {
915 LNN_LOGE(LNN_STATE, "repeat pkgName request, StopTimeSync first! pkgName=%{public}s", pkgName);
916 break;
917 }
918 rc = ServerIpcStartTimeSync(pkgName, targetNetworkId, accuracy, period);
919 if (rc != SOFTBUS_OK) {
920 LNN_LOGE(LNN_STATE, "start time sync failed, ret=%{public}d", rc);
921 } else {
922 rc = AddTimeSyncCbItem(targetNetworkId, cb);
923 }
924 } while (false);
925 if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
926 LNN_LOGE(LNN_STATE, "unlock time sync cb list");
927 }
928 return rc;
929 }
930
StopTimeSyncInner(const char *pkgName, const char *targetNetworkId)931 int32_t StopTimeSyncInner(const char *pkgName, const char *targetNetworkId)
932 {
933 int32_t rc = SOFTBUS_ERR;
934 TimeSyncCallbackItem *item = NULL;
935
936 if (!g_busCenterClient.isInit) {
937 LNN_LOGE(LNN_STATE, "buscenter client not init");
938 return SOFTBUS_NO_INIT;
939 }
940 if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
941 LNN_LOGE(LNN_STATE, "lock time sync cb list");
942 return SOFTBUS_LOCK_ERR;
943 }
944
945 while ((item = FindTimeSyncCbItem(targetNetworkId, NULL)) != NULL) {
946 rc = ServerIpcStopTimeSync(pkgName, targetNetworkId);
947 if (rc != SOFTBUS_OK) {
948 LNN_LOGE(LNN_STATE, "stop time sync failed, ret=%{public}d", rc);
949 } else {
950 ListDelete(&item->node);
951 SoftBusFree(item);
952 }
953 }
954 if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
955 LNN_LOGE(LNN_STATE, "unlock time sync cb list");
956 }
957 return rc;
958 }
959
PublishLNNInner(const char *pkgName, const PublishInfo *info, const IPublishCb *cb)960 int32_t PublishLNNInner(const char *pkgName, const PublishInfo *info, const IPublishCb *cb)
961 {
962 g_busCenterClient.publishCb = *cb;
963 int32_t ret = ServerIpcPublishLNN(pkgName, info);
964 if (ret != SOFTBUS_OK) {
965 LNN_LOGE(LNN_STATE, "Server PublishLNNInner failed, ret=%{public}d", ret);
966 return ret;
967 }
968 if (AddDiscPublishMsg(pkgName, info) != SOFTBUS_OK) {
969 LNN_LOGE(LNN_STATE, "add publish msg error");
970 }
971 return SOFTBUS_OK;
972 }
973
StopPublishLNNInner(const char *pkgName, int32_t publishId)974 int32_t StopPublishLNNInner(const char *pkgName, int32_t publishId)
975 {
976 int32_t ret = ServerIpcStopPublishLNN(pkgName, publishId);
977 if (ret != SOFTBUS_OK) {
978 LNN_LOGE(LNN_STATE, "Server StopPublishLNNInner failed, ret=%{public}d", ret);
979 return ret;
980 }
981 if (DeleteDiscPublishMsg(pkgName, publishId) != SOFTBUS_OK) {
982 LNN_LOGE(LNN_STATE, "del publish msg error");
983 }
984 return SOFTBUS_OK;
985 }
986
RefreshLNNInner(const char *pkgName, const SubscribeInfo *info, const IRefreshCallback *cb)987 int32_t RefreshLNNInner(const char *pkgName, const SubscribeInfo *info, const IRefreshCallback *cb)
988 {
989 g_busCenterClient.refreshCb = *cb;
990 int32_t ret = ServerIpcRefreshLNN(pkgName, info);
991 if (ret != SOFTBUS_OK) {
992 LNN_LOGE(LNN_STATE, "Server RefreshLNNInner failed, ret=%{public}d", ret);
993 return ret;
994 }
995 if (AddDiscSubscribeMsg(pkgName, info) != SOFTBUS_OK) {
996 LNN_LOGE(LNN_STATE, "add subscribe msg error");
997 }
998 return SOFTBUS_OK;
999 }
1000
StopRefreshLNNInner(const char *pkgName, int32_t refreshId)1001 int32_t StopRefreshLNNInner(const char *pkgName, int32_t refreshId)
1002 {
1003 int32_t ret = ServerIpcStopRefreshLNN(pkgName, refreshId);
1004 if (ret != SOFTBUS_OK) {
1005 LNN_LOGE(LNN_STATE, "Server StopRefreshLNNInner failed, ret=%{public}d", ret);
1006 return ret;
1007 }
1008 if (DeleteDiscSubscribeMsg(pkgName, refreshId) != SOFTBUS_OK) {
1009 LNN_LOGE(LNN_STATE, "del subscribe msg error");
1010 }
1011 return SOFTBUS_OK;
1012 }
1013
ActiveMetaNodeInner(const char *pkgName, const MetaNodeConfigInfo *info, char *metaNodeId)1014 int32_t ActiveMetaNodeInner(const char *pkgName, const MetaNodeConfigInfo *info, char *metaNodeId)
1015 {
1016 return ServerIpcActiveMetaNode(pkgName, info, metaNodeId);
1017 }
1018
DeactiveMetaNodeInner(const char *pkgName, const char *metaNodeId)1019 int32_t DeactiveMetaNodeInner(const char *pkgName, const char *metaNodeId)
1020 {
1021 return ServerIpcDeactiveMetaNode(pkgName, metaNodeId);
1022 }
1023
GetAllMetaNodeInfoInner(const char *pkgName, MetaNodeInfo *infos, int32_t *infoNum)1024 int32_t GetAllMetaNodeInfoInner(const char *pkgName, MetaNodeInfo *infos, int32_t *infoNum)
1025 {
1026 return ServerIpcGetAllMetaNodeInfo(pkgName, infos, infoNum);
1027 }
1028
ShiftLNNGearInner(const char *pkgName, const char *callerId, const char *targetNetworkId, const GearMode *mode)1029 int32_t ShiftLNNGearInner(const char *pkgName, const char *callerId, const char *targetNetworkId, const GearMode *mode)
1030 {
1031 return ServerIpcShiftLNNGear(pkgName, callerId, targetNetworkId, mode);
1032 }
1033
SyncTrustedRelationShipInner(const char *pkgName, const char *msg, uint32_t msgLen)1034 int32_t SyncTrustedRelationShipInner(const char *pkgName, const char *msg, uint32_t msgLen)
1035 {
1036 return ServerIpcSyncTrustedRelationShip(pkgName, msg, msgLen);
1037 }
1038
LnnOnJoinResult(void *addr, const char *networkId, int32_t retCode)1039 NO_SANITIZE("cfi") int32_t LnnOnJoinResult(void *addr, const char *networkId, int32_t retCode)
1040 {
1041 JoinLNNCbListItem *item = NULL;
1042 ConnectionAddr *connAddr = (ConnectionAddr *)addr;
1043
1044 if (connAddr == NULL) {
1045 return SOFTBUS_INVALID_PARAM;
1046 }
1047 if (!g_busCenterClient.isInit) {
1048 LNN_LOGE(LNN_STATE, "buscenter client not init");
1049 return SOFTBUS_ERR;
1050 }
1051
1052 if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1053 LNN_LOGE(LNN_STATE, "lock join lnn cb list in join result");
1054 return SOFTBUS_LOCK_ERR;
1055 }
1056 while ((item = FindJoinLNNCbItem((ConnectionAddr *)addr, NULL)) != NULL) {
1057 ListDelete(&item->node);
1058 if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1059 LNN_LOGE(LNN_STATE, "unlock join lnn cb list in join result");
1060 }
1061 if (item->cb != NULL) {
1062 item->cb(connAddr, networkId, retCode);
1063 }
1064 SoftBusFree(item);
1065 if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1066 LNN_LOGE(LNN_STATE, "lock join lnn cb list in join result");
1067 return SOFTBUS_LOCK_ERR;
1068 }
1069 }
1070 if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1071 LNN_LOGE(LNN_STATE, "unlock join lnn cb list in join result");
1072 }
1073 return SOFTBUS_OK;
1074 }
1075
LnnOnLeaveResult(const char *networkId, int32_t retCode)1076 int32_t LnnOnLeaveResult(const char *networkId, int32_t retCode)
1077 {
1078 LeaveLNNCbListItem *item = NULL;
1079
1080 if (networkId == NULL) {
1081 LNN_LOGE(LNN_STATE, "networkId is null");
1082 return SOFTBUS_INVALID_PARAM;
1083 }
1084 if (!g_busCenterClient.isInit) {
1085 LNN_LOGE(LNN_STATE, "buscenter client not init");
1086 return SOFTBUS_ERR;
1087 }
1088
1089 if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1090 LNN_LOGE(LNN_STATE, "lock leave lnn cb list fail");
1091 return SOFTBUS_LOCK_ERR;
1092 }
1093 while ((item = FindLeaveLNNCbItem(networkId, NULL)) != NULL) {
1094 ListDelete(&item->node);
1095 if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1096 LNN_LOGE(LNN_STATE, "unlock leave lnn cb list fail");
1097 }
1098 if (item->cb != NULL) {
1099 item->cb(networkId, retCode);
1100 }
1101 SoftBusFree(item);
1102 if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1103 LNN_LOGE(LNN_STATE, "lock leave lnn cb list fail");
1104 return SOFTBUS_LOCK_ERR;
1105 }
1106 }
1107 if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1108 LNN_LOGE(LNN_STATE, "unlock leave lnn cb list fail");
1109 }
1110 return SOFTBUS_OK;
1111 }
1112
LnnOnNodeOnlineStateChanged(const char *pkgName, bool isOnline, void *info)1113 int32_t LnnOnNodeOnlineStateChanged(const char *pkgName, bool isOnline, void *info)
1114 {
1115 NodeStateCallbackItem *item = NULL;
1116 NodeBasicInfo *basicInfo = (NodeBasicInfo *)info;
1117 ListNode dupList;
1118
1119 if (basicInfo == NULL || pkgName == NULL) {
1120 return SOFTBUS_INVALID_PARAM;
1121 }
1122 if (!g_busCenterClient.isInit) {
1123 LNN_LOGE(LNN_STATE, "buscenter client not init");
1124 return SOFTBUS_ERR;
1125 }
1126
1127 if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1128 LNN_LOGE(LNN_STATE, "lock node state cb list in notify");
1129 return SOFTBUS_LOCK_ERR;
1130 }
1131 ListInit(&dupList);
1132 DuplicateNodeStateCbList(&dupList);
1133 if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1134 LNN_LOGE(LNN_STATE, "unlock node state cb list in notify");
1135 }
1136 LIST_FOR_EACH_ENTRY(item, &dupList, NodeStateCallbackItem, node) {
1137 if (isOnline == true) {
1138 if (((strcmp(item->pkgName, pkgName) == 0) || (strlen(pkgName) == 0)) &&
1139 (item->cb.events & EVENT_NODE_STATE_ONLINE) != 0) {
1140 item->cb.onNodeOnline(basicInfo);
1141 }
1142 } else {
1143 if (((strcmp(item->pkgName, pkgName) == 0) || (strlen(pkgName) == 0)) &&
1144 (item->cb.events & EVENT_NODE_STATE_OFFLINE) != 0) {
1145 item->cb.onNodeOffline(basicInfo);
1146 }
1147 }
1148 }
1149 ClearNodeStateCbList(&dupList);
1150 return SOFTBUS_OK;
1151 }
1152
LnnOnNodeBasicInfoChanged(const char *pkgName, void *info, int32_t type)1153 int32_t LnnOnNodeBasicInfoChanged(const char *pkgName, void *info, int32_t type)
1154 {
1155 NodeStateCallbackItem *item = NULL;
1156 NodeBasicInfo *basicInfo = (NodeBasicInfo *)info;
1157 ListNode dupList;
1158
1159 if (basicInfo == NULL || pkgName == NULL) {
1160 LNN_LOGE(LNN_STATE, "info or pkgName is null");
1161 return SOFTBUS_INVALID_PARAM;
1162 }
1163 if (!g_busCenterClient.isInit) {
1164 LNN_LOGE(LNN_STATE, "buscenter client not init");
1165 return SOFTBUS_ERR;
1166 }
1167
1168 if ((type < 0) || (type > TYPE_NETWORK_INFO)) {
1169 LNN_LOGE(LNN_STATE, "OnNodeBasicInfoChanged invalid type. type=%{public}d", type);
1170 return SOFTBUS_INVALID_PARAM;
1171 }
1172
1173 if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1174 LNN_LOGE(LNN_STATE, "lock node basic info cb list in notify");
1175 return SOFTBUS_LOCK_ERR;
1176 }
1177 ListInit(&dupList);
1178 DuplicateNodeStateCbList(&dupList);
1179 if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1180 LNN_LOGE(LNN_STATE, "unlock node basic info cb list in notify");
1181 }
1182 LIST_FOR_EACH_ENTRY(item, &dupList, NodeStateCallbackItem, node) {
1183 if (((strcmp(item->pkgName, pkgName) == 0) || (strlen(pkgName) == 0)) &&
1184 (item->cb.events & EVENT_NODE_STATE_INFO_CHANGED) != 0) {
1185 item->cb.onNodeBasicInfoChanged((NodeBasicInfoType)type, basicInfo);
1186 }
1187 }
1188 ClearNodeStateCbList(&dupList);
1189 return SOFTBUS_OK;
1190 }
1191
LnnOnNodeStatusChanged(const char *pkgName, void *info, int32_t type)1192 int32_t LnnOnNodeStatusChanged(const char *pkgName, void *info, int32_t type)
1193 {
1194 if (pkgName == NULL || info == NULL) {
1195 LNN_LOGE(LNN_STATE, "pkgName or info is null");
1196 return SOFTBUS_INVALID_PARAM;
1197 }
1198 NodeStateCallbackItem *item = NULL;
1199 NodeStatus *nodeStatus = (NodeStatus *)info;
1200 ListNode dupList;
1201 if (!g_busCenterClient.isInit) {
1202 LNN_LOGE(LNN_STATE, "buscenter client not init");
1203 return SOFTBUS_NO_INIT;
1204 }
1205
1206 if ((type < 0) || (type > TYPE_STATUS_MAX)) {
1207 LNN_LOGE(LNN_STATE, "LnnOnNodeStatusChanged invalid type. type=%{public}d", type);
1208 return SOFTBUS_INVALID_PARAM;
1209 }
1210
1211 if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1212 LNN_LOGE(LNN_STATE, "lock node status cb list in notify");
1213 return SOFTBUS_LOCK_ERR;
1214 }
1215 ListInit(&dupList);
1216 DuplicateNodeStateCbList(&dupList);
1217 if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1218 LNN_LOGE(LNN_STATE, "unlock node status cb list in notify");
1219 }
1220 char *anonyPkgName = NULL;
1221 Anonymize(pkgName, &anonyPkgName);
1222 LNN_LOGI(LNN_STATE, "LnnOnNodeStatusChanged, pkgName=%{public}s, type=%{public}d, screen=%{public}d",
1223 AnonymizeWrapper(anonyPkgName), type, nodeStatus->reserved[0]);
1224 LIST_FOR_EACH_ENTRY(item, &dupList, NodeStateCallbackItem, node) {
1225 if (((strcmp(item->pkgName, pkgName) == 0) || (strlen(pkgName) == 0)) &&
1226 (item->cb.events & EVENT_NODE_STATUS_CHANGED) != 0 && item->cb.onNodeStatusChanged != NULL) {
1227 LNN_LOGI(LNN_STATE, "LnnOnNodeStatusChanged, pkgName=%{public}s, type=%{public}d, screen=%{public}d",
1228 AnonymizeWrapper(anonyPkgName), type, nodeStatus->reserved[0]);
1229 item->cb.onNodeStatusChanged((NodeStatusType)type, nodeStatus);
1230 }
1231 }
1232 AnonymizeFree(anonyPkgName);
1233 ClearNodeStateCbList(&dupList);
1234 return SOFTBUS_OK;
1235 }
1236
LnnOnLocalNetworkIdChanged(const char *pkgName)1237 int32_t LnnOnLocalNetworkIdChanged(const char *pkgName)
1238 {
1239 NodeStateCallbackItem *item = NULL;
1240 ListNode dupList;
1241
1242 if (pkgName == NULL) {
1243 LNN_LOGE(LNN_STATE, "info or pkgName is null");
1244 return SOFTBUS_INVALID_PARAM;
1245 }
1246 if (!g_busCenterClient.isInit) {
1247 LNN_LOGE(LNN_STATE, "buscenter client not init");
1248 return SOFTBUS_NO_INIT;
1249 }
1250
1251 if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1252 LNN_LOGE(LNN_STATE, "lock local networkId cb list in notify");
1253 return SOFTBUS_LOCK_ERR;
1254 }
1255 ListInit(&dupList);
1256 DuplicateNodeStateCbList(&dupList);
1257 if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1258 LNN_LOGE(LNN_STATE, "unlock local networkId cb list in notify");
1259 }
1260 LIST_FOR_EACH_ENTRY(item, &dupList, NodeStateCallbackItem, node) {
1261 if (((strcmp(item->pkgName, pkgName) == 0) || (strlen(pkgName) == 0)) &&
1262 (item->cb.onLocalNetworkIdChanged) != NULL) {
1263 item->cb.onLocalNetworkIdChanged();
1264 }
1265 }
1266 ClearNodeStateCbList(&dupList);
1267 return SOFTBUS_OK;
1268 }
1269
LnnOnNodeDeviceTrustedChange(const char *pkgName, int32_t type, const char *msg, uint32_t msgLen)1270 int32_t LnnOnNodeDeviceTrustedChange(const char *pkgName, int32_t type, const char *msg, uint32_t msgLen)
1271 {
1272 NodeStateCallbackItem *item = NULL;
1273 ListNode dupList;
1274
1275 if (pkgName == NULL) {
1276 LNN_LOGE(LNN_STATE, "pkgName is null");
1277 return SOFTBUS_INVALID_PARAM;
1278 }
1279 if (!g_busCenterClient.isInit) {
1280 LNN_LOGE(LNN_STATE, "buscenter client not init");
1281 return SOFTBUS_NO_INIT;
1282 }
1283
1284 if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1285 LNN_LOGE(LNN_STATE, "lock local cb list in notify");
1286 return SOFTBUS_LOCK_ERR;
1287 }
1288 ListInit(&dupList);
1289 DuplicateNodeStateCbList(&dupList);
1290 if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1291 LNN_LOGE(LNN_STATE, "unlock local cb list in notify");
1292 }
1293 LIST_FOR_EACH_ENTRY(item, &dupList, NodeStateCallbackItem, node) {
1294 if (((strcmp(item->pkgName, pkgName) == 0) || (strlen(pkgName) == 0)) &&
1295 (item->cb.onNodeDeviceTrustedChange) != NULL) {
1296 item->cb.onNodeDeviceTrustedChange((TrustChangeType)type, msg, msgLen);
1297 }
1298 }
1299 ClearNodeStateCbList(&dupList);
1300 return SOFTBUS_OK;
1301 }
1302
LnnOnHichainProofException( const char *pkgName, const char *deviceList, uint32_t deviceListLen, uint16_t deviceTypeId, int32_t errCode)1303 int32_t LnnOnHichainProofException(
1304 const char *pkgName, const char *deviceList, uint32_t deviceListLen, uint16_t deviceTypeId, int32_t errCode)
1305 {
1306 NodeStateCallbackItem *item = NULL;
1307 ListNode dupList;
1308
1309 if (pkgName == NULL) {
1310 LNN_LOGE(LNN_STATE, "pkgName is null");
1311 return SOFTBUS_INVALID_PARAM;
1312 }
1313 if (!g_busCenterClient.isInit) {
1314 LNN_LOGE(LNN_STATE, "buscenter client not init");
1315 return SOFTBUS_NO_INIT;
1316 }
1317 if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1318 LNN_LOGE(LNN_STATE, "lock auth restrict cb list in notify");
1319 return SOFTBUS_LOCK_ERR;
1320 }
1321 ListInit(&dupList);
1322 DuplicateNodeStateCbList(&dupList);
1323 if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1324 LNN_LOGE(LNN_STATE, "unlock auth restrict cb list in notify");
1325 }
1326 LIST_FOR_EACH_ENTRY(item, &dupList, NodeStateCallbackItem, node) {
1327 if (((strcmp(item->pkgName, pkgName) == 0) || (strlen(pkgName) == 0)) &&
1328 (item->cb.events & EVENT_NODE_HICHAIN_PROOF_EXCEPTION) != 0 && item->cb.onHichainProofException != NULL) {
1329 item->cb.onHichainProofException(deviceList, deviceListLen, deviceTypeId, errCode);
1330 char *anonyPkgName = NULL;
1331 char *anonyDeviceList = NULL;
1332 Anonymize(pkgName, &anonyPkgName);
1333 Anonymize(deviceList, &anonyDeviceList);
1334 LNN_LOGI(LNN_STATE,
1335 "onHichainProofException, pkgName=%{public}s, deviceList=%{public}s, errCode=%{public}d, "
1336 "type=%{public}hu",
1337 AnonymizeWrapper(anonyPkgName), AnonymizeWrapper(anonyDeviceList), errCode, deviceTypeId);
1338 AnonymizeFree(anonyPkgName);
1339 AnonymizeFree(anonyDeviceList);
1340 }
1341 }
1342 ClearNodeStateCbList(&dupList);
1343 return SOFTBUS_OK;
1344 }
1345
LnnOnTimeSyncResult(const void *info, int32_t retCode)1346 int32_t LnnOnTimeSyncResult(const void *info, int32_t retCode)
1347 {
1348 TimeSyncCallbackItem *item = NULL;
1349 TimeSyncResultInfo *basicInfo = (TimeSyncResultInfo *)info;
1350 ListNode dupList;
1351
1352 if (info == NULL) {
1353 LNN_LOGE(LNN_STATE, "info or list is null");
1354 return SOFTBUS_INVALID_PARAM;
1355 }
1356 if (!g_busCenterClient.isInit) {
1357 LNN_LOGE(LNN_STATE, "buscenter client not init");
1358 return SOFTBUS_ERR;
1359 }
1360
1361 if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1362 LNN_LOGE(LNN_STATE, "lock time sync cb list in time sync result");
1363 return SOFTBUS_LOCK_ERR;
1364 }
1365 ListInit(&dupList);
1366 DuplicateTimeSyncResultCbList(&dupList, basicInfo->target.targetNetworkId);
1367 if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1368 LNN_LOGE(LNN_STATE, "unlock time sync cb list in time sync result");
1369 }
1370 LIST_FOR_EACH_ENTRY(item, &dupList, TimeSyncCallbackItem, node) {
1371 if (item->cb.onTimeSyncResult != NULL) {
1372 item->cb.onTimeSyncResult((TimeSyncResultInfo *)info, retCode);
1373 }
1374 }
1375 ClearTimeSyncList(&dupList);
1376 return SOFTBUS_OK;
1377 }
1378
LnnOnPublishLNNResult(int32_t publishId, int32_t reason)1379 void LnnOnPublishLNNResult(int32_t publishId, int32_t reason)
1380 {
1381 if (g_busCenterClient.publishCb.OnPublishResult != NULL) {
1382 g_busCenterClient.publishCb.OnPublishResult(publishId, (PublishResult)reason);
1383 }
1384 }
1385
LnnOnRefreshLNNResult(int32_t refreshId, int32_t reason)1386 void LnnOnRefreshLNNResult(int32_t refreshId, int32_t reason)
1387 {
1388 if (g_busCenterClient.refreshCb.OnDiscoverResult != NULL) {
1389 g_busCenterClient.refreshCb.OnDiscoverResult(refreshId, (RefreshResult)reason);
1390 }
1391 }
1392
LnnOnRefreshDeviceFound(const void *device)1393 void LnnOnRefreshDeviceFound(const void *device)
1394 {
1395 if (g_busCenterClient.refreshCb.OnDeviceFound != NULL) {
1396 g_busCenterClient.refreshCb.OnDeviceFound((const DeviceInfo *)device);
1397 }
1398 }
1399
LnnOnDataLevelChanged(const char *networkId, const DataLevelInfo *dataLevelInfo)1400 void LnnOnDataLevelChanged(const char *networkId, const DataLevelInfo *dataLevelInfo)
1401 {
1402 if (g_busCenterClient.dataLevelCb.onDataLevelChanged == NULL) {
1403 LNN_LOGW(LNN_STATE, "data level callback is null");
1404 return;
1405 }
1406 DataLevel dataLevel = {
1407 .dynamicLevel = dataLevelInfo->dynamicLevel,
1408 .staticLevel = dataLevelInfo->staticLevel,
1409 .switchLevel = dataLevelInfo->switchLevel,
1410 .switchLength = dataLevelInfo->switchLength
1411 };
1412 g_busCenterClient.dataLevelCb.onDataLevelChanged(networkId, dataLevel);
1413 }
1414
DiscRecoveryPublishnull1415 int32_t DiscRecoveryPublish()
1416 {
1417 if (!g_isInited) {
1418 LNN_LOGI(LNN_STATE, "no need recovery publish");
1419 return SOFTBUS_OK;
1420 }
1421 LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexLock(&(g_publishMsgList->lock)) == SOFTBUS_OK,
1422 SOFTBUS_LOCK_ERR, LNN_STATE, "lock failed");
1423
1424 DiscPublishMsg *msgNode = NULL;
1425 int32_t ret = SOFTBUS_OK;
1426 LIST_FOR_EACH_ENTRY(msgNode, &(g_publishMsgList->list), DiscPublishMsg, node) {
1427 if (ServerIpcPublishLNN(msgNode->pkgName, msgNode->info) != SOFTBUS_OK) {
1428 LNN_LOGE(LNN_STATE, "recovery publish error, pkgName=%{public}s, capability=%{public}s",
1429 msgNode->pkgName, msgNode->info->capability);
1430 ret = SOFTBUS_ERR;
1431 } else {
1432 LNN_LOGI(LNN_STATE, "recovery publish success, pkgName=%{public}s, capability=%{public}s",
1433 msgNode->pkgName, msgNode->info->capability);
1434 }
1435 }
1436
1437 (void)SoftBusMutexUnlock(&(g_publishMsgList->lock));
1438 return ret;
1439 }
1440
DiscRecoverySubscribenull1441 int32_t DiscRecoverySubscribe()
1442 {
1443 if (!g_isInited) {
1444 LNN_LOGI(LNN_STATE, "no need recovery subscribe");
1445 return SOFTBUS_OK;
1446 }
1447 LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexLock(&(g_discoveryMsgList->lock)) == SOFTBUS_OK,
1448 SOFTBUS_LOCK_ERR, LNN_STATE, "lock failed");
1449
1450 DiscSubscribeMsg *msgNode = NULL;
1451 int32_t ret = SOFTBUS_OK;
1452 LIST_FOR_EACH_ENTRY(msgNode, &(g_discoveryMsgList->list), DiscSubscribeMsg, node) {
1453 if (ServerIpcRefreshLNN(msgNode->pkgName, msgNode->info) != SOFTBUS_OK) {
1454 LNN_LOGE(LNN_STATE, "recovery subscribe error, pkgName=%{public}s, capability=%{public}s",
1455 msgNode->pkgName, msgNode->info->capability);
1456 ret = SOFTBUS_ERR;
1457 } else {
1458 LNN_LOGI(LNN_STATE, "recovery subscribe success, pkgName=%{public}s, capability=%{public}s",
1459 msgNode->pkgName, msgNode->info->capability);
1460 }
1461 }
1462
1463 (void)SoftBusMutexUnlock(&(g_discoveryMsgList->lock));
1464 return ret;
1465 }
1466