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