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