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