• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }