1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "client_bus_center.h"
17
18 #include <string.h>
19
20 #include "client_trans_session_manager.h"
21 #include "softbus_adapter_mem.h"
22 #include "softbus_client_frame_manager.h"
23 #include "softbus_def.h"
24 #include "softbus_errcode.h"
25 #include "softbus_log.h"
26 #include "softbus_type_def.h"
27 #include "softbus_utils.h"
28
CommonInit(const char * pkgName)29 static int32_t CommonInit(const char *pkgName)
30 {
31 if (InitSoftBus(pkgName) != SOFTBUS_OK) {
32 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "init softbus failed");
33 return SOFTBUS_NETWORK_NOT_INIT;
34 }
35 if (CheckPackageName(pkgName) != SOFTBUS_OK) {
36 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "check packageName failed");
37 return SOFTBUS_INVALID_PARAM;
38 }
39 return SOFTBUS_OK;
40 }
41
IsValidNodeStateCb(INodeStateCb * callback)42 static bool IsValidNodeStateCb(INodeStateCb *callback)
43 {
44 if (callback == NULL) {
45 return false;
46 }
47 if (callback->events == 0) {
48 return false;
49 }
50 if ((callback->events & EVENT_NODE_STATE_ONLINE) != 0 &&
51 callback->onNodeOnline == NULL) {
52 return false;
53 }
54 if ((callback->events & EVENT_NODE_STATE_OFFLINE) != 0 &&
55 callback->onNodeOffline == NULL) {
56 return false;
57 }
58 if ((callback->events & EVENT_NODE_STATE_INFO_CHANGED) != 0 &&
59 callback->onNodeBasicInfoChanged == NULL) {
60 return false;
61 }
62 return true;
63 }
64
PublishInfoCheck(const PublishInfo * info)65 static int32_t PublishInfoCheck(const PublishInfo *info)
66 {
67 if ((info->mode != DISCOVER_MODE_PASSIVE) && (info->mode != DISCOVER_MODE_ACTIVE)) {
68 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "mode is invalid");
69 return SOFTBUS_INVALID_PARAM;
70 }
71
72 if ((info->medium < AUTO) || (info->medium > COAP)) {
73 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "medium is invalid");
74 return SOFTBUS_INVALID_PARAM;
75 }
76
77 if ((info->freq < LOW) || (info->freq > SUPER_HIGH)) {
78 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "freq is invalid");
79 return SOFTBUS_INVALID_PARAM;
80 }
81
82 if ((info->capabilityData == NULL) && (info->dataLen != 0)) {
83 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "data is invalid");
84 return SOFTBUS_INVALID_PARAM;
85 }
86
87 if ((info->capabilityData != NULL) &&
88 ((info->dataLen > MAX_CAPABILITYDATA_LEN) ||
89 (strlen((char *)(info->capabilityData)) >= MAX_CAPABILITYDATA_LEN))) {
90 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "data exceeds the maximum length");
91 return SOFTBUS_INVALID_PARAM;
92 }
93
94 return SOFTBUS_OK;
95 }
96
SubscribeInfoCheck(const SubscribeInfo * info)97 static int32_t SubscribeInfoCheck(const SubscribeInfo *info)
98 {
99 if ((info->mode != DISCOVER_MODE_PASSIVE) && (info->mode != DISCOVER_MODE_ACTIVE)) {
100 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "mode is invalid");
101 return SOFTBUS_INVALID_PARAM;
102 }
103
104 if ((info->medium < AUTO) || (info->medium > COAP)) {
105 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "medium is invalid");
106 return SOFTBUS_INVALID_PARAM;
107 }
108
109 if ((info->freq < LOW) || (info->freq > SUPER_HIGH)) {
110 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "freq is invalid");
111 return SOFTBUS_INVALID_PARAM;
112 }
113
114 if ((info->capabilityData == NULL) && (info->dataLen != 0)) {
115 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "data is invalid");
116 return SOFTBUS_INVALID_PARAM;
117 }
118
119 if ((info->capabilityData != NULL) &&
120 ((info->dataLen > MAX_CAPABILITYDATA_LEN) ||
121 (strlen((char *)(info->capabilityData)) >= MAX_CAPABILITYDATA_LEN))) {
122 SoftBusLog(SOFTBUS_LOG_DISC, SOFTBUS_LOG_ERROR, "data exceeds the maximum length");
123 return SOFTBUS_INVALID_PARAM;
124 }
125
126 return SOFTBUS_OK;
127 }
128
GetAllNodeDeviceInfo(const char * pkgName,NodeBasicInfo ** info,int32_t * infoNum)129 int32_t GetAllNodeDeviceInfo(const char *pkgName, NodeBasicInfo **info, int32_t *infoNum)
130 {
131 if (pkgName == NULL || info == NULL || infoNum == NULL) {
132 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: params are null");
133 return SOFTBUS_INVALID_PARAM;
134 }
135 int32_t ret = CommonInit(pkgName);
136 if (ret != SOFTBUS_OK) {
137 return ret;
138 }
139 return GetAllNodeDeviceInfoInner(pkgName, info, infoNum);
140 }
141
FreeNodeInfo(NodeBasicInfo * info)142 void FreeNodeInfo(NodeBasicInfo *info)
143 {
144 if (info == NULL) {
145 return;
146 }
147 SoftBusFree(info);
148 }
149
GetLocalNodeDeviceInfo(const char * pkgName,NodeBasicInfo * info)150 int32_t GetLocalNodeDeviceInfo(const char *pkgName, NodeBasicInfo *info)
151 {
152 if (pkgName == NULL || info == NULL) {
153 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: params are null");
154 return SOFTBUS_INVALID_PARAM;
155 }
156 int32_t ret = CommonInit(pkgName);
157 if (ret != SOFTBUS_OK) {
158 return ret;
159 }
160 return GetLocalNodeDeviceInfoInner(pkgName, info);
161 }
162
GetNodeKeyInfo(const char * pkgName,const char * networkId,NodeDeviceInfoKey key,uint8_t * info,int32_t infoLen)163 int32_t GetNodeKeyInfo(const char *pkgName, const char *networkId, NodeDeviceInfoKey key,
164 uint8_t *info, int32_t infoLen)
165 {
166 if (pkgName == NULL) {
167 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: pkgName is null");
168 return SOFTBUS_INVALID_PARAM;
169 }
170 if (!IsValidString(networkId, NETWORK_ID_BUF_LEN) || info == NULL) {
171 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid params");
172 return SOFTBUS_INVALID_PARAM;
173 }
174 int32_t ret = CommonInit(pkgName);
175 if (ret != SOFTBUS_OK) {
176 return ret;
177 }
178 return GetNodeKeyInfoInner(pkgName, networkId, key, info, infoLen);
179 }
180
SetNodeDataChangeFlag(const char * pkgName,const char * networkId,uint16_t dataChangeFlag)181 int32_t SetNodeDataChangeFlag(const char *pkgName, const char *networkId, uint16_t dataChangeFlag)
182 {
183 if (pkgName == NULL) {
184 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: pkgName is null");
185 return SOFTBUS_INVALID_PARAM;
186 }
187 if (!IsValidString(networkId, NETWORK_ID_BUF_LEN)) {
188 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid params");
189 return SOFTBUS_INVALID_PARAM;
190 }
191 int32_t ret = CommonInit(pkgName);
192 if (ret != SOFTBUS_OK) {
193 return ret;
194 }
195 return SetNodeDataChangeFlagInner(pkgName, networkId, dataChangeFlag);
196 }
197
JoinLNN(const char * pkgName,ConnectionAddr * target,OnJoinLNNResult cb)198 int32_t JoinLNN(const char *pkgName, ConnectionAddr *target, OnJoinLNNResult cb)
199 {
200 if (pkgName == NULL || target == NULL || cb == NULL) {
201 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : params are NULL!");
202 return SOFTBUS_INVALID_PARAM;
203 }
204 int32_t ret = CommonInit(pkgName);
205 if (ret != SOFTBUS_OK) {
206 return ret;
207 }
208 return JoinLNNInner(pkgName, target, cb);
209 }
210
JoinMetaNode(const char * pkgName,ConnectionAddr * target,CustomData * customData,OnJoinMetaNodeResult cb)211 int32_t JoinMetaNode(const char *pkgName, ConnectionAddr *target, CustomData *customData, OnJoinMetaNodeResult cb)
212 {
213 if (pkgName == NULL || target == NULL || customData == NULL || cb == NULL) {
214 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : params are NULL!");
215 return SOFTBUS_INVALID_PARAM;
216 }
217 int32_t ret = CommonInit(pkgName);
218 if (ret != SOFTBUS_OK) {
219 return ret;
220 }
221 if (target->type == CONNECTION_ADDR_SESSION) {
222 ret = ClientGetChannelBySessionId(target->info.session.sessionId, &target->info.session.channelId,
223 &target->info.session.type, NULL);
224 if (ret != SOFTBUS_OK) {
225 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : get channel error!");
226 return ret;
227 }
228 }
229 return JoinMetaNodeInner(pkgName, target, customData, cb);
230 }
231
LeaveLNN(const char * pkgName,const char * networkId,OnLeaveLNNResult cb)232 int32_t LeaveLNN(const char *pkgName, const char *networkId, OnLeaveLNNResult cb)
233 {
234 if (!IsValidString(networkId, NETWORK_ID_BUF_LEN) || cb == NULL || !IsValidString(pkgName, PKG_NAME_SIZE_MAX - 1)) {
235 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : networkId or cb is NULL!");
236 return SOFTBUS_INVALID_PARAM;
237 }
238 return LeaveLNNInner(pkgName, networkId, cb);
239 }
240
LeaveMetaNode(const char * pkgName,const char * networkId,OnLeaveMetaNodeResult cb)241 int32_t LeaveMetaNode(const char *pkgName, const char *networkId, OnLeaveMetaNodeResult cb)
242 {
243 if (!IsValidString(networkId, NETWORK_ID_BUF_LEN) || cb == NULL || !IsValidString(pkgName, PKG_NAME_SIZE_MAX - 1)) {
244 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail : networkId or cb is NULL!");
245 return SOFTBUS_INVALID_PARAM;
246 }
247 return LeaveMetaNodeInner(pkgName, networkId, cb);
248 }
249
RegNodeDeviceStateCb(const char * pkgName,INodeStateCb * callback)250 int32_t RegNodeDeviceStateCb(const char *pkgName, INodeStateCb *callback)
251 {
252 if (pkgName == NULL || IsValidNodeStateCb(callback) == false) {
253 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: invalid parameters");
254 return SOFTBUS_INVALID_PARAM;
255 }
256 int32_t ret = CommonInit(pkgName);
257 if (ret != SOFTBUS_OK) {
258 return ret;
259 }
260 return RegNodeDeviceStateCbInner(pkgName, callback);
261 }
262
UnregNodeDeviceStateCb(INodeStateCb * callback)263 int32_t UnregNodeDeviceStateCb(INodeStateCb *callback)
264 {
265 if (callback == NULL) {
266 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "para callback = null!");
267 return SOFTBUS_INVALID_PARAM;
268 }
269 return UnregNodeDeviceStateCbInner(callback);
270 }
271
StartTimeSync(const char * pkgName,const char * targetNetworkId,TimeSyncAccuracy accuracy,TimeSyncPeriod period,ITimeSyncCb * cb)272 int32_t StartTimeSync(const char *pkgName, const char *targetNetworkId, TimeSyncAccuracy accuracy,
273 TimeSyncPeriod period, ITimeSyncCb *cb)
274 {
275 if (pkgName == NULL || targetNetworkId == NULL || cb == NULL || cb->onTimeSyncResult == NULL) {
276 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: invalid parameters");
277 return SOFTBUS_INVALID_PARAM;
278 }
279 int32_t ret = CommonInit(pkgName);
280 if (ret != SOFTBUS_OK) {
281 return ret;
282 }
283 return StartTimeSyncInner(pkgName, targetNetworkId, accuracy, period, cb);
284 }
285
StopTimeSync(const char * pkgName,const char * targetNetworkId)286 int32_t StopTimeSync(const char *pkgName, const char *targetNetworkId)
287 {
288 if (pkgName == NULL || targetNetworkId == NULL) {
289 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: invalid parameters");
290 return SOFTBUS_INVALID_PARAM;
291 }
292 int32_t ret = CommonInit(pkgName);
293 if (ret != SOFTBUS_OK) {
294 return ret;
295 }
296 return StopTimeSyncInner(pkgName, targetNetworkId);
297 }
298
PublishLNN(const char * pkgName,const PublishInfo * info,const IPublishCb * cb)299 int32_t PublishLNN(const char *pkgName, const PublishInfo *info, const IPublishCb *cb)
300 {
301 if ((pkgName == NULL) || (info == NULL) || (cb == NULL)) {
302 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: invalid parameters");
303 return SOFTBUS_INVALID_PARAM;
304 }
305 int32_t ret = CommonInit(pkgName);
306 if (ret != SOFTBUS_OK) {
307 return ret;
308 }
309 if (PublishInfoCheck(info) != SOFTBUS_OK) {
310 return SOFTBUS_INVALID_PARAM;
311 }
312 return PublishLNNInner(pkgName, info, cb);
313 }
314
StopPublishLNN(const char * pkgName,int32_t publishId)315 int32_t StopPublishLNN(const char *pkgName, int32_t publishId)
316 {
317 if (pkgName == NULL) {
318 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: invalid parameters");
319 return SOFTBUS_INVALID_PARAM;
320 }
321 int32_t ret = CommonInit(pkgName);
322 if (ret != SOFTBUS_OK) {
323 return ret;
324 }
325 return StopPublishLNNInner(pkgName, publishId);
326 }
327
RefreshLNN(const char * pkgName,const SubscribeInfo * info,const IRefreshCallback * cb)328 int32_t RefreshLNN(const char *pkgName, const SubscribeInfo *info, const IRefreshCallback *cb)
329 {
330 if ((pkgName == NULL) || (info == NULL) || (cb == NULL)) {
331 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: invalid parameters");
332 return SOFTBUS_INVALID_PARAM;
333 }
334 int32_t ret = CommonInit(pkgName);
335 if (ret != SOFTBUS_OK) {
336 return ret;
337 }
338 if (SubscribeInfoCheck(info) != SOFTBUS_OK) {
339 return SOFTBUS_INVALID_PARAM;
340 }
341 return RefreshLNNInner(pkgName, info, cb);
342 }
343
StopRefreshLNN(const char * pkgName,int32_t refreshId)344 int32_t StopRefreshLNN(const char *pkgName, int32_t refreshId)
345 {
346 if (pkgName == NULL) {
347 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "fail: invalid parameters");
348 return SOFTBUS_INVALID_PARAM;
349 }
350 int32_t ret = CommonInit(pkgName);
351 if (ret != SOFTBUS_OK) {
352 return ret;
353 }
354 return StopRefreshLNNInner(pkgName, refreshId);
355 }
356
ActiveMetaNode(const char * pkgName,const MetaNodeConfigInfo * info,char * metaNodeId)357 int32_t ActiveMetaNode(const char *pkgName, const MetaNodeConfigInfo *info, char *metaNodeId)
358 {
359 if (pkgName == NULL || info == NULL || metaNodeId == NULL) {
360 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid active meta node para");
361 return SOFTBUS_INVALID_PARAM;
362 }
363 int32_t ret = CommonInit(pkgName);
364 if (ret != SOFTBUS_OK) {
365 return ret;
366 }
367 return ActiveMetaNodeInner(pkgName, info, metaNodeId);
368 }
369
DeactiveMetaNode(const char * pkgName,const char * metaNodeId)370 int32_t DeactiveMetaNode(const char *pkgName, const char *metaNodeId)
371 {
372 if (pkgName == NULL || metaNodeId == NULL) {
373 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid deactive meta node para");
374 return SOFTBUS_INVALID_PARAM;
375 }
376 int32_t ret = CommonInit(pkgName);
377 if (ret != SOFTBUS_OK) {
378 return ret;
379 }
380 return DeactiveMetaNodeInner(pkgName, metaNodeId);
381 }
382
GetAllMetaNodeInfo(const char * pkgName,MetaNodeInfo * infos,int32_t * infoNum)383 int32_t GetAllMetaNodeInfo(const char *pkgName, MetaNodeInfo *infos, int32_t *infoNum)
384 {
385 if (pkgName == NULL || infos == NULL || infoNum == NULL || *infoNum > MAX_META_NODE_NUM) {
386 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid query meta node info para");
387 return SOFTBUS_INVALID_PARAM;
388 }
389 int32_t ret = CommonInit(pkgName);
390 if (ret != SOFTBUS_OK) {
391 return ret;
392 }
393 return GetAllMetaNodeInfoInner(pkgName, infos, infoNum);
394 }
395
ShiftLNNGear(const char * pkgName,const char * callerId,const char * targetNetworkId,const GearMode * mode)396 int32_t ShiftLNNGear(const char *pkgName, const char *callerId, const char *targetNetworkId, const GearMode *mode)
397 {
398 if (pkgName == NULL || callerId == NULL || mode == NULL) {
399 SoftBusLog(SOFTBUS_LOG_LNN, SOFTBUS_LOG_ERROR, "invalid shift lnn gear para");
400 return SOFTBUS_INVALID_PARAM;
401 }
402 if (CommonInit(pkgName) != SOFTBUS_OK) {
403 return SOFTBUS_INVALID_PARAM;
404 }
405 size_t len = strnlen(callerId, CALLER_ID_MAX_LEN);
406 if (len == 0 || len >= CALLER_ID_MAX_LEN) {
407 return SOFTBUS_INVALID_PARAM;
408 }
409 if (targetNetworkId != NULL && strnlen(targetNetworkId, NETWORK_ID_BUF_LEN) != NETWORK_ID_BUF_LEN - 1) {
410 return SOFTBUS_INVALID_PARAM;
411 }
412 return ShiftLNNGearInner(pkgName, callerId, targetNetworkId, mode);
413 }
414