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