1 /*
2  * Copyright (c) 2022-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 "js_ability_manager_utils.h"
17 
18 #include <cstdint>
19 
20 #include "ability_state.h"
21 #include "hilog_tag_wrapper.h"
22 #include "js_runtime.h"
23 #include "js_runtime_utils.h"
24 #include "napi_common_want.h"
25 #include "napi_remote_object.h"
26 
27 namespace OHOS {
28 namespace AbilityRuntime {
CreateJSToken(napi_env env,const sptr<IRemoteObject> target)29 napi_value CreateJSToken(napi_env env, const sptr<IRemoteObject> target)
30 {
31     napi_value tokenClass = nullptr;
32     auto constructorcb = [](napi_env env, napi_callback_info info) -> napi_value {
33         napi_value thisVar = nullptr;
34         napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
35         return thisVar;
36     };
37     napi_define_class(
38         env, "TokenClass", NAPI_AUTO_LENGTH, constructorcb, nullptr, 0, nullptr, &tokenClass);
39     napi_value jsToken = nullptr;
40     napi_new_instance(env, tokenClass, 0, nullptr, &jsToken);
41     auto finalizecb = [](napi_env env, void *data, void *hint) {};
42     napi_wrap(env, jsToken, static_cast<void *>(target.GetRefPtr()), finalizecb, nullptr, nullptr);
43     return jsToken;
44 }
45 
CreateJsAbilityRunningInfoArray(napi_env env,const std::vector<AAFwk::AbilityRunningInfo> & infos)46 napi_value CreateJsAbilityRunningInfoArray(napi_env env, const std::vector<AAFwk::AbilityRunningInfo> &infos)
47 {
48     napi_value arrayValue = nullptr;
49     napi_create_array_with_length(env, infos.size(), &arrayValue);
50     uint32_t index = 0;
51     for (const auto &runningInfo : infos) {
52         napi_set_element(env, arrayValue, index++, CreateJsAbilityRunningInfo(env, runningInfo));
53     }
54     return arrayValue;
55 }
56 
CreateJsElementName(napi_env env,const AppExecFwk::ElementName & elementName)57 napi_value CreateJsElementName(napi_env env, const AppExecFwk::ElementName &elementName)
58 {
59     return OHOS::AppExecFwk::WrapElementName(env, elementName);
60 }
61 
CreateJsExtensionRunningInfoArray(napi_env env,const std::vector<AAFwk::ExtensionRunningInfo> & infos)62 napi_value CreateJsExtensionRunningInfoArray(napi_env env, const std::vector<AAFwk::ExtensionRunningInfo> &infos)
63 {
64     napi_value arrayValue = nullptr;
65     napi_create_array_with_length(env, infos.size(), &arrayValue);
66     uint32_t index = 0;
67     for (const auto &runningInfo : infos) {
68         napi_set_element(env, arrayValue, index++, CreateJsExtensionRunningInfo(env, runningInfo));
69     }
70     return arrayValue;
71 }
72 
CreateJsAbilityRunningInfo(napi_env env,const AAFwk::AbilityRunningInfo & info)73 napi_value CreateJsAbilityRunningInfo(napi_env env, const AAFwk::AbilityRunningInfo &info)
74 {
75     napi_value objValue = nullptr;
76     napi_create_object(env, &objValue);
77 
78     napi_value napiElementName = OHOS::AppExecFwk::WrapElementName(env, info.ability);
79     napi_set_named_property(env, objValue, "ability", napiElementName);
80     napi_set_named_property(env, objValue, "pid", CreateJsValue(env, info.pid));
81     napi_set_named_property(env, objValue, "uid", CreateJsValue(env, info.uid));
82     napi_set_named_property(env, objValue, "processName", CreateJsValue(env, info.processName));
83     napi_set_named_property(env, objValue, "startTime", CreateJsValue(env, info.startTime));
84     napi_set_named_property(env, objValue, "abilityState", CreateJsValue(env, info.abilityState));
85     return objValue;
86 }
87 
CreateJsExtensionRunningInfo(napi_env env,const AAFwk::ExtensionRunningInfo & info)88 napi_value CreateJsExtensionRunningInfo(napi_env env, const AAFwk::ExtensionRunningInfo &info)
89 {
90     napi_value objValue = nullptr;
91     napi_create_object(env, &objValue);
92 
93     napi_value napiElementName = OHOS::AppExecFwk::WrapElementName(env, info.extension);
94     napi_set_named_property(env, objValue, "extension", napiElementName);
95     napi_set_named_property(env, objValue, "pid", CreateJsValue(env, info.pid));
96     napi_set_named_property(env, objValue, "uid", CreateJsValue(env, info.uid));
97     napi_set_named_property(env, objValue, "type", CreateJsValue(env, info.type));
98     napi_set_named_property(env, objValue, "processName", CreateJsValue(env, info.processName));
99     napi_set_named_property(env, objValue, "startTime", CreateJsValue(env, info.startTime));
100     napi_set_named_property(env, objValue, "clientPackage", CreateNativeArray(env, info.clientPackage));
101     return objValue;
102 }
103 
AbilityStateInit(napi_env env)104 napi_value AbilityStateInit(napi_env env)
105 {
106     TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
107     napi_value objValue = nullptr;
108     napi_create_object(env, &objValue);
109 
110     napi_set_named_property(env, objValue, "INITIAL", CreateJsValue(env, AAFwk::AbilityState::INITIAL));
111     napi_set_named_property(env, objValue, "FOCUS", CreateJsValue(env, AAFwk::AbilityState::ACTIVE));
112     napi_set_named_property(env, objValue, "FOREGROUND", CreateJsValue(env, AAFwk::AbilityState::FOREGROUND));
113     napi_set_named_property(env, objValue, "BACKGROUND", CreateJsValue(env, AAFwk::AbilityState::BACKGROUND));
114     napi_set_named_property(env, objValue, "FOREGROUNDING", CreateJsValue(env, AAFwk::AbilityState::FOREGROUNDING));
115     napi_set_named_property(env, objValue, "BACKGROUNDING", CreateJsValue(env, AAFwk::AbilityState::BACKGROUNDING));
116     return objValue;
117 }
118 
UserStatusInit(napi_env env)119 napi_value UserStatusInit(napi_env env)
120 {
121     TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
122     napi_value objValue = nullptr;
123     napi_create_object(env, &objValue);
124 
125     napi_set_named_property(
126         env, objValue, "ASSERT_TERMINATE", CreateJsValue(env, AAFwk::UserStatus::ASSERT_TERMINATE));
127     napi_set_named_property(env, objValue, "ASSERT_CONTINUE", CreateJsValue(env, AAFwk::UserStatus::ASSERT_CONTINUE));
128     napi_set_named_property(env, objValue, "ASSERT_RETRY", CreateJsValue(env, AAFwk::UserStatus::ASSERT_RETRY));
129     return objValue;
130 }
131 
CreateJsAbilityStateData(napi_env env,const AbilityStateData & abilityStateData)132 napi_value CreateJsAbilityStateData(napi_env env, const AbilityStateData &abilityStateData)
133 {
134     TAG_LOGD(AAFwkTag::ABILITYMGR, "called");
135     napi_value object = nullptr;
136     napi_create_object(env, &object);
137     if (object == nullptr) {
138         TAG_LOGE(AAFwkTag::ABILITYMGR, "null ObjValue");
139         return nullptr;
140     }
141     napi_set_named_property(env, object, "bundleName", CreateJsValue(env, abilityStateData.bundleName));
142     napi_set_named_property(env, object, "moduleName", CreateJsValue(env, abilityStateData.moduleName));
143     napi_set_named_property(env, object, "abilityName", CreateJsValue(env, abilityStateData.abilityName));
144     napi_set_named_property(env, object, "pid", CreateJsValue(env, abilityStateData.pid));
145     napi_set_named_property(env, object, "uid", CreateJsValue(env, abilityStateData.uid));
146     napi_set_named_property(env, object, "state", CreateJsValue(env, abilityStateData.abilityState));
147     napi_set_named_property(env, object, "abilityType", CreateJsValue(env, abilityStateData.abilityType));
148     napi_set_named_property(env, object, "isAtomicService", CreateJsValue(env, abilityStateData.isAtomicService));
149     if (abilityStateData.appCloneIndex != -1) {
150         napi_set_named_property(env, object, "appCloneIndex", CreateJsValue(env, abilityStateData.appCloneIndex));
151     }
152     return object;
153 }
154 
CreateJsAbilityStateDataArray(napi_env env,const std::vector<AppExecFwk::AbilityStateData> & abilityStateDatas)155 napi_value CreateJsAbilityStateDataArray(
156     napi_env env, const std::vector<AppExecFwk::AbilityStateData> &abilityStateDatas)
157 {
158     napi_value arrayValue = nullptr;
159     napi_create_array_with_length(env, abilityStateDatas.size(), &arrayValue);
160     uint32_t index = 0;
161     for (const auto &abilityStateData : abilityStateDatas) {
162         napi_set_element(env, arrayValue, index++, CreateJsAbilityStateData(env, abilityStateData));
163     }
164     return arrayValue;
165 }
166 } // namespace AbilityRuntime
167 } // namespace OHOS
168