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