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(©Item->node);
316 copyItem->cb = item->cb;
317 ListAdd(list, ©Item->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(©Item->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, ©Item->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