1 /*
2 * Copyright (c) 2025 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 "sms_utils.h"
17
18 #include "enum_convert_for_js.h"
19 #include "napi_util.h"
20 #include "sms_service_manager_client.h"
21 #include "state_registry_errors.h"
22 #include "telephony_types.h"
23
24 namespace OHOS {
25 namespace Telephony {
MallocCString(const std::string & origin)26 char* MallocCString(const std::string& origin)
27 {
28 if (origin.empty()) {
29 return nullptr;
30 }
31 auto len = origin.length() + 1;
32 char* res = static_cast<char*>(malloc(sizeof(char) * len));
33 if (res == nullptr) {
34 return nullptr;
35 }
36 return std::char_traits<char>::copy(res, origin.c_str(), len);
37 }
38
CreateCommonArgumentErrorCodeForCj(int32_t errorCode,int32_t & error)39 bool CreateCommonArgumentErrorCodeForCj(int32_t errorCode, int32_t& error)
40 {
41 bool flag = true;
42
43 switch (errorCode) {
44 case TELEPHONY_ERR_ARGUMENT_MISMATCH:
45 case TELEPHONY_ERR_ARGUMENT_INVALID:
46 case TELEPHONY_ERR_ARGUMENT_NULL:
47 case TELEPHONY_ERR_SLOTID_INVALID:
48 error = JS_ERROR_TELEPHONY_ARGUMENT_ERROR;
49 break;
50 default:
51 flag = false;
52 break;
53 }
54 return flag;
55 }
56
CreateCommonServiceErrorCodeForCj(int32_t errorCode,int32_t & error)57 bool CreateCommonServiceErrorCodeForCj(int32_t errorCode, int32_t& error)
58 {
59 bool flag = true;
60
61 switch (errorCode) {
62 case TELEPHONY_ERR_DESCRIPTOR_MISMATCH:
63 case TELEPHONY_ERR_WRITE_DESCRIPTOR_TOKEN_FAIL:
64 case TELEPHONY_ERR_WRITE_DATA_FAIL:
65 case TELEPHONY_ERR_WRITE_REPLY_FAIL:
66 case TELEPHONY_ERR_READ_DATA_FAIL:
67 case TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL:
68 case TELEPHONY_ERR_REGISTER_CALLBACK_FAIL:
69 case TELEPHONY_ERR_CALLBACK_ALREADY_REGISTERED:
70 case TELEPHONY_ERR_UNINIT:
71 case TELEPHONY_ERR_UNREGISTER_CALLBACK_FAIL:
72 error = JS_ERROR_TELEPHONY_SERVICE_ERROR;
73 break;
74 default:
75 flag = false;
76 break;
77 }
78 return flag;
79 }
80
CreateCommonSystemErrorCodeForCj(int32_t errorCode,int32_t & error)81 bool CreateCommonSystemErrorCodeForCj(int32_t errorCode, int32_t& error)
82 {
83 bool flag = true;
84
85 switch (errorCode) {
86 case TELEPHONY_ERR_FAIL:
87 case TELEPHONY_ERR_MEMCPY_FAIL:
88 case TELEPHONY_ERR_MEMSET_FAIL:
89 case TELEPHONY_ERR_STRCPY_FAIL:
90 case TELEPHONY_ERR_LOCAL_PTR_NULL:
91 case TELEPHONY_ERR_SUBSCRIBE_BROADCAST_FAIL:
92 case TELEPHONY_ERR_PUBLISH_BROADCAST_FAIL:
93 case TELEPHONY_ERR_ADD_DEATH_RECIPIENT_FAIL:
94 case TELEPHONY_ERR_STRTOINT_FAIL:
95 case TELEPHONY_ERR_RIL_CMD_FAIL:
96 case TELEPHONY_ERR_DATABASE_WRITE_FAIL:
97 case TELEPHONY_ERR_DATABASE_READ_FAIL:
98 case TELEPHONY_ERR_UNKNOWN_NETWORK_TYPE:
99 error = JS_ERROR_TELEPHONY_SYSTEM_ERROR;
100 break;
101 case TELEPHONY_ERR_NO_SIM_CARD:
102 error = JS_ERROR_TELEPHONY_NO_SIM_CARD;
103 break;
104 case TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API:
105 error = JS_ERROR_ILLEGAL_USE_OF_SYSTEM_API;
106 break;
107 case TELEPHONY_ERR_AIRPLANE_MODE_ON:
108 error = JS_ERROR_TELEPHONY_AIRPLANE_MODE_ON;
109 break;
110 case TELEPHONY_ERR_NETWORK_NOT_IN_SERVICE:
111 error = JS_ERROR_TELEPHONY_NETWORK_NOT_IN_SERVICE;
112 break;
113 default:
114 flag = false;
115 break;
116 }
117 return flag;
118 }
119
CreateCommonErrorCodeForCj(int32_t errorCode,int32_t & error)120 bool CreateCommonErrorCodeForCj(int32_t errorCode, int32_t& error)
121 {
122 if ((errorCode < COMMON_ERR_OFFSET || errorCode >= CALL_ERR_OFFSET)) {
123 return false;
124 }
125 if (CreateCommonArgumentErrorCodeForCj(errorCode, error) || CreateCommonServiceErrorCodeForCj(errorCode, error) ||
126 CreateCommonSystemErrorCodeForCj(errorCode, error)) {
127 return true;
128 }
129 return false;
130 }
131
CreateParameterErrorCodeForCj(int32_t errorCode,int32_t & error)132 bool CreateParameterErrorCodeForCj(int32_t errorCode, int32_t& error)
133 {
134 bool flag = true;
135 switch (errorCode) {
136 case ERROR_SERVICE_UNAVAILABLE:
137 case ERROR_NATIVE_API_EXECUTE_FAIL:
138 error = JS_ERROR_TELEPHONY_SYSTEM_ERROR;
139 break;
140 case ERROR_PARAMETER_COUNTS_INVALID:
141 case ERROR_PARAMETER_TYPE_INVALID:
142 error = JS_ERROR_TELEPHONY_INVALID_INPUT_PARAMETER;
143 break;
144 case ERROR_SLOT_ID_INVALID:
145 error = JS_ERROR_TELEPHONY_ARGUMENT_ERROR;
146 break;
147 default:
148 flag = false;
149 break;
150 }
151
152 return flag;
153 }
154
CreateCommonCallErrorCodeForCj(int32_t errorCode,int32_t & error)155 bool CreateCommonCallErrorCodeForCj(int32_t errorCode, int32_t& error)
156 {
157 bool flag = true;
158
159 switch (errorCode) {
160 case TELEPHONY_CALL_ERR_NUMBER_OUT_OF_RANGE:
161 case TELEPHONY_CALL_ERR_PHONE_NUMBER_EMPTY:
162 case TELEPHONY_CALL_ERR_FORMAT_PHONE_NUMBER_FAILED:
163 error = JS_ERROR_TELEPHONY_ARGUMENT_ERROR;
164 break;
165 case TELEPHONY_CALL_ERR_PARAMETER_OUT_OF_RANGE:
166 case TELEPHONY_CALL_ERR_INVALID_SLOT_ID:
167 error = JS_ERROR_TELEPHONY_ARGUMENT_ERROR;
168 break;
169 case TELEPHONY_CALL_ERR_CONFERENCE_CALL_EXCEED_LIMIT:
170 error = JS_ERROR_TELEPHONY_CONFERENCE_EXCEED_LIMIT;
171 break;
172 case TELEPHONY_CALL_ERR_CONFERENCE_CALL_IS_NOT_ACTIVE:
173 error = JS_ERROR_TELEPHONY_CONFERENCE_CALL_NOT_ACTIVE;
174 break;
175 case TELEPHONY_CALL_ERR_CALL_COUNTS_EXCEED_LIMIT:
176 error = JS_ERROR_TELEPHONY_CALL_COUNTS_EXCEED_LIMIT;
177 break;
178 case TELEPHONY_CALL_ERR_CALL_IS_NOT_ACTIVATED:
179 case TELEPHONY_CALL_ERR_ILLEGAL_CALL_OPERATION:
180 case TELEPHONY_CALL_ERR_AUDIO_SETTING_MUTE_FAILED:
181 case TELEPHONY_CALL_ERR_CALL_IS_NOT_ON_HOLDING:
182 case TELEPHONY_CALL_ERR_PHONE_CALLS_TOO_FEW:
183 case TELEPHONY_CALL_ERR_VIDEO_ILLEGAL_CALL_TYPE:
184 case TELEPHONY_CALL_ERR_CONFERENCE_NOT_EXISTS:
185 case TELEPHONY_CALL_ERR_CONFERENCE_SEPERATE_FAILED:
186 case TELEPHONY_CALL_ERR_EMERGENCY_UNSUPPORT_CONFERENCEABLE:
187 case TELEPHONY_CALL_ERR_VOLTE_NOT_SUPPORT:
188 case TELEPHONY_CALL_ERR_VOLTE_PROVISIONING_DISABLED:
189 error = JS_ERROR_TELEPHONY_SYSTEM_ERROR;
190 break;
191 case TELEPHONY_CALL_ERR_DIAL_IS_BUSY:
192 error = JS_ERROR_TELEPHONY_DIAL_IS_BUSY;
193 break;
194 default:
195 flag = false;
196 break;
197 }
198 return flag;
199 }
200
CreateVideoCallErrorCodeForCj(int32_t errorCode,int32_t & error)201 bool CreateVideoCallErrorCodeForCj(int32_t errorCode, int32_t& error)
202 {
203 bool flag = true;
204
205 switch (errorCode) {
206 case TELEPHONY_CALL_ERR_VIDEO_ILLEGAL_MEDIA_TYPE:
207 case TELEPHONY_CALL_ERR_VIDEO_IN_PROGRESS:
208 case TELEPHONY_CALL_ERR_VIDEO_ILLEAGAL_SCENARIO:
209 case TELEPHONY_CALL_ERR_VIDEO_MODE_CHANGE_NOTIFY_FAILED:
210 case TELEPHONY_CALL_ERR_VIDEO_NOT_SUPPORTED:
211 case TELEPHONY_CALL_ERR_SETTING_AUDIO_DEVICE_FAILED:
212 case TELEPHONY_CALL_ERR_VIDEO_INVALID_COORDINATES:
213 case TELEPHONY_CALL_ERR_VIDEO_INVALID_ZOOM:
214 case TELEPHONY_CALL_ERR_VIDEO_INVALID_ROTATION:
215 case TELEPHONY_CALL_ERR_VIDEO_INVALID_CAMERA_ID:
216 case TELEPHONY_CALL_ERR_INVALID_PATH:
217 case TELEPHONY_CALL_ERR_CAMERA_NOT_TURNED_ON:
218 case TELEPHONY_CALL_ERR_INVALID_DIAL_SCENE:
219 case TELEPHONY_CALL_ERR_INVALID_VIDEO_STATE:
220 case TELEPHONY_CALL_ERR_UNKNOW_DIAL_TYPE:
221 error = JS_ERROR_TELEPHONY_SYSTEM_ERROR;
222 break;
223 default:
224 flag = false;
225 break;
226 }
227 return flag;
228 }
229
CreateSupplementServiceCallErrorCodeForCj(int32_t errorCode,int32_t & error)230 bool CreateSupplementServiceCallErrorCodeForCj(int32_t errorCode, int32_t& error)
231 {
232 bool flag = true;
233
234 switch (errorCode) {
235 case TELEPHONY_CALL_ERR_INVALID_RESTRICTION_TYPE:
236 case TELEPHONY_CALL_ERR_INVALID_RESTRICTION_MODE:
237 case TELEPHONY_CALL_ERR_INVALID_TRANSFER_TYPE:
238 case TELEPHONY_CALL_ERR_INVALID_TRANSFER_SETTING_TYPE:
239 error = JS_ERROR_TELEPHONY_ARGUMENT_ERROR;
240 break;
241 case TELEPHONY_CALL_ERR_FUNCTION_NOT_SUPPORTED:
242 error = JS_ERROR_DEVICE_NOT_SUPPORT_THIS_API;
243 break;
244 case TELEPHONY_CALL_ERR_INVALID_TRANSFER_TIME:
245 case TELEPHONY_CALL_ERR_NAPI_INTERFACE_FAILED:
246 case TELEPHONY_CALL_ERR_CALLBACK_ALREADY_EXIST:
247 case TELEPHONY_CALL_ERR_RESOURCE_UNAVAILABLE:
248 error = JS_ERROR_TELEPHONY_SYSTEM_ERROR;
249 break;
250 case TELEPHONY_CALL_ERR_UT_NO_CONNECTION:
251 error = JS_ERROR_CALL_UT_NO_CONNECTION;
252 break;
253 default:
254 flag = false;
255 break;
256 }
257 return flag;
258 }
259
CreateCallErrorCodeForCj(int32_t errorCode,int32_t & error)260 bool CreateCallErrorCodeForCj(int32_t errorCode, int32_t& error)
261 {
262 if ((errorCode < CALL_ERR_OFFSET || errorCode >= CELLULAR_DATA_ERR_OFFSET)) {
263 return false;
264 }
265 if (CreateCommonCallErrorCodeForCj(errorCode, error) || CreateVideoCallErrorCodeForCj(errorCode, error) ||
266 CreateSupplementServiceCallErrorCodeForCj(errorCode, error)) {
267 return true;
268 }
269 return false;
270 }
271
CreateDataErrorCodeForCj(int32_t errorCode,int32_t & error)272 bool CreateDataErrorCodeForCj(int32_t errorCode, int32_t& error)
273 {
274 if ((errorCode < CELLULAR_DATA_ERR_OFFSET || errorCode >= SMS_MMS_ERR_OFFSET)) {
275 return false;
276 }
277 bool flag = true;
278
279 switch (errorCode) {
280 case TELEPHONY_CELLULAR_DATA_INVALID_PARAM:
281 error = JS_ERROR_CELLULAR_DATA_BASE_ERROR;
282 break;
283 default:
284 flag = false;
285 break;
286 }
287 return flag;
288 }
289
CreateNetworkSearchErrorCodeForCj(int32_t errorCode,int32_t & error)290 bool CreateNetworkSearchErrorCodeForCj(int32_t errorCode, int32_t& error)
291 {
292 if ((errorCode < CORE_SERVICE_NETWORK_SEARCH_ERR_OFFSET || errorCode >= CORE_SERVICE_CORE_ERR_OFFSET)) {
293 return false;
294 }
295 bool flag = true;
296 switch (errorCode) {
297 case CORE_SERVICE_SEND_CALLBACK_FAILED:
298 case CORE_SERVICE_RADIO_PROTOCOL_TECH_UNKNOWN:
299 error = JS_ERROR_TELEPHONY_SYSTEM_ERROR;
300 break;
301 default:
302 flag = false;
303 break;
304 }
305
306 return flag;
307 }
308
CreateVcardErrorCodeForCj(int32_t errorCode,int32_t & error)309 bool CreateVcardErrorCodeForCj(int32_t errorCode, int32_t& error)
310 {
311 bool flag = true;
312 switch (errorCode) {
313 case TELEPHONY_ERR_VCARD_FILE_INVALID:
314 error = JS_ERROR_TELEPHONY_SYSTEM_ERROR;
315 break;
316 default:
317 flag = false;
318 break;
319 }
320
321 return flag;
322 }
323
CreateSimErrorCodeForCj(int32_t errorCode,int32_t & error)324 bool CreateSimErrorCodeForCj(int32_t errorCode, int32_t& error)
325 {
326 if ((errorCode < CORE_SERVICE_SIM_ERR_OFFSET || errorCode >= CORE_SERVICE_NETWORK_SEARCH_ERR_OFFSET)) {
327 return false;
328 }
329 bool flag = true;
330 switch (errorCode) {
331 case CORE_SERVICE_SIM_CARD_IS_NOT_ACTIVE:
332 error = JS_ERROR_SIM_CARD_IS_NOT_ACTIVE;
333 break;
334 case CORE_ERR_SIM_CARD_LOAD_FAILED:
335 case CORE_ERR_SIM_CARD_UPDATE_FAILED:
336 error = JS_ERROR_SIM_CARD_OPERATION_ERROR;
337 break;
338 case CORE_ERR_OPERATOR_KEY_NOT_EXIT:
339 case CORE_ERR_OPERATOR_CONF_NOT_EXIT:
340 error = JS_ERROR_OPERATOR_CONFIG_ERROR;
341 break;
342 default:
343 flag = false;
344 break;
345 }
346
347 return flag;
348 }
349
CreateSmsErrorCodeForCj(int32_t errorCode,int32_t & error)350 bool CreateSmsErrorCodeForCj(int32_t errorCode, int32_t& error)
351 {
352 if ((errorCode < SMS_MMS_ERR_OFFSET || errorCode >= STATE_REGISTRY_ERR_OFFSET)) {
353 return false;
354 }
355 bool flag = true;
356 switch (errorCode) {
357 case TELEPHONY_SMS_MMS_DECODE_DATA_EMPTY:
358 case TELEPHONY_SMS_MMS_UNKNOWN_SIM_MESSAGE_STATUS:
359 case TELEPHONY_SMS_MMS_MESSAGE_LENGTH_OUT_OF_RANGE:
360 error = JS_ERROR_TELEPHONY_SYSTEM_ERROR;
361 break;
362 default:
363 flag = false;
364 break;
365 }
366
367 return flag;
368 }
369
CreateObserverErrorCodeForCj(int32_t errorCode,int32_t & error)370 bool CreateObserverErrorCodeForCj(int32_t errorCode, int32_t& error)
371 {
372 if ((errorCode < STATE_REGISTRY_ERR_OFFSET || errorCode >= NET_MANAGER_ERR_OFFSET)) {
373 return false;
374 }
375 bool flag = true;
376 switch (errorCode) {
377 case TELEPHONY_STATE_REGISTRY_SLODID_ERROR:
378 error = JS_ERROR_TELEPHONY_ARGUMENT_ERROR;
379 break;
380 case TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED:
381 error = JS_ERROR_TELEPHONY_PERMISSION_DENIED;
382 break;
383 case TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST:
384 case TELEPHONY_STATE_UNREGISTRY_DATA_NOT_EXIST:
385 case TELEPHONY_STATE_REGISTRY_DATA_EXIST:
386 case TELEPHONY_STATE_REGISTRY_NOT_IMPLEMENTED:
387 error = JS_ERROR_TELEPHONY_SYSTEM_ERROR;
388 break;
389 default:
390 flag = false;
391 break;
392 }
393
394 return flag;
395 }
396
ConverErrorCodeForCj(int32_t errorCode)397 int32_t ConverErrorCodeForCj(int32_t errorCode)
398 {
399 int32_t error = 0;
400 if (errorCode == TELEPHONY_ERR_SUCCESS) {
401 return JS_ERROR_TELEPHONY_SUCCESS;
402 }
403 if (CreateParameterErrorCodeForCj(errorCode, error)) {
404 return error;
405 }
406 if (!CreateCommonErrorCodeForCj(errorCode, error) && !CreateCallErrorCodeForCj(errorCode, error) &&
407 !CreateDataErrorCodeForCj(errorCode, error) && !CreateNetworkSearchErrorCodeForCj(errorCode, error) &&
408 !CreateVcardErrorCodeForCj(errorCode, error) && !CreateSimErrorCodeForCj(errorCode, error) &&
409 !CreateSmsErrorCodeForCj(errorCode, error) && !CreateObserverErrorCodeForCj(errorCode, error)) {
410 error = JS_ERROR_TELEPHONY_UNKNOW_ERROR;
411 }
412 return error;
413 }
414
ConverErrorCodeWithPermissionForCj(int32_t errorCode)415 int32_t ConverErrorCodeWithPermissionForCj(int32_t errorCode)
416 {
417 if (errorCode == TELEPHONY_ERR_PERMISSION_ERR) {
418 return JS_ERROR_TELEPHONY_PERMISSION_DENIED;
419 }
420 return ConverErrorCodeForCj(errorCode);
421 }
422 } // namespace Telephony
423 } // namespace OHOS
424