1 /*
2 * Copyright (c) 2022-2024 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_context_common.h"
16
17 namespace OHOS {
18 namespace Security {
19 namespace AccessToken {
20 namespace {
21 static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {
22 LOG_CORE, SECURITY_DOMAIN_ACCESSTOKEN, "AtManagerAsyncWorkData"
23 };
24 }
25
GetJsErrorCode(int32_t errCode)26 int32_t NapiContextCommon::GetJsErrorCode(int32_t errCode)
27 {
28 int32_t jsCode;
29 switch (errCode) {
30 case RET_SUCCESS:
31 jsCode = JS_OK;
32 break;
33 case ERR_PERMISSION_DENIED:
34 jsCode = JS_ERROR_PERMISSION_DENIED;
35 break;
36 case ERR_NOT_SYSTEM_APP:
37 jsCode = JS_ERROR_NOT_SYSTEM_APP;
38 break;
39 case ERR_PARAM_INVALID:
40 jsCode = JS_ERROR_PARAM_INVALID;
41 break;
42 case ERR_TOKENID_NOT_EXIST:
43 jsCode = JS_ERROR_TOKENID_NOT_EXIST;
44 break;
45 case ERR_PERMISSION_NOT_EXIST:
46 jsCode = JS_ERROR_PERMISSION_NOT_EXIST;
47 break;
48 case ERR_INTERFACE_NOT_USED_TOGETHER:
49 case ERR_CALLBACK_ALREADY_EXIST:
50 jsCode = JS_ERROR_NOT_USE_TOGETHER;
51 break;
52 case ERR_CALLBACKS_EXCEED_LIMITATION:
53 jsCode = JS_ERROR_REGISTERS_EXCEED_LIMITATION;
54 break;
55 case ERR_IDENTITY_CHECK_FAILED:
56 jsCode = JS_ERROR_PERMISSION_OPERATION_NOT_ALLOWED;
57 break;
58 case ERR_SERVICE_ABNORMAL:
59 case ERROR_IPC_REQUEST_FAIL:
60 case ERR_READ_PARCEL_FAILED:
61 case ERR_WRITE_PARCEL_FAILED:
62 jsCode = JS_ERROR_SERVICE_NOT_RUNNING;
63 break;
64 case ERR_MALLOC_FAILED:
65 jsCode = JS_ERROR_OUT_OF_MEMORY;
66 break;
67 default:
68 jsCode = JS_ERROR_INNER;
69 break;
70 }
71 ACCESSTOKEN_LOG_DEBUG(LABEL, "GetJsErrorCode nativeCode(%{public}d) jsCode(%{public}d).", errCode, jsCode);
72 return jsCode;
73 }
74
AtManagerAsyncWorkData(napi_env envValue)75 AtManagerAsyncWorkData::AtManagerAsyncWorkData(napi_env envValue)
76 {
77 env = envValue;
78 }
79
~AtManagerAsyncWorkData()80 AtManagerAsyncWorkData::~AtManagerAsyncWorkData()
81 {
82 if (env == nullptr) {
83 ACCESSTOKEN_LOG_ERROR(LABEL, "Invalid env");
84 return;
85 }
86 std::unique_ptr<uv_work_t> workPtr = std::make_unique<uv_work_t>();
87 std::unique_ptr<AtManagerAsyncWorkDataRel> workDataRel = std::make_unique<AtManagerAsyncWorkDataRel>();
88 uv_loop_s *loop = nullptr;
89 napi_get_uv_event_loop(env, &loop);
90 if ((loop == nullptr) || (workPtr == nullptr) || (workDataRel == nullptr)) {
91 ACCESSTOKEN_LOG_ERROR(LABEL, "Fail to init execution environment");
92 return;
93 }
94 workDataRel->env = env;
95 workDataRel->work = work;
96 workDataRel->callbackRef = callbackRef;
97 workPtr->data = reinterpret_cast<void *>(workDataRel.get());
98 NAPI_CALL_RETURN_VOID(env, uv_queue_work_with_qos(loop, workPtr.get(), [] (uv_work_t *work) {},
99 [] (uv_work_t *work, int status) {
100 if (work == nullptr) {
101 ACCESSTOKEN_LOG_ERROR(LABEL, "Work is nullptr");
102 return;
103 }
104 auto workDataRel = reinterpret_cast<AtManagerAsyncWorkDataRel *>(work->data);
105 if (workDataRel == nullptr) {
106 ACCESSTOKEN_LOG_ERROR(LABEL, "WorkDataRel is nullptr");
107 delete work;
108 return;
109 }
110 if (workDataRel->work != nullptr) {
111 napi_delete_async_work(workDataRel->env, workDataRel->work);
112 }
113 if (workDataRel->callbackRef != nullptr) {
114 napi_delete_reference(workDataRel->env, workDataRel->callbackRef);
115 }
116 delete workDataRel;
117 delete work;
118 }, uv_qos_default));
119 workDataRel.release();
120 workPtr.release();
121 }
122 } // namespace AccessToken
123 } // namespace Security
124 } // namespace OHOS