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