1a1db01bdSopenharmony_ci/* 2a1db01bdSopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd. 3a1db01bdSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4a1db01bdSopenharmony_ci * you may not use this file except in compliance with the License. 5a1db01bdSopenharmony_ci * You may obtain a copy of the License at 6a1db01bdSopenharmony_ci * 7a1db01bdSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8a1db01bdSopenharmony_ci * 9a1db01bdSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10a1db01bdSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11a1db01bdSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12a1db01bdSopenharmony_ci * See the License for the specific language governing permissions and 13a1db01bdSopenharmony_ci * limitations under the License. 14a1db01bdSopenharmony_ci */ 15a1db01bdSopenharmony_ci 16a1db01bdSopenharmony_ci#include <securec.h> 17a1db01bdSopenharmony_ci#include <cassert> 18a1db01bdSopenharmony_ci#include "ability_manager.h" 19a1db01bdSopenharmony_ci#include "napi/native_api.h" 20a1db01bdSopenharmony_ci#include "napi/native_node_api.h" 21a1db01bdSopenharmony_ci#include "ability_errors.h" 22a1db01bdSopenharmony_ci 23a1db01bdSopenharmony_ci#define GET_PARAMS(env, info, num) \ 24a1db01bdSopenharmony_ci do { \ 25a1db01bdSopenharmony_ci size_t argc = num; \ 26a1db01bdSopenharmony_ci napi_value argv[num]; \ 27a1db01bdSopenharmony_ci napi_value thisVar; \ 28a1db01bdSopenharmony_ci void* data; \ 29a1db01bdSopenharmony_ci napi_get_cb_info(env, info, &argc, argv, &thisVar, &data) \ 30a1db01bdSopenharmony_ci while (0) 31a1db01bdSopenharmony_ci 32a1db01bdSopenharmony_ciusing struct _SetTimeAsyncContext { 33a1db01bdSopenharmony_ci napi_env env; 34a1db01bdSopenharmony_ci napi_async_work work; 35a1db01bdSopenharmony_ci 36a1db01bdSopenharmony_ci int64_t time; 37a1db01bdSopenharmony_ci napi_deferred deferred; 38a1db01bdSopenharmony_ci napi_ref callbackRef; 39a1db01bdSopenharmony_ci 40a1db01bdSopenharmony_ci int status; 41a1db01bdSopenharmony_ci} SetTimeAsyncContext; 42a1db01bdSopenharmony_ci 43a1db01bdSopenharmony_cistatic int JSAafwkStartAbility(napi_env env, napi_callback_info info) 44a1db01bdSopenharmony_ci{ 45a1db01bdSopenharmony_ci napi_status status; 46a1db01bdSopenharmony_ci size_t argc = 1; 47a1db01bdSopenharmony_ci napi_value args[1] = {0}; 48a1db01bdSopenharmony_ci status = napi_get_cb_info(env, info, &argc, args, NULL, NULL); 49a1db01bdSopenharmony_ci assert(status == napi_ok); 50a1db01bdSopenharmony_ci 51a1db01bdSopenharmony_ci napi_valuetype types[1]; 52a1db01bdSopenharmony_ci status = napi_typeof(env, args[0], types); 53a1db01bdSopenharmony_ci assert(status == napi_ok); 54a1db01bdSopenharmony_ci assert(argc == 1 && types[0] == napi_object); 55a1db01bdSopenharmony_ci 56a1db01bdSopenharmony_ci Want want; 57a1db01bdSopenharmony_ci if (memset_s(&want, sizeof(Want), 0x00, sizeof(Want)) != 0) { 58a1db01bdSopenharmony_ci return MEMORY_MALLOC_ERROR; 59a1db01bdSopenharmony_ci } 60a1db01bdSopenharmony_ci if (GetWantFromNapiValue(env, args[0], want) == false) { 61a1db01bdSopenharmony_ci return PARAM_CHECK_ERROR; 62a1db01bdSopenharmony_ci } 63a1db01bdSopenharmony_ci StartAbility(&want); 64a1db01bdSopenharmony_ci ClearWant(&want); 65a1db01bdSopenharmony_ci} 66a1db01bdSopenharmony_ci 67a1db01bdSopenharmony_cistatic int JSAafwkStopAbility(napi_env env, napi_callback_info info) 68a1db01bdSopenharmony_ci{ 69a1db01bdSopenharmony_ci napi_status status; 70a1db01bdSopenharmony_ci size_t argc = 1; 71a1db01bdSopenharmony_ci napi_value args[1] = {0}; 72a1db01bdSopenharmony_ci status = napi_get_cb_info(env, info, &argc, args, NULL, NULL); 73a1db01bdSopenharmony_ci assert(status == napi_ok); 74a1db01bdSopenharmony_ci 75a1db01bdSopenharmony_ci napi_valuetype types[1]; 76a1db01bdSopenharmony_ci status = napi_typeof(env, args[0], types); 77a1db01bdSopenharmony_ci assert(status == napi_ok); 78a1db01bdSopenharmony_ci assert(argc == 1 && types[0] == napi_object); 79a1db01bdSopenharmony_ci 80a1db01bdSopenharmony_ci Want want; 81a1db01bdSopenharmony_ci if (memset_s(&want, sizeof(Want), 0x00, sizeof(Want)) != 0) { 82a1db01bdSopenharmony_ci return MEMORY_MALLOC_ERROR; 83a1db01bdSopenharmony_ci } 84a1db01bdSopenharmony_ci if (GetWantFromNapiValue(env, args[0], want) == false) { 85a1db01bdSopenharmony_ci return PARAM_CHECK_ERROR; 86a1db01bdSopenharmony_ci } 87a1db01bdSopenharmony_ci StopAbility(&want); 88a1db01bdSopenharmony_ci ClearWant(&want); 89a1db01bdSopenharmony_ci} 90a1db01bdSopenharmony_ci 91a1db01bdSopenharmony_cistatic bool GetWantFromNapiValue(napi_env env, napi_value args, Want& want) 92a1db01bdSopenharmony_ci{ 93a1db01bdSopenharmony_ci ElementName element; 94a1db01bdSopenharmony_ci if (memset_s(&element, sizeof(ElementName), 0x00, sizeof(ElementName)) != 0) { 95a1db01bdSopenharmony_ci return MEMORY_MALLOC_ERROR; 96a1db01bdSopenharmony_ci } 97a1db01bdSopenharmony_ci 98a1db01bdSopenharmony_ci napi_value data; 99a1db01bdSopenharmony_ci napi_get_named_property(env, args, "want_param", &data); 100a1db01bdSopenharmony_ci 101a1db01bdSopenharmony_ci napi_value elementName; 102a1db01bdSopenharmony_ci if (napi_get_named_property(env, args, "elementName", &elementName) != napi_ok) { 103a1db01bdSopenharmony_ci return COMMAND_ERROR; 104a1db01bdSopenharmony_ci } 105a1db01bdSopenharmony_ci 106a1db01bdSopenharmony_ci napi_value napi_deviceId; 107a1db01bdSopenharmony_ci napi_get_named_property(env, elementName, "deviceId", &napi_deviceId); 108a1db01bdSopenharmony_ci char *deviceId = nullptr; 109a1db01bdSopenharmony_ci GetCharPointerArgument(env, napi_deviceId, deviceId); 110a1db01bdSopenharmony_ci SetElementDeviceID(&element, deviceId); 111a1db01bdSopenharmony_ci free(deviceId); 112a1db01bdSopenharmony_ci deviceId = nullptr; 113a1db01bdSopenharmony_ci 114a1db01bdSopenharmony_ci napi_value napi_bundleName; 115a1db01bdSopenharmony_ci napi_get_named_property(env, elementName, "bundleName", &napi_bundleName); 116a1db01bdSopenharmony_ci char *bundleName = nullptr; 117a1db01bdSopenharmony_ci GetCharPointerArgument(env, napi_bundleName, bundleName); 118a1db01bdSopenharmony_ci SetElementBundleName(&element, bundleName); 119a1db01bdSopenharmony_ci free(bundleName); 120a1db01bdSopenharmony_ci bundleName = nullptr; 121a1db01bdSopenharmony_ci 122a1db01bdSopenharmony_ci napi_value napi_abilityName; 123a1db01bdSopenharmony_ci napi_get_named_property(env, elementName, "abilityName", &napi_abilityName); 124a1db01bdSopenharmony_ci char *abilityName = nullptr; 125a1db01bdSopenharmony_ci GetCharPointerArgument(env, napi_abilityName, abilityName); 126a1db01bdSopenharmony_ci SetElementAbilityName(&element, abilityName); 127a1db01bdSopenharmony_ci free(abilityName); 128a1db01bdSopenharmony_ci abilityName = nullptr; 129a1db01bdSopenharmony_ci 130a1db01bdSopenharmony_ci SetWantData(&want, (void *)data, sizeof(data)); 131a1db01bdSopenharmony_ci SetWantElement(&want, element); 132a1db01bdSopenharmony_ci ClearElement(&element); 133a1db01bdSopenharmony_ci} 134a1db01bdSopenharmony_ci 135a1db01bdSopenharmony_ci// Function to read string argument from napi_value 136a1db01bdSopenharmony_cistatic bool GetCharPointerArgument(napi_env env, napi_value value, char* result) 137a1db01bdSopenharmony_ci{ 138a1db01bdSopenharmony_ci napi_status status; 139a1db01bdSopenharmony_ci size_t bufLength = 0; 140a1db01bdSopenharmony_ci result = nullptr; 141a1db01bdSopenharmony_ci bool ret = false; 142a1db01bdSopenharmony_ci // get buffer length first and get buffer based on length 143a1db01bdSopenharmony_ci status = napi_get_value_string_utf8(env, value, nullptr, 0, &bufLength); 144a1db01bdSopenharmony_ci if (status == napi_ok && bufLength > 0) { 145a1db01bdSopenharmony_ci // Create a buffer and create std::string later from it 146a1db01bdSopenharmony_ci result = (char *) malloc((bufLength + 1) * sizeof(char)); 147a1db01bdSopenharmony_ci if (result != nullptr) { 148a1db01bdSopenharmony_ci status = napi_get_value_string_utf8(env, value, result, bufLength + 1, &bufLength); 149a1db01bdSopenharmony_ci if (status == napi_ok) { 150a1db01bdSopenharmony_ci ret = true; 151a1db01bdSopenharmony_ci } 152a1db01bdSopenharmony_ci } 153a1db01bdSopenharmony_ci } 154a1db01bdSopenharmony_ci return ret; 155a1db01bdSopenharmony_ci} 156a1db01bdSopenharmony_ci 157a1db01bdSopenharmony_ciEXTERN_C_START 158a1db01bdSopenharmony_ciusing namespace OHOS { 159a1db01bdSopenharmony_cinapi_value AafwkExport(napi_env env, napi_value exports) 160a1db01bdSopenharmony_ci{ 161a1db01bdSopenharmony_ci static napi_property_descriptor desc[] = { 162a1db01bdSopenharmony_ci DECLARE_NAPI_FUNCTION("startAbility", JSAafwkStartAbility), 163a1db01bdSopenharmony_ci DECLARE_NAPI_FUNCTION("stopAbility", JSAafwkStopAbility), 164a1db01bdSopenharmony_ci }; 165a1db01bdSopenharmony_ci NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc)); 166a1db01bdSopenharmony_ci return exports; 167a1db01bdSopenharmony_ci} 168a1db01bdSopenharmony_ci} 169a1db01bdSopenharmony_ciEXTERN_C_END 170a1db01bdSopenharmony_ci 171a1db01bdSopenharmony_cistatic napi_module aafwk_module = { 172a1db01bdSopenharmony_ci .nm_version = 1, 173a1db01bdSopenharmony_ci .nm_flags = 0, 174a1db01bdSopenharmony_ci .nm_filename = nullptr, 175a1db01bdSopenharmony_ci .nm_register_func = AafwkExport, 176a1db01bdSopenharmony_ci .nm_modname = "aafwk", 177a1db01bdSopenharmony_ci .nm_priv = ((void*)0), 178a1db01bdSopenharmony_ci .reserved = {0} 179a1db01bdSopenharmony_ci}; 180a1db01bdSopenharmony_ci 181a1db01bdSopenharmony_ciextern "C" __attribute__((constructor)) void AafwkRegister() 182a1db01bdSopenharmony_ci{ 183a1db01bdSopenharmony_ci napi_module_register(&aafwk_module); 184a1db01bdSopenharmony_ci}