1c8a96e64Sopenharmony_ci/*
2c8a96e64Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
3c8a96e64Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c8a96e64Sopenharmony_ci * you may not use this file except in compliance with the License.
5c8a96e64Sopenharmony_ci * You may obtain a copy of the License at
6c8a96e64Sopenharmony_ci *
7c8a96e64Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8c8a96e64Sopenharmony_ci *
9c8a96e64Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c8a96e64Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c8a96e64Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c8a96e64Sopenharmony_ci * See the License for the specific language governing permissions and
13c8a96e64Sopenharmony_ci * limitations under the License.
14c8a96e64Sopenharmony_ci */
15c8a96e64Sopenharmony_ci
16c8a96e64Sopenharmony_ci#include "advanced_ui_component/navpushpathhelper/include/hsp_silentinstall_napi.h"
17c8a96e64Sopenharmony_ci#include "advanced_ui_component/navpushpathhelper/include/hsp_silentinstall.h"
18c8a96e64Sopenharmony_ci#include "base/log/log.h"
19c8a96e64Sopenharmony_ci
20c8a96e64Sopenharmony_ciusing namespace std;
21c8a96e64Sopenharmony_ci
22c8a96e64Sopenharmony_cinamespace OHOS::NavPushPathHelper {
23c8a96e64Sopenharmony_ci
24c8a96e64Sopenharmony_cinapi_value HspSilentInstallNapi::IsHspExist(napi_env env, napi_callback_info info)
25c8a96e64Sopenharmony_ci{
26c8a96e64Sopenharmony_ci    size_t argc = 2;
27c8a96e64Sopenharmony_ci    size_t requireArgc = 2;
28c8a96e64Sopenharmony_ci    napi_value args[2] = { nullptr };
29c8a96e64Sopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr));
30c8a96e64Sopenharmony_ci    NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments");
31c8a96e64Sopenharmony_ci
32c8a96e64Sopenharmony_ci    // get first parameter:moduleName
33c8a96e64Sopenharmony_ci    napi_valuetype moduleNameType;
34c8a96e64Sopenharmony_ci    NAPI_CALL(env, napi_typeof(env, args[0], &moduleNameType));
35c8a96e64Sopenharmony_ci    NAPI_ASSERT(env, moduleNameType == napi_string, "Wrong argument type. String expected.");
36c8a96e64Sopenharmony_ci
37c8a96e64Sopenharmony_ci    size_t maxValueLen = 1024;
38c8a96e64Sopenharmony_ci    char moduleNameValue[maxValueLen];
39c8a96e64Sopenharmony_ci    size_t moduleNameLength = 0;
40c8a96e64Sopenharmony_ci    napi_get_value_string_utf8(env, args[0], moduleNameValue, maxValueLen, &moduleNameLength);
41c8a96e64Sopenharmony_ci    std::string moduleName = moduleNameValue;
42c8a96e64Sopenharmony_ci
43c8a96e64Sopenharmony_ci    // get second parameter:pathName
44c8a96e64Sopenharmony_ci    napi_valuetype pathNameType;
45c8a96e64Sopenharmony_ci    NAPI_CALL(env, napi_typeof(env, args[1], &pathNameType));
46c8a96e64Sopenharmony_ci    NAPI_ASSERT(env, pathNameType == napi_string, "Wrong argument type. String expected.");
47c8a96e64Sopenharmony_ci
48c8a96e64Sopenharmony_ci    char pathNameValue[maxValueLen];
49c8a96e64Sopenharmony_ci    size_t pathNameLength = 0;
50c8a96e64Sopenharmony_ci    napi_get_value_string_utf8(env, args[1], pathNameValue, maxValueLen, &pathNameLength);
51c8a96e64Sopenharmony_ci    std::string pathName = pathNameValue;
52c8a96e64Sopenharmony_ci
53c8a96e64Sopenharmony_ci    bool isHspExits = HspSilentInstall::IsHspExist(moduleName, pathName);
54c8a96e64Sopenharmony_ci    napi_value jsResult;
55c8a96e64Sopenharmony_ci    NAPI_CALL(env, napi_get_boolean(env, isHspExits, &jsResult));
56c8a96e64Sopenharmony_ci    return jsResult;
57c8a96e64Sopenharmony_ci}
58c8a96e64Sopenharmony_ci
59c8a96e64Sopenharmony_cinapi_value HspSilentInstallNapi::InitRouteMap(napi_env env, napi_callback_info info)
60c8a96e64Sopenharmony_ci{
61c8a96e64Sopenharmony_ci    HspSilentInstall::InitRouteMap();
62c8a96e64Sopenharmony_ci    return nullptr;
63c8a96e64Sopenharmony_ci}
64c8a96e64Sopenharmony_ci
65c8a96e64Sopenharmony_cinapi_value HspSilentInstallNapi::SilentInstall(napi_env env, napi_callback_info info)
66c8a96e64Sopenharmony_ci{
67c8a96e64Sopenharmony_ci    napi_value result = nullptr;
68c8a96e64Sopenharmony_ci    size_t argc = 3;
69c8a96e64Sopenharmony_ci    size_t requireArgc = 3;
70c8a96e64Sopenharmony_ci    napi_value args[3] = { nullptr };
71c8a96e64Sopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr));
72c8a96e64Sopenharmony_ci    NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments");
73c8a96e64Sopenharmony_ci
74c8a96e64Sopenharmony_ci    // get first parameter:moduleName
75c8a96e64Sopenharmony_ci    std::string moduleName;
76c8a96e64Sopenharmony_ci    getModuleName(env, args[0], moduleName);
77c8a96e64Sopenharmony_ci
78c8a96e64Sopenharmony_ci    auto callbackData = new (std::nothrow) CallbackData();
79c8a96e64Sopenharmony_ci    if (callbackData == nullptr) {
80c8a96e64Sopenharmony_ci        return result;
81c8a96e64Sopenharmony_ci    }
82c8a96e64Sopenharmony_ci    uv_work_t *work = new (std::nothrow) uv_work_t;
83c8a96e64Sopenharmony_ci    if (work == nullptr) {
84c8a96e64Sopenharmony_ci        delete callbackData;
85c8a96e64Sopenharmony_ci        callbackData = nullptr;
86c8a96e64Sopenharmony_ci        return result;
87c8a96e64Sopenharmony_ci    }
88c8a96e64Sopenharmony_ci    int parameterNum = 1;
89c8a96e64Sopenharmony_ci    const int indexTwo = 2;
90c8a96e64Sopenharmony_ci    napi_create_reference(env, args[1], parameterNum, &(callbackData->successCallback));
91c8a96e64Sopenharmony_ci    napi_create_reference(env, args[indexTwo], parameterNum, &(callbackData->failCallback));
92c8a96e64Sopenharmony_ci    callbackData->env = env;
93c8a96e64Sopenharmony_ci
94c8a96e64Sopenharmony_ci    auto successCallback = [callbackData, work]() {
95c8a96e64Sopenharmony_ci        uv_loop_s *loop = nullptr;
96c8a96e64Sopenharmony_ci        napi_get_uv_event_loop(callbackData->env, &loop);
97c8a96e64Sopenharmony_ci        work->data = reinterpret_cast<void *>(callbackData);
98c8a96e64Sopenharmony_ci        uv_queue_work(loop, work, [](uv_work_t *work) { (void)work; }, SendSuccessBackWork);
99c8a96e64Sopenharmony_ci    };
100c8a96e64Sopenharmony_ci
101c8a96e64Sopenharmony_ci    auto failCallback = [callbackData, work](int32_t errorCode, const std::string& errorMessage) {
102c8a96e64Sopenharmony_ci        callbackData->errCode = errorCode;
103c8a96e64Sopenharmony_ci        callbackData->errorMessage = errorMessage;
104c8a96e64Sopenharmony_ci
105c8a96e64Sopenharmony_ci        uv_loop_s *loop = nullptr;
106c8a96e64Sopenharmony_ci        napi_get_uv_event_loop(callbackData->env, &loop);
107c8a96e64Sopenharmony_ci        work->data = reinterpret_cast<void *>(callbackData);
108c8a96e64Sopenharmony_ci        uv_queue_work(loop, work, [](uv_work_t *work) { (void)work; }, SendFailBackWork);
109c8a96e64Sopenharmony_ci    };
110c8a96e64Sopenharmony_ci
111c8a96e64Sopenharmony_ci    HspSilentInstall::SilentInstall(moduleName, successCallback, failCallback);
112c8a96e64Sopenharmony_ci    return result;
113c8a96e64Sopenharmony_ci}
114c8a96e64Sopenharmony_ci
115c8a96e64Sopenharmony_cinapi_value HspSilentInstallNapi::getModuleName(napi_env env, napi_value args, std::string& moduleName)
116c8a96e64Sopenharmony_ci{
117c8a96e64Sopenharmony_ci    napi_valuetype moduleNameType;
118c8a96e64Sopenharmony_ci    NAPI_CALL(env, napi_typeof(env, args, &moduleNameType));
119c8a96e64Sopenharmony_ci    NAPI_ASSERT(env, moduleNameType == napi_string, "Wrong argument type. String expected.");
120c8a96e64Sopenharmony_ci
121c8a96e64Sopenharmony_ci    napi_status status;
122c8a96e64Sopenharmony_ci    size_t maxValueLen = 1024;
123c8a96e64Sopenharmony_ci    char moduleNameValue[maxValueLen];
124c8a96e64Sopenharmony_ci    size_t moduleNameLength = 0;
125c8a96e64Sopenharmony_ci    status = napi_get_value_string_utf8(env, args, moduleNameValue, maxValueLen, &moduleNameLength);
126c8a96e64Sopenharmony_ci    NAPI_ASSERT(env, status == napi_ok, "Failed to napi_get_value_string_utf8");
127c8a96e64Sopenharmony_ci    moduleName = moduleNameValue;
128c8a96e64Sopenharmony_ci    return nullptr;
129c8a96e64Sopenharmony_ci}
130c8a96e64Sopenharmony_ci
131c8a96e64Sopenharmony_civoid HspSilentInstallNapi::SendSuccessBackWork(uv_work_t *work, int statusIn)
132c8a96e64Sopenharmony_ci{
133c8a96e64Sopenharmony_ci    if (work == nullptr) {
134c8a96e64Sopenharmony_ci        TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "SendSuccessBackWork -> work is null");
135c8a96e64Sopenharmony_ci        return;
136c8a96e64Sopenharmony_ci    }
137c8a96e64Sopenharmony_ci    (void)statusIn;
138c8a96e64Sopenharmony_ci    napi_status status;
139c8a96e64Sopenharmony_ci    napi_handle_scope scope = nullptr;
140c8a96e64Sopenharmony_ci    CallbackData *callbackData = reinterpret_cast<CallbackData *>(work->data);
141c8a96e64Sopenharmony_ci    if (callbackData == nullptr) {
142c8a96e64Sopenharmony_ci        TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "SendSuccessBackWork -> callbackData is null");
143c8a96e64Sopenharmony_ci        return;
144c8a96e64Sopenharmony_ci    }
145c8a96e64Sopenharmony_ci
146c8a96e64Sopenharmony_ci    napi_open_handle_scope(callbackData->env, &scope);
147c8a96e64Sopenharmony_ci    if (scope == nullptr) {
148c8a96e64Sopenharmony_ci        TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "SendSuccessBackWork -> scope is null");
149c8a96e64Sopenharmony_ci        return;
150c8a96e64Sopenharmony_ci    }
151c8a96e64Sopenharmony_ci
152c8a96e64Sopenharmony_ci    napi_value callback = nullptr;
153c8a96e64Sopenharmony_ci    status = napi_get_reference_value(callbackData->env, callbackData->successCallback, &callback);
154c8a96e64Sopenharmony_ci    if (status != napi_ok) {
155c8a96e64Sopenharmony_ci        TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "SendSuccessBackWork -> napi_get_reference_value error");
156c8a96e64Sopenharmony_ci        napi_close_handle_scope(callbackData->env, scope);
157c8a96e64Sopenharmony_ci        return;
158c8a96e64Sopenharmony_ci    }
159c8a96e64Sopenharmony_ci
160c8a96e64Sopenharmony_ci    napi_value result;
161c8a96e64Sopenharmony_ci    status = napi_call_function(callbackData->env, nullptr, callback, 0, nullptr, &result);
162c8a96e64Sopenharmony_ci    if (status != napi_ok) {
163c8a96e64Sopenharmony_ci        TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "SendSuccessBackWork -> napi_call_function error");
164c8a96e64Sopenharmony_ci        napi_close_handle_scope(callbackData->env, scope);
165c8a96e64Sopenharmony_ci        return;
166c8a96e64Sopenharmony_ci    }
167c8a96e64Sopenharmony_ci
168c8a96e64Sopenharmony_ci    napi_close_handle_scope(callbackData->env, scope);
169c8a96e64Sopenharmony_ci
170c8a96e64Sopenharmony_ci    if (callbackData != nullptr) {
171c8a96e64Sopenharmony_ci        delete callbackData;
172c8a96e64Sopenharmony_ci        callbackData = nullptr;
173c8a96e64Sopenharmony_ci    }
174c8a96e64Sopenharmony_ci
175c8a96e64Sopenharmony_ci    if (work != nullptr) {
176c8a96e64Sopenharmony_ci        delete work;
177c8a96e64Sopenharmony_ci        work = nullptr;
178c8a96e64Sopenharmony_ci    }
179c8a96e64Sopenharmony_ci}
180c8a96e64Sopenharmony_ci
181c8a96e64Sopenharmony_civoid HspSilentInstallNapi::SendFailBackWork(uv_work_t *work, int statusIn)
182c8a96e64Sopenharmony_ci{
183c8a96e64Sopenharmony_ci    if (work == nullptr) {
184c8a96e64Sopenharmony_ci        TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "SendSuccessBackWork -> work is null");
185c8a96e64Sopenharmony_ci        return;
186c8a96e64Sopenharmony_ci    }
187c8a96e64Sopenharmony_ci    (void)statusIn;
188c8a96e64Sopenharmony_ci    napi_status status;
189c8a96e64Sopenharmony_ci    napi_handle_scope scope = nullptr;
190c8a96e64Sopenharmony_ci    CallbackData *callbackData = reinterpret_cast<CallbackData *>(work->data);
191c8a96e64Sopenharmony_ci    if (callbackData == nullptr) {
192c8a96e64Sopenharmony_ci        TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "SendFailBackWork -> callbackData is null");
193c8a96e64Sopenharmony_ci        return;
194c8a96e64Sopenharmony_ci    }
195c8a96e64Sopenharmony_ci
196c8a96e64Sopenharmony_ci    napi_open_handle_scope(callbackData->env, &scope);
197c8a96e64Sopenharmony_ci    if (scope == nullptr) {
198c8a96e64Sopenharmony_ci        TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "SendFailBackWork -> scope is null");
199c8a96e64Sopenharmony_ci        return;
200c8a96e64Sopenharmony_ci    }
201c8a96e64Sopenharmony_ci
202c8a96e64Sopenharmony_ci    napi_value callback = nullptr;
203c8a96e64Sopenharmony_ci    status = napi_get_reference_value(callbackData->env, callbackData->failCallback, &callback);
204c8a96e64Sopenharmony_ci    if (status != napi_ok) {
205c8a96e64Sopenharmony_ci        TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "SendFailBackWork -> napi_get_reference_value error");
206c8a96e64Sopenharmony_ci        napi_close_handle_scope(callbackData->env, scope);
207c8a96e64Sopenharmony_ci        return;
208c8a96e64Sopenharmony_ci    }
209c8a96e64Sopenharmony_ci
210c8a96e64Sopenharmony_ci    size_t resultLength = 1;
211c8a96e64Sopenharmony_ci    napi_value resultMessage = CreateResultMessage(callbackData);
212c8a96e64Sopenharmony_ci    napi_value result[] = { resultMessage };
213c8a96e64Sopenharmony_ci    status = napi_call_function(callbackData->env, nullptr, callback, resultLength, result, nullptr);
214c8a96e64Sopenharmony_ci    if (status != napi_ok) {
215c8a96e64Sopenharmony_ci        TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "SendFailBackWork -> napi_call_function error");
216c8a96e64Sopenharmony_ci        napi_close_handle_scope(callbackData->env, scope);
217c8a96e64Sopenharmony_ci        return;
218c8a96e64Sopenharmony_ci    }
219c8a96e64Sopenharmony_ci
220c8a96e64Sopenharmony_ci    napi_close_handle_scope(callbackData->env, scope);
221c8a96e64Sopenharmony_ci
222c8a96e64Sopenharmony_ci    if (callbackData != nullptr) {
223c8a96e64Sopenharmony_ci        delete callbackData;
224c8a96e64Sopenharmony_ci        callbackData = nullptr;
225c8a96e64Sopenharmony_ci    }
226c8a96e64Sopenharmony_ci
227c8a96e64Sopenharmony_ci    if (work != nullptr) {
228c8a96e64Sopenharmony_ci        delete work;
229c8a96e64Sopenharmony_ci        work = nullptr;
230c8a96e64Sopenharmony_ci    }
231c8a96e64Sopenharmony_ci}
232c8a96e64Sopenharmony_ci
233c8a96e64Sopenharmony_cinapi_value HspSilentInstallNapi::CreateResultMessage(CallbackData *callbackData)
234c8a96e64Sopenharmony_ci{
235c8a96e64Sopenharmony_ci    napi_status status;
236c8a96e64Sopenharmony_ci    napi_value result = nullptr;
237c8a96e64Sopenharmony_ci    napi_value code = nullptr;
238c8a96e64Sopenharmony_ci
239c8a96e64Sopenharmony_ci    status = napi_create_int32(callbackData->env, callbackData->errCode, &code);
240c8a96e64Sopenharmony_ci    if (status != napi_ok) {
241c8a96e64Sopenharmony_ci        TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "CreateResultMessage -> napi_create_int32 error");
242c8a96e64Sopenharmony_ci        return result;
243c8a96e64Sopenharmony_ci    }
244c8a96e64Sopenharmony_ci
245c8a96e64Sopenharmony_ci    napi_value message = nullptr;
246c8a96e64Sopenharmony_ci    status = napi_create_string_utf8(callbackData->env, callbackData->errorMessage.c_str(),
247c8a96e64Sopenharmony_ci        NAPI_AUTO_LENGTH, &message);
248c8a96e64Sopenharmony_ci    if (status != napi_ok) {
249c8a96e64Sopenharmony_ci        TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "CreateResultMessage -> napi_create_string_utf8 error");
250c8a96e64Sopenharmony_ci        return result;
251c8a96e64Sopenharmony_ci    }
252c8a96e64Sopenharmony_ci
253c8a96e64Sopenharmony_ci    napi_value businessError = nullptr;
254c8a96e64Sopenharmony_ci    status = napi_create_object(callbackData->env, &businessError);
255c8a96e64Sopenharmony_ci    if (status != napi_ok) {
256c8a96e64Sopenharmony_ci        TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "CreateResultMessage -> napi_create_object error");
257c8a96e64Sopenharmony_ci        return result;
258c8a96e64Sopenharmony_ci    }
259c8a96e64Sopenharmony_ci
260c8a96e64Sopenharmony_ci    status = napi_set_named_property(callbackData->env, businessError, "code", code);
261c8a96e64Sopenharmony_ci    if (status != napi_ok) {
262c8a96e64Sopenharmony_ci        TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "CreateResultMessage -> napi_set_named_property error");
263c8a96e64Sopenharmony_ci        return result;
264c8a96e64Sopenharmony_ci    }
265c8a96e64Sopenharmony_ci
266c8a96e64Sopenharmony_ci    status = napi_set_named_property(callbackData->env, businessError, "message", message);
267c8a96e64Sopenharmony_ci    if (status != napi_ok) {
268c8a96e64Sopenharmony_ci        TAG_LOGE(OHOS::Ace::AceLogTag::ACE_DEFAULT_DOMAIN, "CreateResultMessage -> napi_set_named_property error");
269c8a96e64Sopenharmony_ci        return result;
270c8a96e64Sopenharmony_ci    }
271c8a96e64Sopenharmony_ci    return businessError;
272c8a96e64Sopenharmony_ci}
273c8a96e64Sopenharmony_ci}