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 ¶meter, 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 ¶meter,
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 ¶meter, 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, ¶meter.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 ¶meter)
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, ¶meterCount, 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, ¶meterCount, 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, ¶meterCount, 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, ¶meterCount, 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, ¶meterCount, 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, ¶meterCount, 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, ¶meterCount, 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, ¶meterCount, 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, ¶meterCount, 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, ¶meterCount, 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, ¶meterCount, 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, ¶meterCount, 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, ¶meterCount, 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, ¶meterCount, 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, ¶meterCount, 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, ¶msCount, 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, ¶msCount, 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