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