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}