1 /*
2 * Copyright (c) 2022 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 #include "napi_screenlock_ability.h"
16
17 #include <hitrace_meter.h>
18 #include <napi/native_api.h>
19 #include <pthread.h>
20 #include <unistd.h>
21 #include <uv.h>
22
23 #include <map>
24
25 #include "event_listener.h"
26 #include "ipc_skeleton.h"
27 #include "sclock_log.h"
28 #include "screenlock_app_manager.h"
29 #include "screenlock_callback.h"
30 #include "screenlock_common.h"
31 #include "screenlock_js_util.h"
32 #include "screenlock_manager.h"
33 #include "screenlock_system_ability_callback.h"
34
35 using namespace OHOS;
36 using namespace OHOS::ScreenLock;
37
38 namespace OHOS {
39 namespace ScreenLock {
40 constexpr const char *PERMISSION_VALIDATION_FAILED = "Permission validation failed.";
41 constexpr const char *PARAMETER_VALIDATION_FAILED = "Parameter validation failed.";
42 constexpr const char *CANCEL_UNLOCK_OPENATION = "The user canceled the unlock openation.";
43 constexpr const char *SERVICE_IS_ABNORMAL = "The screenlock management service is abnormal.";
44 const std::map<int, uint32_t> ERROR_CODE_CONVERSION = {
45 { E_SCREENLOCK_NO_PERMISSION, JsErrorCode::ERR_NO_PERMISSION },
46 { E_SCREENLOCK_PARAMETERS_INVALID, JsErrorCode::ERR_INVALID_PARAMS },
47 { E_SCREENLOCK_WRITE_PARCEL_ERROR, JsErrorCode::ERR_SERVICE_ABNORMAL },
48 { E_SCREENLOCK_NULLPTR, JsErrorCode::ERR_SERVICE_ABNORMAL },
49 { E_SCREENLOCK_SENDREQUEST_FAILED, JsErrorCode::ERR_SERVICE_ABNORMAL },
50
51 };
52 const std::map<uint32_t, std::string> ERROR_INFO_MAP = {
53 { JsErrorCode::ERR_NO_PERMISSION, PERMISSION_VALIDATION_FAILED },
54 { JsErrorCode::ERR_INVALID_PARAMS, PARAMETER_VALIDATION_FAILED },
55 { JsErrorCode::ERR_CANCEL_UNLOCK, CANCEL_UNLOCK_OPENATION },
56 { JsErrorCode::ERR_SERVICE_ABNORMAL, SERVICE_IS_ABNORMAL },
57 };
58
Init(napi_env env,napi_value exports)59 napi_status Init(napi_env env, napi_value exports)
60 {
61 napi_property_descriptor exportFuncs[] = {
62 DECLARE_NAPI_FUNCTION("isScreenLocked", OHOS::ScreenLock::NAPI_IsScreenLocked),
63 DECLARE_NAPI_FUNCTION("isLocked", OHOS::ScreenLock::NAPI_IsLocked),
64 DECLARE_NAPI_FUNCTION("lock", OHOS::ScreenLock::NAPI_Lock),
65 DECLARE_NAPI_FUNCTION("unlockScreen", OHOS::ScreenLock::NAPI_UnlockScreen),
66 DECLARE_NAPI_FUNCTION("unlock", OHOS::ScreenLock::NAPI_Unlock),
67 DECLARE_NAPI_FUNCTION("isSecureMode", OHOS::ScreenLock::NAPI_IsSecureMode),
68 DECLARE_NAPI_FUNCTION("isSecure", OHOS::ScreenLock::NAPI_IsSecure),
69 DECLARE_NAPI_FUNCTION("onSystemEvent", NAPI_OnSystemEvent),
70 DECLARE_NAPI_FUNCTION("sendScreenLockEvent", OHOS::ScreenLock::NAPI_ScreenLockSendEvent),
71 };
72 napi_define_properties(env, exports, sizeof(exportFuncs) / sizeof(*exportFuncs), exportFuncs);
73 return napi_ok;
74 }
75
IsVaildEvent(const std::string & type)76 napi_status IsVaildEvent(const std::string &type)
77 {
78 if (type == UNLOCK_SCREEN_RESULT || type == SCREEN_DRAWDONE || type == LOCK_SCREEN_RESULT) {
79 return napi_ok;
80 }
81 return napi_invalid_arg;
82 }
83
CheckParamType(napi_env env,napi_value param,napi_valuetype jsType)84 napi_status CheckParamType(napi_env env, napi_value param, napi_valuetype jsType)
85 {
86 napi_valuetype valueType = napi_undefined;
87 napi_status status = napi_typeof(env, param, &valueType);
88 if (status != napi_ok || valueType != jsType) {
89 return napi_invalid_arg;
90 }
91 return napi_ok;
92 }
93
CheckParamNumber(size_t argc,std::uint32_t paramNumber)94 napi_status CheckParamNumber(size_t argc, std::uint32_t paramNumber)
95 {
96 if (argc < paramNumber) {
97 return napi_invalid_arg;
98 }
99 return napi_ok;
100 }
101
ThrowError(napi_env env,const uint32_t & code,const std::string & msg)102 void ThrowError(napi_env env, const uint32_t &code, const std::string &msg)
103 {
104 SCLOCK_HILOGD("ThrowError start");
105 std::string errorCode = std::to_string(code);
106 napi_status status = napi_throw_error(env, errorCode.c_str(), msg.c_str());
107 if (status != napi_ok) {
108 SCLOCK_HILOGD("Failed to napi_throw_error");
109 }
110 SCLOCK_HILOGD("ThrowError end");
111 }
112
GetErrorInfo(int32_t errorCode,ErrorInfo & errorInfo)113 void GetErrorInfo(int32_t errorCode, ErrorInfo &errorInfo)
114 {
115 std::map<int, uint32_t>::const_iterator iter = ERROR_CODE_CONVERSION.find(errorCode);
116 if (iter != ERROR_CODE_CONVERSION.end()) {
117 errorInfo.errorCode_ = iter->second;
118 errorInfo.message_ = GetErrorMessage(errorInfo.errorCode_);
119 SCLOCK_HILOGD("GetErrorInfo errorInfo.code: %{public}d, errorInfo.message: %{public}s", errorInfo.errorCode_,
120 errorInfo.message_.c_str());
121 } else {
122 SCLOCK_HILOGD("GetErrorInfo errCode: %{public}d", errorCode);
123 }
124 }
125
GetErrorMessage(const uint32_t & code)126 std::string GetErrorMessage(const uint32_t &code)
127 {
128 std::string message;
129 std::map<uint32_t, std::string>::const_iterator iter = ERROR_INFO_MAP.find(code);
130 if (iter != ERROR_INFO_MAP.end()) {
131 message = iter->second;
132 }
133 SCLOCK_HILOGD("GetErrorMessage: message is %{public}s", message.c_str());
134 return message;
135 }
136
NAPI_IsScreenLocked(napi_env env,napi_callback_info info)137 napi_value NAPI_IsScreenLocked(napi_env env, napi_callback_info info)
138 {
139 SCLOCK_HILOGD("NAPI_IsScreenLocked begin");
140 AsyncScreenLockInfo *context = new AsyncScreenLockInfo();
141 auto input = [context](napi_env env, size_t argc, napi_value argv[], napi_value self) -> napi_status {
142 NAPI_ASSERT_BASE(
143 env, argc == ARGS_SIZE_ZERO || argc == ARGS_SIZE_ONE, " should 0 or 1 parameters!", napi_invalid_arg);
144 SCLOCK_HILOGD("input ---- argc : %{public}zu", argc);
145 return napi_ok;
146 };
147 auto output = [context](napi_env env, napi_value *result) -> napi_status {
148 napi_status status = napi_get_boolean(env, context->allowed, result);
149 SCLOCK_HILOGD("output ---- napi_get_boolean[%{public}d]", status);
150 return napi_ok;
151 };
152 auto exec = [context](AsyncCall::Context *ctx) {
153 SCLOCK_HILOGD("exec ---- NAPI_IsScreenLocked begin");
154 context->allowed = ScreenLockManager::GetInstance()->IsScreenLocked();
155 SCLOCK_HILOGD("NAPI_IsScreenLocked exec allowed = %{public}d ", context->allowed);
156 context->SetStatus(napi_ok);
157 };
158 context->SetAction(std::move(input), std::move(output));
159 AsyncCall asyncCall(env, info, context, ARGS_SIZE_ZERO);
160 return asyncCall.Call(env, exec);
161 }
162
NAPI_IsLocked(napi_env env,napi_callback_info info)163 napi_value NAPI_IsLocked(napi_env env, napi_callback_info info)
164 {
165 SCLOCK_HILOGD("NAPI_IsScreenLocked begin");
166 bool status = ScreenLockManager::GetInstance()->IsScreenLocked();
167 SCLOCK_HILOGD("isScreenlocked status=%{public}d", status);
168 napi_value result = nullptr;
169 napi_get_boolean(env, status, &result);
170 return result;
171 }
172
CompleteAsyncWork(napi_env env,napi_status status,void * data)173 static void CompleteAsyncWork(napi_env env, napi_status status, void *data)
174 {
175 EventListener *eventListener = reinterpret_cast<EventListener *>(data);
176 if (eventListener == nullptr) {
177 return;
178 }
179 if (eventListener->work != nullptr) {
180 napi_delete_async_work(env, eventListener->work);
181 }
182 delete eventListener;
183 }
184
AsyncCallLockScreen(napi_env env,EventListener * lockListener)185 void AsyncCallLockScreen(napi_env env, EventListener *lockListener)
186 {
187 napi_value resource = nullptr;
188 auto execute = [](napi_env env, void *data) {
189 EventListener *eventListener = reinterpret_cast<EventListener *>(data);
190 if (eventListener == nullptr) {
191 return;
192 }
193
194 sptr<ScreenLockSystemAbilityInterface> listener = new (std::nothrow) ScreenlockCallback(*eventListener);
195 if (listener == nullptr) {
196 SCLOCK_HILOGE("NAPI_Lock create callback object fail");
197 if (eventListener->callbackRef != nullptr) {
198 napi_delete_reference(env, eventListener->callbackRef);
199 }
200 return;
201 }
202 int32_t status = ScreenLockManager::GetInstance()->RequestLock(listener);
203 if (status != E_SCREENLOCK_OK) {
204 ErrorInfo errInfo(static_cast<uint32_t>(status));
205 GetErrorInfo(status, errInfo);
206 listener->SetErrorInfo(errInfo);
207 SystemEvent systemEvent("", std::to_string(status));
208 listener->OnCallBack(systemEvent);
209 }
210 };
211 NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, "AsyncCall", NAPI_AUTO_LENGTH, &resource));
212 NAPI_CALL_RETURN_VOID(env, napi_create_async_work(env, nullptr, resource, execute, CompleteAsyncWork,
213 static_cast<void *>(lockListener), &(lockListener->work)));
214 NAPI_CALL_RETURN_VOID(env, napi_queue_async_work(env, lockListener->work));
215 }
216
NAPI_Lock(napi_env env,napi_callback_info info)217 napi_value NAPI_Lock(napi_env env, napi_callback_info info)
218 {
219 SCLOCK_HILOGD("NAPI_Lock begin");
220 napi_value ret = nullptr;
221 size_t argc = ARGS_SIZE_ONE;
222 napi_value argv[ARGS_SIZE_ONE] = { nullptr };
223 napi_value thisVar = nullptr;
224 void *data = nullptr;
225 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, &data));
226 napi_ref callbackRef = nullptr;
227 EventListener *eventListener = nullptr;
228 if (argc == ARGS_SIZE_ONE) {
229 SCLOCK_HILOGD("NAPI_Lock callback");
230 if (CheckParamType(env, argv[ARGV_ZERO], napi_function) != napi_ok) {
231 ThrowError(env, JsErrorCode::ERR_INVALID_PARAMS, PARAMETER_VALIDATION_FAILED);
232 return ret;
233 }
234
235 SCLOCK_HILOGD("NAPI_Lock create callback");
236 napi_create_reference(env, argv[ARGV_ZERO], 1, &callbackRef);
237 eventListener = new (std::nothrow)
238 EventListener{ .env = env, .thisVar = thisVar, .callbackRef = callbackRef, .callBackResult = true };
239 if (eventListener == nullptr) {
240 SCLOCK_HILOGE("eventListener is nullptr");
241 return nullptr;
242 }
243 }
244 if (callbackRef == nullptr) {
245 SCLOCK_HILOGD("NAPI_Lock create promise");
246 napi_deferred deferred;
247 napi_create_promise(env, &deferred, &ret);
248 eventListener = new (std::nothrow)
249 EventListener{ .env = env, .thisVar = thisVar, .deferred = deferred, .callBackResult = true };
250 if (eventListener == nullptr) {
251 SCLOCK_HILOGE("eventListener is nullptr");
252 return nullptr;
253 }
254 } else {
255 SCLOCK_HILOGD("NAPI_Lock create callback");
256 napi_get_undefined(env, &ret);
257 }
258 AsyncCallLockScreen(env, eventListener);
259 return ret;
260 }
261
AsyncCallUnlockScreen(napi_env env,EventListener * unlockListener)262 void AsyncCallUnlockScreen(napi_env env, EventListener *unlockListener)
263 {
264 napi_value resource = nullptr;
265 auto execute = [](napi_env env, void *data) {
266 EventListener *eventListener = reinterpret_cast<EventListener *>(data);
267 if (eventListener == nullptr) {
268 SCLOCK_HILOGE("EventListener is nullptr");
269 return;
270 }
271 sptr<ScreenLockSystemAbilityInterface> listener = new (std::nothrow) ScreenlockCallback(*eventListener);
272 if (listener == nullptr) {
273 SCLOCK_HILOGE("ScreenlockCallback create callback object fail");
274 if (eventListener->callbackRef != nullptr) {
275 napi_delete_reference(env, eventListener->callbackRef);
276 }
277 return;
278 }
279 int32_t status = ScreenLockManager::GetInstance()->RequestUnlock(listener);
280 if (status != E_SCREENLOCK_OK) {
281 ErrorInfo errInfo(static_cast<uint32_t>(status));
282 GetErrorInfo(status, errInfo);
283 listener->SetErrorInfo(errInfo);
284 SystemEvent systemEvent("", std::to_string(status));
285 listener->OnCallBack(systemEvent);
286 }
287 };
288 NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, "AsyncCall", NAPI_AUTO_LENGTH, &resource));
289 NAPI_CALL_RETURN_VOID(env, napi_create_async_work(env, nullptr, resource, execute, CompleteAsyncWork,
290 static_cast<void *>(unlockListener), &(unlockListener->work)));
291 NAPI_CALL_RETURN_VOID(env, napi_queue_async_work(env, unlockListener->work));
292 }
293
NAPI_UnlockScreen(napi_env env,napi_callback_info info)294 napi_value NAPI_UnlockScreen(napi_env env, napi_callback_info info)
295 {
296 SCLOCK_HILOGD("NAPI_UnlockScreen begin");
297 StartAsyncTrace(HITRACE_TAG_MISC, "NAPI_UnlockScreen start", HITRACE_UNLOCKSCREEN);
298 napi_value ret = nullptr;
299 size_t argc = ARGS_SIZE_ONE;
300 napi_value argv[ARGS_SIZE_ONE] = { nullptr };
301 napi_value thisVar = nullptr;
302 void *data = nullptr;
303 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, &data));
304 NAPI_ASSERT(env, argc == ARGS_SIZE_ZERO || argc == ARGS_SIZE_ONE, "Wrong number of arguments, requires one");
305 napi_ref callbackRef = nullptr;
306 EventListener *eventListener = nullptr;
307 napi_valuetype valueType = napi_undefined;
308 if (argc == ARGS_SIZE_ONE) {
309 napi_typeof(env, argv[ARGV_ZERO], &valueType);
310 SCLOCK_HILOGD("NAPI_UnlockScreen callback");
311 NAPI_ASSERT(env, valueType == napi_function, "callback is not a function");
312 SCLOCK_HILOGD("NAPI_UnlockScreen create callback");
313 napi_create_reference(env, argv[ARGV_ZERO], 1, &callbackRef);
314 eventListener = new (std::nothrow) EventListener{ .env = env, .thisVar = thisVar, .callbackRef = callbackRef };
315 if (eventListener == nullptr) {
316 SCLOCK_HILOGE("eventListener is nullptr");
317 return nullptr;
318 }
319 }
320 if (callbackRef == nullptr) {
321 SCLOCK_HILOGD("NAPI_UnlockScreen create promise");
322 napi_deferred deferred;
323 napi_create_promise(env, &deferred, &ret);
324 eventListener = new (std::nothrow) EventListener{ .env = env, .thisVar = thisVar, .deferred = deferred };
325 if (eventListener == nullptr) {
326 SCLOCK_HILOGE("eventListener is nullptr");
327 return nullptr;
328 }
329 } else {
330 SCLOCK_HILOGD("NAPI_UnlockScreen create callback");
331 napi_get_undefined(env, &ret);
332 }
333 AsyncCallUnlockScreen(env, eventListener);
334 return ret;
335 }
336
NAPI_Unlock(napi_env env,napi_callback_info info)337 napi_value NAPI_Unlock(napi_env env, napi_callback_info info)
338 {
339 SCLOCK_HILOGD("NAPI_Unlock begin");
340 napi_value ret = nullptr;
341 size_t argc = ARGS_SIZE_ONE;
342 napi_value argv[ARGS_SIZE_ONE] = { nullptr };
343 napi_value thisVar = nullptr;
344 void *data = nullptr;
345 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, &data));
346 napi_ref callbackRef = nullptr;
347 EventListener *eventListener = nullptr;
348 if (argc == ARGS_SIZE_ONE) {
349 SCLOCK_HILOGD("NAPI_Unlock callback");
350 if (CheckParamType(env, argv[ARGV_ZERO], napi_function) != napi_ok) {
351 ThrowError(env, JsErrorCode::ERR_INVALID_PARAMS, PARAMETER_VALIDATION_FAILED);
352 return nullptr;
353 }
354
355 SCLOCK_HILOGD("NAPI_Unlock create callback");
356 napi_create_reference(env, argv[ARGV_ZERO], 1, &callbackRef);
357 eventListener = new (std::nothrow)
358 EventListener{ .env = env, .thisVar = thisVar, .callbackRef = callbackRef, .callBackResult = true };
359 if (eventListener == nullptr) {
360 SCLOCK_HILOGE("eventListener is nullptr");
361 return nullptr;
362 }
363 }
364 if (callbackRef == nullptr) {
365 SCLOCK_HILOGD("NAPI_Unlock create promise");
366 napi_deferred deferred;
367 napi_create_promise(env, &deferred, &ret);
368 eventListener = new (std::nothrow)
369 EventListener{ .env = env, .thisVar = thisVar, .deferred = deferred, .callBackResult = true };
370 if (eventListener == nullptr) {
371 SCLOCK_HILOGE("eventListener is nullptr");
372 return nullptr;
373 }
374 } else {
375 SCLOCK_HILOGD("NAPI_Unlock create callback");
376 napi_get_undefined(env, &ret);
377 }
378 AsyncCallUnlockScreen(env, eventListener);
379 return ret;
380 }
381
NAPI_IsSecureMode(napi_env env,napi_callback_info info)382 napi_value NAPI_IsSecureMode(napi_env env, napi_callback_info info)
383 {
384 SCLOCK_HILOGD("NAPI_IsSecureMode begin");
385 AsyncScreenLockInfo *context = new AsyncScreenLockInfo();
386 auto input = [context](napi_env env, size_t argc, napi_value argv[], napi_value self) -> napi_status {
387 SCLOCK_HILOGD("input ---- argc : %{public}zu", argc);
388 return napi_ok;
389 };
390 auto output = [context](napi_env env, napi_value *result) -> napi_status {
391 napi_status status = napi_get_boolean(env, context->allowed, result);
392 SCLOCK_HILOGD("output ---- napi_get_boolean[%{public}d]", status);
393 return napi_ok;
394 };
395 auto exec = [context](AsyncCall::Context *ctx) {
396 SCLOCK_HILOGD("exec ---- NAPI_IsSecureMode begin");
397 context->allowed = ScreenLockManager::GetInstance()->GetSecure();
398 SCLOCK_HILOGD("NAPI_IsSecureMode exec allowed = %{public}d ", context->allowed);
399 context->SetStatus(napi_ok);
400 };
401 context->SetAction(std::move(input), std::move(output));
402 AsyncCall asyncCall(env, info, context, ARGS_SIZE_ZERO);
403 return asyncCall.Call(env, exec);
404 }
405
NAPI_IsSecure(napi_env env,napi_callback_info info)406 napi_value NAPI_IsSecure(napi_env env, napi_callback_info info)
407 {
408 SCLOCK_HILOGD("NAPI_IsSecure begin");
409 bool status = ScreenLockManager::GetInstance()->GetSecure();
410 SCLOCK_HILOGD("isSecureMode status=%{public}d", status);
411 napi_value result = nullptr;
412 napi_get_boolean(env, status, &result);
413 return result;
414 }
415
NAPI_OnSystemEvent(napi_env env,napi_callback_info info)416 napi_value NAPI_OnSystemEvent(napi_env env, napi_callback_info info)
417 {
418 SCLOCK_HILOGD("NAPI_OnSystemEvent in");
419 napi_value result = nullptr;
420 bool status = false;
421 napi_get_boolean(env, status, &result);
422 size_t argc = ARGS_SIZE_ONE;
423 napi_value argv = { nullptr };
424 napi_value thisVar = nullptr;
425 void *data = nullptr;
426 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &argv, &thisVar, &data));
427 if (CheckParamNumber(argc, ARGS_SIZE_ONE) != napi_ok) {
428 ThrowError(env, JsErrorCode::ERR_INVALID_PARAMS, PARAMETER_VALIDATION_FAILED);
429 return result;
430 }
431 if (CheckParamType(env, argv, napi_function) != napi_ok) {
432 ThrowError(env, JsErrorCode::ERR_INVALID_PARAMS, PARAMETER_VALIDATION_FAILED);
433 return result;
434 }
435 napi_ref callbackRef = nullptr;
436 napi_create_reference(env, argv, ARGS_SIZE_ONE, &callbackRef);
437 EventListener eventListener{ .env = env, .thisVar = thisVar, .callbackRef = callbackRef };
438 sptr<ScreenLockSystemAbilityInterface> listener = new (std::nothrow) ScreenlockSystemAbilityCallback(eventListener);
439 if (listener != nullptr) {
440 int32_t retCode = ScreenLockAppManager::GetInstance()->OnSystemEvent(listener);
441 if (retCode != E_SCREENLOCK_OK) {
442 ErrorInfo errInfo(static_cast<uint32_t>(retCode));
443 GetErrorInfo(retCode, errInfo);
444 ThrowError(env, errInfo.errorCode_, errInfo.message_);
445 status = false;
446 } else {
447 status = true;
448 }
449 }
450 SCLOCK_HILOGD("on system event status=%{public}d", status);
451 napi_get_boolean(env, status, &result);
452 return result;
453 }
454
NAPI_ScreenLockSendEvent(napi_env env,napi_callback_info info)455 napi_value NAPI_ScreenLockSendEvent(napi_env env, napi_callback_info info)
456 {
457 SCLOCK_HILOGD("NAPI_ScreenLockSendEvent begin");
458 SendEventInfo *context = new SendEventInfo();
459 auto input = [context](napi_env env, size_t argc, napi_value argv[], napi_value self) -> napi_status {
460 SCLOCK_HILOGD("input ---- argc : %{public}zu", argc);
461 if (CheckParamNumber(argc, ARGS_SIZE_TWO) != napi_ok) {
462 ThrowError(env, JsErrorCode::ERR_INVALID_PARAMS, PARAMETER_VALIDATION_FAILED);
463 return napi_invalid_arg;
464 }
465 if (CheckParamType(env, argv[ARGV_ZERO], napi_string) != napi_ok) {
466 ThrowError(env, JsErrorCode::ERR_INVALID_PARAMS, PARAMETER_VALIDATION_FAILED);
467 return napi_invalid_arg;
468 }
469 char event[MAX_VALUE_LEN] = { 0 };
470 size_t len;
471 napi_get_value_string_utf8(env, argv[ARGV_ZERO], event, MAX_VALUE_LEN, &len);
472 context->eventInfo = event;
473 std::string type = event;
474 if (IsVaildEvent(type) != napi_ok) {
475 ThrowError(env, JsErrorCode::ERR_INVALID_PARAMS, PARAMETER_VALIDATION_FAILED);
476 return napi_invalid_arg;
477 }
478 if (CheckParamType(env, argv[ARGV_ONE], napi_number) != napi_ok) {
479 ThrowError(env, JsErrorCode::ERR_INVALID_PARAMS, PARAMETER_VALIDATION_FAILED);
480 return napi_invalid_arg;
481 }
482 napi_get_value_int32(env, argv[ARGV_ONE], &context->param);
483 return napi_ok;
484 };
485 auto output = [context](napi_env env, napi_value *result) -> napi_status {
486 napi_status status = napi_get_boolean(env, context->allowed, result);
487 SCLOCK_HILOGD("output ---- napi_get_boolean[%{public}d]", status);
488 return napi_ok;
489 };
490 auto exec = [context](AsyncCall::Context *ctx) {
491 int32_t retCode = ScreenLockAppManager::GetInstance()->SendScreenLockEvent(context->eventInfo, context->param);
492 if (retCode != E_SCREENLOCK_OK) {
493 ErrorInfo errInfo(static_cast<uint32_t>(retCode));
494 GetErrorInfo(retCode, errInfo);
495 context->SetErrorInfo(errInfo);
496 context->allowed = false;
497 } else {
498 context->SetStatus(napi_ok);
499 context->allowed = true;
500 }
501 };
502 context->SetAction(std::move(input), std::move(output));
503 AsyncCall asyncCall(env, info, context, ARGV_TWO);
504 return asyncCall.Call(env, exec);
505 }
506
ScreenlockInit(napi_env env,napi_value exports)507 static napi_value ScreenlockInit(napi_env env, napi_value exports)
508 {
509 napi_status ret = Init(env, exports);
510 if (ret != napi_ok) {
511 SCLOCK_HILOGE("ModuleInit failed!");
512 }
513 return exports;
514 }
515
RegisterModule(void)516 extern "C" __attribute__((constructor)) void RegisterModule(void)
517 {
518 napi_module module = {.nm_version = 1, // NAPI v1
519 .nm_flags = 0, // normal
520 .nm_filename = nullptr,
521 .nm_register_func = ScreenlockInit,
522 .nm_modname = "screenLock",
523 .nm_priv = nullptr,
524 .reserved = {}};
525 napi_module_register(&module);
526 }
527 } // namespace ScreenLock
528 } // namespace OHOS
529