1 /*
2 * Copyright (c) 2021-2023 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_disc_service.h"
17
18 #include <securec.h>
19 #include <stdbool.h>
20 #include <string.h>
21
22 #include "client_disc_manager.h"
23 #include "disc_event.h"
24 #include "disc_log.h"
25 #include "softbus_adapter_mem.h"
26 #include "softbus_client_frame_manager.h"
27 #include "softbus_def.h"
28 #include "softbus_errcode.h"
29 #include "softbus_utils.h"
30
PublishInfoCheck(const PublishInfo * info)31 static int32_t PublishInfoCheck(const PublishInfo *info)
32 {
33 if ((info->mode != DISCOVER_MODE_PASSIVE) && (info->mode != DISCOVER_MODE_ACTIVE)) {
34 DISC_LOGE(DISC_SDK, "mode is invalid");
35 return SOFTBUS_INVALID_PARAM;
36 }
37
38 if ((info->medium < AUTO) || (info->medium > COAP)) {
39 DISC_LOGE(DISC_SDK, "medium is invalid");
40 return SOFTBUS_INVALID_PARAM;
41 }
42
43 if ((info->freq < LOW) || (info->freq > SUPER_HIGH)) {
44 DISC_LOGE(DISC_SDK, "freq is invalid");
45 return SOFTBUS_INVALID_PARAM;
46 }
47
48 if ((info->capabilityData == NULL) && (info->dataLen != 0)) {
49 DISC_LOGE(DISC_SDK, "data is invalid");
50 return SOFTBUS_INVALID_PARAM;
51 }
52
53 if (info->dataLen == 0) {
54 return SOFTBUS_OK;
55 }
56
57 if ((info->dataLen > MAX_CAPABILITYDATA_LEN) ||
58 (strlen((char *)(info->capabilityData)) >= MAX_CAPABILITYDATA_LEN)) {
59 DISC_LOGE(DISC_SDK, "data exceeds the maximum length");
60 return SOFTBUS_INVALID_PARAM;
61 }
62 return SOFTBUS_OK;
63 }
64
SubscribeInfoCheck(const SubscribeInfo * info)65 static int32_t SubscribeInfoCheck(const SubscribeInfo *info)
66 {
67 if ((info->mode != DISCOVER_MODE_PASSIVE) && (info->mode != DISCOVER_MODE_ACTIVE)) {
68 DISC_LOGE(DISC_SDK, "mode is invalid");
69 return SOFTBUS_INVALID_PARAM;
70 }
71
72 if ((info->medium < AUTO) || (info->medium > COAP)) {
73 DISC_LOGE(DISC_SDK, "medium is invalid");
74 return SOFTBUS_INVALID_PARAM;
75 }
76
77 if ((info->freq < LOW) || (info->freq > SUPER_HIGH)) {
78 DISC_LOGE(DISC_SDK, "freq is invalid");
79 return SOFTBUS_INVALID_PARAM;
80 }
81
82 if ((info->capabilityData == NULL) && (info->dataLen != 0)) {
83 DISC_LOGE(DISC_SDK, "data is invalid");
84 return SOFTBUS_INVALID_PARAM;
85 }
86
87 if (info->dataLen == 0) {
88 return SOFTBUS_OK;
89 }
90
91 if ((info->dataLen > MAX_CAPABILITYDATA_LEN) ||
92 (strlen((char *)(info->capabilityData)) >= MAX_CAPABILITYDATA_LEN)) {
93 DISC_LOGE(DISC_SDK, "data exceeds the maximum length");
94 return SOFTBUS_INVALID_PARAM;
95 }
96
97 return SOFTBUS_OK;
98 }
99
DfxRecordDiscServerEnd(int32_t serverType,int32_t reason,const char * packageName)100 static void DfxRecordDiscServerEnd(int32_t serverType, int32_t reason, const char *packageName)
101 {
102 if (reason == SOFTBUS_OK) {
103 return;
104 }
105 DiscEventExtra extra = { 0 };
106 DiscEventExtraInit(&extra);
107 extra.serverType = serverType;
108 extra.errcode = reason;
109 extra.result = EVENT_STAGE_RESULT_FAILED;
110
111 char pkgName[PKG_NAME_SIZE_MAX] = { 0 };
112 if (packageName != NULL && IsValidString(packageName, PKG_NAME_SIZE_MAX - 1) && strncpy_s(pkgName,
113 PKG_NAME_SIZE_MAX, packageName, PKG_NAME_SIZE_MAX - 1) == EOK) {
114 extra.callerPkg = pkgName;
115 }
116 DISC_EVENT(EVENT_SCENE_DISC, EVENT_STAGE_DISC_SDK, extra);
117 }
118
PublishService(const char * packageName,const PublishInfo * info,const IPublishCallback * cb)119 int PublishService(const char *packageName, const PublishInfo *info, const IPublishCallback *cb)
120 {
121 if ((packageName == NULL) || (strlen(packageName) >= PKG_NAME_SIZE_MAX) || (info == NULL) || (cb == NULL)) {
122 DfxRecordDiscServerEnd(SERVER_PUBLISH, SOFTBUS_INVALID_PARAM, packageName);
123 DISC_LOGE(DISC_SDK, "invalid parameter:null");
124 return SOFTBUS_INVALID_PARAM;
125 }
126
127 if (InitSoftBus(packageName) != SOFTBUS_OK) {
128 DfxRecordDiscServerEnd(SERVER_PUBLISH, SOFTBUS_DISCOVER_NOT_INIT, packageName);
129 DISC_LOGE(DISC_SDK, "init softbus err");
130 return SOFTBUS_DISCOVER_NOT_INIT;
131 }
132
133 if (CheckPackageName(packageName) != SOFTBUS_OK) {
134 DfxRecordDiscServerEnd(SERVER_PUBLISH, SOFTBUS_INVALID_PARAM, packageName);
135 DISC_LOGE(DISC_SDK, "check packageName failed");
136 return SOFTBUS_INVALID_PARAM;
137 }
138
139 if (PublishInfoCheck(info) != SOFTBUS_OK) {
140 DfxRecordDiscServerEnd(SERVER_PUBLISH, SOFTBUS_INVALID_PARAM, packageName);
141 DISC_LOGE(DISC_SDK, "publish infoCheck failed");
142 return SOFTBUS_INVALID_PARAM;
143 }
144
145 int32_t ret = PublishServiceInner(packageName, info, cb);
146 DfxRecordDiscServerEnd(SERVER_PUBLISH, ret, packageName);
147 return ret;
148 }
149
UnPublishService(const char * packageName,int publishId)150 int UnPublishService(const char *packageName, int publishId)
151 {
152 if ((packageName == NULL) || (strlen(packageName) >= PKG_NAME_SIZE_MAX)) {
153 DfxRecordDiscServerEnd(SERVER_STOP_PUBLISH, SOFTBUS_INVALID_PARAM, packageName);
154 DISC_LOGE(DISC_SDK, "invalid packageName");
155 return SOFTBUS_INVALID_PARAM;
156 }
157
158 if (CheckPackageName(packageName) != SOFTBUS_OK) {
159 DfxRecordDiscServerEnd(SERVER_STOP_PUBLISH, SOFTBUS_INVALID_PARAM, packageName);
160 DISC_LOGE(DISC_SDK, "check packageName failed");
161 return SOFTBUS_INVALID_PARAM;
162 }
163
164 int32_t ret = UnpublishServiceInner(packageName, publishId);
165 DfxRecordDiscServerEnd(SERVER_STOP_PUBLISH, ret, packageName);
166 return ret;
167 }
168
StartDiscovery(const char * packageName,const SubscribeInfo * info,const IDiscoveryCallback * cb)169 int StartDiscovery(const char *packageName, const SubscribeInfo *info, const IDiscoveryCallback *cb)
170 {
171 if ((packageName == NULL) || (strlen(packageName) >= PKG_NAME_SIZE_MAX) || (info == NULL) || (cb == NULL)) {
172 DfxRecordDiscServerEnd(SERVER_DISCOVERY, SOFTBUS_INVALID_PARAM, packageName);
173 DISC_LOGE(DISC_SDK, " invalid parameter:null");
174 return SOFTBUS_INVALID_PARAM;
175 }
176 if (InitSoftBus(packageName) != SOFTBUS_OK) {
177 DfxRecordDiscServerEnd(SERVER_DISCOVERY, SOFTBUS_DISCOVER_NOT_INIT, packageName);
178 DISC_LOGE(DISC_SDK, "init softbus err");
179 return SOFTBUS_DISCOVER_NOT_INIT;
180 }
181 if (CheckPackageName(packageName) != SOFTBUS_OK) {
182 DfxRecordDiscServerEnd(SERVER_DISCOVERY, SOFTBUS_INVALID_PARAM, packageName);
183 DISC_LOGE(DISC_SDK, "check packageName failed");
184 return SOFTBUS_INVALID_PARAM;
185 }
186 if (SubscribeInfoCheck(info) != SOFTBUS_OK) {
187 DfxRecordDiscServerEnd(SERVER_DISCOVERY, SOFTBUS_INVALID_PARAM, packageName);
188 DISC_LOGE(DISC_SDK, "subscribe infoCheck failed");
189 return SOFTBUS_INVALID_PARAM;
190 }
191
192 int32_t ret = StartDiscoveryInner(packageName, info, cb);
193 DfxRecordDiscServerEnd(SERVER_DISCOVERY, ret, packageName);
194 return ret;
195 }
196
StopDiscovery(const char * packageName,int subscribeId)197 int StopDiscovery(const char *packageName, int subscribeId)
198 {
199 if ((packageName == NULL) || (strlen(packageName) >= PKG_NAME_SIZE_MAX)) {
200 DfxRecordDiscServerEnd(SERVER_STOP_DISCOVERY, SOFTBUS_INVALID_PARAM, packageName);
201 DISC_LOGE(DISC_SDK, "invalid packageName:null");
202 return SOFTBUS_INVALID_PARAM;
203 }
204
205 if (CheckPackageName(packageName) != SOFTBUS_OK) {
206 DfxRecordDiscServerEnd(SERVER_STOP_DISCOVERY, SOFTBUS_INVALID_PARAM, packageName);
207 DISC_LOGE(DISC_SDK, "check packageName failed");
208 return SOFTBUS_INVALID_PARAM;
209 }
210
211 int32_t ret = StopDiscoveryInner(packageName, subscribeId);
212 DfxRecordDiscServerEnd(SERVER_STOP_DISCOVERY, ret, packageName);
213 return ret;
214 }