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