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