• 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 "bus_center_server_proxy.h"
22 #include "common_list.h"
23 #include "lnn_log.h"
24 #include "softbus_adapter_mem.h"
25 #include "softbus_adapter_thread.h"
26 #include "softbus_def.h"
27 #include "softbus_errcode.h"
28 #include "softbus_feature_config.h"
29 #include "softbus_utils.h"
30 
31 #define DEFAULT_NODE_STATE_CB_CNT 10
32 #define MAX_IPC_LEN 1024
33 
34 static int32_t g_maxNodeStateCbCount;
35 static SoftBusList *g_publishMsgList = NULL;
36 static SoftBusList *g_discoveryMsgList = NULL;
37 static bool g_isInited = false;
38 static SoftBusMutex g_isInitedLock;
39 
40 typedef struct {
41     ListNode node;
42     ConnectionAddr addr;
43     OnJoinLNNResult cb;
44 } JoinLNNCbListItem;
45 
46 typedef struct {
47     ListNode node;
48     char networkId[NETWORK_ID_BUF_LEN];
49     OnLeaveLNNResult cb;
50 } LeaveLNNCbListItem;
51 
52 typedef struct {
53     ListNode node;
54     char networkId[NETWORK_ID_BUF_LEN];
55     ITimeSyncCb cb;
56 } TimeSyncCallbackItem;
57 
58 typedef struct {
59     ListNode node;
60     INodeStateCb cb;
61     char pkgName[PKG_NAME_SIZE_MAX];
62 } NodeStateCallbackItem;
63 
64 typedef struct {
65     ListNode joinLNNCbList;
66     ListNode leaveLNNCbList;
67     ListNode nodeStateCbList;
68     ListNode timeSyncCbList;
69     int32_t nodeStateCbListCnt;
70     IPublishCb publishCb;
71     IRefreshCallback refreshCb;
72     bool isInit;
73     SoftBusMutex lock;
74 } BusCenterClient;
75 
76 typedef struct {
77     char pkgName[PKG_NAME_SIZE_MAX];
78     PublishInfo *info;
79     ListNode node;
80 } DiscPublishMsg;
81 
82 typedef struct {
83     char pkgName[PKG_NAME_SIZE_MAX];
84     SubscribeInfo *info;
85     ListNode node;
86 } DiscSubscribeMsg;
87 
88 static BusCenterClient g_busCenterClient = {
89     .nodeStateCbListCnt = 0,
90     .publishCb.OnPublishResult = NULL,
91     .refreshCb.OnDeviceFound = NULL,
92     .refreshCb.OnDiscoverResult = NULL,
93     .isInit = false,
94 };
95 
IsUdidHashEmpty(const ConnectionAddr * addr)96 static bool IsUdidHashEmpty(const ConnectionAddr *addr)
97 {
98     for (uint32_t i = 0; i < UDID_HASH_LEN; i++) {
99         if (addr->info.ble.udidHash[i] != 0) {
100             return false;
101         }
102     }
103     return true;
104 }
105 
IsSameConnectionAddr(const ConnectionAddr * addr1,const ConnectionAddr * addr2)106 static bool IsSameConnectionAddr(const ConnectionAddr *addr1, const ConnectionAddr *addr2)
107 {
108     if (addr1->type != addr2->type) {
109         return false;
110     }
111     if (addr1->type == CONNECTION_ADDR_BR) {
112         return strncmp(addr1->info.br.brMac, addr2->info.br.brMac, BT_MAC_LEN) == 0;
113     }
114     if (addr1->type == CONNECTION_ADDR_BLE) {
115         if (IsUdidHashEmpty(addr2)) {
116             return strncmp(addr1->info.ble.bleMac, addr2->info.ble.bleMac, BT_MAC_LEN) == 0;
117         }
118         return memcmp(addr1->info.ble.udidHash, addr2->info.ble.udidHash, UDID_HASH_LEN) == 0 ||
119             strncmp(addr1->info.ble.bleMac, addr2->info.ble.bleMac, BT_MAC_LEN) == 0;
120     }
121     if (addr1->type == CONNECTION_ADDR_WLAN || addr1->type == CONNECTION_ADDR_ETH) {
122         return (strncmp(addr1->info.ip.ip, addr2->info.ip.ip, IP_STR_MAX_LEN) == 0)
123             && (addr1->info.ip.port == addr2->info.ip.port);
124     }
125     if (addr1->type == CONNECTION_ADDR_SESSION) {
126         return ((addr1->info.session.sessionId == addr2->info.session.sessionId) &&
127             (addr1->info.session.channelId == addr2->info.session.channelId) &&
128             (addr1->info.session.type == addr2->info.session.type));
129     }
130     return false;
131 }
132 
FindJoinLNNCbItem(ConnectionAddr * addr,OnJoinLNNResult cb)133 static JoinLNNCbListItem *FindJoinLNNCbItem(ConnectionAddr *addr, OnJoinLNNResult cb)
134 {
135     JoinLNNCbListItem *item = NULL;
136 
137     LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.joinLNNCbList, JoinLNNCbListItem, node) {
138         if (IsSameConnectionAddr(&item->addr, addr) &&
139             (cb == NULL || cb == item->cb)) {
140             return item;
141         }
142     }
143     return NULL;
144 }
145 
AddJoinLNNCbItem(ConnectionAddr * target,OnJoinLNNResult cb)146 static int32_t AddJoinLNNCbItem(ConnectionAddr *target, OnJoinLNNResult cb)
147 {
148     JoinLNNCbListItem *item = NULL;
149 
150     item = (JoinLNNCbListItem *)SoftBusMalloc(sizeof(*item));
151     if (item == NULL) {
152         LNN_LOGE(LNN_STATE, "malloc join LNN cb item fail");
153         return SOFTBUS_MALLOC_ERR;
154     }
155     ListInit(&item->node);
156     item->addr = *target;
157     item->cb = cb;
158     ListAdd(&g_busCenterClient.joinLNNCbList, &item->node);
159     return SOFTBUS_OK;
160 }
161 
FindLeaveLNNCbItem(const char * networkId,OnLeaveLNNResult cb)162 static LeaveLNNCbListItem *FindLeaveLNNCbItem(const char *networkId, OnLeaveLNNResult cb)
163 {
164     LeaveLNNCbListItem *item = NULL;
165 
166     LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.leaveLNNCbList, LeaveLNNCbListItem, node) {
167         if (strcmp(item->networkId, networkId) == 0 &&
168             (cb == NULL || cb == item->cb)) {
169             return item;
170         }
171     }
172     return NULL;
173 }
174 
AddLeaveLNNCbItem(const char * networkId,OnLeaveLNNResult cb)175 static int32_t AddLeaveLNNCbItem(const char *networkId, OnLeaveLNNResult cb)
176 {
177     LeaveLNNCbListItem *item = NULL;
178 
179     item = (LeaveLNNCbListItem *)SoftBusMalloc(sizeof(*item));
180     if (item == NULL) {
181         LNN_LOGE(LNN_STATE, "malloc join LNN cb item fail");
182         return SOFTBUS_MALLOC_ERR;
183     }
184     ListInit(&item->node);
185     if (strncpy_s(item->networkId, NETWORK_ID_BUF_LEN, networkId, strlen(networkId)) != EOK) {
186         LNN_LOGE(LNN_STATE, "strcpy network id fail");
187         SoftBusFree(item);
188         return SOFTBUS_ERR;
189     }
190     item->cb = cb;
191     ListAdd(&g_busCenterClient.leaveLNNCbList, &item->node);
192     return SOFTBUS_OK;
193 }
194 
FindTimeSyncCbItem(const char * networkId,ITimeSyncCb * cb)195 static TimeSyncCallbackItem *FindTimeSyncCbItem(const char *networkId, ITimeSyncCb *cb)
196 {
197     TimeSyncCallbackItem *item = NULL;
198 
199     LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.timeSyncCbList, TimeSyncCallbackItem, node) {
200         if (strcmp(item->networkId, networkId) == 0 &&
201             (cb == NULL || cb->onTimeSyncResult == item->cb.onTimeSyncResult)) {
202             return item;
203         }
204     }
205     return NULL;
206 }
207 
AddTimeSyncCbItem(const char * networkId,ITimeSyncCb * cb)208 static int32_t AddTimeSyncCbItem(const char *networkId, ITimeSyncCb *cb)
209 {
210     TimeSyncCallbackItem *item = NULL;
211 
212     item = (TimeSyncCallbackItem *)SoftBusMalloc(sizeof(*item));
213     if (item == NULL) {
214         LNN_LOGE(LNN_STATE, "malloc time sync cb item fail");
215         return SOFTBUS_MALLOC_ERR;
216     }
217     ListInit(&item->node);
218     if (strncpy_s(item->networkId, NETWORK_ID_BUF_LEN, networkId, strlen(networkId)) != EOK) {
219         LNN_LOGE(LNN_STATE, "strcpy network id fail");
220         SoftBusFree(item);
221         return SOFTBUS_ERR;
222     }
223     item->cb = *cb;
224     ListAdd(&g_busCenterClient.timeSyncCbList, &item->node);
225     return SOFTBUS_OK;
226 }
227 
ClearJoinLNNList(void)228 static void ClearJoinLNNList(void)
229 {
230     JoinLNNCbListItem *item = NULL;
231     JoinLNNCbListItem *next = NULL;
232 
233     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_busCenterClient.joinLNNCbList, JoinLNNCbListItem, node) {
234         ListDelete(&item->node);
235         SoftBusFree(item);
236     }
237 }
238 
ClearLeaveLNNList(void)239 static void ClearLeaveLNNList(void)
240 {
241     LeaveLNNCbListItem *item = NULL;
242     LeaveLNNCbListItem *next = NULL;
243 
244     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_busCenterClient.leaveLNNCbList, LeaveLNNCbListItem, node) {
245         ListDelete(&item->node);
246         SoftBusFree(item);
247     }
248 }
249 
ClearTimeSyncList(ListNode * list)250 static void ClearTimeSyncList(ListNode *list)
251 {
252     TimeSyncCallbackItem *item = NULL;
253     TimeSyncCallbackItem *next = NULL;
254 
255     LIST_FOR_EACH_ENTRY_SAFE(item, next, list, TimeSyncCallbackItem, node) {
256         ListDelete(&item->node);
257         SoftBusFree(item);
258     }
259 }
260 
ClearNodeStateCbList(ListNode * list)261 static void ClearNodeStateCbList(ListNode *list)
262 {
263     NodeStateCallbackItem *item = NULL;
264     NodeStateCallbackItem *next = NULL;
265 
266     LIST_FOR_EACH_ENTRY_SAFE(item, next, list, NodeStateCallbackItem, node) {
267         ListDelete(&item->node);
268         SoftBusFree(item);
269     }
270 }
271 
DuplicateNodeStateCbList(ListNode * list)272 static void DuplicateNodeStateCbList(ListNode *list)
273 {
274     NodeStateCallbackItem *item = NULL;
275     NodeStateCallbackItem *copyItem = NULL;
276 
277     LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.nodeStateCbList, NodeStateCallbackItem, node) {
278         copyItem = (NodeStateCallbackItem *)SoftBusCalloc(sizeof(NodeStateCallbackItem));
279         if (copyItem == NULL) {
280             LNN_LOGE(LNN_STATE, "malloc node state callback item fail");
281             continue;
282         }
283         if (strncpy_s(copyItem->pkgName, PKG_NAME_SIZE_MAX, item->pkgName, PKG_NAME_SIZE_MAX - 1) != EOK) {
284             LNN_LOGE(LNN_STATE, "copy pkgName fail");
285             SoftBusFree(copyItem);
286             continue;
287         }
288         ListInit(&copyItem->node);
289         copyItem->cb = item->cb;
290         ListAdd(list, &copyItem->node);
291     }
292 }
293 
DuplicateTimeSyncResultCbList(ListNode * list,const char * networkId)294 static void DuplicateTimeSyncResultCbList(ListNode *list, const char *networkId)
295 {
296     TimeSyncCallbackItem *item = NULL;
297     TimeSyncCallbackItem *copyItem = NULL;
298 
299     LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.timeSyncCbList, TimeSyncCallbackItem, node) {
300         if (strcmp(item->networkId, networkId) != 0) {
301             continue;
302         }
303         copyItem = (TimeSyncCallbackItem *)SoftBusMalloc(sizeof(TimeSyncCallbackItem));
304         if (copyItem == NULL) {
305             LNN_LOGE(LNN_STATE, "malloc time sync callback item fail");
306             continue;
307         }
308         copyItem->cb = item->cb;
309         ListInit(&copyItem->node);
310         if (strncpy_s(copyItem->networkId, NETWORK_ID_BUF_LEN, item->networkId, strlen(item->networkId)) != EOK) {
311             LNN_LOGE(LNN_STATE, "copy networkId fail");
312             SoftBusFree(copyItem);
313             continue;
314         }
315         ListAdd(list, &copyItem->node);
316     }
317 }
318 
FreeDiscPublishMsg(DiscPublishMsg ** msgNode)319 static void FreeDiscPublishMsg(DiscPublishMsg **msgNode)
320 {
321     if (*msgNode != NULL && (*msgNode)->info != NULL) {
322         SoftBusFree((char *)(*msgNode)->info->capability);
323         SoftBusFree((*msgNode)->info->capabilityData);
324         SoftBusFree((*msgNode)->info);
325     }
326     SoftBusFree(*msgNode);
327     *msgNode = NULL;
328 }
329 
FreeDiscSubscribeMsg(DiscSubscribeMsg ** msgNode)330 static void FreeDiscSubscribeMsg(DiscSubscribeMsg **msgNode)
331 {
332     if (*msgNode != NULL && (*msgNode)->info != NULL) {
333         SoftBusFree((char *)(*msgNode)->info->capability);
334         SoftBusFree((*msgNode)->info->capabilityData);
335         SoftBusFree((*msgNode)->info);
336     }
337     SoftBusFree(*msgNode);
338     *msgNode = NULL;
339 }
340 
BuildDiscPublishMsg(DiscPublishMsg ** msgNode,const PublishInfo * info,const char * pkgName)341 static int32_t BuildDiscPublishMsg(DiscPublishMsg **msgNode, const PublishInfo *info, const char *pkgName)
342 {
343     *msgNode = (DiscPublishMsg *)SoftBusCalloc(sizeof(DiscPublishMsg));
344     if (*msgNode == NULL) {
345         LNN_LOGE(LNN_STATE, "calloc msgNode failed");
346         return SOFTBUS_MALLOC_ERR;
347     }
348     (*msgNode)->info = (PublishInfo *)SoftBusCalloc(sizeof(PublishInfo));
349     if ((*msgNode)->info == NULL) {
350         FreeDiscPublishMsg(msgNode);
351         LNN_LOGE(LNN_STATE, "calloc info failed");
352         return SOFTBUS_MALLOC_ERR;
353     }
354     (*msgNode)->info->capability = (char *)SoftBusCalloc(strlen(info->capability) + 1);
355     if ((*msgNode)->info->capability == NULL) {
356         FreeDiscPublishMsg(msgNode);
357         LNN_LOGE(LNN_STATE, "calloc capability failed");
358         return SOFTBUS_MALLOC_ERR;
359     }
360     (*msgNode)->info->publishId = info->publishId;
361     (*msgNode)->info->mode = info->mode;
362     (*msgNode)->info->medium = info->medium;
363     (*msgNode)->info->freq = info->freq;
364     (*msgNode)->info->dataLen = info->dataLen;
365     (*msgNode)->info->ranging = info->ranging;
366     if (strcpy_s((char *)(*msgNode)->info->capability, strlen(info->capability) + 1, info->capability) != EOK ||
367         strcpy_s((*msgNode)->pkgName, PKG_NAME_SIZE_MAX, pkgName) != EOK) {
368         FreeDiscPublishMsg(msgNode);
369         LNN_LOGE(LNN_STATE, "copy capability or pkgName failed");
370         return SOFTBUS_ERR;
371     }
372     if (info->dataLen > 0) {
373         (*msgNode)->info->capabilityData = (unsigned char *)SoftBusCalloc(info->dataLen + 1);
374         if ((*msgNode)->info->capabilityData == NULL) {
375             FreeDiscPublishMsg(msgNode);
376             LNN_LOGE(LNN_STATE, "calloc failed");
377             return SOFTBUS_MALLOC_ERR;
378         }
379         if (memcpy_s((*msgNode)->info->capabilityData, info->dataLen + 1,
380             info->capabilityData, info->dataLen + 1) != EOK) {
381             FreeDiscPublishMsg(msgNode);
382             LNN_LOGE(LNN_STATE, "copy capabilityData failed");
383             return SOFTBUS_ERR;
384         }
385     }
386     return SOFTBUS_OK;
387 }
388 
BuildDiscSubscribeMsg(DiscSubscribeMsg ** msgNode,const SubscribeInfo * info,const char * pkgName)389 static int32_t BuildDiscSubscribeMsg(DiscSubscribeMsg **msgNode, const SubscribeInfo *info, const char *pkgName)
390 {
391     *msgNode = (DiscSubscribeMsg *)SoftBusCalloc(sizeof(DiscSubscribeMsg));
392     if (*msgNode == NULL) {
393         LNN_LOGE(LNN_STATE, "calloc msgNode failed");
394         return SOFTBUS_MALLOC_ERR;
395     }
396     (*msgNode)->info = (SubscribeInfo *)SoftBusCalloc(sizeof(SubscribeInfo));
397     if ((*msgNode)->info == NULL) {
398         FreeDiscSubscribeMsg(msgNode);
399         LNN_LOGE(LNN_STATE, "calloc info failed");
400         return SOFTBUS_MALLOC_ERR;
401     }
402     (*msgNode)->info->capability = (char *)SoftBusCalloc(strlen(info->capability) + 1);
403     if ((*msgNode)->info->capability == NULL) {
404         FreeDiscSubscribeMsg(msgNode);
405         LNN_LOGE(LNN_STATE, "calloc capability failed");
406         return SOFTBUS_MALLOC_ERR;
407     }
408     (*msgNode)->info->subscribeId = info->subscribeId;
409     (*msgNode)->info->mode = info->mode;
410     (*msgNode)->info->medium = info->medium;
411     (*msgNode)->info->freq = info->freq;
412     (*msgNode)->info->dataLen = info->dataLen;
413     if (strcpy_s((char *)(*msgNode)->info->capability, strlen(info->capability) + 1, info->capability) != EOK ||
414         strcpy_s((*msgNode)->pkgName, PKG_NAME_SIZE_MAX, pkgName) != EOK) {
415         FreeDiscSubscribeMsg(msgNode);
416         LNN_LOGE(LNN_STATE, "copy capability or pkgName failed");
417         return SOFTBUS_ERR;
418     }
419     if (info->dataLen > 0) {
420         (*msgNode)->info->capabilityData = (unsigned char *)SoftBusCalloc(info->dataLen + 1);
421         if ((*msgNode)->info->capabilityData == NULL) {
422             FreeDiscSubscribeMsg(msgNode);
423             LNN_LOGE(LNN_STATE, "calloc failed");
424             return SOFTBUS_MALLOC_ERR;
425         }
426         if (memcpy_s((*msgNode)->info->capabilityData, info->dataLen + 1,
427             info->capabilityData, info->dataLen + 1) != EOK) {
428             FreeDiscSubscribeMsg(msgNode);
429             LNN_LOGE(LNN_STATE, "copy capabilityData failed");
430             return SOFTBUS_ERR;
431         }
432     }
433     return SOFTBUS_OK;
434 }
435 
AddDiscPublishMsg(const char * pkgName,const PublishInfo * info)436 static int32_t AddDiscPublishMsg(const char *pkgName, const PublishInfo *info)
437 {
438     LNN_CHECK_AND_RETURN_RET_LOGW(g_isInited, SOFTBUS_NO_INIT, LNN_STATE, "disc publish list not init");
439     LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexLock(&(g_publishMsgList->lock)) == SOFTBUS_OK,
440         SOFTBUS_LOCK_ERR, LNN_STATE, "lock failed");
441 
442     DiscPublishMsg *msgNode = NULL;
443     LIST_FOR_EACH_ENTRY(msgNode, &(g_publishMsgList->list), DiscPublishMsg, node) {
444         if (msgNode->info->publishId == info->publishId
445             && strcmp(msgNode->info->capability, info->capability) == 0
446             && strcmp(msgNode->pkgName, pkgName) == 0) {
447             (void)SoftBusMutexUnlock(&(g_publishMsgList->lock));
448             return SOFTBUS_OK;
449         }
450     }
451 
452     if (BuildDiscPublishMsg(&msgNode, info, pkgName) != SOFTBUS_OK) {
453         (void)SoftBusMutexUnlock(&(g_publishMsgList->lock));
454         LNN_LOGE(LNN_STATE, "build DiscPublishMsg failed");
455         return SOFTBUS_ERR;
456     }
457     ListTailInsert(&(g_publishMsgList->list), &(msgNode->node));
458     (void)SoftBusMutexUnlock(&(g_publishMsgList->lock));
459     return SOFTBUS_OK;
460 }
461 
DeleteDiscPublishMsg(const char * pkgName,int32_t publishId)462 static int32_t DeleteDiscPublishMsg(const char *pkgName, int32_t publishId)
463 {
464     LNN_CHECK_AND_RETURN_RET_LOGW(g_isInited, SOFTBUS_NO_INIT, LNN_STATE, "disc publish list not init");
465     LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexLock(&(g_publishMsgList->lock)) == SOFTBUS_OK,
466         SOFTBUS_LOCK_ERR, LNN_STATE, "lock failed");
467 
468     DiscPublishMsg *msgNode = NULL;
469     DiscPublishMsg *next = NULL;
470     LIST_FOR_EACH_ENTRY_SAFE(msgNode, next, &(g_publishMsgList->list), DiscPublishMsg, node) {
471         if (msgNode->info->publishId == publishId && strcmp(msgNode->pkgName, pkgName) == 0) {
472             ListDelete(&(msgNode->node));
473             FreeDiscPublishMsg(&msgNode);
474             break;
475         }
476     }
477     (void)SoftBusMutexUnlock(&(g_publishMsgList->lock));
478     return SOFTBUS_OK;
479 }
480 
AddDiscSubscribeMsg(const char * pkgName,const SubscribeInfo * info)481 static int32_t AddDiscSubscribeMsg(const char *pkgName, const SubscribeInfo *info)
482 {
483     LNN_CHECK_AND_RETURN_RET_LOGW(g_isInited, SOFTBUS_NO_INIT, LNN_STATE, "disc subscribe list not init");
484     LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexLock(&(g_discoveryMsgList->lock)) == SOFTBUS_OK,
485         SOFTBUS_LOCK_ERR, LNN_STATE, "lock failed");
486 
487     DiscSubscribeMsg *msgNode = NULL;
488     LIST_FOR_EACH_ENTRY(msgNode, &(g_discoveryMsgList->list), DiscSubscribeMsg, node) {
489         if (msgNode->info->subscribeId == info->subscribeId
490             && strcmp(msgNode->info->capability, info->capability) == 0
491             && strcmp(msgNode->pkgName, pkgName) == 0) {
492             (void)SoftBusMutexUnlock(&(g_discoveryMsgList->lock));
493             return SOFTBUS_OK;
494         }
495     }
496 
497     if (BuildDiscSubscribeMsg(&msgNode, info, pkgName) != SOFTBUS_OK) {
498         (void)SoftBusMutexUnlock(&(g_discoveryMsgList->lock));
499         LNN_LOGE(LNN_STATE, "build DiscSubscribeMsg failed");
500         return SOFTBUS_ERR;
501     }
502     ListTailInsert(&(g_discoveryMsgList->list), &(msgNode->node));
503     (void)SoftBusMutexUnlock(&(g_discoveryMsgList->lock));
504     return SOFTBUS_OK;
505 }
506 
DeleteDiscSubscribeMsg(const char * pkgName,int32_t refreshId)507 static int32_t DeleteDiscSubscribeMsg(const char *pkgName, int32_t refreshId)
508 {
509     LNN_CHECK_AND_RETURN_RET_LOGW(g_isInited, SOFTBUS_NO_INIT, LNN_STATE, "disc subscribe list not init");
510     LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexLock(&(g_discoveryMsgList->lock)) == SOFTBUS_OK,
511         SOFTBUS_LOCK_ERR, LNN_STATE, "lock failed");
512 
513     DiscSubscribeMsg *msgNode = NULL;
514     DiscSubscribeMsg *next = NULL;
515     LIST_FOR_EACH_ENTRY_SAFE(msgNode, next, &(g_discoveryMsgList->list), DiscSubscribeMsg, node) {
516         if (msgNode->info->subscribeId == refreshId && strcmp(msgNode->pkgName, pkgName) == 0) {
517             ListDelete(&(msgNode->node));
518             FreeDiscSubscribeMsg(&msgNode);
519             break;
520         }
521     }
522     (void)SoftBusMutexUnlock(&(g_discoveryMsgList->lock));
523     return SOFTBUS_OK;
524 }
525 
DiscoveryMsgListInit()526 static int32_t DiscoveryMsgListInit()
527 {
528     if (g_isInited) {
529         LNN_LOGI(LNN_STATE, "disc msg list already init");
530         return SOFTBUS_OK;
531     }
532     LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexInit(&g_isInitedLock, NULL) == SOFTBUS_OK,
533         SOFTBUS_LOCK_ERR, LNN_STATE, "lock init failed");
534     LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexLock(&g_isInitedLock) == SOFTBUS_OK,
535         SOFTBUS_LOCK_ERR, LNN_STATE, "lock failed");
536 
537     g_publishMsgList = CreateSoftBusList();
538     g_discoveryMsgList = CreateSoftBusList();
539     if (g_publishMsgList == NULL || g_discoveryMsgList == NULL) {
540         LNN_LOGE(LNN_STATE, "init disc msg list failed");
541         DestroySoftBusList(g_publishMsgList);
542         DestroySoftBusList(g_discoveryMsgList);
543         (void)SoftBusMutexUnlock(&g_isInitedLock);
544         return SOFTBUS_ERR;
545     }
546     g_isInited = true;
547     (void)SoftBusMutexUnlock(&g_isInitedLock);
548     LNN_LOGI(LNN_STATE, "disc list init success");
549     return SOFTBUS_OK;
550 }
551 
DiscoveryMsgListDeInit()552 static int32_t DiscoveryMsgListDeInit()
553 {
554     if (!g_isInited) {
555         LNN_LOGI(LNN_STATE, "disc msg list no need deInit");
556         return SOFTBUS_OK;
557     }
558     LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexInit(&g_isInitedLock, NULL) == SOFTBUS_OK,
559         SOFTBUS_LOCK_ERR, LNN_STATE, "lock init failed");
560     LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexLock(&g_isInitedLock) == SOFTBUS_OK,
561         SOFTBUS_LOCK_ERR, LNN_STATE, "lock failed");
562 
563     DestroySoftBusList(g_publishMsgList);
564     DestroySoftBusList(g_discoveryMsgList);
565     g_publishMsgList = NULL;
566     g_discoveryMsgList = NULL;
567     g_isInited = false;
568 
569     (void)SoftBusMutexUnlock(&g_isInitedLock);
570     LNN_LOGI(LNN_STATE, "disc list deinit success");
571     return SOFTBUS_OK;
572 }
573 
BusCenterClientDeinit(void)574 void BusCenterClientDeinit(void)
575 {
576     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
577         LNN_LOGE(LNN_INIT, "lock in deinit");
578         return;
579     }
580     if (DiscoveryMsgListDeInit() != SOFTBUS_OK) {
581         LNN_LOGE(LNN_INIT, "DiscoveryMsgListDeInit fail");
582         return;
583     }
584     ClearJoinLNNList();
585     ClearLeaveLNNList();
586     ClearTimeSyncList(&g_busCenterClient.timeSyncCbList);
587     ClearNodeStateCbList(&g_busCenterClient.nodeStateCbList);
588     g_busCenterClient.nodeStateCbListCnt = 0;
589     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
590         LNN_LOGE(LNN_INIT, "unlock in deinit");
591     }
592     BusCenterServerProxyDeInit();
593 }
594 
BusCenterClientInit(void)595 int BusCenterClientInit(void)
596 {
597     if (SoftbusGetConfig(SOFTBUS_INT_MAX_NODE_STATE_CB_CNT,
598         (unsigned char *)&g_maxNodeStateCbCount, sizeof(g_maxNodeStateCbCount)) != SOFTBUS_OK) {
599         LNN_LOGE(LNN_INIT, "Cannot get NodeStateCbCount from config file");
600         g_maxNodeStateCbCount = DEFAULT_NODE_STATE_CB_CNT;
601     }
602     LNN_LOGI(LNN_INIT, "NodeStateCbCount=%{public}u", g_maxNodeStateCbCount);
603 
604     if (SoftBusMutexInit(&g_busCenterClient.lock, NULL) != SOFTBUS_OK) {
605         LNN_LOGE(LNN_INIT, "g_busCenterClient.lock init failed");
606         return SOFTBUS_ERR;
607     }
608     if (DiscoveryMsgListInit() != SOFTBUS_OK) {
609         LNN_LOGE(LNN_INIT, "DiscoveryMsgListInit fail");
610         return SOFTBUS_ERR;
611     }
612 
613     ListInit(&g_busCenterClient.joinLNNCbList);
614     ListInit(&g_busCenterClient.leaveLNNCbList);
615     ListInit(&g_busCenterClient.nodeStateCbList);
616     ListInit(&g_busCenterClient.timeSyncCbList);
617     g_busCenterClient.isInit = true;
618     if (BusCenterServerProxyInit() != SOFTBUS_OK) {
619         LNN_LOGE(LNN_INIT, "bus center server proxy init failed");
620         BusCenterClientDeinit();
621         return SOFTBUS_ERR;
622     }
623     LNN_LOGI(LNN_INIT, "BusCenterClientInit init OK");
624     return SOFTBUS_OK;
625 }
626 
GetAllNodeDeviceInfoInner(const char * pkgName,NodeBasicInfo ** info,int32_t * infoNum)627 int32_t GetAllNodeDeviceInfoInner(const char *pkgName, NodeBasicInfo **info, int32_t *infoNum)
628 {
629     int ret = ServerIpcGetAllOnlineNodeInfo(pkgName, (void **)info, sizeof(NodeBasicInfo), infoNum);
630     if (ret != SOFTBUS_OK) {
631         LNN_LOGE(LNN_STATE, "Server GetAllOnlineNodeInfo failed, ret=%{public}d", ret);
632     }
633     return ret;
634 }
635 
GetLocalNodeDeviceInfoInner(const char * pkgName,NodeBasicInfo * info)636 int32_t GetLocalNodeDeviceInfoInner(const char *pkgName, NodeBasicInfo *info)
637 {
638     int ret = ServerIpcGetLocalDeviceInfo(pkgName, info, sizeof(*info));
639     if (ret != SOFTBUS_OK) {
640         LNN_LOGE(LNN_STATE, "Server GetLocalNodeDeviceInfo failed, ret=%{public}d", ret);
641     }
642     return ret;
643 }
644 
GetNodeKeyInfoInner(const char * pkgName,const char * networkId,NodeDeviceInfoKey key,uint8_t * info,int32_t infoLen)645 int32_t GetNodeKeyInfoInner(const char *pkgName, const char *networkId, NodeDeviceInfoKey key,
646     uint8_t *info, int32_t infoLen)
647 {
648     int ret = ServerIpcGetNodeKeyInfo(pkgName, networkId, key, info, infoLen);
649     if (ret != SOFTBUS_OK) {
650         LNN_LOGE(LNN_STATE, "Server GetNodeKeyInfo failed, ret=%{public}d", ret);
651     }
652     return ret;
653 }
654 
SetNodeDataChangeFlagInner(const char * pkgName,const char * networkId,uint16_t dataChangeFlag)655 int32_t SetNodeDataChangeFlagInner(const char *pkgName, const char *networkId, uint16_t dataChangeFlag)
656 {
657     int ret = ServerIpcSetNodeDataChangeFlag(pkgName, networkId, dataChangeFlag);
658     if (ret != SOFTBUS_OK) {
659         LNN_LOGE(LNN_STATE, "Server SetNodeDataChangeFlag failed, ret=%{public}d", ret);
660     }
661     return ret;
662 }
663 
JoinLNNInner(const char * pkgName,ConnectionAddr * target,OnJoinLNNResult cb)664 int32_t JoinLNNInner(const char *pkgName, ConnectionAddr *target, OnJoinLNNResult cb)
665 {
666     if (target == NULL) {
667         LNN_LOGE(LNN_STATE, "target is null");
668         return SOFTBUS_INVALID_PARAM;
669     }
670     int32_t rc;
671 
672     if (!g_busCenterClient.isInit) {
673         LNN_LOGE(LNN_STATE, "buscenter client not init");
674         return SOFTBUS_NO_INIT;
675     }
676     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
677         LNN_LOGE(LNN_STATE, "lock join lnn cb list in join");
678         return SOFTBUS_LOCK_ERR;
679     }
680 
681     do {
682         if (FindJoinLNNCbItem(target, cb) != NULL) {
683             LNN_LOGE(LNN_STATE, "join request already exist");
684             rc = SOFTBUS_ALREADY_EXISTED;
685             break;
686         }
687         rc = ServerIpcJoinLNN(pkgName, target, sizeof(*target));
688         if (rc != SOFTBUS_OK) {
689             LNN_LOGE(LNN_STATE, "request join lnn failed, ret=%{public}d", rc);
690         } else {
691             rc = AddJoinLNNCbItem(target, cb);
692         }
693     } while (false);
694     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
695         LNN_LOGE(LNN_STATE, "unlock join lnn cb list in join");
696     }
697     return rc;
698 }
699 
LeaveLNNInner(const char * pkgName,const char * networkId,OnLeaveLNNResult cb)700 int32_t LeaveLNNInner(const char *pkgName, const char *networkId, OnLeaveLNNResult cb)
701 {
702     if (networkId == NULL) {
703         LNN_LOGE(LNN_STATE, "networkId is null");
704         return SOFTBUS_INVALID_PARAM;
705     }
706     int32_t rc;
707 
708     if (!g_busCenterClient.isInit) {
709         LNN_LOGE(LNN_STATE, "buscenter client not init");
710         return SOFTBUS_NO_INIT;
711     }
712     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
713         LNN_LOGE(LNN_STATE, "lock leave lnn cb list in leave");
714         return SOFTBUS_LOCK_ERR;
715     }
716     rc = SOFTBUS_ERR;
717     do {
718         if (FindLeaveLNNCbItem(networkId, cb) != NULL) {
719             LNN_LOGE(LNN_STATE, "leave request already exist");
720             break;
721         }
722         rc = ServerIpcLeaveLNN(pkgName, networkId);
723         if (rc != SOFTBUS_OK) {
724             LNN_LOGE(LNN_STATE, "request leave lnn failed, ret=%{public}d", rc);
725         } else {
726             rc = AddLeaveLNNCbItem(networkId, cb);
727         }
728     } while (false);
729     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
730         LNN_LOGE(LNN_STATE, "unlock leave lnn cb list in leave");
731     }
732     return rc;
733 }
734 
IsSameNodeStateCb(const INodeStateCb * callback1,const INodeStateCb * callback2)735 static bool IsSameNodeStateCb(const INodeStateCb *callback1, const INodeStateCb *callback2)
736 {
737     if (callback1->events != callback2->events) {
738         return false;
739     }
740     if ((callback1->events & EVENT_NODE_STATE_ONLINE) &&
741         callback1->onNodeOnline != callback2->onNodeOnline) {
742         return false;
743     }
744     if ((callback1->events & EVENT_NODE_STATE_OFFLINE) &&
745         callback1->onNodeOffline != callback2->onNodeOffline) {
746         return false;
747     }
748     if ((callback1->events & EVENT_NODE_STATE_INFO_CHANGED) &&
749         callback1->onNodeBasicInfoChanged != callback2->onNodeBasicInfoChanged) {
750         return false;
751     }
752     if ((callback1->events & EVENT_NODE_STATUS_CHANGED) &&
753         callback1->onNodeStatusChanged != callback2->onNodeStatusChanged) {
754         return false;
755     }
756     return true;
757 }
758 
RegNodeDeviceStateCbInner(const char * pkgName,INodeStateCb * callback)759 int32_t RegNodeDeviceStateCbInner(const char *pkgName, INodeStateCb *callback)
760 {
761     if (callback == NULL) {
762         LNN_LOGE(LNN_STATE, "callback is null");
763         return SOFTBUS_INVALID_PARAM;
764     }
765     NodeStateCallbackItem *item = NULL;
766     int32_t rc = SOFTBUS_ERR;
767 
768     if (!IsValidString(pkgName, PKG_NAME_SIZE_MAX - 1)) {
769         LNN_LOGE(LNN_STATE, "Package name is empty or length exceeds");
770         return SOFTBUS_INVALID_PARAM;
771     }
772     if (!g_busCenterClient.isInit) {
773         LNN_LOGE(LNN_STATE, "buscenter client not init");
774         return SOFTBUS_NO_INIT;
775     }
776     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
777         LNN_LOGE(LNN_STATE, "lock node state cb list in reg");
778         return SOFTBUS_LOCK_ERR;
779     }
780     LIST_FOR_EACH_ENTRY(item, &g_busCenterClient.nodeStateCbList, NodeStateCallbackItem, node) {
781         if (IsSameNodeStateCb(&item->cb, callback)) {
782             (void)SoftBusMutexUnlock(&g_busCenterClient.lock);
783             LNN_LOGI(LNN_STATE, "warn: reg node state callback repeatedly");
784             return SOFTBUS_OK;
785         }
786     }
787     do {
788         if (g_busCenterClient.nodeStateCbListCnt >= g_maxNodeStateCbCount) {
789             break;
790         }
791         item = (NodeStateCallbackItem *)SoftBusCalloc(sizeof(*item));
792         if (item == NULL) {
793             rc = SOFTBUS_MALLOC_ERR;
794             break;
795         }
796         (void)strncpy_s(item->pkgName, PKG_NAME_SIZE_MAX, pkgName, PKG_NAME_SIZE_MAX - 1);
797         ListInit(&item->node);
798         item->cb = *callback;
799         ListAdd(&g_busCenterClient.nodeStateCbList, &item->node);
800         g_busCenterClient.nodeStateCbListCnt++;
801         rc = SOFTBUS_OK;
802     } while (false);
803     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
804         LNN_LOGE(LNN_STATE, "unlock node state cb list");
805     }
806     return rc;
807 }
808 
UnregNodeDeviceStateCbInner(INodeStateCb * callback)809 int32_t UnregNodeDeviceStateCbInner(INodeStateCb *callback)
810 {
811     if (callback == NULL) {
812         LNN_LOGE(LNN_STATE, "callback is null");
813         return SOFTBUS_INVALID_PARAM;
814     }
815     NodeStateCallbackItem *item = NULL;
816     NodeStateCallbackItem *next = NULL;
817 
818     if (!g_busCenterClient.isInit) {
819         LNN_LOGE(LNN_STATE, "buscenter client not init");
820         return SOFTBUS_NO_INIT;
821     }
822     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
823         LNN_LOGE(LNN_STATE, "lock node state cb list in unreg");
824         return SOFTBUS_LOCK_ERR;
825     }
826     LIST_FOR_EACH_ENTRY_SAFE(item, next, &g_busCenterClient.nodeStateCbList, NodeStateCallbackItem, node) {
827         if (IsSameNodeStateCb(&item->cb, callback)) {
828             ListDelete(&item->node);
829             SoftBusFree(item);
830             g_busCenterClient.nodeStateCbListCnt--;
831             break;
832         }
833     }
834     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
835         LNN_LOGE(LNN_STATE, "unlock node state cb list in unreg");
836     }
837     return SOFTBUS_OK;
838 }
839 
StartTimeSyncInner(const char * pkgName,const char * targetNetworkId,TimeSyncAccuracy accuracy,TimeSyncPeriod period,ITimeSyncCb * cb)840 int32_t StartTimeSyncInner(const char *pkgName, const char *targetNetworkId, TimeSyncAccuracy accuracy,
841     TimeSyncPeriod period, ITimeSyncCb *cb)
842 {
843     int32_t rc = SOFTBUS_ERR;
844 
845     if (!g_busCenterClient.isInit) {
846         LNN_LOGE(LNN_STATE, "buscenter client not init");
847         return SOFTBUS_NO_INIT;
848     }
849     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
850         LNN_LOGE(LNN_STATE, "lock time sync cb list");
851         return SOFTBUS_LOCK_ERR;
852     }
853 
854     do {
855         if (FindTimeSyncCbItem(targetNetworkId, cb) != NULL) {
856             LNN_LOGE(LNN_STATE, "repeat pkgName request, StopTimeSync first! pkgName=%{public}s", pkgName);
857             break;
858         }
859         rc = ServerIpcStartTimeSync(pkgName, targetNetworkId, accuracy, period);
860         if (rc != SOFTBUS_OK) {
861             LNN_LOGE(LNN_STATE, "start time sync failed, ret=%{public}d", rc);
862         } else {
863             rc = AddTimeSyncCbItem(targetNetworkId, cb);
864         }
865     } while (false);
866     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
867         LNN_LOGE(LNN_STATE, "unlock time sync cb list");
868     }
869     return rc;
870 }
871 
StopTimeSyncInner(const char * pkgName,const char * targetNetworkId)872 int32_t StopTimeSyncInner(const char *pkgName, const char *targetNetworkId)
873 {
874     int32_t rc = SOFTBUS_ERR;
875     TimeSyncCallbackItem *item = NULL;
876 
877     if (!g_busCenterClient.isInit) {
878         LNN_LOGE(LNN_STATE, "buscenter client not init");
879         return SOFTBUS_NO_INIT;
880     }
881     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
882         LNN_LOGE(LNN_STATE, "lock time sync cb list");
883         return SOFTBUS_LOCK_ERR;
884     }
885 
886     while ((item = FindTimeSyncCbItem(targetNetworkId, NULL)) != NULL) {
887         rc = ServerIpcStopTimeSync(pkgName, targetNetworkId);
888         if (rc != SOFTBUS_OK) {
889             LNN_LOGE(LNN_STATE, "stop time sync failed, ret=%{public}d", rc);
890         } else {
891             ListDelete(&item->node);
892             SoftBusFree(item);
893         }
894     }
895     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
896         LNN_LOGE(LNN_STATE, "unlock time sync cb list");
897     }
898     return rc;
899 }
900 
PublishLNNInner(const char * pkgName,const PublishInfo * info,const IPublishCb * cb)901 int32_t PublishLNNInner(const char *pkgName, const PublishInfo *info, const IPublishCb *cb)
902 {
903     g_busCenterClient.publishCb = *cb;
904     int32_t ret = ServerIpcPublishLNN(pkgName, info);
905     if (ret != SOFTBUS_OK) {
906         LNN_LOGE(LNN_STATE, "Server PublishLNNInner failed, ret=%{public}d", ret);
907         return ret;
908     }
909     if (AddDiscPublishMsg(pkgName, info) != SOFTBUS_OK) {
910         LNN_LOGE(LNN_STATE, "add publish msg error");
911     }
912     return SOFTBUS_OK;
913 }
914 
StopPublishLNNInner(const char * pkgName,int32_t publishId)915 int32_t StopPublishLNNInner(const char *pkgName, int32_t publishId)
916 {
917     int32_t ret = ServerIpcStopPublishLNN(pkgName, publishId);
918     if (ret != SOFTBUS_OK) {
919         LNN_LOGE(LNN_STATE, "Server StopPublishLNNInner failed, ret=%{public}d", ret);
920         return ret;
921     }
922     if (DeleteDiscPublishMsg(pkgName, publishId) != SOFTBUS_OK) {
923         LNN_LOGE(LNN_STATE, "del publish msg error");
924     }
925     return SOFTBUS_OK;
926 }
927 
RefreshLNNInner(const char * pkgName,const SubscribeInfo * info,const IRefreshCallback * cb)928 int32_t RefreshLNNInner(const char *pkgName, const SubscribeInfo *info, const IRefreshCallback *cb)
929 {
930     g_busCenterClient.refreshCb = *cb;
931     int32_t ret = ServerIpcRefreshLNN(pkgName, info);
932     if (ret != SOFTBUS_OK) {
933         LNN_LOGE(LNN_STATE, "Server RefreshLNNInner failed, ret=%{public}d", ret);
934         return ret;
935     }
936     if (AddDiscSubscribeMsg(pkgName, info) != SOFTBUS_OK) {
937         LNN_LOGE(LNN_STATE, "add subscribe msg error");
938     }
939     return SOFTBUS_OK;
940 }
941 
StopRefreshLNNInner(const char * pkgName,int32_t refreshId)942 int32_t StopRefreshLNNInner(const char *pkgName, int32_t refreshId)
943 {
944     int32_t ret = ServerIpcStopRefreshLNN(pkgName, refreshId);
945     if (ret != SOFTBUS_OK) {
946         LNN_LOGE(LNN_STATE, "Server StopRefreshLNNInner failed, ret=%{public}d", ret);
947         return ret;
948     }
949     if (DeleteDiscSubscribeMsg(pkgName, refreshId) != SOFTBUS_OK) {
950         LNN_LOGE(LNN_STATE, "del subscribe msg error");
951     }
952     return SOFTBUS_OK;
953 }
954 
ActiveMetaNodeInner(const char * pkgName,const MetaNodeConfigInfo * info,char * metaNodeId)955 int32_t ActiveMetaNodeInner(const char *pkgName, const MetaNodeConfigInfo *info, char *metaNodeId)
956 {
957     return ServerIpcActiveMetaNode(pkgName, info, metaNodeId);
958 }
959 
DeactiveMetaNodeInner(const char * pkgName,const char * metaNodeId)960 int32_t DeactiveMetaNodeInner(const char *pkgName, const char *metaNodeId)
961 {
962     return ServerIpcDeactiveMetaNode(pkgName, metaNodeId);
963 }
964 
GetAllMetaNodeInfoInner(const char * pkgName,MetaNodeInfo * infos,int32_t * infoNum)965 int32_t GetAllMetaNodeInfoInner(const char *pkgName, MetaNodeInfo *infos, int32_t *infoNum)
966 {
967     return ServerIpcGetAllMetaNodeInfo(pkgName, infos, infoNum);
968 }
969 
ShiftLNNGearInner(const char * pkgName,const char * callerId,const char * targetNetworkId,const GearMode * mode)970 int32_t ShiftLNNGearInner(const char *pkgName, const char *callerId, const char *targetNetworkId, const GearMode *mode)
971 {
972     return ServerIpcShiftLNNGear(pkgName, callerId, targetNetworkId, mode);
973 }
974 
LnnOnJoinResult(void * addr,const char * networkId,int32_t retCode)975 int32_t LnnOnJoinResult(void *addr, const char *networkId, int32_t retCode)
976 {
977     JoinLNNCbListItem *item = NULL;
978     ConnectionAddr *connAddr = (ConnectionAddr *)addr;
979 
980     if (connAddr == NULL) {
981         return SOFTBUS_INVALID_PARAM;
982     }
983     if (!g_busCenterClient.isInit) {
984         LNN_LOGE(LNN_STATE, "buscenter client not init");
985         return SOFTBUS_ERR;
986     }
987 
988     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
989         LNN_LOGE(LNN_STATE, "lock join lnn cb list in join result");
990         return SOFTBUS_LOCK_ERR;
991     }
992     while ((item = FindJoinLNNCbItem((ConnectionAddr *)addr, NULL)) != NULL) {
993         ListDelete(&item->node);
994         if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
995             LNN_LOGE(LNN_STATE, "unlock join lnn cb list in join result");
996         }
997         if (item->cb != NULL) {
998             item->cb(connAddr, networkId, retCode);
999         }
1000         SoftBusFree(item);
1001         if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1002             LNN_LOGE(LNN_STATE, "lock join lnn cb list in join result");
1003             return SOFTBUS_LOCK_ERR;
1004         }
1005     }
1006     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1007         LNN_LOGE(LNN_STATE, "unlock join lnn cb list in join result");
1008     }
1009     return SOFTBUS_OK;
1010 }
1011 
LnnOnLeaveResult(const char * networkId,int32_t retCode)1012 int32_t LnnOnLeaveResult(const char *networkId, int32_t retCode)
1013 {
1014     LeaveLNNCbListItem *item = NULL;
1015 
1016     if (networkId == NULL) {
1017         LNN_LOGE(LNN_STATE, "networkId is null");
1018         return SOFTBUS_INVALID_PARAM;
1019     }
1020     if (!g_busCenterClient.isInit) {
1021         LNN_LOGE(LNN_STATE, "buscenter client not init");
1022         return SOFTBUS_ERR;
1023     }
1024 
1025     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1026         LNN_LOGE(LNN_STATE, "lock leave lnn cb list fail");
1027         return SOFTBUS_LOCK_ERR;
1028     }
1029     while ((item = FindLeaveLNNCbItem(networkId, NULL)) != NULL) {
1030         ListDelete(&item->node);
1031         if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1032             LNN_LOGE(LNN_STATE, "unlock leave lnn cb list fail");
1033         }
1034         if (item->cb != NULL) {
1035             item->cb(networkId, retCode);
1036         }
1037         SoftBusFree(item);
1038         if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1039             LNN_LOGE(LNN_STATE, "lock leave lnn cb list fail");
1040             return SOFTBUS_LOCK_ERR;
1041         }
1042     }
1043     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1044         LNN_LOGE(LNN_STATE, "unlock leave lnn cb list fail");
1045     }
1046     return SOFTBUS_OK;
1047 }
1048 
LnnOnNodeOnlineStateChanged(const char * pkgName,bool isOnline,void * info)1049 int32_t LnnOnNodeOnlineStateChanged(const char *pkgName, bool isOnline, void *info)
1050 {
1051     NodeStateCallbackItem *item = NULL;
1052     NodeBasicInfo *basicInfo = (NodeBasicInfo *)info;
1053     ListNode dupList;
1054 
1055     if (basicInfo == NULL || pkgName == NULL) {
1056         return SOFTBUS_INVALID_PARAM;
1057     }
1058     if (!g_busCenterClient.isInit) {
1059         LNN_LOGE(LNN_STATE, "buscenter client not init");
1060         return SOFTBUS_ERR;
1061     }
1062 
1063     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1064         LNN_LOGE(LNN_STATE, "lock node state cb list in notify");
1065         return SOFTBUS_LOCK_ERR;
1066     }
1067     ListInit(&dupList);
1068     DuplicateNodeStateCbList(&dupList);
1069     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1070         LNN_LOGE(LNN_STATE, "unlock node state cb list in notify");
1071     }
1072     LIST_FOR_EACH_ENTRY(item, &dupList, NodeStateCallbackItem, node) {
1073         if (isOnline == true) {
1074             if (((strcmp(item->pkgName, pkgName) == 0) || (strlen(pkgName) == 0)) &&
1075                 (item->cb.events & EVENT_NODE_STATE_ONLINE) != 0) {
1076                 item->cb.onNodeOnline(basicInfo);
1077             }
1078         } else {
1079             if (((strcmp(item->pkgName, pkgName) == 0) || (strlen(pkgName) == 0)) &&
1080                 (item->cb.events & EVENT_NODE_STATE_OFFLINE) != 0) {
1081                 item->cb.onNodeOffline(basicInfo);
1082             }
1083         }
1084     }
1085     ClearNodeStateCbList(&dupList);
1086     return SOFTBUS_OK;
1087 }
1088 
LnnOnNodeBasicInfoChanged(const char * pkgName,void * info,int32_t type)1089 int32_t LnnOnNodeBasicInfoChanged(const char *pkgName, void *info, int32_t type)
1090 {
1091     NodeStateCallbackItem *item = NULL;
1092     NodeBasicInfo *basicInfo = (NodeBasicInfo *)info;
1093     ListNode dupList;
1094 
1095     if (basicInfo == NULL || pkgName == NULL) {
1096         LNN_LOGE(LNN_STATE, "info or pkgName is null");
1097         return SOFTBUS_INVALID_PARAM;
1098     }
1099     if (!g_busCenterClient.isInit) {
1100         LNN_LOGE(LNN_STATE, "buscenter client not init");
1101         return SOFTBUS_ERR;
1102     }
1103 
1104     if ((type < 0) || (type > TYPE_NETWORK_INFO)) {
1105         LNN_LOGE(LNN_STATE, "OnNodeBasicInfoChanged invalid type. type=%{public}d", type);
1106         return SOFTBUS_INVALID_PARAM;
1107     }
1108 
1109     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1110         LNN_LOGE(LNN_STATE, "lock node basic info cb list in notify");
1111         return SOFTBUS_LOCK_ERR;
1112     }
1113     ListInit(&dupList);
1114     DuplicateNodeStateCbList(&dupList);
1115     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1116         LNN_LOGE(LNN_STATE, "unlock node basic info cb list in notify");
1117     }
1118     LIST_FOR_EACH_ENTRY(item, &dupList, NodeStateCallbackItem, node) {
1119         if (((strcmp(item->pkgName, pkgName) == 0) || (strlen(pkgName) == 0)) &&
1120             (item->cb.events & EVENT_NODE_STATE_INFO_CHANGED) != 0) {
1121             item->cb.onNodeBasicInfoChanged((NodeBasicInfoType)type, basicInfo);
1122         }
1123     }
1124     ClearNodeStateCbList(&dupList);
1125     return SOFTBUS_OK;
1126 }
1127 
LnnOnTimeSyncResult(const void * info,int retCode)1128 int32_t LnnOnTimeSyncResult(const void *info, int retCode)
1129 {
1130     TimeSyncCallbackItem *item = NULL;
1131     TimeSyncResultInfo *basicInfo = (TimeSyncResultInfo *)info;
1132     ListNode dupList;
1133 
1134     if (info == NULL) {
1135         LNN_LOGE(LNN_STATE, "info or list is null");
1136         return SOFTBUS_INVALID_PARAM;
1137     }
1138     if (!g_busCenterClient.isInit) {
1139         LNN_LOGE(LNN_STATE, "buscenter client not init");
1140         return SOFTBUS_ERR;
1141     }
1142 
1143     if (SoftBusMutexLock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1144         LNN_LOGE(LNN_STATE, "lock time sync cb list in time sync result");
1145         return SOFTBUS_LOCK_ERR;
1146     }
1147     ListInit(&dupList);
1148     DuplicateTimeSyncResultCbList(&dupList, basicInfo->target.targetNetworkId);
1149     if (SoftBusMutexUnlock(&g_busCenterClient.lock) != SOFTBUS_OK) {
1150         LNN_LOGE(LNN_STATE, "unlock time sync cb list in time sync result");
1151     }
1152     LIST_FOR_EACH_ENTRY(item, &dupList, TimeSyncCallbackItem, node) {
1153         if (item->cb.onTimeSyncResult != NULL) {
1154             item->cb.onTimeSyncResult((TimeSyncResultInfo *)info, retCode);
1155         }
1156     }
1157     ClearTimeSyncList(&dupList);
1158     return SOFTBUS_OK;
1159 }
1160 
LnnOnPublishLNNResult(int32_t publishId,int32_t reason)1161 void LnnOnPublishLNNResult(int32_t publishId, int32_t reason)
1162 {
1163     if (g_busCenterClient.publishCb.OnPublishResult != NULL) {
1164         g_busCenterClient.publishCb.OnPublishResult(publishId, (PublishResult)reason);
1165     }
1166 }
1167 
LnnOnRefreshLNNResult(int32_t refreshId,int32_t reason)1168 void LnnOnRefreshLNNResult(int32_t refreshId, int32_t reason)
1169 {
1170     if (g_busCenterClient.refreshCb.OnDiscoverResult != NULL) {
1171         g_busCenterClient.refreshCb.OnDiscoverResult(refreshId, (RefreshResult)reason);
1172     }
1173 }
1174 
LnnOnRefreshDeviceFound(const void * device)1175 void LnnOnRefreshDeviceFound(const void *device)
1176 {
1177     if (g_busCenterClient.refreshCb.OnDeviceFound != NULL) {
1178         g_busCenterClient.refreshCb.OnDeviceFound((const DeviceInfo *)device);
1179     }
1180 }
1181 
DiscRecoveryPublish()1182 int32_t DiscRecoveryPublish()
1183 {
1184     if (!g_isInited) {
1185         LNN_LOGI(LNN_STATE, "no need recovery publish");
1186         return SOFTBUS_OK;
1187     }
1188     LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexLock(&(g_publishMsgList->lock)) == SOFTBUS_OK,
1189         SOFTBUS_LOCK_ERR, LNN_STATE, "lock failed");
1190 
1191     DiscPublishMsg *msgNode = NULL;
1192     int32_t ret = SOFTBUS_OK;
1193     LIST_FOR_EACH_ENTRY(msgNode, &(g_publishMsgList->list), DiscPublishMsg, node) {
1194         if (ServerIpcPublishLNN(msgNode->pkgName, msgNode->info) != SOFTBUS_OK) {
1195             LNN_LOGE(LNN_STATE, "recovery publish error, pkgName=%{public}s, capability=%{public}s",
1196                 msgNode->pkgName, msgNode->info->capability);
1197             ret = SOFTBUS_ERR;
1198         } else {
1199             LNN_LOGI(LNN_STATE, "recovery publish success, pkgName=%{public}s, capability=%{public}s",
1200                 msgNode->pkgName, msgNode->info->capability);
1201         }
1202     }
1203 
1204     (void)SoftBusMutexUnlock(&(g_publishMsgList->lock));
1205     return ret;
1206 }
1207 
DiscRecoverySubscribe()1208 int32_t DiscRecoverySubscribe()
1209 {
1210     if (!g_isInited) {
1211         LNN_LOGI(LNN_STATE, "no need recovery subscribe");
1212         return SOFTBUS_OK;
1213     }
1214     LNN_CHECK_AND_RETURN_RET_LOGE(SoftBusMutexLock(&(g_discoveryMsgList->lock)) == SOFTBUS_OK,
1215         SOFTBUS_LOCK_ERR, LNN_STATE, "lock failed");
1216 
1217     DiscSubscribeMsg *msgNode = NULL;
1218     int32_t ret = SOFTBUS_OK;
1219     LIST_FOR_EACH_ENTRY(msgNode, &(g_discoveryMsgList->list), DiscSubscribeMsg, node) {
1220         if (ServerIpcRefreshLNN(msgNode->pkgName, msgNode->info) != SOFTBUS_OK) {
1221             LNN_LOGE(LNN_STATE, "recovery subscribe error, pkgName=%{public}s, capability=%{public}s",
1222                 msgNode->pkgName, msgNode->info->capability);
1223             ret = SOFTBUS_ERR;
1224         } else {
1225             LNN_LOGI(LNN_STATE, "recovery subscribe success, pkgName=%{public}s, capability=%{public}s",
1226                 msgNode->pkgName, msgNode->info->capability);
1227         }
1228     }
1229 
1230     (void)SoftBusMutexUnlock(&(g_discoveryMsgList->lock));
1231     return ret;
1232 }
1233