• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "napi_sms.h"
17 
18 #include "delivery_callback.h"
19 #include "napi_mms.h"
20 #include "napi_send_recv_mms.h"
21 #include "send_callback.h"
22 #include "sms_mms_errors.h"
23 
24 #define PARAMETER_COUNT_3 3
25 #define PARAMETERS_INDEX_2 2
26 #define PARAMETERS_INDEX_3 3
27 
28 namespace OHOS {
29 namespace Telephony {
30 namespace {
31 const std::string g_slotIdStr = "slotId";
32 const std::string g_destinationHostStr = "destinationHost";
33 const std::string g_serviceCenterStr = "serviceCenter";
34 const std::string g_contentStr = "content";
35 const std::string g_destinationPortStr = "destinationPort";
36 const std::string g_sendCallbackStr = "sendCallback";
37 const std::string g_deliveryCallbackStr = "deliveryCallback";
38 const std::string g_isPersistStr = "isPersist";
39 static const int32_t DEFAULT_REF_COUNT = 1;
40 static bool g_validPort = false;
41 } // namespace
42 
SetPropertyArray(napi_env env,napi_value object,const std::string & name,std::vector<unsigned char> pdu)43 static void SetPropertyArray(napi_env env, napi_value object, const std::string &name, std::vector<unsigned char> pdu)
44 {
45     napi_value array = nullptr;
46     napi_create_array(env, &array);
47     size_t size = pdu.size();
48     for (size_t i = 0; i < size; i++) {
49         napi_value element = nullptr;
50         napi_create_int32(env, pdu[i], &element);
51         napi_set_element(env, array, i, element);
52     }
53     napi_set_named_property(env, object, name.c_str(), array);
54 }
55 
WrapSimMessageStatus(int32_t status)56 static int32_t WrapSimMessageStatus(int32_t status)
57 {
58     switch (status) {
59         case ShortMessage::SMS_SIM_MESSAGE_STATUS_UNREAD: {
60             return static_cast<int32_t>(ISmsServiceInterface::SimMessageStatus::SIM_MESSAGE_STATUS_UNREAD);
61         }
62         case ShortMessage::SMS_SIM_MESSAGE_STATUS_READ: {
63             return static_cast<int32_t>(ISmsServiceInterface::SimMessageStatus::SIM_MESSAGE_STATUS_READ);
64         }
65         case ShortMessage::SMS_SIM_MESSAGE_STATUS_UNSENT: {
66             return static_cast<int32_t>(ISmsServiceInterface::SimMessageStatus::SIM_MESSAGE_STATUS_UNSENT);
67         }
68         case ShortMessage::SMS_SIM_MESSAGE_STATUS_SENT: {
69             return static_cast<int32_t>(ISmsServiceInterface::SimMessageStatus::SIM_MESSAGE_STATUS_SENT);
70         }
71         default: {
72             return MESSAGE_UNKNOWN_STATUS;
73         }
74     }
75 }
76 
GetDefaultSmsSlotId()77 static int32_t GetDefaultSmsSlotId()
78 {
79     return DEFAULT_SIM_SLOT_ID;
80 }
81 
IsValidSlotId(int32_t slotId)82 static inline bool IsValidSlotId(int32_t slotId)
83 {
84     return ((slotId >= DEFAULT_SIM_SLOT_ID) && (slotId < SIM_SLOT_COUNT));
85 }
86 
MatchObjectProperty(napi_env env,napi_value object,std::initializer_list<std::pair<std::string,napi_valuetype>> pairList)87 static bool MatchObjectProperty(
88     napi_env env, napi_value object, std::initializer_list<std::pair<std::string, napi_valuetype>> pairList)
89 {
90     if (object == nullptr) {
91         TELEPHONY_LOGI("MatchObjectProperty object == nullptr");
92         return false;
93     }
94     for (auto beg = pairList.begin(); beg != pairList.end(); ++beg) {
95         if (!NapiUtil::HasNamedTypeProperty(env, object, beg->second, beg->first)) {
96             TELEPHONY_LOGI("MatchObjectProperty match failed!");
97             return false;
98         }
99     }
100     return true;
101 }
102 
Get64StringFromValue(napi_env env,napi_value value)103 static std::string Get64StringFromValue(napi_env env, napi_value value)
104 {
105     char msgChars[MAX_TEXT_SHORT_MESSAGE_LENGTH] = {0};
106     size_t strLength = 0;
107     napi_get_value_string_utf8(env, value, msgChars, MAX_TEXT_SHORT_MESSAGE_LENGTH, &strLength);
108     TELEPHONY_LOGI("Get64StringFromValue strLength = %{public}zu", strLength);
109     if (strLength > 0) {
110         return std::string(msgChars, 0, strLength);
111     } else {
112         return "";
113     }
114 }
115 
GetU16StrFromNapiValue(napi_env env,napi_value value)116 static std::u16string GetU16StrFromNapiValue(napi_env env, napi_value value)
117 {
118     char strChars[PROPERTY_NAME_SIZE] = {0};
119     size_t strLength = 0;
120     napi_get_value_string_utf8(env, value, strChars, BUFF_LENGTH, &strLength);
121     std::string str8(strChars, strLength);
122     return NapiUtil::ToUtf16(str8);
123 }
124 
InValidSlotIdOrInValidPort(int32_t slotId,uint16_t port)125 static bool InValidSlotIdOrInValidPort(int32_t slotId, uint16_t port)
126 {
127     if (!IsValidSlotId(slotId)) {
128         TELEPHONY_LOGE("InValidSlotIdOrInValidPort invalid slotid");
129         return true;
130     }
131 
132     if (!g_validPort) {
133         TELEPHONY_LOGE("InValidSlotIdOrInValidPort invalid port");
134         return true;
135     }
136     g_validPort = false;
137     return false;
138 }
139 
ActuallySendTextMessage(SendMessageContext & parameter,std::unique_ptr<SendCallback> sendCallback,std::unique_ptr<DeliveryCallback> deliveryCallback)140 static int32_t ActuallySendTextMessage(SendMessageContext &parameter, std::unique_ptr<SendCallback> sendCallback,
141     std::unique_ptr<DeliveryCallback> deliveryCallback)
142 {
143     if (!IsValidSlotId(parameter.slotId)) {
144         auto result = ISendShortMessageCallback::SmsSendResult::SEND_SMS_FAILURE_UNKNOWN;
145         sendCallback->OnSmsSendResult(result);
146         if (deliveryCallback != nullptr) {
147             deliveryCallback->OnSmsDeliveryResult(u"");
148         }
149         return TELEPHONY_ERR_SLOTID_INVALID;
150     }
151     return Singleton<SmsServiceManagerClient>::GetInstance().SendMessage(parameter.slotId,
152         parameter.destinationHost, parameter.serviceCenter, parameter.textContent, sendCallback.release(),
153         deliveryCallback.release());
154 }
155 
ActuallySendTextMessageWithoutSave(SendMessageContext & parameter,std::unique_ptr<SendCallback> sendCallback,std::unique_ptr<DeliveryCallback> deliveryCallback)156 static int32_t ActuallySendTextMessageWithoutSave(SendMessageContext &parameter,
157     std::unique_ptr<SendCallback> sendCallback, std::unique_ptr<DeliveryCallback> deliveryCallback)
158 {
159     if (!IsValidSlotId(parameter.slotId) || parameter.isPersist) {
160         auto result = ISendShortMessageCallback::SmsSendResult::SEND_SMS_FAILURE_UNKNOWN;
161         sendCallback->OnSmsSendResult(result);
162         if (deliveryCallback != nullptr) {
163             deliveryCallback->OnSmsDeliveryResult(u"");
164         }
165         return TELEPHONY_ERR_SLOTID_INVALID;
166     }
167     return Singleton<SmsServiceManagerClient>::GetInstance().SendMessageWithoutSave(parameter.slotId,
168         parameter.destinationHost, parameter.serviceCenter, parameter.textContent, sendCallback.release(),
169         deliveryCallback.release());
170 }
171 
ActuallySendDataMessage(SendMessageContext & parameter,std::unique_ptr<SendCallback> sendCallback,std::unique_ptr<DeliveryCallback> deliveryCallback)172 static int32_t ActuallySendDataMessage(SendMessageContext &parameter, std::unique_ptr<SendCallback> sendCallback,
173     std::unique_ptr<DeliveryCallback> deliveryCallback)
174 {
175     if (InValidSlotIdOrInValidPort(parameter.slotId, parameter.destinationPort)) {
176         auto result = ISendShortMessageCallback::SmsSendResult::SEND_SMS_FAILURE_UNKNOWN;
177         sendCallback->OnSmsSendResult(result);
178         if (deliveryCallback != nullptr) {
179             deliveryCallback->OnSmsDeliveryResult(u"");
180         }
181         return TELEPHONY_ERR_SLOTID_INVALID;
182     }
183     if (parameter.rawDataContent.size() > 0) {
184         uint16_t arrayLength = static_cast<uint16_t>(parameter.rawDataContent.size());
185         return Singleton<SmsServiceManagerClient>::GetInstance().SendMessage(parameter.slotId,
186             parameter.destinationHost, parameter.serviceCenter, parameter.destinationPort, &parameter.rawDataContent[0],
187             arrayLength, sendCallback.release(), deliveryCallback.release());
188     }
189     return TELEPHONY_ERR_ARGUMENT_INVALID;
190 }
191 
ActuallySendMessage(napi_env env,SendMessageContext & parameter)192 static int32_t ActuallySendMessage(napi_env env, SendMessageContext &parameter)
193 {
194     bool hasSendCallback = parameter.sendCallbackRef != nullptr;
195     std::unique_ptr<SendCallback> sendCallback =
196         std::make_unique<SendCallback>(hasSendCallback, env, parameter.thisVarRef, parameter.sendCallbackRef);
197     if (sendCallback == nullptr) {
198         TELEPHONY_LOGE("ActuallySendMessage sendCallback == nullptr");
199         return TELEPHONY_ERR_LOCAL_PTR_NULL;
200     }
201     bool hasDeliveryCallback = parameter.deliveryCallbackRef != nullptr;
202     std::unique_ptr<DeliveryCallback> deliveryCallback = std::make_unique<DeliveryCallback>(
203         hasDeliveryCallback, env, parameter.thisVarRef, parameter.deliveryCallbackRef);
204     if (deliveryCallback == nullptr) {
205         TELEPHONY_LOGE("ActuallySendMessage deliveryCallback == nullptr");
206         return TELEPHONY_ERR_LOCAL_PTR_NULL;
207     }
208     if (parameter.messageType == TEXT_MESSAGE_PARAMETER_MATCH && parameter.isPersist) {
209         if (hasDeliveryCallback) {
210             return ActuallySendTextMessage(parameter, std::move(sendCallback), std::move(deliveryCallback));
211         }
212         return ActuallySendTextMessage(parameter, std::move(sendCallback), nullptr);
213     } else if (parameter.messageType == TEXT_MESSAGE_PARAMETER_MATCH && !parameter.isPersist) {
214         if (hasDeliveryCallback) {
215             return ActuallySendTextMessageWithoutSave(parameter, std::move(sendCallback), std::move(deliveryCallback));
216         }
217         return ActuallySendTextMessageWithoutSave(parameter, std::move(sendCallback), nullptr);
218     } else if (parameter.messageType == RAW_DATA_MESSAGE_PARAMETER_MATCH) {
219         if (hasDeliveryCallback) {
220             return ActuallySendDataMessage(parameter, std::move(sendCallback), std::move(deliveryCallback));
221         }
222         return ActuallySendDataMessage(parameter, std::move(sendCallback), nullptr);
223     }
224     return TELEPHONY_ERR_ARGUMENT_INVALID;
225 }
226 
NativeSendMessage(napi_env env,void * data)227 static void NativeSendMessage(napi_env env, void *data)
228 {
229     auto asyncContext = static_cast<SendMessageContext *>(data);
230     if (asyncContext == nullptr) {
231         TELEPHONY_LOGE("NativeSendMessage SendMessageContext is nullptr.");
232         return;
233     }
234     asyncContext->errorCode = ActuallySendMessage(env, *asyncContext);
235     if (asyncContext->errorCode == TELEPHONY_ERR_SUCCESS) {
236         asyncContext->resolved = true;
237     }
238     TELEPHONY_LOGI("NativeSendMessage end resolved = %{public}d", asyncContext->resolved);
239 }
240 
SendMessageCallback(napi_env env,napi_status status,void * data)241 static void SendMessageCallback(napi_env env, napi_status status, void *data)
242 {
243     auto asyncContext = static_cast<SendMessageContext *>(data);
244     napi_value callbackValue = nullptr;
245     if (asyncContext->resolved) {
246         napi_get_undefined(env, &callbackValue);
247     } else {
248         JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
249             asyncContext->errorCode, "sendMessage", "ohos.permission.SEND_MESSAGES");
250         TELEPHONY_LOGI("asyncContext->errorCode:%{public}d.", error.errorCode);
251         callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
252     }
253     if (asyncContext->destinationHost.capacity() != 0) {
254         asyncContext->destinationHost = u"";
255     }
256     if (asyncContext->serviceCenter.capacity() != 0) {
257         asyncContext->serviceCenter = u"";
258     }
259     if (asyncContext->textContent.capacity() != 0) {
260         asyncContext->textContent = u"";
261     }
262     if (asyncContext->messageType == RAW_DATA_MESSAGE_PARAMETER_MATCH) {
263         std::vector<unsigned char>().swap(asyncContext->rawDataContent);
264     }
265     NapiUtil::Handle1ValueCallback(env, asyncContext, callbackValue);
266 }
267 
MatchSendMessageParameters(napi_env env,napi_value parameters[],size_t parameterCount)268 static int32_t MatchSendMessageParameters(napi_env env, napi_value parameters[], size_t parameterCount)
269 {
270     bool match = (parameterCount == 1) && NapiUtil::MatchParameters(env, parameters, {napi_object});
271     if (!match) {
272         return MESSAGE_PARAMETER_NOT_MATCH;
273     }
274     napi_value object = parameters[0];
275     bool hasSlotId = NapiUtil::HasNamedTypeProperty(env, object, napi_number, g_slotIdStr);
276     bool hasDestinationHost = NapiUtil::HasNamedTypeProperty(env, object, napi_string, g_destinationHostStr);
277     bool hasContent = NapiUtil::HasNamedProperty(env, object, g_contentStr);
278     bool hasNecessaryParameter = hasSlotId && hasDestinationHost && hasContent;
279     if (!hasNecessaryParameter) {
280         return MESSAGE_PARAMETER_NOT_MATCH;
281     }
282     napi_value contentValue = NapiUtil::GetNamedProperty(env, object, g_contentStr);
283     bool contentIsStr = NapiUtil::MatchValueType(env, contentValue, napi_string);
284     bool contentIsObj = NapiUtil::MatchValueType(env, contentValue, napi_object);
285     bool contentIsArray = false;
286     if (contentIsObj) {
287         napi_is_array(env, contentValue, &contentIsArray);
288     }
289     bool serviceCenterTypeMatch = NapiUtil::MatchOptionPropertyType(env, object, napi_string, g_serviceCenterStr);
290     bool sendCallbackTypeMatch = NapiUtil::MatchOptionPropertyType(env, object, napi_function, g_sendCallbackStr);
291     bool deliveryCallbackTypeMatch =
292         NapiUtil::MatchOptionPropertyType(env, object, napi_function, g_deliveryCallbackStr);
293     bool destindationPortMatch = NapiUtil::MatchOptionPropertyType(env, object, napi_number, g_destinationPortStr);
294     if (contentIsStr && serviceCenterTypeMatch && sendCallbackTypeMatch && deliveryCallbackTypeMatch) {
295         return TEXT_MESSAGE_PARAMETER_MATCH;
296     } else if (contentIsArray && serviceCenterTypeMatch && sendCallbackTypeMatch && deliveryCallbackTypeMatch &&
297         destindationPortMatch) {
298         return RAW_DATA_MESSAGE_PARAMETER_MATCH;
299     }
300     return MESSAGE_PARAMETER_NOT_MATCH;
301 }
302 
GetOptionalProperty(napi_env env,napi_value object,SendMessageContext & context)303 static void GetOptionalProperty(napi_env env, napi_value object, SendMessageContext &context)
304 {
305     if (NapiUtil::HasNamedProperty(env, object, g_serviceCenterStr)) {
306         napi_value serviceCenterValue = NapiUtil::GetNamedProperty(env, object, g_serviceCenterStr);
307         context.serviceCenter = GetU16StrFromNapiValue(env, serviceCenterValue);
308     }
309     if (NapiUtil::HasNamedProperty(env, object, g_sendCallbackStr)) {
310         napi_value sendCallbackValue = NapiUtil::GetNamedProperty(env, object, g_sendCallbackStr);
311         napi_create_reference(env, sendCallbackValue, DEFAULT_REF_COUNT, &context.sendCallbackRef);
312     }
313     if (NapiUtil::HasNamedProperty(env, object, g_deliveryCallbackStr)) {
314         napi_value deliveryCallbackValue = NapiUtil::GetNamedProperty(env, object, g_deliveryCallbackStr);
315         napi_create_reference(env, deliveryCallbackValue, DEFAULT_REF_COUNT, &context.deliveryCallbackRef);
316     }
317     if (NapiUtil::HasNamedProperty(env, object, g_isPersistStr)) {
318         napi_value isPersistValue = nullptr;
319         napi_get_named_property(env, object, g_isPersistStr.data(), &isPersistValue);
320         napi_get_value_bool(env, isPersistValue, &context.isPersist);
321     }
322 }
323 
ParseMessageParameter(int32_t messageMatchResult,napi_env env,napi_value object,SendMessageContext & context)324 static void ParseMessageParameter(
325     int32_t messageMatchResult, napi_env env, napi_value object, SendMessageContext &context)
326 {
327     context.messageType = messageMatchResult;
328     context.slotId = GetDefaultSmsSlotId();
329     napi_value slotIdValue = nullptr;
330     napi_get_named_property(env, object, g_slotIdStr.data(), &slotIdValue);
331     napi_get_value_int32(env, slotIdValue, &context.slotId);
332     napi_value destinationHostValue = NapiUtil::GetNamedProperty(env, object, g_destinationHostStr);
333     context.destinationHost = GetU16StrFromNapiValue(env, destinationHostValue);
334     GetOptionalProperty(env, object, context);
335     napi_value contentValue = NapiUtil::GetNamedProperty(env, object, g_contentStr);
336     if (messageMatchResult == TEXT_MESSAGE_PARAMETER_MATCH) {
337         char contentChars[MAX_TEXT_SHORT_MESSAGE_LENGTH] = {0};
338         size_t contentLength = 0;
339         napi_get_value_string_utf8(env, contentValue, contentChars, MAX_TEXT_SHORT_MESSAGE_LENGTH, &contentLength);
340         std::string text(contentChars, contentLength);
341         context.textContent = NapiUtil::ToUtf16(text);
342     }
343     if (messageMatchResult == RAW_DATA_MESSAGE_PARAMETER_MATCH) {
344         int32_t destinationPort = INVALID_PORT;
345         napi_value destinationPortValue = nullptr;
346         napi_get_named_property(env, object, g_destinationPortStr.data(), &destinationPortValue);
347         napi_get_value_int32(env, destinationPortValue, &destinationPort);
348         TELEPHONY_LOGI("SendMessage destinationPort: %{private}d", destinationPort);
349         if (destinationPort >= MIN_PORT && destinationPort <= MAX_PORT) {
350             g_validPort = true;
351         }
352         context.destinationPort = static_cast<uint16_t>(destinationPort);
353         napi_value elementValue = nullptr;
354         int32_t element = 0;
355         uint32_t valueArraySize = 0;
356         napi_get_array_length(env, contentValue, &valueArraySize);
357         auto arraySize = static_cast<int32_t>(valueArraySize);
358         for (int32_t i = 0; i < arraySize; i++) {
359             napi_get_element(env, contentValue, i, &elementValue);
360             napi_get_value_int32(env, elementValue, &element);
361             context.rawDataContent.push_back((uint8_t)element);
362         }
363     }
364 }
365 
SendMessage(napi_env env,napi_callback_info info)366 static napi_value SendMessage(napi_env env, napi_callback_info info)
367 {
368     size_t parameterCount = 1;
369     napi_value parameters[1] = {0};
370     napi_value thisVar = nullptr;
371     void *data = nullptr;
372 
373     napi_get_cb_info(env, info, &parameterCount, parameters, &thisVar, &data);
374     int32_t messageMatchResult = MatchSendMessageParameters(env, parameters, parameterCount);
375     if (messageMatchResult == MESSAGE_PARAMETER_NOT_MATCH) {
376         TELEPHONY_LOGE("SendMessage parameter matching failed.");
377         NapiUtil::ThrowParameterError(env);
378         return nullptr;
379     }
380     auto asyncContext = std::make_unique<SendMessageContext>().release();
381     if (asyncContext == nullptr) {
382         TELEPHONY_LOGE("SendMessage SendMessageContext is nullptr.");
383         NapiUtil::ThrowParameterError(env);
384         return nullptr;
385     }
386     ParseMessageParameter(messageMatchResult, env, parameters[0], *asyncContext);
387     napi_create_reference(env, thisVar, DEFAULT_REF_COUNT, &asyncContext->thisVarRef);
388     napi_value resourceName = nullptr;
389     napi_create_string_utf8(env, "SendMessage", NAPI_AUTO_LENGTH, &resourceName);
390     napi_create_async_work(env, nullptr, resourceName, NativeSendMessage, SendMessageCallback,
391         (void *)asyncContext, &(asyncContext->work));
392     napi_queue_async_work_with_qos(env, asyncContext->work, napi_qos_default);
393     return NapiUtil::CreateUndefined(env);
394 }
395 
MatchSendShortMessageParameters(napi_env env,napi_value parameters[],size_t parameterCount)396 static int32_t MatchSendShortMessageParameters(napi_env env, napi_value parameters[], size_t parameterCount)
397 {
398     bool match = false;
399     switch (parameterCount) {
400         case ONE_PARAMETER: {
401             match = NapiUtil::MatchParameters(env, parameters, { napi_object });
402             break;
403         }
404         case TWO_PARAMETERS: {
405             match = NapiUtil::MatchParameters(env, parameters, { napi_object, napi_function });
406             break;
407         }
408         default:
409             break;
410     }
411     if (!match) {
412         return MESSAGE_PARAMETER_NOT_MATCH;
413     }
414 
415     napi_value object = parameters[0];
416     bool hasSlotId = NapiUtil::HasNamedTypeProperty(env, object, napi_number, g_slotIdStr);
417     bool hasDestinationHost = NapiUtil::HasNamedTypeProperty(env, object, napi_string, g_destinationHostStr);
418     bool hasContent = NapiUtil::HasNamedProperty(env, object, g_contentStr);
419     bool hasNecessaryParameter = hasSlotId && hasDestinationHost && hasContent;
420     if (!hasNecessaryParameter) {
421         return MESSAGE_PARAMETER_NOT_MATCH;
422     }
423     napi_value contentValue = NapiUtil::GetNamedProperty(env, object, g_contentStr);
424     bool contentIsStr = NapiUtil::MatchValueType(env, contentValue, napi_string);
425     bool contentIsObj = NapiUtil::MatchValueType(env, contentValue, napi_object);
426     bool contentIsArray = false;
427     if (contentIsObj) {
428         napi_is_array(env, contentValue, &contentIsArray);
429     }
430     bool serviceCenterTypeMatch = NapiUtil::MatchOptionPropertyType(env, object, napi_string, g_serviceCenterStr);
431     bool sendCallbackTypeMatch = NapiUtil::MatchOptionPropertyType(env, object, napi_function, g_sendCallbackStr);
432     bool deliveryCallbackTypeMatch =
433         NapiUtil::MatchOptionPropertyType(env, object, napi_function, g_deliveryCallbackStr);
434     bool destindationPortMatch = NapiUtil::MatchOptionPropertyType(env, object, napi_number, g_destinationPortStr);
435     if (contentIsStr && serviceCenterTypeMatch && sendCallbackTypeMatch && deliveryCallbackTypeMatch) {
436         return TEXT_MESSAGE_PARAMETER_MATCH;
437     } else if (contentIsArray && serviceCenterTypeMatch && sendCallbackTypeMatch && deliveryCallbackTypeMatch &&
438                destindationPortMatch) {
439         return RAW_DATA_MESSAGE_PARAMETER_MATCH;
440     }
441     return MESSAGE_PARAMETER_NOT_MATCH;
442 }
443 
SendShortMessage(napi_env env,napi_callback_info info)444 static napi_value SendShortMessage(napi_env env, napi_callback_info info)
445 {
446     size_t parameterCount = TWO_PARAMETERS;
447     napi_value parameters[TWO_PARAMETERS] = { 0 };
448     napi_value thisVar = nullptr;
449     void *data = nullptr;
450 
451     napi_get_cb_info(env, info, &parameterCount, parameters, &thisVar, &data);
452     int32_t messageMatchResult = MatchSendShortMessageParameters(env, parameters, parameterCount);
453     if (messageMatchResult == MESSAGE_PARAMETER_NOT_MATCH) {
454         TELEPHONY_LOGE("SendShortMessage parameter matching failed.");
455         NapiUtil::ThrowParameterError(env);
456         return nullptr;
457     }
458     auto asyncContext = std::make_unique<SendMessageContext>().release();
459     if (asyncContext == nullptr) {
460         TELEPHONY_LOGE("SendMessage SendMessageContext is nullptr.");
461         NapiUtil::ThrowParameterError(env);
462         return nullptr;
463     }
464     ParseMessageParameter(messageMatchResult, env, parameters[0], *asyncContext);
465     napi_create_reference(env, thisVar, DEFAULT_REF_COUNT, &asyncContext->thisVarRef);
466 
467     if (parameterCount == TWO_PARAMETERS) {
468         napi_create_reference(env, parameters[1], DEFAULT_REF_COUNT, &asyncContext->callbackRef);
469     }
470     napi_value result =
471         NapiUtil::HandleAsyncWork(env, asyncContext, "SendShortMessage", NativeSendMessage, SendMessageCallback);
472     return result;
473 }
474 
NativeCreateMessage(napi_env env,void * data)475 static void NativeCreateMessage(napi_env env, void *data)
476 {
477     auto asyncContext = static_cast<CreateMessageContext *>(data);
478     if (asyncContext->specification.empty() || asyncContext->pdu.empty()) {
479         asyncContext->errorCode = TELEPHONY_ERR_ARGUMENT_INVALID;
480         return;
481     }
482     std::u16string specification16 = NapiUtil::ToUtf16(asyncContext->specification);
483     auto shortMessageObj = new ShortMessage();
484     asyncContext->errorCode = ShortMessage::CreateMessage(asyncContext->pdu, specification16, *shortMessageObj);
485     if (asyncContext->errorCode == TELEPHONY_ERR_SUCCESS) {
486         asyncContext->resolved = true;
487         asyncContext->shortMessage = shortMessageObj;
488     } else {
489         TELEPHONY_LOGI("NativeCreateMessage CreateMessage faied");
490     }
491 }
492 
CreateShortMessageValue(napi_env env,const ShortMessage & shortMessage)493 static napi_value CreateShortMessageValue(napi_env env, const ShortMessage &shortMessage)
494 {
495     napi_value object = nullptr;
496     napi_create_object(env, &object);
497     NapiUtil::SetPropertyStringUtf8(
498         env, object, "visibleMessageBody", NapiUtil::ToUtf8(shortMessage.GetVisibleMessageBody()));
499     NapiUtil::SetPropertyStringUtf8(
500         env, object, "visibleRawAddress", NapiUtil::ToUtf8(shortMessage.GetVisibleRawAddress()));
501     NapiUtil::SetPropertyInt32(env, object, "messageClass", shortMessage.GetMessageClass());
502     NapiUtil::SetPropertyInt32(env, object, "protocolId", shortMessage.GetProtocolId());
503     std::u16string smscAddress;
504     shortMessage.GetScAddress(smscAddress);
505     NapiUtil::SetPropertyStringUtf8(env, object, "scAddress", NapiUtil::ToUtf8(smscAddress));
506     NapiUtil::SetPropertyInt64(env, object, "scTimestamp", shortMessage.GetScTimestamp());
507     NapiUtil::SetPropertyBoolean(env, object, "isReplaceMessage", shortMessage.IsReplaceMessage());
508     NapiUtil::SetPropertyBoolean(env, object, "hasReplyPath", shortMessage.HasReplyPath());
509     SetPropertyArray(env, object, "pdu", shortMessage.GetPdu());
510     NapiUtil::SetPropertyInt32(env, object, "status", shortMessage.GetStatus());
511     NapiUtil::SetPropertyBoolean(env, object, "isSmsStatusReportMessage", shortMessage.IsSmsStatusReportMessage());
512     return object;
513 }
514 
CreateMessageCallback(napi_env env,napi_status status,void * data)515 static void CreateMessageCallback(napi_env env, napi_status status, void *data)
516 {
517     auto asyncContext = static_cast<CreateMessageContext *>(data);
518     if (asyncContext == nullptr) {
519         TELEPHONY_LOGE("asyncContext is nullptr!");
520         return;
521     }
522     napi_value callbackValue = nullptr;
523     if (status == napi_ok) {
524         if (asyncContext->resolved) {
525             if (asyncContext->shortMessage != nullptr) {
526                 callbackValue = CreateShortMessageValue(env, *(asyncContext->shortMessage));
527                 delete asyncContext->shortMessage;
528                 asyncContext->shortMessage = nullptr;
529             }
530         } else {
531             JsError error = NapiUtil::ConverErrorMessageForJs(asyncContext->errorCode);
532             callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
533         }
534     } else {
535         callbackValue = NapiUtil::CreateErrorMessage(
536             env, "create message error,cause napi_status = " + std::to_string(status));
537     }
538     if (asyncContext->pdu.capacity() != 0) {
539         std::vector<unsigned char>().swap(asyncContext->pdu);
540     }
541     if (asyncContext->specification.capacity() != 0) {
542         std::string().swap(asyncContext->specification);
543     }
544     NapiUtil::Handle2ValueCallback(env, asyncContext, callbackValue);
545 }
546 
MatchCreateMessageParameter(napi_env env,const napi_value parameters[],size_t parameterCount)547 static bool MatchCreateMessageParameter(napi_env env, const napi_value parameters[], size_t parameterCount)
548 {
549     bool typeMatch = false;
550     switch (parameterCount) {
551         case TWO_PARAMETERS: {
552             typeMatch = NapiUtil::MatchParameters(env, parameters, {napi_object, napi_string});
553             break;
554         }
555         case THREE_PARAMETERS:
556             typeMatch = NapiUtil::MatchParameters(env, parameters, {napi_object, napi_string, napi_function});
557             break;
558         default: {
559             return false;
560         }
561     }
562     if (typeMatch) {
563         bool isArray = false;
564         napi_is_array(env, parameters[0], &isArray);
565         return isArray;
566     }
567     return false;
568 }
569 
CreateMessage(napi_env env,napi_callback_info info)570 static napi_value CreateMessage(napi_env env, napi_callback_info info)
571 {
572     size_t parameterCount = THREE_PARAMETERS;
573     napi_value parameters[THREE_PARAMETERS] = {0};
574     napi_value thisVar = nullptr;
575     void *data = nullptr;
576 
577     napi_get_cb_info(env, info, &parameterCount, parameters, &thisVar, &data);
578     if (!MatchCreateMessageParameter(env, parameters, parameterCount)) {
579         TELEPHONY_LOGE("CreateMessage parameter matching failed.");
580         NapiUtil::ThrowParameterError(env);
581         return nullptr;
582     }
583     auto asyncContext = std::make_unique<CreateMessageContext>().release();
584     if (asyncContext == nullptr) {
585         TELEPHONY_LOGE("CreateMessage CreateMessageContext is nullptr.");
586         NapiUtil::ThrowParameterError(env);
587         return nullptr;
588     }
589     asyncContext->specification = Get64StringFromValue(env, parameters[1]);
590     TELEPHONY_LOGI("CreateMessage specification = %s", asyncContext->specification.c_str());
591     uint32_t arrayLength = 0;
592     napi_get_array_length(env, parameters[0], &arrayLength);
593     napi_value elementValue = nullptr;
594     int32_t element = 0;
595     for (uint32_t i = 0; i < arrayLength; i++) {
596         napi_get_element(env, parameters[0], i, &elementValue);
597         napi_get_value_int32(env, elementValue, &element);
598         asyncContext->pdu.push_back((unsigned char)element);
599     }
600     TELEPHONY_LOGI("CreateMessage pdu size = %{public}zu", asyncContext->pdu.size());
601     if (parameterCount == THREE_PARAMETERS) {
602         napi_create_reference(env, parameters[PARAMETERS_INDEX_2], DEFAULT_REF_COUNT, &(asyncContext->callbackRef));
603     }
604     return NapiUtil ::HandleAsyncWork(
605         env, asyncContext, "CreateMessage", NativeCreateMessage, CreateMessageCallback);
606 }
607 
MatchSetDefaultSmsSlotIdParameters(napi_env env,const napi_value parameters[],size_t parameterCount)608 static bool MatchSetDefaultSmsSlotIdParameters(napi_env env, const napi_value parameters[], size_t parameterCount)
609 {
610     switch (parameterCount) {
611         case ONE_PARAMETER: {
612             return NapiUtil::MatchParameters(env, parameters, {napi_number});
613         }
614         case TWO_PARAMETERS:
615             return NapiUtil::MatchParameters(env, parameters, {napi_number, napi_function});
616         default: {
617             return false;
618         }
619     }
620 }
621 
NativeSetDefaultSmsSlotId(napi_env env,void * data)622 static void NativeSetDefaultSmsSlotId(napi_env env, void *data)
623 {
624     auto context = static_cast<SetDefaultSmsSlotIdContext *>(data);
625     if (!IsValidSlotId(context->slotId) && (context->slotId != DEFAULT_SIM_SLOT_ID_REMOVE)) {
626         TELEPHONY_LOGE("NativeSetDefaultSmsSlotId slotId is invalid");
627         context->errorCode = ERROR_SLOT_ID_INVALID;
628         return;
629     }
630     context->errorCode = Singleton<SmsServiceManagerClient>::GetInstance().SetDefaultSmsSlotId(context->slotId);
631     if (context->errorCode == TELEPHONY_ERR_SUCCESS) {
632         context->resolved = true;
633     }
634     TELEPHONY_LOGI("NativeSetDefaultSmsSlotId end resolved = %{public}d", context->resolved);
635 }
636 
SetDefaultSmsSlotIdCallback(napi_env env,napi_status status,void * data)637 static void SetDefaultSmsSlotIdCallback(napi_env env, napi_status status, void *data)
638 {
639     auto context = static_cast<SetDefaultSmsSlotIdContext *>(data);
640     TELEPHONY_LOGI("SetDefaultSmsSlotIdCallback status = %{public}d", status);
641     napi_value callbackValue = nullptr;
642     if (context->resolved) {
643         napi_get_undefined(env, &callbackValue);
644     } else {
645         JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
646             context->errorCode, "setDefaultSmsSlotId", "ohos.permission.SET_TELEPHONY_STATE");
647         callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
648     }
649     NapiUtil::Handle1ValueCallback(env, context, callbackValue);
650 }
651 
SetDefaultSmsSlotId(napi_env env,napi_callback_info info)652 static napi_value SetDefaultSmsSlotId(napi_env env, napi_callback_info info)
653 {
654     size_t parameterCount = TWO_PARAMETERS;
655     napi_value parameters[TWO_PARAMETERS] = {0};
656     napi_value thisVar = nullptr;
657     void *data = nullptr;
658 
659     napi_get_cb_info(env, info, &parameterCount, parameters, &thisVar, &data);
660     if (!MatchSetDefaultSmsSlotIdParameters(env, parameters, parameterCount)) {
661         TELEPHONY_LOGE("SetDefaultSmsSlotId parameter matching failed.");
662         NapiUtil::ThrowParameterError(env);
663         return nullptr;
664     }
665     auto context = std::make_unique<SetDefaultSmsSlotIdContext>().release();
666     if (context == nullptr) {
667         TELEPHONY_LOGE("SetDefaultSmsSlotId SetDefaultSmsSlotIdContext is nullptr.");
668         NapiUtil::ThrowParameterError(env);
669         return nullptr;
670     }
671     napi_get_value_int32(env, parameters[0], &context->slotId);
672     if (parameterCount == TWO_PARAMETERS) {
673         napi_create_reference(env, parameters[1], DEFAULT_REF_COUNT, &context->callbackRef);
674     }
675     napi_value result = NapiUtil::HandleAsyncWork(
676         env, context, "SetDefaultSmsSlotId", NativeSetDefaultSmsSlotId, SetDefaultSmsSlotIdCallback);
677     return result;
678 }
679 
MatchGetDefaultSmsSlotIdParameters(napi_env env,const napi_value parameters[],size_t parameterCount)680 static bool MatchGetDefaultSmsSlotIdParameters(napi_env env, const napi_value parameters[], size_t parameterCount)
681 {
682     switch (parameterCount) {
683         case NONE_PARAMETER: {
684             return true;
685         }
686         case ONE_PARAMETER: {
687             return NapiUtil::MatchParameters(env, parameters, {napi_function});
688         }
689         default: {
690             return false;
691         }
692     }
693 }
694 
NativeGetDefaultSmsSlotId(napi_env env,void * data)695 static void NativeGetDefaultSmsSlotId(napi_env env, void *data)
696 {
697     auto context = static_cast<GetDefaultSmsSlotIdContext *>(data);
698     context->defaultSmsSlotId = Singleton<SmsServiceManagerClient>::GetInstance().GetDefaultSmsSlotId();
699     TELEPHONY_LOGI("NativeGetDefaultSmsSlotId defaultSmsSlotId  = %{public}d", context->defaultSmsSlotId);
700     if (context->defaultSmsSlotId >= SIM_SLOT_0) {
701         context->resolved = true;
702     } else {
703         context->resolved = false;
704     }
705 }
706 
GetDefaultSmsSlotIdCallback(napi_env env,napi_status status,void * data)707 static void GetDefaultSmsSlotIdCallback(napi_env env, napi_status status, void *data)
708 {
709     auto context = static_cast<GetDefaultSmsSlotIdContext *>(data);
710     napi_value callbackValue = nullptr;
711     if (status == napi_ok) {
712         if (context->resolved) {
713             napi_create_int32(env, context->defaultSmsSlotId, &callbackValue);
714         } else {
715             callbackValue = NapiUtil::CreateErrorMessage(env, "get default sms slot id error");
716         }
717     } else {
718         callbackValue = NapiUtil::CreateErrorMessage(
719             env, "get default sms slot id error cause napi_status = " + std::to_string(status));
720     }
721     NapiUtil::Handle2ValueCallback(env, context, callbackValue);
722 }
723 
GetDefaultSmsSlotId(napi_env env,napi_callback_info info)724 static napi_value GetDefaultSmsSlotId(napi_env env, napi_callback_info info)
725 {
726     size_t parameterCount = 1;
727     napi_value parameters[1] = {0};
728     napi_value thisVar = nullptr;
729     void *data = nullptr;
730 
731     napi_get_cb_info(env, info, &parameterCount, parameters, &thisVar, &data);
732     NAPI_ASSERT(env, MatchGetDefaultSmsSlotIdParameters(env, parameters, parameterCount), "type mismatch");
733     auto context = std::make_unique<GetDefaultSmsSlotIdContext>().release();
734     if (context == nullptr) {
735         std::string errorCode = std::to_string(napi_generic_failure);
736         std::string errorMessage = "error at GetDefaultSmsSlotIdContext is nullptr";
737         NAPI_CALL(env, napi_throw_error(env, errorCode.c_str(), errorMessage.c_str()));
738         return nullptr;
739     }
740     napi_status statusValue = napi_get_value_int32(env, parameters[0], &context->defaultSmsSlotId);
741     TELEPHONY_LOGI("GetDefaultSmsSlotId statusValue = %{private}d", statusValue);
742     if (parameterCount == 1) {
743         napi_create_reference(env, parameters[0], DEFAULT_REF_COUNT, &context->callbackRef);
744     }
745     return NapiUtil::HandleAsyncWork(
746         env, context, "SetDefaultSmsSlotId", NativeGetDefaultSmsSlotId, GetDefaultSmsSlotIdCallback);
747 }
748 
NativeGetDefaultSmsSimId(napi_env env,void * data)749 static void NativeGetDefaultSmsSimId(napi_env env, void *data)
750 {
751     auto context = static_cast<GetDefaultSmsSimIdContext *>(data);
752     int32_t simId = 0;
753     context->errorCode = Singleton<SmsServiceManagerClient>::GetInstance().GetDefaultSmsSimId(simId);
754     TELEPHONY_LOGI("result = %{public}d", context->errorCode);
755     if (context->errorCode == TELEPHONY_ERR_SUCCESS) {
756         context->defaultSmsSimId = simId;
757         context->resolved = true;
758     } else {
759         context->resolved = false;
760     }
761 }
762 
GetDefaultSmsSimIdCallback(napi_env env,napi_status status,void * data)763 static void GetDefaultSmsSimIdCallback(napi_env env, napi_status status, void *data)
764 {
765     auto context = static_cast<GetDefaultSmsSimIdContext *>(data);
766     napi_value callbackValue = nullptr;
767     if (status == napi_ok) {
768         if (context->resolved) {
769             napi_create_int32(env, context->defaultSmsSimId, &callbackValue);
770         } else {
771             JsError error = NapiUtil::ConverErrorMessageForJs(context->errorCode);
772             callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
773         }
774     } else {
775         callbackValue = NapiUtil::CreateErrorMessage(
776             env, "get default sms sim id error cause napi_status = " + std::to_string(status));
777     }
778     NapiUtil::Handle2ValueCallback(env, context, callbackValue);
779 }
780 
GetDefaultSmsSimId(napi_env env,napi_callback_info info)781 static napi_value GetDefaultSmsSimId(napi_env env, napi_callback_info info)
782 {
783     size_t parameterCount = 1;
784     napi_value parameters[1] = { 0 };
785     napi_value thisVar = nullptr;
786     void *data = nullptr;
787 
788     napi_get_cb_info(env, info, &parameterCount, parameters, &thisVar, &data);
789     if (!MatchGetDefaultSmsSlotIdParameters(env, parameters, parameterCount)) {
790         NapiUtil::ThrowParameterError(env);
791         return nullptr;
792     }
793     auto context = std::make_unique<GetDefaultSmsSimIdContext>().release();
794     if (context == nullptr) {
795         NapiUtil::ThrowParameterError(env);
796         return nullptr;
797     }
798     napi_status statusValue = napi_get_value_int32(env, parameters[0], &context->defaultSmsSimId);
799     TELEPHONY_LOGI("statusValue = %{private}d", statusValue);
800     if (parameterCount == 1) {
801         napi_create_reference(env, parameters[0], DEFAULT_REF_COUNT, &context->callbackRef);
802     }
803     return NapiUtil::HandleAsyncWork(
804         env, context, "GetDefaultSmsSimId", NativeGetDefaultSmsSimId, GetDefaultSmsSimIdCallback);
805 }
806 
MatchSetSmscAddrParameters(napi_env env,const napi_value parameters[],size_t parameterCount)807 static bool MatchSetSmscAddrParameters(napi_env env, const napi_value parameters[], size_t parameterCount)
808 {
809     switch (parameterCount) {
810         case TWO_PARAMETERS: {
811             return NapiUtil::MatchParameters(env, parameters, {napi_number, napi_string});
812         }
813         case THREE_PARAMETERS: {
814             return NapiUtil::MatchParameters(env, parameters, {napi_number, napi_string, napi_function});
815         }
816         default: {
817             return false;
818         }
819     }
820 }
821 
NativeSetSmscAddr(napi_env env,void * data)822 static void NativeSetSmscAddr(napi_env env, void *data)
823 {
824     auto context = static_cast<SetSmscAddrContext *>(data);
825     if (!IsValidSlotId(context->slotId)) {
826         TELEPHONY_LOGE("NativeSetSmscAddr slotId is invalid");
827         context->errorCode = ERROR_SLOT_ID_INVALID;
828         return;
829     }
830     context->errorCode = Singleton<SmsServiceManagerClient>::GetInstance().SetScAddress(context->slotId,
831         NapiUtil::ToUtf16(context->smscAddr));
832     if (context->errorCode == TELEPHONY_ERR_SUCCESS) {
833         context->resolved = true;
834     }
835     TELEPHONY_LOGI("NativeSetSmscAddr resolved = %{public}d", context->resolved);
836 }
837 
SetSmscAddrCallback(napi_env env,napi_status status,void * data)838 static void SetSmscAddrCallback(napi_env env, napi_status status, void *data)
839 {
840     auto context = static_cast<SetSmscAddrContext *>(data);
841     napi_value callbackValue = nullptr;
842     if (context->resolved) {
843         napi_get_undefined(env, &callbackValue);
844     } else {
845         JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
846             context->errorCode, "setSmscAddr", "ohos.permission.SET_TELEPHONY_STATE");
847         callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
848     }
849     if (context->smscAddr.capacity() != 0) {
850         std::string().swap(context->smscAddr);
851     }
852     NapiUtil::Handle1ValueCallback(env, context, callbackValue);
853 }
854 
SetSmscAddr(napi_env env,napi_callback_info info)855 static napi_value SetSmscAddr(napi_env env, napi_callback_info info)
856 {
857     size_t parameterCount = THREE_PARAMETERS;
858     napi_value parameters[THREE_PARAMETERS] = {0};
859     napi_value thisVar = nullptr;
860     void *data = nullptr;
861 
862     napi_get_cb_info(env, info, &parameterCount, parameters, &thisVar, &data);
863     if (!MatchSetSmscAddrParameters(env, parameters, parameterCount)) {
864         TELEPHONY_LOGE("SetSmscAddr parameter matching failed.");
865         NapiUtil::ThrowParameterError(env);
866         return nullptr;
867     }
868     TELEPHONY_LOGI("SetSmscAddr start after MatchSetSmscAddrParameters");
869     auto context = std::make_unique<SetSmscAddrContext>().release();
870     if (context == nullptr) {
871         TELEPHONY_LOGE("SetSmscAddr SetSmscAddrContext is nullptr.");
872         NapiUtil::ThrowParameterError(env);
873         return nullptr;
874     }
875     TELEPHONY_LOGI("SetSmscAddr start after SetSmscAddrContext contruct");
876     napi_get_value_int32(env, parameters[0], &context->slotId);
877     context->smscAddr = Get64StringFromValue(env, parameters[1]);
878     TELEPHONY_LOGI("SetSmscAddr smscAddr = %{private}s", context->smscAddr.data());
879     if (parameterCount == THREE_PARAMETERS) {
880         napi_create_reference(env, parameters[PARAMETERS_INDEX_2], DEFAULT_REF_COUNT, &context->callbackRef);
881     }
882     TELEPHONY_LOGI("SetSmscAddr before end");
883     return NapiUtil::HandleAsyncWork(env, context, "SetSmscAddr", NativeSetSmscAddr, SetSmscAddrCallback);
884 }
885 
MatchGetSmscAddrParameters(napi_env env,const napi_value parameters[],size_t parameterCount)886 static bool MatchGetSmscAddrParameters(napi_env env, const napi_value parameters[], size_t parameterCount)
887 {
888     switch (parameterCount) {
889         case ONE_PARAMETER: {
890             return NapiUtil::MatchParameters(env, parameters, {napi_number});
891         }
892         case TWO_PARAMETERS: {
893             return NapiUtil::MatchParameters(env, parameters, {napi_number, napi_function});
894         }
895         default: {
896             return false;
897         }
898     }
899 }
900 
NativeGetSmscAddr(napi_env env,void * data)901 static void NativeGetSmscAddr(napi_env env, void *data)
902 {
903     auto context = static_cast<GetSmscAddrContext *>(data);
904     if (!IsValidSlotId(context->slotId)) {
905         TELEPHONY_LOGE("NativeGetSmscAddr slotId is invalid");
906         context->errorCode = ERROR_SLOT_ID_INVALID;
907         return;
908     }
909     std::u16string smscAddress;
910     context->errorCode = Singleton<SmsServiceManagerClient>::GetInstance().GetScAddress(context->slotId, smscAddress);
911     if (context->errorCode == TELEPHONY_ERR_SUCCESS) {
912         context->smscAddr = NapiUtil::ToUtf8(smscAddress);
913         context->resolved = true;
914     }
915 }
916 
GetSmscAddrCallback(napi_env env,napi_status status,void * data)917 static void GetSmscAddrCallback(napi_env env, napi_status status, void *data)
918 {
919     auto context = static_cast<GetSmscAddrContext *>(data);
920     napi_value callbackValue = nullptr;
921     if (context->resolved) {
922         napi_create_string_utf8(env, context->smscAddr.data(), context->smscAddr.length(), &callbackValue);
923     } else {
924         JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
925             context->errorCode, "getSmscAddr", "ohos.permission.GET_TELEPHONY_STATE");
926         callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
927     }
928     if (context->smscAddr.capacity() != 0) {
929         std::string().swap(context->smscAddr);
930     }
931     NapiUtil::Handle2ValueCallback(env, context, callbackValue);
932 }
933 
GetSmscAddr(napi_env env,napi_callback_info info)934 static napi_value GetSmscAddr(napi_env env, napi_callback_info info)
935 {
936     size_t parameterCount = TWO_PARAMETERS;
937     napi_value parameters[TWO_PARAMETERS] = {0};
938     napi_value thisVar = nullptr;
939     void *data = nullptr;
940 
941     napi_get_cb_info(env, info, &parameterCount, parameters, &thisVar, &data);
942     if (!MatchGetSmscAddrParameters(env, parameters, parameterCount)) {
943         TELEPHONY_LOGE("GetSmscAddr parameter matching failed.");
944         NapiUtil::ThrowParameterError(env);
945         return nullptr;
946     }
947     auto context = std::make_unique<GetSmscAddrContext>().release();
948     if (context == nullptr) {
949         TELEPHONY_LOGE("GetSmscAddr GetSmscAddrContext is nullptr.");
950         NapiUtil::ThrowParameterError(env);
951         return nullptr;
952     }
953     napi_get_value_int32(env, parameters[0], &context->slotId);
954     if (parameterCount == TWO_PARAMETERS) {
955         napi_create_reference(env, parameters[1], DEFAULT_REF_COUNT, &context->callbackRef);
956     }
957     return NapiUtil::HandleAsyncWork(env, context, "GetSmscAddr", NativeGetSmscAddr, GetSmscAddrCallback);
958 }
959 
MatchAddSimMessageParameters(napi_env env,const napi_value parameters[],size_t parameterCount)960 static bool MatchAddSimMessageParameters(napi_env env, const napi_value parameters[], size_t parameterCount)
961 {
962     bool typeMatch = false;
963     switch (parameterCount) {
964         case ONE_PARAMETER: {
965             typeMatch = NapiUtil::MatchParameters(env, parameters, {napi_object});
966             break;
967         }
968         case TWO_PARAMETERS: {
969             typeMatch = NapiUtil::MatchParameters(env, parameters, {napi_object, napi_function});
970             break;
971         }
972         default: {
973             break;
974         }
975     }
976     if (typeMatch) {
977         return MatchObjectProperty(env, parameters[0],
978             {
979                 {"slotId", napi_number},
980                 {"smsc", napi_string},
981                 {"status", napi_number},
982                 {"pdu", napi_string},
983             });
984     }
985     return false;
986 }
987 
NativeAddSimMessage(napi_env env,void * data)988 static void NativeAddSimMessage(napi_env env, void *data)
989 {
990     auto context = static_cast<AddSimMessageContext *>(data);
991     int32_t wrapStatus = static_cast<int32_t>(context->status);
992     TELEPHONY_LOGI("NativeAddSimMessage start wrapStatus = %{public}d", wrapStatus);
993     if (wrapStatus != MESSAGE_UNKNOWN_STATUS) {
994         ISmsServiceInterface::SimMessageStatus status =
995             static_cast<ISmsServiceInterface::SimMessageStatus>(wrapStatus);
996         context->errorCode = Singleton<SmsServiceManagerClient>::GetInstance().AddSimMessage(
997             context->slotId, NapiUtil::ToUtf16(context->smsc), NapiUtil::ToUtf16(context->pdu), status);
998         if (context->errorCode == TELEPHONY_ERR_SUCCESS) {
999             context->resolved = true;
1000         }
1001         TELEPHONY_LOGI("NativeAddSimMessage context->resolved = %{public}d", context->resolved);
1002     } else {
1003         context->errorCode = SMS_MMS_UNKNOWN_SIM_MESSAGE_STATUS;
1004     }
1005 }
1006 
AddSimMessageCallback(napi_env env,napi_status status,void * data)1007 static void AddSimMessageCallback(napi_env env, napi_status status, void *data)
1008 {
1009     auto context = static_cast<AddSimMessageContext *>(data);
1010     napi_value callbackValue = nullptr;
1011     if (context->resolved) {
1012         napi_get_undefined(env, &callbackValue);
1013     } else {
1014         JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
1015             context->errorCode, "addSimMessage", "ohos.permission.SEND_MESSAGES");
1016         callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
1017     }
1018     if (context->smsc.capacity() != 0) {
1019         std::string().swap(context->smsc);
1020     }
1021     if (context->pdu.capacity() != 0) {
1022         std::string().swap(context->pdu);
1023     }
1024     NapiUtil::Handle1ValueCallback(env, context, callbackValue);
1025 }
1026 
AddSimMessage(napi_env env,napi_callback_info info)1027 static napi_value AddSimMessage(napi_env env, napi_callback_info info)
1028 {
1029     size_t parameterCount = TWO_PARAMETERS;
1030     napi_value parameters[TWO_PARAMETERS] = {0};
1031     napi_value thisVar = nullptr;
1032     void *data = nullptr;
1033 
1034     napi_get_cb_info(env, info, &parameterCount, parameters, &thisVar, &data);
1035     if (!MatchAddSimMessageParameters(env, parameters, parameterCount)) {
1036         TELEPHONY_LOGE("AddSimMessage parameter matching failed.");
1037         NapiUtil::ThrowParameterError(env);
1038         return nullptr;
1039     }
1040     auto context = std::make_unique<AddSimMessageContext>().release();
1041     if (context == nullptr) {
1042         TELEPHONY_LOGE("AddSimMessage AddSimMessageContext is nullptr.");
1043         NapiUtil::ThrowParameterError(env);
1044         return nullptr;
1045     }
1046     napi_value slotIdValue = NapiUtil::GetNamedProperty(env, parameters[0], "slotId");
1047     if (slotIdValue != nullptr) {
1048         napi_get_value_int32(env, slotIdValue, &context->slotId);
1049     }
1050     napi_value smscValue = NapiUtil::GetNamedProperty(env, parameters[0], "smsc");
1051     if (smscValue != nullptr) {
1052         context->smsc = Get64StringFromValue(env, smscValue);
1053     }
1054     napi_value pduValue = NapiUtil::GetNamedProperty(env, parameters[0], "pdu");
1055     if (pduValue != nullptr) {
1056         context->pdu = NapiUtil::GetStringFromValue(env, pduValue);
1057     }
1058     napi_value statusValue = NapiUtil::GetNamedProperty(env, parameters[0], "status");
1059     if (statusValue != nullptr) {
1060         int32_t messageStatus = static_cast<int32_t>(MESSAGE_UNKNOWN_STATUS);
1061         napi_get_value_int32(env, statusValue, &messageStatus);
1062         context->status = WrapSimMessageStatus(messageStatus);
1063     }
1064     if (parameterCount == TWO_PARAMETERS) {
1065         napi_create_reference(env, parameters[1], DEFAULT_REF_COUNT, &context->callbackRef);
1066     }
1067     return NapiUtil::HandleAsyncWork(env, context, "AddSimMessage", NativeAddSimMessage, AddSimMessageCallback);
1068 }
1069 
MatchDelSimMessageParameters(napi_env env,const napi_value parameters[],size_t parameterCount)1070 static bool MatchDelSimMessageParameters(napi_env env, const napi_value parameters[], size_t parameterCount)
1071 {
1072     switch (parameterCount) {
1073         case TWO_PARAMETERS: {
1074             return NapiUtil::MatchParameters(env, parameters, {napi_number, napi_number});
1075         }
1076         case THREE_PARAMETERS: {
1077             return NapiUtil::MatchParameters(env, parameters, {napi_number, napi_number, napi_function});
1078         }
1079         default: {
1080             return false;
1081         }
1082     }
1083 }
NativeDelSimMessage(napi_env env,void * data)1084 static void NativeDelSimMessage(napi_env env, void *data)
1085 {
1086     auto context = static_cast<DelSimMessageContext *>(data);
1087     if (!IsValidSlotId(context->slotId)) {
1088         TELEPHONY_LOGE("NativeDelSimMessage slotId is invalid");
1089         context->errorCode = ERROR_SLOT_ID_INVALID;
1090         return;
1091     }
1092     context->errorCode = Singleton<SmsServiceManagerClient>::GetInstance().DelSimMessage(context->slotId,
1093         context->msgIndex);
1094     if (context->errorCode == TELEPHONY_ERR_SUCCESS) {
1095         context->resolved = true;
1096     }
1097     TELEPHONY_LOGI("NativeDelSimMessage resolved = %{public}d", context->resolved);
1098 }
1099 
DelSimMessageCallback(napi_env env,napi_status status,void * data)1100 static void DelSimMessageCallback(napi_env env, napi_status status, void *data)
1101 {
1102     auto context = static_cast<DelSimMessageContext *>(data);
1103     napi_value callbackValue = nullptr;
1104     if (context->resolved) {
1105         napi_get_undefined(env, &callbackValue);
1106     } else {
1107         JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
1108             context->errorCode, "delSimMessage", "ohos.permission.SEND_MESSAGES");
1109         callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
1110     }
1111     NapiUtil::Handle1ValueCallback(env, context, callbackValue);
1112 }
1113 
DelSimMessage(napi_env env,napi_callback_info info)1114 static napi_value DelSimMessage(napi_env env, napi_callback_info info)
1115 {
1116     size_t parameterCount = 3;
1117     napi_value parameters[3] = {0};
1118     napi_value thisVar = nullptr;
1119     void *data = nullptr;
1120 
1121     napi_get_cb_info(env, info, &parameterCount, parameters, &thisVar, &data);
1122     if (!MatchDelSimMessageParameters(env, parameters, parameterCount)) {
1123         TELEPHONY_LOGE("DelSimMessage parameter matching failed.");
1124         NapiUtil::ThrowParameterError(env);
1125         return nullptr;
1126     }
1127     auto context = std::make_unique<DelSimMessageContext>().release();
1128     if (context == nullptr) {
1129         TELEPHONY_LOGE("DelSimMessage DelSimMessageContext is nullptr.");
1130         NapiUtil::ThrowParameterError(env);
1131         return nullptr;
1132     }
1133     napi_get_value_int32(env, parameters[0], &context->slotId);
1134     napi_get_value_int32(env, parameters[1], &context->msgIndex);
1135     if (parameterCount == PARAMETER_COUNT_3) {
1136         napi_create_reference(env, parameters[PARAMETERS_INDEX_2], DEFAULT_REF_COUNT, &context->callbackRef);
1137     }
1138     return NapiUtil::HandleAsyncWork(env, context, "DelSimMessage", NativeDelSimMessage, DelSimMessageCallback);
1139 }
1140 
MatchUpdateSimMessageParameters(napi_env env,const napi_value parameters[],size_t parameterCount)1141 static bool MatchUpdateSimMessageParameters(napi_env env, const napi_value parameters[], size_t parameterCount)
1142 {
1143     bool typeMatch = false;
1144     switch (parameterCount) {
1145         case ONE_PARAMETER: {
1146             typeMatch = NapiUtil::MatchParameters(env, parameters, {napi_object});
1147             break;
1148         }
1149         case TWO_PARAMETERS: {
1150             typeMatch = NapiUtil::MatchParameters(env, parameters, {napi_object, napi_function});
1151             break;
1152         }
1153         default: {
1154             break;
1155         }
1156     }
1157     if (typeMatch) {
1158         bool propertyMatchResult = MatchObjectProperty(env, parameters[0],
1159             {
1160                 {"slotId", napi_number},
1161                 {"msgIndex", napi_number},
1162                 {"newStatus", napi_number},
1163                 {"pdu", napi_string},
1164                 {"smsc", napi_string},
1165             });
1166         TELEPHONY_LOGI(
1167             "MatchUpdateSimMessageParameters start propertyMatchResult = %{public}d", propertyMatchResult);
1168         return propertyMatchResult;
1169     }
1170     TELEPHONY_LOGI("MatchUpdateSimMessageParameters end");
1171     return false;
1172 }
1173 
NativeUpdateSimMessage(napi_env env,void * data)1174 static void NativeUpdateSimMessage(napi_env env, void *data)
1175 {
1176     auto context = static_cast<UpdateSimMessageContext *>(data);
1177     int32_t newStatus = static_cast<int32_t>(context->newStatus);
1178     TELEPHONY_LOGI("NativeUpdateSimMessage newStatus = %{public}d", newStatus);
1179     if (!context->pdu.empty() && (newStatus > -1)) {
1180         std::string msgPud(context->pdu.begin(), context->pdu.end());
1181         TELEPHONY_LOGD("NativeUpdateSimMessage msgPud = %{private}s", msgPud.c_str());
1182         context->errorCode = Singleton<SmsServiceManagerClient>::GetInstance().UpdateSimMessage(context->slotId,
1183             context->msgIndex, static_cast<ISmsServiceInterface::SimMessageStatus>(context->newStatus),
1184             NapiUtil::ToUtf16(context->pdu), NapiUtil::ToUtf16(context->smsc));
1185         if (context->errorCode == TELEPHONY_ERR_SUCCESS) {
1186             context->resolved = true;
1187         }
1188     } else {
1189         TELEPHONY_LOGI("NativeUpdateSimMessage resolved false cause parameter invalided");
1190         context->errorCode = SMS_MMS_UNKNOWN_SIM_MESSAGE_STATUS;
1191     }
1192 }
1193 
UpdateSimMessageCallback(napi_env env,napi_status status,void * data)1194 static void UpdateSimMessageCallback(napi_env env, napi_status status, void *data)
1195 {
1196     auto context = static_cast<UpdateSimMessageContext *>(data);
1197     napi_value callbackValue = nullptr;
1198     if (context->resolved) {
1199         napi_get_undefined(env, &callbackValue);
1200     } else {
1201         JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
1202             context->errorCode, "updateSimMessage", "ohos.permission.SEND_MESSAGES");
1203         callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
1204     }
1205     if (context->smsc.capacity() != 0) {
1206         std::string().swap(context->smsc);
1207     }
1208     if (context->pdu.capacity() != 0) {
1209         std::string().swap(context->pdu);
1210     }
1211     NapiUtil::Handle1ValueCallback(env, context, callbackValue);
1212 }
1213 
UpdateSimMessage(napi_env env,napi_callback_info info)1214 static napi_value UpdateSimMessage(napi_env env, napi_callback_info info)
1215 {
1216     size_t parameterCount = TWO_PARAMETERS;
1217     napi_value parameters[TWO_PARAMETERS] = {0};
1218     napi_value thisVar = nullptr;
1219     void *data = nullptr;
1220 
1221     napi_get_cb_info(env, info, &parameterCount, parameters, &thisVar, &data);
1222     if (!MatchUpdateSimMessageParameters(env, parameters, parameterCount)) {
1223         TELEPHONY_LOGE("UpdateSimMessage parameter matching failed.");
1224         NapiUtil::ThrowParameterError(env);
1225         return nullptr;
1226     }
1227     TELEPHONY_LOGI("UpdateSimMessage start parameter match passed");
1228     auto context = std::make_unique<UpdateSimMessageContext>().release();
1229     if (context == nullptr) {
1230         TELEPHONY_LOGE("UpdateSimMessage UpdateSimMessageContext is nullptr.");
1231         NapiUtil::ThrowParameterError(env);
1232         return nullptr;
1233     }
1234     napi_value slotIdValue = NapiUtil::GetNamedProperty(env, parameters[0], "slotId");
1235     if (slotIdValue != nullptr) {
1236         napi_get_value_int32(env, slotIdValue, &context->slotId);
1237     }
1238     napi_value msgIndexValue = NapiUtil::GetNamedProperty(env, parameters[0], "msgIndex");
1239     if (msgIndexValue != nullptr) {
1240         napi_get_value_int32(env, msgIndexValue, &context->msgIndex);
1241     }
1242     napi_value newStatusValue = NapiUtil::GetNamedProperty(env, parameters[0], "newStatus");
1243     if (newStatusValue != nullptr) {
1244         int32_t newStatus = static_cast<int32_t>(MESSAGE_UNKNOWN_STATUS);
1245         napi_get_value_int32(env, newStatusValue, &newStatus);
1246         context->newStatus = WrapSimMessageStatus(newStatus);
1247     }
1248     napi_value pudValue = NapiUtil::GetNamedProperty(env, parameters[0], "pdu");
1249     if (pudValue != nullptr) {
1250         context->pdu = NapiUtil::GetStringFromValue(env, pudValue);
1251     }
1252     TELEPHONY_LOGD("UpdateSimMessage pdu = %{private}s", context->pdu.c_str());
1253     napi_value smscValue = NapiUtil::GetNamedProperty(env, parameters[0], "smsc");
1254     if (smscValue != nullptr) {
1255         context->smsc = Get64StringFromValue(env, smscValue);
1256     }
1257     if (parameterCount == TWO_PARAMETERS) {
1258         napi_create_reference(env, parameters[1], DEFAULT_REF_COUNT, &context->callbackRef);
1259     }
1260     TELEPHONY_LOGI("UpdateSimMessage start before HandleAsyncWork");
1261     return NapiUtil::HandleAsyncWork(
1262         env, context, "UpdateSimMessage", NativeUpdateSimMessage, UpdateSimMessageCallback);
1263 }
1264 
MatchGetAllSimMessagesParameters(napi_env env,const napi_value parameters[],size_t parameterCount)1265 static bool MatchGetAllSimMessagesParameters(napi_env env, const napi_value parameters[], size_t parameterCount)
1266 {
1267     switch (parameterCount) {
1268         case ONE_PARAMETER: {
1269             return NapiUtil::MatchParameters(env, parameters, {napi_number});
1270         }
1271         case TWO_PARAMETERS: {
1272             return NapiUtil::MatchParameters(env, parameters, {napi_number, napi_function});
1273         }
1274         default: {
1275             return false;
1276         }
1277     }
1278 }
1279 
NativeGetAllSimMessages(napi_env env,void * data)1280 static void NativeGetAllSimMessages(napi_env env, void *data)
1281 {
1282     auto context = static_cast<GetAllSimMessagesContext *>(data);
1283     if (!IsValidSlotId(context->slotId)) {
1284         TELEPHONY_LOGE("NativeGetAllSimMessages slotId is invalid");
1285         context->errorCode = ERROR_SLOT_ID_INVALID;
1286         return;
1287     }
1288     context->errorCode = Singleton<SmsServiceManagerClient>::GetInstance().
1289         GetAllSimMessages(context->slotId, context->messageArray);
1290     if (context->errorCode == TELEPHONY_ERR_SUCCESS) {
1291         context->resolved = true;
1292     } else {
1293         TELEPHONY_LOGE("NativeGetAllSimMessages context->resolved == false");
1294     }
1295 }
1296 
CreateSimShortMessageValue(napi_env env,const ShortMessage & shortMessage)1297 static napi_value CreateSimShortMessageValue(napi_env env, const ShortMessage &shortMessage)
1298 {
1299     napi_value simObject = nullptr;
1300     napi_value object = CreateShortMessageValue(env, shortMessage);
1301     napi_create_object(env, &simObject);
1302     std::string shortMessageKey("shortMessage");
1303     napi_set_named_property(env, simObject, shortMessageKey.c_str(), object);
1304     NapiUtil::SetPropertyInt32(env, simObject, "simMessageStatus", shortMessage.GetIccMessageStatus());
1305     NapiUtil::SetPropertyInt32(env, simObject, "indexOnSim", shortMessage.GetIndexOnSim());
1306     return simObject;
1307 }
1308 
GetAllSimMessagesCallback(napi_env env,napi_status status,void * data)1309 static void GetAllSimMessagesCallback(napi_env env, napi_status status, void *data)
1310 {
1311     auto context = static_cast<GetAllSimMessagesContext *>(data);
1312     napi_value callbackValue = nullptr;
1313     if (context->resolved) {
1314         napi_create_array(env, &callbackValue);
1315         int32_t arraySize = static_cast<int32_t>(context->messageArray.size());
1316         for (int32_t i = 0; i < arraySize; i++) {
1317             ShortMessage message = context->messageArray[i];
1318             napi_value itemValue = CreateSimShortMessageValue(env, message);
1319             napi_set_element(env, callbackValue, i, itemValue);
1320         }
1321     } else {
1322         JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
1323             context->errorCode, "getAllSimMessages", "ohos.permission.RECEIVE_SMS");
1324         callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
1325     }
1326     if (context->messageArray.capacity() != 0) {
1327         std::vector<ShortMessage>().swap(context->messageArray);
1328     }
1329     NapiUtil::Handle2ValueCallback(env, context, callbackValue);
1330 }
1331 
GetAllSimMessages(napi_env env,napi_callback_info info)1332 static napi_value GetAllSimMessages(napi_env env, napi_callback_info info)
1333 {
1334     size_t parameterCount = TWO_PARAMETERS;
1335     napi_value parameters[TWO_PARAMETERS] = {0};
1336     napi_value thisVar = nullptr;
1337     void *data = nullptr;
1338 
1339     napi_get_cb_info(env, info, &parameterCount, parameters, &thisVar, &data);
1340     if (!MatchGetAllSimMessagesParameters(env, parameters, parameterCount)) {
1341         TELEPHONY_LOGE("GetAllSimMessages parameter matching failed.");
1342         NapiUtil::ThrowParameterError(env);
1343         return nullptr;
1344     }
1345     auto context = std::make_unique<GetAllSimMessagesContext>().release();
1346     if (context == nullptr) {
1347         TELEPHONY_LOGE("GetAllSimMessages GetAllSimMessagesContext is nullptr.");
1348         NapiUtil::ThrowParameterError(env);
1349         return nullptr;
1350     }
1351     napi_get_value_int32(env, parameters[0], &context->slotId);
1352     if (parameterCount == TWO_PARAMETERS) {
1353         napi_create_reference(env, parameters[1], DEFAULT_REF_COUNT, &context->callbackRef);
1354     }
1355     napi_value result = NapiUtil::HandleAsyncWork(
1356         env, context, "GetAllSimMessages", NativeGetAllSimMessages, GetAllSimMessagesCallback);
1357     return result;
1358 }
1359 
MatchSetCBConfigParameters(napi_env env,const napi_value parameters[],size_t parameterCount)1360 static bool MatchSetCBConfigParameters(napi_env env, const napi_value parameters[], size_t parameterCount)
1361 {
1362     bool typeMatch = false;
1363     switch (parameterCount) {
1364         case ONE_PARAMETER: {
1365             typeMatch = NapiUtil::MatchParameters(env, parameters, {napi_object});
1366             break;
1367         }
1368         case TWO_PARAMETERS: {
1369             typeMatch = NapiUtil::MatchParameters(env, parameters, {napi_object, napi_function});
1370             break;
1371         }
1372         default: {
1373             break;
1374         }
1375     }
1376     if (typeMatch) {
1377         return MatchObjectProperty(env, parameters[0],
1378             {
1379                 {"slotId", napi_number},
1380                 {"enable", napi_boolean},
1381                 {"startMessageId", napi_number},
1382                 {"endMessageId", napi_number},
1383                 {"ranType", napi_number},
1384             });
1385     }
1386     return false;
1387 }
1388 
NativeSetCBConfig(napi_env env,void * data)1389 static void NativeSetCBConfig(napi_env env, void *data)
1390 {
1391     auto context = static_cast<CBConfigContext *>(data);
1392     context->errorCode = Singleton<SmsServiceManagerClient>::GetInstance().SetCBConfig(
1393         context->slotId, context->enable, context->startMessageId, context->endMessageId, context->ranType);
1394     if (context->errorCode == TELEPHONY_ERR_SUCCESS) {
1395         context->resolved = true;
1396     }
1397     TELEPHONY_LOGD("NativeSetCBConfig end resolved = %{public}d", context->resolved);
1398 }
1399 
SetCBConfigCallback(napi_env env,napi_status status,void * data)1400 static void SetCBConfigCallback(napi_env env, napi_status status, void *data)
1401 {
1402     auto context = static_cast<CBConfigContext *>(data);
1403     napi_value callbackValue = nullptr;
1404     if (context->resolved) {
1405         napi_get_undefined(env, &callbackValue);
1406     } else {
1407         JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
1408             context->errorCode, "setCBConfig", "ohos.permission.RECEIVE_SMS");
1409         callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
1410     }
1411     NapiUtil::Handle1ValueCallback(env, context, callbackValue);
1412 }
1413 
SetCBConfig(napi_env env,napi_callback_info info)1414 static napi_value SetCBConfig(napi_env env, napi_callback_info info)
1415 {
1416     size_t parameterCount = TWO_PARAMETERS;
1417     napi_value parameters[TWO_PARAMETERS] = {0};
1418     napi_value thisVar = nullptr;
1419     void *data = nullptr;
1420 
1421     napi_get_cb_info(env, info, &parameterCount, parameters, &thisVar, &data);
1422     if (!MatchSetCBConfigParameters(env, parameters, parameterCount)) {
1423         TELEPHONY_LOGE("SetCBConfig parameter matching failed.");
1424         NapiUtil::ThrowParameterError(env);
1425         return nullptr;
1426     }
1427     auto context = std::make_unique<CBConfigContext>().release();
1428     if (context == nullptr) {
1429         TELEPHONY_LOGE("SetCBConfig CBConfigContext is nullptr.");
1430         NapiUtil::ThrowParameterError(env);
1431         return nullptr;
1432     }
1433     napi_value slotIdValue = NapiUtil::GetNamedProperty(env, parameters[0], "slotId");
1434     if (slotIdValue != nullptr) {
1435         napi_get_value_int32(env, slotIdValue, &context->slotId);
1436     }
1437     napi_value enableValue = NapiUtil::GetNamedProperty(env, parameters[0], "enable");
1438     if (enableValue != nullptr) {
1439         napi_get_value_bool(env, enableValue, &context->enable);
1440     }
1441     napi_value startMessageIdValue = NapiUtil::GetNamedProperty(env, parameters[0], "startMessageId");
1442     if (startMessageIdValue != nullptr) {
1443         napi_get_value_int32(env, startMessageIdValue, &context->startMessageId);
1444     }
1445     napi_value endMessageIdValue = NapiUtil::GetNamedProperty(env, parameters[0], "endMessageId");
1446     if (endMessageIdValue != nullptr) {
1447         napi_get_value_int32(env, endMessageIdValue, &context->endMessageId);
1448     }
1449     napi_value ranTypeValue = NapiUtil::GetNamedProperty(env, parameters[0], "ranType");
1450     if (ranTypeValue != nullptr) {
1451         napi_get_value_int32(env, ranTypeValue, &context->ranType);
1452     }
1453     if (parameterCount == TWO_PARAMETERS) {
1454         napi_create_reference(env, parameters[1], DEFAULT_REF_COUNT, &context->callbackRef);
1455     }
1456     napi_value result =
1457         NapiUtil::HandleAsyncWork(env, context, "SetCBConfig", NativeSetCBConfig, SetCBConfigCallback);
1458     return result;
1459 }
1460 
MatchSplitMessageParameters(napi_env env,const napi_value parameters[],size_t parameterCount)1461 static bool MatchSplitMessageParameters(napi_env env, const napi_value parameters[], size_t parameterCount)
1462 {
1463     switch (parameterCount) {
1464         case ONE_PARAMETER:
1465             return NapiUtil::MatchParameters(env, parameters, {napi_string});
1466         case TWO_PARAMETERS:
1467             return NapiUtil::MatchParameters(env, parameters, {napi_string, napi_function});
1468         default:
1469             return false;
1470     }
1471 }
1472 
NativeSplitMessage(napi_env env,void * data)1473 static void NativeSplitMessage(napi_env env, void *data)
1474 {
1475     auto context = static_cast<SplitMessageContext *>(data);
1476     std::u16string content = NapiUtil::ToUtf16(context->content);
1477     context->errorCode =
1478         Singleton<SmsServiceManagerClient>::GetInstance().SplitMessage(content, context->messageArray);
1479     if (context->errorCode == TELEPHONY_ERR_SUCCESS) {
1480         context->resolved = true;
1481     }
1482 }
1483 
SplitMessageCallback(napi_env env,napi_status status,void * data)1484 static void SplitMessageCallback(napi_env env, napi_status status, void *data)
1485 {
1486     auto context = static_cast<SplitMessageContext *>(data);
1487     napi_value callbackValue = nullptr;
1488     if (context->resolved) {
1489         napi_create_array(env, &callbackValue);
1490         int32_t arraySize = static_cast<int32_t>(context->messageArray.size());
1491         TELEPHONY_LOGI("napi_sms messageArray.size =  %{public}d", arraySize);
1492         for (int32_t i = 0; i < arraySize; i++) {
1493             napi_value itemValue = nullptr;
1494             std::string message = NapiUtil::ToUtf8(context->messageArray[i]);
1495             napi_create_string_utf8(env, message.data(), message.size(), &itemValue);
1496             napi_set_element(env, callbackValue, i, itemValue);
1497         }
1498     } else {
1499         JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
1500             context->errorCode, "splitMessage", "ohos.permission.SEND_MESSAGES");
1501         callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
1502     }
1503     if (context->content.capacity() != 0) {
1504         std::string().swap(context->content);
1505     }
1506     if (context->messageArray.capacity() != 0) {
1507         std::vector<std::u16string>().swap(context->messageArray);
1508     }
1509     NapiUtil::Handle2ValueCallback(env, context, callbackValue);
1510 }
1511 
SplitMessage(napi_env env,napi_callback_info info)1512 static napi_value SplitMessage(napi_env env, napi_callback_info info)
1513 {
1514     size_t parameterCount = TWO_PARAMETERS;
1515     napi_value parameters[TWO_PARAMETERS] = {0};
1516     napi_value thisVar = nullptr;
1517     void *data = nullptr;
1518 
1519     napi_get_cb_info(env, info, &parameterCount, parameters, &thisVar, &data);
1520     if (!MatchSplitMessageParameters(env, parameters, parameterCount)) {
1521         TELEPHONY_LOGE("SplitMessage parameter matching failed.");
1522         NapiUtil::ThrowParameterError(env);
1523         return nullptr;
1524     }
1525     auto context = std::make_unique<SplitMessageContext>().release();
1526     if (context == nullptr) {
1527         TELEPHONY_LOGE("SplitMessage SplitMessageContext is nullptr.");
1528         NapiUtil::ThrowParameterError(env);
1529         return nullptr;
1530     }
1531     context->content = Get64StringFromValue(env, parameters[0]);
1532     TELEPHONY_LOGD("napi_sms splitMessage context->content = %{private}s", context->content.c_str());
1533     if (parameterCount == TWO_PARAMETERS) {
1534         napi_create_reference(env, parameters[1], MAX_TEXT_SHORT_MESSAGE_LENGTH, &context->callbackRef);
1535     }
1536     napi_value result =
1537         NapiUtil::HandleAsyncWork(env, context, "SplitMessage", NativeSplitMessage, SplitMessageCallback);
1538     return result;
1539 }
1540 
HasSmsCapability(napi_env env,napi_callback_info info)1541 static napi_value HasSmsCapability(napi_env env, napi_callback_info info)
1542 {
1543     napi_value result = nullptr;
1544     napi_get_boolean(env, Singleton<SmsServiceManagerClient>::GetInstance().HasSmsCapability(), &result);
1545     return result;
1546 }
1547 
MatchGetSmsSegmentsInfoParameters(napi_env env,const napi_value parameters[],size_t parameterCount)1548 static bool MatchGetSmsSegmentsInfoParameters(napi_env env, const napi_value parameters[], size_t parameterCount)
1549 {
1550     switch (parameterCount) {
1551         case THREE_PARAMETERS:
1552             return NapiUtil::MatchParameters(env, parameters, {napi_number, napi_string, napi_boolean});
1553         case FOUR_PARAMETERS:
1554             return NapiUtil::MatchParameters(
1555                 env, parameters, {napi_number, napi_string, napi_boolean, napi_function});
1556         default:
1557             return false;
1558     }
1559 }
1560 
NativeGetSmsSegmentsInfo(napi_env env,void * data)1561 static void NativeGetSmsSegmentsInfo(napi_env env, void *data)
1562 {
1563     auto context = static_cast<GetSmsSegmentsInfoContext *>(data);
1564     if (!IsValidSlotId(context->slotId)) {
1565         TELEPHONY_LOGE("NativeGetSmsSegmentsInfo slotId is invalid");
1566         context->errorCode = ERROR_SLOT_ID_INVALID;
1567         return;
1568     }
1569     std::u16string content = NapiUtil::ToUtf16(context->content);
1570     ISmsServiceInterface::SmsSegmentsInfo info;
1571     context->errorCode = Singleton<SmsServiceManagerClient>::GetInstance().GetSmsSegmentsInfo(context->slotId,
1572         content, context->force7BitCode, info);
1573     if (context->errorCode == TELEPHONY_ERR_SUCCESS) {
1574         context->resolved = true;
1575         context->splitCount = info.msgSegCount;
1576         context->encodeCount = info.msgEncodingCount;
1577         context->encodeCountRemaining = info.msgRemainCount;
1578         context->scheme = info.msgCodeScheme;
1579     } else {
1580         TELEPHONY_LOGE("NativeGetSmsSegmentsInfo context->resolved == false");
1581     }
1582 }
1583 
GetSmsSegmentsInfoCallback(napi_env env,napi_status status,void * data)1584 static void GetSmsSegmentsInfoCallback(napi_env env, napi_status status, void *data)
1585 {
1586     auto context = static_cast<GetSmsSegmentsInfoContext *>(data);
1587     napi_value callbackValue = nullptr;
1588     if (context->resolved) {
1589         napi_create_object(env, &callbackValue);
1590         NapiUtil::SetPropertyInt32(env, callbackValue, "splitCount", context->splitCount);
1591         NapiUtil::SetPropertyInt32(env, callbackValue, "encodeCount", context->encodeCount);
1592         NapiUtil::SetPropertyInt32(env, callbackValue, "encodeCountRemaining", context->encodeCountRemaining);
1593         NapiUtil::SetPropertyInt32(env, callbackValue, "scheme", static_cast<int32_t>(context->scheme));
1594     } else {
1595         JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
1596             context->errorCode, "getSmsSegmentsInfo", "ohos.permission.GET_TELEPHONY_STATE");
1597         callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
1598     }
1599     if (context->content.capacity() != 0) {
1600         std::string().swap(context->content);
1601     }
1602     NapiUtil::Handle2ValueCallback(env, context, callbackValue);
1603 }
1604 
GetSmsSegmentsInfo(napi_env env,napi_callback_info info)1605 static napi_value GetSmsSegmentsInfo(napi_env env, napi_callback_info info)
1606 {
1607     size_t parameterCount = FOUR_PARAMETERS;
1608     napi_value parameters[FOUR_PARAMETERS] = { 0 };
1609     napi_value thisVar = nullptr;
1610     void *data = nullptr;
1611 
1612     napi_get_cb_info(env, info, &parameterCount, parameters, &thisVar, &data);
1613     if (!MatchGetSmsSegmentsInfoParameters(env, parameters, parameterCount)) {
1614         TELEPHONY_LOGE("GetSmsSegmentsInfo parameter matching failed.");
1615         NapiUtil::ThrowParameterError(env);
1616         return nullptr;
1617     }
1618     auto context = std::make_unique<GetSmsSegmentsInfoContext>().release();
1619     if (context == nullptr) {
1620         TELEPHONY_LOGE("GetSmsSegmentsInfo context is nullptr.");
1621         NapiUtil::ThrowParameterError(env);
1622         return nullptr;
1623     }
1624     napi_get_value_int32(env, parameters[0], &context->slotId);
1625     context->content = NapiUtil::GetStringFromValue(env, parameters[1]);
1626     napi_get_value_bool(env, parameters[PARAMETERS_INDEX_2], &context->force7BitCode);
1627     if (parameterCount == FOUR_PARAMETERS) {
1628         napi_create_reference(env, parameters[PARAMETERS_INDEX_3], DEFAULT_REF_COUNT, &context->callbackRef);
1629     }
1630     napi_value result = NapiUtil::HandleAsyncWork(
1631         env, context, "GetSmsSegmentsInfo", NativeGetSmsSegmentsInfo, GetSmsSegmentsInfoCallback);
1632     return result;
1633 }
1634 
MatchIsImsSmsSupportedParameters(napi_env env,const napi_value parameters[],size_t parameterCount)1635 static bool MatchIsImsSmsSupportedParameters(napi_env env, const napi_value parameters[], size_t parameterCount)
1636 {
1637     switch (parameterCount) {
1638         case ONE_PARAMETER: {
1639             return NapiUtil::MatchParameters(env, parameters, { napi_number });
1640         }
1641         case TWO_PARAMETERS: {
1642             return NapiUtil::MatchParameters(env, parameters, { napi_number, napi_function });
1643         }
1644         default: {
1645             return false;
1646         }
1647     }
1648 }
1649 
NativeIsImsSmsSupported(napi_env env,void * data)1650 static void NativeIsImsSmsSupported(napi_env env, void *data)
1651 {
1652     auto context = static_cast<IsImsSmsSupportedContext *>(data);
1653     context->errorCode = Singleton<SmsServiceManagerClient>::GetInstance().IsImsSmsSupported(
1654         context->slotId, context->setResult);
1655     if (context->errorCode == TELEPHONY_ERR_SUCCESS) {
1656         context->resolved = true;
1657     } else {
1658         TELEPHONY_LOGE("NativeIsImsSmsSupported context->resolved == false");
1659     }
1660 }
1661 
IsImsSmsSupportedCallback(napi_env env,napi_status status,void * data)1662 static void IsImsSmsSupportedCallback(napi_env env, napi_status status, void *data)
1663 {
1664     auto context = static_cast<IsImsSmsSupportedContext *>(data);
1665     napi_value callbackValue = nullptr;
1666     if (context->resolved) {
1667         napi_get_boolean(env, context->setResult, &callbackValue);
1668     } else {
1669         JsError error = NapiUtil::ConverErrorMessageForJs(context->errorCode);
1670         callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
1671     }
1672     NapiUtil::Handle2ValueCallback(env, context, callbackValue);
1673 }
1674 
IsImsSmsSupported(napi_env env,napi_callback_info info)1675 static napi_value IsImsSmsSupported(napi_env env, napi_callback_info info)
1676 {
1677     size_t paramsCount = TWO_PARAMETERS;
1678     napi_value params[TWO_PARAMETERS] = { 0 };
1679     napi_value arg = nullptr;
1680     void *data = nullptr;
1681 
1682     napi_get_cb_info(env, info, &paramsCount, params, &arg, &data);
1683     if (!MatchIsImsSmsSupportedParameters(env, params, paramsCount)) {
1684         TELEPHONY_LOGE("IsImsSmsSupported parameter matching failed.");
1685         NapiUtil::ThrowParameterError(env);
1686         return nullptr;
1687     }
1688     auto context = std::make_unique<IsImsSmsSupportedContext>().release();
1689     if (context == nullptr) {
1690         TELEPHONY_LOGE("IsImsSmsSupported IsImsSmsSupportedContext is nullptr.");
1691         NapiUtil::ThrowParameterError(env);
1692         return nullptr;
1693     }
1694     napi_get_value_int32(env, params[0], &context->slotId);
1695     if (paramsCount == TWO_PARAMETERS) {
1696         napi_create_reference(env, params[1], DEFAULT_REF_COUNT, &context->callbackRef);
1697     }
1698     napi_value result = NapiUtil::HandleAsyncWork(
1699         env, context, "IsImsSmsSupported", NativeIsImsSmsSupported, IsImsSmsSupportedCallback);
1700     return result;
1701 }
1702 
NativeGetImsShortMessageFormat(napi_env env,void * data)1703 static void NativeGetImsShortMessageFormat(napi_env env, void *data)
1704 {
1705     auto context = static_cast<SingleValueContext<std::u16string> *>(data);
1706     context->errorCode = Singleton<SmsServiceManagerClient>::GetInstance().GetImsShortMessageFormat(context->value);
1707     if (context->errorCode == TELEPHONY_ERR_SUCCESS) {
1708         context->resolved = true;
1709     }
1710     TELEPHONY_LOGE("errorCode:%{public}d", context->errorCode);
1711 }
1712 
to_utf8(std::u16string str16)1713 static std::string to_utf8(std::u16string str16)
1714 {
1715     return std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> {}.to_bytes(str16);
1716 }
1717 
GetImsShortMessageFormatCallback(napi_env env,napi_status status,void * data)1718 static void GetImsShortMessageFormatCallback(napi_env env, napi_status status, void *data)
1719 {
1720     auto context = static_cast<SingleValueContext<std::u16string> *>(data);
1721     napi_value callbackValue = nullptr;
1722     if (context->resolved) {
1723         std::string toUtf8Value = to_utf8(context->value);
1724         napi_create_string_utf8(env, toUtf8Value.c_str(), toUtf8Value.size(), &callbackValue);
1725     } else {
1726         JsError error = NapiUtil::ConverErrorMessageWithPermissionForJs(
1727             context->errorCode, "getImsShortMessageFormat", "ohos.permission.GET_TELEPHONY_STATE");
1728         callbackValue = NapiUtil::CreateErrorMessage(env, error.errorMessage, error.errorCode);
1729     }
1730     NapiUtil::Handle2ValueCallback(env, context, callbackValue);
1731 }
1732 
MatchGetImsShortMessageFormatParameters(napi_env env,const napi_value parameters[],size_t parameterCount)1733 static bool MatchGetImsShortMessageFormatParameters(napi_env env, const napi_value parameters[], size_t parameterCount)
1734 {
1735     switch (parameterCount) {
1736         case NONE_PARAMETER: {
1737             return true;
1738         }
1739         case ONE_PARAMETER: {
1740             return NapiUtil::MatchParameters(env, parameters, { napi_function });
1741         }
1742         default: {
1743             return false;
1744         }
1745     }
1746 }
1747 
GetImsShortMessageFormat(napi_env env,napi_callback_info info)1748 static napi_value GetImsShortMessageFormat(napi_env env, napi_callback_info info)
1749 {
1750     size_t paramsCount = ONE_PARAMETER;
1751     napi_value params[ONE_PARAMETER] = { 0 };
1752     napi_value arg = nullptr;
1753     void *data = nullptr;
1754 
1755     napi_get_cb_info(env, info, &paramsCount, params, &arg, &data);
1756     if (!MatchGetImsShortMessageFormatParameters(env, params, paramsCount)) {
1757         TELEPHONY_LOGE("GetImsShortMessageFormat parameter matching failed.");
1758         NapiUtil::ThrowParameterError(env);
1759         return nullptr;
1760     }
1761     auto context = std::make_unique<SingleValueContext<std::u16string>>().release();
1762     if (context == nullptr) {
1763         TELEPHONY_LOGE("GetImsShortMessageFormat SingleValueContext is nullptr.");
1764         NapiUtil::ThrowParameterError(env);
1765         return nullptr;
1766     }
1767     if (paramsCount == ONE_PARAMETER) {
1768         napi_create_reference(env, params[0], DEFAULT_REF_COUNT, &context->callbackRef);
1769     }
1770     napi_value result = NapiUtil::HandleAsyncWork(env, context, "GetImsShortMessageFormat",
1771         NativeGetImsShortMessageFormat, GetImsShortMessageFormatCallback);
1772     return result;
1773 }
1774 
CreateEnumConstructor(napi_env env,napi_callback_info info)1775 static napi_value CreateEnumConstructor(napi_env env, napi_callback_info info)
1776 {
1777     napi_value thisArg = nullptr;
1778     void *data = nullptr;
1779 
1780     napi_get_cb_info(env, info, nullptr, nullptr, &thisArg, &data);
1781     napi_value global = nullptr;
1782     napi_get_global(env, &global);
1783     return thisArg;
1784 }
1785 
CreateEnumSendSmsResult(napi_env env,napi_value exports)1786 static napi_value CreateEnumSendSmsResult(napi_env env, napi_value exports)
1787 {
1788     napi_value success = nullptr;
1789     napi_value unknow = nullptr;
1790     napi_value radioOff = nullptr;
1791     napi_value serviceUnavailable = nullptr;
1792 
1793     napi_create_int32(env, (int32_t)SendSmsResult::SEND_SMS_SUCCESS, &success);
1794     napi_create_int32(env, (int32_t)SendSmsResult::SEND_SMS_FAILURE_UNKNOWN, &unknow);
1795     napi_create_int32(env, (int32_t)SendSmsResult::SEND_SMS_FAILURE_RADIO_OFF, &radioOff);
1796     napi_create_int32(env, (int32_t)SendSmsResult::SEND_SMS_FAILURE_SERVICE_UNAVAILABLE, &serviceUnavailable);
1797 
1798     napi_property_descriptor desc[] = {
1799         DECLARE_NAPI_STATIC_PROPERTY("SEND_SMS_SUCCESS", success),
1800         DECLARE_NAPI_STATIC_PROPERTY("SEND_SMS_FAILURE_UNKNOWN", unknow),
1801         DECLARE_NAPI_STATIC_PROPERTY("SEND_SMS_FAILURE_RADIO_OFF", radioOff),
1802         DECLARE_NAPI_STATIC_PROPERTY("SEND_SMS_FAILURE_SERVICE_UNAVAILABLE", serviceUnavailable),
1803     };
1804 
1805     napi_value result = nullptr;
1806     napi_define_class(env, "SendSmsResult", NAPI_AUTO_LENGTH, CreateEnumConstructor, nullptr,
1807         sizeof(desc) / sizeof(*desc), desc, &result);
1808     napi_set_named_property(env, exports, "SendSmsResult", result);
1809     return exports;
1810 }
1811 
CreateEnumShortMessageClass(napi_env env,napi_value exports)1812 static napi_value CreateEnumShortMessageClass(napi_env env, napi_value exports)
1813 {
1814     napi_property_descriptor desc[] = {
1815         DECLARE_NAPI_STATIC_PROPERTY(
1816             "UNKNOWN", NapiUtil::ToInt32Value(env, static_cast<int32_t>(ShortMessageClass::UNKNOWN))),
1817         DECLARE_NAPI_STATIC_PROPERTY("INSTANT_MESSAGE",
1818             NapiUtil::ToInt32Value(env, static_cast<int32_t>(ShortMessageClass::INSTANT_MESSAGE))),
1819         DECLARE_NAPI_STATIC_PROPERTY("OPTIONAL_MESSAGE",
1820             NapiUtil::ToInt32Value(env, static_cast<int32_t>(ShortMessageClass::OPTIONAL_MESSAGE))),
1821         DECLARE_NAPI_STATIC_PROPERTY(
1822             "SIM_MESSAGE", NapiUtil::ToInt32Value(env, static_cast<int32_t>(ShortMessageClass::SIM_MESSAGE))),
1823         DECLARE_NAPI_STATIC_PROPERTY("FORWARD_MESSAGE",
1824             NapiUtil::ToInt32Value(env, static_cast<int32_t>(ShortMessageClass::FORWARD_MESSAGE))),
1825     };
1826     napi_value result = nullptr;
1827     napi_define_class(env, "ShortMessageClass", NAPI_AUTO_LENGTH, CreateEnumConstructor, nullptr,
1828         sizeof(desc) / sizeof(*desc), desc, &result);
1829     napi_set_named_property(env, exports, "ShortMessageClass", result);
1830     return exports;
1831 }
1832 
CreateEnumMessageStatusClass(napi_env env,napi_value exports)1833 static napi_value CreateEnumMessageStatusClass(napi_env env, napi_value exports)
1834 {
1835     napi_property_descriptor desc[] = {
1836         DECLARE_NAPI_STATIC_PROPERTY("SIM_MESSAGE_STATUS_FREE",
1837             NapiUtil::ToInt32Value(
1838                 env, static_cast<int32_t>(ShortMessage::SmsSimMessageStatus::SMS_SIM_MESSAGE_STATUS_FREE))),
1839         DECLARE_NAPI_STATIC_PROPERTY("SIM_MESSAGE_STATUS_READ",
1840             NapiUtil::ToInt32Value(
1841                 env, static_cast<int32_t>(ShortMessage::SmsSimMessageStatus::SMS_SIM_MESSAGE_STATUS_READ))),
1842         DECLARE_NAPI_STATIC_PROPERTY("SIM_MESSAGE_STATUS_UNREAD",
1843             NapiUtil::ToInt32Value(
1844                 env, static_cast<int32_t>(ShortMessage::SmsSimMessageStatus::SMS_SIM_MESSAGE_STATUS_UNREAD))),
1845         DECLARE_NAPI_STATIC_PROPERTY("SIM_MESSAGE_STATUS_SENT",
1846             NapiUtil::ToInt32Value(
1847                 env, static_cast<int32_t>(ShortMessage::SmsSimMessageStatus::SMS_SIM_MESSAGE_STATUS_SENT))),
1848         DECLARE_NAPI_STATIC_PROPERTY("SIM_MESSAGE_STATUS_UNSENT",
1849             NapiUtil::ToInt32Value(
1850                 env, static_cast<int32_t>(ShortMessage::SmsSimMessageStatus::SMS_SIM_MESSAGE_STATUS_UNSENT))),
1851     };
1852     napi_value result = nullptr;
1853     napi_define_class(env, "SimMessageStatus", NAPI_AUTO_LENGTH, CreateEnumConstructor, nullptr,
1854         sizeof(desc) / sizeof(*desc), desc, &result);
1855     napi_set_named_property(env, exports, "SimMessageStatus", result);
1856     return exports;
1857 }
1858 
CreateEnumRanType(napi_env env,napi_value exports)1859 static napi_value CreateEnumRanType(napi_env env, napi_value exports)
1860 {
1861     napi_property_descriptor desc[] = {
1862         DECLARE_NAPI_STATIC_PROPERTY(
1863             "TYPE_GSM", NapiUtil::ToInt32Value(env, static_cast<int32_t>(RanType::TYPE_GSM))),
1864         DECLARE_NAPI_STATIC_PROPERTY(
1865             "TYPE_CDMA", NapiUtil::ToInt32Value(env, static_cast<int32_t>(RanType::TYPE_CDMA))),
1866     };
1867     napi_value result = nullptr;
1868     napi_define_class(env, "RanType", NAPI_AUTO_LENGTH, CreateEnumConstructor, nullptr,
1869         sizeof(desc) / sizeof(*desc), desc, &result);
1870     napi_set_named_property(env, exports, "RanType", result);
1871     return exports;
1872 }
1873 
CreateEnumSmsSegmentsInfo(napi_env env,napi_value exports)1874 static napi_value CreateEnumSmsSegmentsInfo(napi_env env, napi_value exports)
1875 {
1876     napi_property_descriptor desc[] = {
1877         DECLARE_NAPI_STATIC_PROPERTY("SMS_ENCODING_UNKNOWN",
1878             NapiUtil::ToInt32Value(
1879                 env, static_cast<int32_t>(ISmsServiceInterface::SmsEncodingScheme::SMS_ENCODING_UNKNOWN))),
1880         DECLARE_NAPI_STATIC_PROPERTY("SMS_ENCODING_7BIT",
1881             NapiUtil::ToInt32Value(
1882                 env, static_cast<int32_t>(ISmsServiceInterface::SmsEncodingScheme::SMS_ENCODING_7BIT))),
1883         DECLARE_NAPI_STATIC_PROPERTY("SMS_ENCODING_8BIT",
1884             NapiUtil::ToInt32Value(
1885                 env, static_cast<int32_t>(ISmsServiceInterface::SmsEncodingScheme::SMS_ENCODING_8BIT))),
1886         DECLARE_NAPI_STATIC_PROPERTY("SMS_ENCODING_16BIT",
1887             NapiUtil::ToInt32Value(
1888                 env, static_cast<int32_t>(ISmsServiceInterface::SmsEncodingScheme::SMS_ENCODING_16BIT))),
1889     };
1890     napi_value result = nullptr;
1891     napi_define_class(env, "SmsEncodingScheme", NAPI_AUTO_LENGTH, CreateEnumConstructor, nullptr,
1892         sizeof(desc) / sizeof(*desc), desc, &result);
1893     napi_set_named_property(env, exports, "SmsEncodingScheme", result);
1894     return exports;
1895 }
1896 
InitEnumSendSmsResult(napi_env env,napi_value exports)1897 static napi_value InitEnumSendSmsResult(napi_env env, napi_value exports)
1898 {
1899     napi_property_descriptor desc[] = {
1900         DECLARE_NAPI_STATIC_PROPERTY(
1901             "SEND_SMS_SUCCESS", NapiUtil::ToInt32Value(env, static_cast<int32_t>(SEND_SMS_SUCCESS))),
1902         DECLARE_NAPI_STATIC_PROPERTY("SEND_SMS_FAILURE_UNKNOWN",
1903             NapiUtil::ToInt32Value(env, static_cast<int32_t>(SEND_SMS_FAILURE_UNKNOWN))),
1904         DECLARE_NAPI_STATIC_PROPERTY("SEND_SMS_FAILURE_RADIO_OFF",
1905             NapiUtil::ToInt32Value(env, static_cast<int32_t>(SEND_SMS_FAILURE_RADIO_OFF))),
1906         DECLARE_NAPI_STATIC_PROPERTY("SEND_SMS_FAILURE_SERVICE_UNAVAILABLE",
1907             NapiUtil::ToInt32Value(env, static_cast<int32_t>(SEND_SMS_FAILURE_SERVICE_UNAVAILABLE))),
1908     };
1909     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
1910     return exports;
1911 }
1912 
InitEnumShortMessageClass(napi_env env,napi_value exports)1913 static napi_value InitEnumShortMessageClass(napi_env env, napi_value exports)
1914 {
1915     napi_property_descriptor desc[] = {
1916         DECLARE_NAPI_STATIC_PROPERTY(
1917             "UNKNOWN", NapiUtil::ToInt32Value(env, static_cast<int32_t>(ShortMessageClass::UNKNOWN))),
1918         DECLARE_NAPI_STATIC_PROPERTY("INSTANT_MESSAGE",
1919             NapiUtil::ToInt32Value(env, static_cast<int32_t>(ShortMessageClass::INSTANT_MESSAGE))),
1920         DECLARE_NAPI_STATIC_PROPERTY("OPTIONAL_MESSAGE",
1921             NapiUtil::ToInt32Value(env, static_cast<int32_t>(ShortMessageClass::OPTIONAL_MESSAGE))),
1922         DECLARE_NAPI_STATIC_PROPERTY(
1923             "SIM_MESSAGE", NapiUtil::ToInt32Value(env, static_cast<int32_t>(ShortMessageClass::SIM_MESSAGE))),
1924         DECLARE_NAPI_STATIC_PROPERTY("FORWARD_MESSAGE",
1925             NapiUtil::ToInt32Value(env, static_cast<int32_t>(ShortMessageClass::FORWARD_MESSAGE))),
1926     };
1927     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
1928     return exports;
1929 }
1930 
InitEnumMessageStatusClass(napi_env env,napi_value exports)1931 static napi_value InitEnumMessageStatusClass(napi_env env, napi_value exports)
1932 {
1933     napi_property_descriptor desc[] = {
1934         DECLARE_NAPI_STATIC_PROPERTY("SIM_MESSAGE_STATUS_FREE",
1935             NapiUtil::ToInt32Value(
1936                 env, static_cast<int32_t>(ShortMessage::SmsSimMessageStatus::SMS_SIM_MESSAGE_STATUS_FREE))),
1937         DECLARE_NAPI_STATIC_PROPERTY("SIM_MESSAGE_STATUS_READ",
1938             NapiUtil::ToInt32Value(
1939                 env, static_cast<int32_t>(ShortMessage::SmsSimMessageStatus::SMS_SIM_MESSAGE_STATUS_READ))),
1940         DECLARE_NAPI_STATIC_PROPERTY("SIM_MESSAGE_STATUS_UNREAD",
1941             NapiUtil::ToInt32Value(
1942                 env, static_cast<int32_t>(ShortMessage::SmsSimMessageStatus::SMS_SIM_MESSAGE_STATUS_UNREAD))),
1943         DECLARE_NAPI_STATIC_PROPERTY("SIM_MESSAGE_STATUS_SENT",
1944             NapiUtil::ToInt32Value(
1945                 env, static_cast<int32_t>(ShortMessage::SmsSimMessageStatus::SMS_SIM_MESSAGE_STATUS_SENT))),
1946         DECLARE_NAPI_STATIC_PROPERTY("SIM_MESSAGE_STATUS_UNSENT",
1947             NapiUtil::ToInt32Value(
1948                 env, static_cast<int32_t>(ShortMessage::SmsSimMessageStatus::SMS_SIM_MESSAGE_STATUS_UNSENT))),
1949     };
1950     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
1951     return exports;
1952 }
1953 
InitEnumRanType(napi_env env,napi_value exports)1954 static napi_value InitEnumRanType(napi_env env, napi_value exports)
1955 {
1956     napi_property_descriptor desc[] = {
1957         DECLARE_NAPI_STATIC_PROPERTY(
1958             "TYPE_GSM", NapiUtil::ToInt32Value(env, static_cast<int32_t>(RanType::TYPE_GSM))),
1959         DECLARE_NAPI_STATIC_PROPERTY(
1960             "TYPE_CDMA", NapiUtil::ToInt32Value(env, static_cast<int32_t>(RanType::TYPE_CDMA))),
1961     };
1962     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
1963     return exports;
1964 }
1965 
InitEnumSmsSegmentsInfo(napi_env env,napi_value exports)1966 static napi_value InitEnumSmsSegmentsInfo(napi_env env, napi_value exports)
1967 {
1968     napi_property_descriptor desc[] = {
1969         DECLARE_NAPI_STATIC_PROPERTY("SMS_ENCODING_UNKNOWN",
1970             NapiUtil::ToInt32Value(
1971                 env, static_cast<int32_t>(ISmsServiceInterface::SmsEncodingScheme::SMS_ENCODING_UNKNOWN))),
1972         DECLARE_NAPI_STATIC_PROPERTY("SMS_ENCODING_7BIT",
1973             NapiUtil::ToInt32Value(
1974                 env, static_cast<int32_t>(ISmsServiceInterface::SmsEncodingScheme::SMS_ENCODING_7BIT))),
1975         DECLARE_NAPI_STATIC_PROPERTY("SMS_ENCODING_8BIT",
1976             NapiUtil::ToInt32Value(
1977                 env, static_cast<int32_t>(ISmsServiceInterface::SmsEncodingScheme::SMS_ENCODING_8BIT))),
1978         DECLARE_NAPI_STATIC_PROPERTY("SMS_ENCODING_16BIT",
1979             NapiUtil::ToInt32Value(
1980                 env, static_cast<int32_t>(ISmsServiceInterface::SmsEncodingScheme::SMS_ENCODING_16BIT))),
1981     };
1982     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
1983     return exports;
1984 }
1985 
1986 EXTERN_C_START
InitNapiSmsRegistry(napi_env env,napi_value exports)1987 napi_value InitNapiSmsRegistry(napi_env env, napi_value exports)
1988 {
1989     napi_property_descriptor desc[] = {
1990         DECLARE_NAPI_FUNCTION("sendMessage", SendMessage),
1991         DECLARE_NAPI_FUNCTION("sendShortMessage", SendShortMessage),
1992         DECLARE_NAPI_FUNCTION("createMessage", CreateMessage),
1993         DECLARE_NAPI_FUNCTION("setDefaultSmsSlotId", SetDefaultSmsSlotId),
1994         DECLARE_NAPI_FUNCTION("getDefaultSmsSlotId", GetDefaultSmsSlotId),
1995         DECLARE_NAPI_FUNCTION("getDefaultSmsSimId", GetDefaultSmsSimId),
1996         DECLARE_NAPI_FUNCTION("setSmscAddr", SetSmscAddr),
1997         DECLARE_NAPI_FUNCTION("getSmscAddr", GetSmscAddr),
1998         DECLARE_NAPI_FUNCTION("addSimMessage", AddSimMessage),
1999         DECLARE_NAPI_FUNCTION("delSimMessage", DelSimMessage),
2000         DECLARE_NAPI_FUNCTION("updateSimMessage", UpdateSimMessage),
2001         DECLARE_NAPI_FUNCTION("getAllSimMessages", GetAllSimMessages),
2002         DECLARE_NAPI_FUNCTION("setCBConfig", SetCBConfig),
2003         DECLARE_NAPI_FUNCTION("splitMessage", SplitMessage),
2004         DECLARE_NAPI_FUNCTION("hasSmsCapability", HasSmsCapability),
2005         DECLARE_NAPI_FUNCTION("getSmsSegmentsInfo", GetSmsSegmentsInfo),
2006         DECLARE_NAPI_FUNCTION("isImsSmsSupported", IsImsSmsSupported),
2007         DECLARE_NAPI_FUNCTION("getImsShortMessageFormat", GetImsShortMessageFormat),
2008         DECLARE_NAPI_FUNCTION("decodeMms", NapiMms::DecodeMms),
2009         DECLARE_NAPI_FUNCTION("encodeMms", NapiMms::EncodeMms),
2010         DECLARE_NAPI_FUNCTION("sendMms", NapiSendRecvMms::SendMms),
2011         DECLARE_NAPI_FUNCTION("downloadMms", NapiSendRecvMms::DownloadMms),
2012     };
2013     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
2014     CreateEnumSendSmsResult(env, exports);
2015     CreateEnumShortMessageClass(env, exports);
2016     CreateEnumMessageStatusClass(env, exports);
2017     CreateEnumRanType(env, exports);
2018     CreateEnumSmsSegmentsInfo(env, exports);
2019     InitEnumSendSmsResult(env, exports);
2020     InitEnumShortMessageClass(env, exports);
2021     InitEnumMessageStatusClass(env, exports);
2022     InitEnumRanType(env, exports);
2023     InitEnumSmsSegmentsInfo(env, exports);
2024     NapiMms::InitEnumMmsCharSets(env, exports);
2025     NapiMms::InitEnumMessageType(env, exports);
2026     NapiMms::InitEnumPriorityType(env, exports);
2027     NapiMms::InitEnumVersionType(env, exports);
2028     NapiMms::InitEnumDispositionType(env, exports);
2029     NapiMms::InitEnumReportAllowedType(env, exports);
2030     NapiMms::InitSupportEnumMmsCharSets(env, exports);
2031     NapiMms::InitSupportEnumMessageType(env, exports);
2032     NapiMms::InitSupportEnumPriorityType(env, exports);
2033     NapiMms::InitSupportEnumVersionType(env, exports);
2034     NapiMms::InitSupportEnumDispositionType(env, exports);
2035     NapiMms::InitSupportEnumReportAllowedType(env, exports);
2036     return exports;
2037 }
2038 EXTERN_C_END
2039 
2040 static napi_module g_smsModule = {
2041     .nm_version = 1,
2042     .nm_flags = 0,
2043     .nm_filename = nullptr,
2044     .nm_register_func = InitNapiSmsRegistry,
2045     .nm_modname = "telephony.sms",
2046     .nm_priv = ((void *)0),
2047     .reserved = {(void *)0},
2048 };
2049 
RegisterTelephonySmsModule(void)2050 extern "C" __attribute__((constructor)) void RegisterTelephonySmsModule(void)
2051 {
2052     napi_module_register(&g_smsModule);
2053 }
2054 } // namespace Telephony
2055 } // namespace OHOS
2056