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}