1 /*
2  * Copyright (c) 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 
16 #include "advanced_ui_component/navpushpathhelper/include/hsp_silentinstall_napi.h"
17 #include "advanced_ui_component/navpushpathhelper/include/hsp_silentinstall.h"
18 #include "base/log/log.h"
19 
20 using namespace std;
21 
22 namespace OHOS::NavPushPathHelper {
23 
IsHspExist(napi_env env,napi_callback_info info)24 napi_value HspSilentInstallNapi::IsHspExist(napi_env env, napi_callback_info info)
25 {
26     size_t argc = 2;
27     size_t requireArgc = 2;
28     napi_value args[2] = { nullptr };
29     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr));
30     NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments");
31 
32     // get first parameter:moduleName
33     napi_valuetype moduleNameType;
34     NAPI_CALL(env, napi_typeof(env, args[0], &moduleNameType));
35     NAPI_ASSERT(env, moduleNameType == napi_string, "Wrong argument type. String expected.");
36 
37     size_t maxValueLen = 1024;
38     char moduleNameValue[maxValueLen];
39     size_t moduleNameLength = 0;
40     napi_get_value_string_utf8(env, args[0], moduleNameValue, maxValueLen, &moduleNameLength);
41     std::string moduleName = moduleNameValue;
42 
43     // get second parameter:pathName
44     napi_valuetype pathNameType;
45     NAPI_CALL(env, napi_typeof(env, args[1], &pathNameType));
46     NAPI_ASSERT(env, pathNameType == napi_string, "Wrong argument type. String expected.");
47 
48     char pathNameValue[maxValueLen];
49     size_t pathNameLength = 0;
50     napi_get_value_string_utf8(env, args[1], pathNameValue, maxValueLen, &pathNameLength);
51     std::string pathName = pathNameValue;
52 
53     bool isHspExits = HspSilentInstall::IsHspExist(moduleName, pathName);
54     napi_value jsResult;
55     NAPI_CALL(env, napi_get_boolean(env, isHspExits, &jsResult));
56     return jsResult;
57 }
58 
InitRouteMap(napi_env env,napi_callback_info info)59 napi_value HspSilentInstallNapi::InitRouteMap(napi_env env, napi_callback_info info)
60 {
61     HspSilentInstall::InitRouteMap();
62     return nullptr;
63 }
64 
SilentInstall(napi_env env,napi_callback_info info)65 napi_value HspSilentInstallNapi::SilentInstall(napi_env env, napi_callback_info info)
66 {
67     napi_value result = nullptr;
68     size_t argc = 3;
69     size_t requireArgc = 3;
70     napi_value args[3] = { nullptr };
71     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr));
72     NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments");
73 
74     // get first parameter:moduleName
75     std::string moduleName;
76     getModuleName(env, args[0], moduleName);
77 
78     auto callbackData = new CallbackData();
79     int parameterNum = 1;
80     const int indexTwo = 2;
81     napi_create_reference(env, args[1], parameterNum, &(callbackData->successCallback));
82     napi_create_reference(env, args[indexTwo], parameterNum, &(callbackData->failCallback));
83     callbackData->env = env;
84 
85     auto successCallback = [callbackData]() {
86         uv_loop_s *loop = nullptr;
87         napi_get_uv_event_loop(callbackData->env, &loop);
88         uv_work_t *work = new (std::nothrow) uv_work_t;
89         work->data = reinterpret_cast<void *>(callbackData);
90         uv_queue_work(loop, work, [](uv_work_t *work) { (void)work; }, SendSuccessBackWork);
91     };
92 
93     auto failCallback = [callbackData](int32_t errorCode, const std::string& errorMessage) {
94         callbackData->errCode = errorCode;
95         callbackData->errorMessage = errorMessage;
96 
97         uv_loop_s *loop = nullptr;
98         napi_get_uv_event_loop(callbackData->env, &loop);
99         uv_work_t *work = new (std::nothrow) uv_work_t;
100         work->data = reinterpret_cast<void *>(callbackData);
101         uv_queue_work(loop, work, [](uv_work_t *work) { (void)work; }, SendFailBackWork);
102     };
103 
104     HspSilentInstall::SilentInstall(moduleName, successCallback, failCallback);
105     return result;
106 }
107 
getModuleName(napi_env env,napi_value args,std::string & moduleName)108 napi_value HspSilentInstallNapi::getModuleName(napi_env env, napi_value args, std::string& moduleName)
109 {
110     napi_valuetype moduleNameType;
111     NAPI_CALL(env, napi_typeof(env, args, &moduleNameType));
112     NAPI_ASSERT(env, moduleNameType == napi_string, "Wrong argument type. String expected.");
113 
114     napi_status status;
115     size_t maxValueLen = 1024;
116     char moduleNameValue[maxValueLen];
117     size_t moduleNameLength = 0;
118     status = napi_get_value_string_utf8(env, args, moduleNameValue, maxValueLen, &moduleNameLength);
119     NAPI_ASSERT(env, status == napi_ok, "Failed to napi_get_value_string_utf8");
120     moduleName = moduleNameValue;
121     return nullptr;
122 }
123 
SendSuccessBackWork(uv_work_t * work,int statusIn)124 void HspSilentInstallNapi::SendSuccessBackWork(uv_work_t *work, int statusIn)
125 {
126     (void)statusIn;
127     napi_status status;
128     napi_handle_scope scope = nullptr;
129     CallbackData *callbackData = reinterpret_cast<CallbackData *>(work->data);
130     if (callbackData == nullptr) {
131         TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "SendSuccessBackWork -> callbackData is null");
132         return;
133     }
134 
135     napi_open_handle_scope(callbackData->env, &scope);
136     if (scope == nullptr) {
137         TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "SendSuccessBackWork -> scope is null");
138         return;
139     }
140 
141     napi_value callback = nullptr;
142     status = napi_get_reference_value(callbackData->env, callbackData->successCallback, &callback);
143     if (status != napi_ok) {
144         TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "SendSuccessBackWork -> napi_get_reference_value error");
145         napi_close_handle_scope(callbackData->env, scope);
146         return;
147     }
148 
149     napi_value result;
150     status = napi_call_function(callbackData->env, nullptr, callback, 0, nullptr, &result);
151     if (status != napi_ok) {
152         TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "SendSuccessBackWork -> napi_call_function error");
153         napi_close_handle_scope(callbackData->env, scope);
154         return;
155     }
156 
157     napi_close_handle_scope(callbackData->env, scope);
158 
159     if (callbackData != nullptr) {
160         delete callbackData;
161         callbackData = nullptr;
162     }
163 
164     if (work != nullptr) {
165         delete work;
166         work = nullptr;
167     }
168 }
169 
SendFailBackWork(uv_work_t * work,int statusIn)170 void HspSilentInstallNapi::SendFailBackWork(uv_work_t *work, int statusIn)
171 {
172     (void)statusIn;
173     napi_status status;
174     napi_handle_scope scope = nullptr;
175     CallbackData *callbackData = reinterpret_cast<CallbackData *>(work->data);
176     if (callbackData == nullptr) {
177         TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "SendFailBackWork -> callbackData is null");
178         return;
179     }
180 
181     napi_open_handle_scope(callbackData->env, &scope);
182     if (scope == nullptr) {
183         TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "SendFailBackWork -> scope is null");
184         return;
185     }
186 
187     napi_value callback = nullptr;
188     status = napi_get_reference_value(callbackData->env, callbackData->failCallback, &callback);
189     if (status != napi_ok) {
190         TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "SendFailBackWork -> napi_get_reference_value error");
191         napi_close_handle_scope(callbackData->env, scope);
192         return;
193     }
194 
195     size_t resultLength = 1;
196     napi_value resultMessage = CreateResultMessage(callbackData);
197     napi_value result[] = { resultMessage };
198     status = napi_call_function(callbackData->env, nullptr, callback, resultLength, result, nullptr);
199     if (status != napi_ok) {
200         TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "SendFailBackWork -> napi_call_function error");
201         napi_close_handle_scope(callbackData->env, scope);
202         return;
203     }
204 
205     napi_close_handle_scope(callbackData->env, scope);
206 
207     if (callbackData != nullptr) {
208         delete callbackData;
209         callbackData = nullptr;
210     }
211 
212     if (work != nullptr) {
213         delete work;
214         work = nullptr;
215     }
216 }
217 
CreateResultMessage(CallbackData * callbackData)218 napi_value HspSilentInstallNapi::CreateResultMessage(CallbackData *callbackData)
219 {
220     napi_status status;
221     napi_value result = nullptr;
222     napi_value code = nullptr;
223 
224     status = napi_create_int32(callbackData->env, callbackData->errCode, &code);
225     if (status != napi_ok) {
226         TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "CreateResultMessage -> napi_create_int32 error");
227         return result;
228     }
229 
230     napi_value message = nullptr;
231     status = napi_create_string_utf8(callbackData->env, callbackData->errorMessage.c_str(),
232         NAPI_AUTO_LENGTH, &message);
233     if (status != napi_ok) {
234         TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "CreateResultMessage -> napi_create_string_utf8 error");
235         return result;
236     }
237 
238     napi_value businessError = nullptr;
239     status = napi_create_object(callbackData->env, &businessError);
240     if (status != napi_ok) {
241         TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "CreateResultMessage -> napi_create_object error");
242         return result;
243     }
244 
245     status = napi_set_named_property(callbackData->env, businessError, "code", code);
246     if (status != napi_ok) {
247         TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "CreateResultMessage -> napi_set_named_property error");
248         return result;
249     }
250 
251     status = napi_set_named_property(callbackData->env, businessError, "message", message);
252     if (status != napi_ok) {
253         TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "CreateResultMessage -> napi_set_named_property error");
254         return result;
255     }
256     return businessError;
257 }
258 }