1 /*
2 * Copyright (c) 2021-2022 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_data_struct_converter.h"
17
18 #include "configuration_convertor.h"
19 #include "hilog_wrapper.h"
20 #include "js_runtime.h"
21 #include "js_runtime_utils.h"
22
23 namespace OHOS {
24 namespace AbilityRuntime {
25 using namespace OHOS::AppExecFwk;
CreateJsWantObject(NativeEngine & engine,const AAFwk::Want & want)26 NativeValue* CreateJsWantObject(NativeEngine& engine, const AAFwk::Want& want)
27 {
28 NativeValue* objValue = engine.CreateObject();
29 NativeObject* object = ConvertNativeValueTo<NativeObject>(objValue);
30 if (object == nullptr) {
31 HILOG_ERROR("Native object is nullptr.");
32 return objValue;
33 }
34
35 object->SetProperty("deviceId", CreateJsValue(engine, want.GetOperation().GetDeviceId()));
36 object->SetProperty("bundleName", CreateJsValue(engine, want.GetBundle()));
37 object->SetProperty("abilityName", CreateJsValue(engine, want.GetOperation().GetAbilityName()));
38 object->SetProperty("uri", CreateJsValue(engine, want.GetUriString()));
39 object->SetProperty("type", CreateJsValue(engine, want.GetType()));
40 object->SetProperty("flags", CreateJsValue(engine, want.GetFlags()));
41 object->SetProperty("action", CreateJsValue(engine, want.GetAction()));
42 object->SetProperty("entities", CreateNativeArray(engine, want.GetEntities()));
43 return objValue;
44 }
45
CreateJsAbilityInfo(NativeEngine & engine,const AppExecFwk::AbilityInfo & abilityInfo)46 NativeValue* CreateJsAbilityInfo(NativeEngine& engine, const AppExecFwk::AbilityInfo& abilityInfo)
47 {
48 NativeValue* objValue = engine.CreateObject();
49 NativeObject* object = ConvertNativeValueTo<NativeObject>(objValue);
50 if (object == nullptr) {
51 HILOG_ERROR("Native object is nullptr.");
52 return objValue;
53 }
54
55 object->SetProperty("bundleName", CreateJsValue(engine, abilityInfo.bundleName));
56 object->SetProperty("name", CreateJsValue(engine, abilityInfo.name));
57 object->SetProperty("label", CreateJsValue(engine, abilityInfo.label));
58 object->SetProperty("description", CreateJsValue(engine, abilityInfo.description));
59 object->SetProperty("icon", CreateJsValue(engine, abilityInfo.iconPath));
60 object->SetProperty("labelId", CreateJsValue(engine, abilityInfo.labelId));
61 object->SetProperty("descriptionId", CreateJsValue(engine, abilityInfo.descriptionId));
62 object->SetProperty("iconId", CreateJsValue(engine, abilityInfo.iconId));
63 object->SetProperty("moduleName", CreateJsValue(engine, abilityInfo.moduleName));
64 object->SetProperty("process", CreateJsValue(engine, abilityInfo.process));
65 object->SetProperty("targetAbility", CreateJsValue(engine, abilityInfo.targetAbility));
66 object->SetProperty("backgroundModes", CreateJsValue(engine, abilityInfo.backgroundModes));
67 object->SetProperty("isVisible", CreateJsValue(engine, abilityInfo.visible));
68 object->SetProperty("formEnabled", CreateJsValue(engine, abilityInfo.formEnabled));
69
70 object->SetProperty("type", CreateJsValue(engine, abilityInfo.type));
71 object->SetProperty("subType", CreateJsValue(engine, abilityInfo.subType));
72 object->SetProperty("orientation", CreateJsValue(engine, abilityInfo.orientation));
73 object->SetProperty("launchMode", CreateJsValue(engine, abilityInfo.launchMode));
74
75 object->SetProperty("permissions", CreateNativeArray(engine, abilityInfo.permissions));
76 object->SetProperty("deviceTypes", CreateNativeArray(engine, abilityInfo.deviceTypes));
77 object->SetProperty("deviceCapabilities", CreateNativeArray(engine, abilityInfo.deviceCapabilities));
78
79 object->SetProperty("readPermission", CreateJsValue(engine, abilityInfo.readPermission));
80 object->SetProperty("writePermission", CreateJsValue(engine, abilityInfo.writePermission));
81
82 object->SetProperty("applicationInfo", CreateJsApplicationInfo(engine, abilityInfo.applicationInfo));
83
84 object->SetProperty("formEntity", CreateJsValue(engine, abilityInfo.formEntity));
85 object->SetProperty("minFormHeight", CreateJsValue(engine, abilityInfo.minFormHeight));
86 object->SetProperty("defaultFormHeight", CreateJsValue(engine, abilityInfo.defaultFormHeight));
87 object->SetProperty("minFormWidth", CreateJsValue(engine, abilityInfo.minFormWidth));
88 object->SetProperty("defaultFormWidth", CreateJsValue(engine, abilityInfo.defaultFormWidth));
89 object->SetProperty("uri", CreateJsValue(engine, abilityInfo.uri));
90
91 object->SetProperty("metaData", CreateJsCustomizeDataArray(engine, abilityInfo.metaData.customizeData));
92 object->SetProperty("metadata", CreateJsMetadataArray(engine, abilityInfo.metadata));
93 return objValue;
94 }
95
CreateJsMetadataArray(NativeEngine & engine,const std::vector<AppExecFwk::Metadata> & info)96 NativeValue* CreateJsMetadataArray(NativeEngine& engine, const std::vector<AppExecFwk::Metadata> &info)
97 {
98 NativeValue* arrayValue = engine.CreateArray(info.size());
99 NativeArray* array = ConvertNativeValueTo<NativeArray>(arrayValue);
100 if (array == nullptr) {
101 HILOG_ERROR("Native object is nullptr.");
102 return arrayValue;
103 }
104
105 uint32_t index = 0;
106 for (const auto& item : info) {
107 array->SetElement(index++, CreateJsMetadata(engine, item));
108 }
109 return arrayValue;
110 }
111
CreateJsMetadata(NativeEngine & engine,const AppExecFwk::Metadata & Info)112 NativeValue* CreateJsMetadata(NativeEngine& engine, const AppExecFwk::Metadata &Info)
113 {
114 NativeValue *objValue = engine.CreateObject();
115 NativeObject *object = ConvertNativeValueTo<NativeObject>(objValue);
116 if (object == nullptr) {
117 HILOG_ERROR("Native object is nullptr.");
118 return objValue;
119 }
120
121 object->SetProperty("name", CreateJsValue(engine, Info.name));
122 object->SetProperty("value", CreateJsValue(engine, Info.value));
123 object->SetProperty("resource", CreateJsValue(engine, Info.resource));
124 return objValue;
125 }
126
CreateJsCustomizeData(NativeEngine & engine,const AppExecFwk::CustomizeData & Info)127 NativeValue* CreateJsCustomizeData(NativeEngine& engine, const AppExecFwk::CustomizeData &Info)
128 {
129 NativeValue *objValue = engine.CreateObject();
130 NativeObject *object = ConvertNativeValueTo<NativeObject>(objValue);
131 if (object == nullptr) {
132 HILOG_ERROR("Native object is nullptr.");
133 return objValue;
134 }
135
136 object->SetProperty("name", CreateJsValue(engine, Info.name));
137 object->SetProperty("value", CreateJsValue(engine, Info.value));
138 object->SetProperty("extra", CreateJsValue(engine, Info.extra));
139 return objValue;
140 }
141
CreateJsCustomizeDataArray(NativeEngine & engine,const std::vector<AppExecFwk::CustomizeData> & info)142 NativeValue* CreateJsCustomizeDataArray(NativeEngine& engine, const std::vector<AppExecFwk::CustomizeData> &info)
143 {
144 NativeValue* arrayValue = engine.CreateArray(info.size());
145 NativeArray* array = ConvertNativeValueTo<NativeArray>(arrayValue);
146 if (array == nullptr) {
147 HILOG_ERROR("Native object is nullptr.");
148 return arrayValue;
149 }
150
151 uint32_t index = 0;
152 for (const auto& item : info) {
153 array->SetElement(index++, CreateJsCustomizeData(engine, item));
154 }
155 return arrayValue;
156 }
157
CreateJsModuleInfo(NativeEngine & engine,const AppExecFwk::ModuleInfo & moduleInfo)158 NativeValue* CreateJsModuleInfo(NativeEngine& engine, const AppExecFwk::ModuleInfo &moduleInfo)
159 {
160 NativeValue *objValue = engine.CreateObject();
161 NativeObject *object = ConvertNativeValueTo<NativeObject>(objValue);
162 if (object == nullptr) {
163 HILOG_ERROR("Native object is nullptr.");
164 return objValue;
165 }
166
167 object->SetProperty("moduleName", CreateJsValue(engine, moduleInfo.moduleName));
168 object->SetProperty("moduleSourceDir", CreateJsValue(engine, moduleInfo.moduleSourceDir));
169
170 return objValue;
171 }
172
CreateJsApplicationInfo(NativeEngine & engine,const AppExecFwk::ApplicationInfo & applicationInfo)173 NativeValue* CreateJsApplicationInfo(NativeEngine& engine, const AppExecFwk::ApplicationInfo &applicationInfo)
174 {
175 NativeValue *objValue = engine.CreateObject();
176 NativeObject *object = ConvertNativeValueTo<NativeObject>(objValue);
177 if (object == nullptr) {
178 HILOG_ERROR("Native object is nullptr.");
179 return objValue;
180 }
181
182 object->SetProperty("name", CreateJsValue(engine, applicationInfo.name));
183 object->SetProperty("description", CreateJsValue(engine, applicationInfo.description));
184 object->SetProperty("descriptionId", CreateJsValue(engine, applicationInfo.descriptionId));
185 object->SetProperty("systemApp", CreateJsValue(engine, applicationInfo.isSystemApp));
186 object->SetProperty("enabled", CreateJsValue(engine, applicationInfo.enabled));
187 object->SetProperty("label", CreateJsValue(engine, applicationInfo.label));
188 object->SetProperty("labelId", CreateJsValue(engine, std::to_string(applicationInfo.labelId)));
189 object->SetProperty("icon", CreateJsValue(engine, applicationInfo.iconPath));
190 object->SetProperty("iconId", CreateJsValue(engine, std::to_string(applicationInfo.iconId)));
191 object->SetProperty("process", CreateJsValue(engine, applicationInfo.process));
192 object->SetProperty("supportedModes", CreateJsValue(engine, applicationInfo.supportedModes));
193 object->SetProperty("entryDir", CreateJsValue(engine, applicationInfo.entryDir));
194 object->SetProperty("codePath", CreateJsValue(engine, applicationInfo.codePath));
195 object->SetProperty("removable", CreateJsValue(engine, applicationInfo.removable));
196
197 object->SetProperty("moduleSourceDirs", CreateNativeArray(engine, applicationInfo.moduleSourceDirs));
198 object->SetProperty("permissions", CreateNativeArray(engine, applicationInfo.permissions));
199
200 NativeValue *arrayValue = engine.CreateArray(applicationInfo.moduleInfos.size());
201 NativeArray *array = ConvertNativeValueTo<NativeArray>(arrayValue);
202 if (array != nullptr) {
203 uint32_t index = 0;
204 for (auto entity : applicationInfo.moduleInfos) {
205 array->SetElement(index++, CreateJsModuleInfo(engine, entity));
206 }
207 }
208 object->SetProperty("moduleInfos", arrayValue);
209
210 for (auto &item : applicationInfo.metaData) {
211 object->SetProperty(item.first.c_str(), CreateJsCustomizeDataArray(engine, item.second));
212 }
213
214 for (auto &item : applicationInfo.metadata) {
215 object->SetProperty(item.first.c_str(), CreateJsMetadataArray(engine, item.second));
216 }
217
218 return objValue;
219 }
220
CreateJsLaunchParam(NativeEngine & engine,const AAFwk::LaunchParam & launchParam)221 NativeValue* CreateJsLaunchParam(NativeEngine& engine, const AAFwk::LaunchParam& launchParam)
222 {
223 NativeValue *objValue = engine.CreateObject();
224 NativeObject *object = ConvertNativeValueTo<NativeObject>(objValue);
225 if (object == nullptr) {
226 HILOG_ERROR("Native object is nullptr.");
227 return objValue;
228 }
229
230 object->SetProperty("launchReason", CreateJsValue(engine, launchParam.launchReason));
231 object->SetProperty("lastExitReason", CreateJsValue(engine, launchParam.lastExitReason));
232
233 return objValue;
234 }
235
CreateJsConfiguration(NativeEngine & engine,const AppExecFwk::Configuration & configuration)236 NativeValue* CreateJsConfiguration(NativeEngine& engine, const AppExecFwk::Configuration& configuration)
237 {
238 NativeValue* objValue = engine.CreateObject();
239 NativeObject* object = ConvertNativeValueTo<NativeObject>(objValue);
240 if (object == nullptr) {
241 HILOG_ERROR("Native object is nullptr.");
242 return objValue;
243 }
244
245 object->SetProperty("language", CreateJsValue(engine,
246 configuration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_LANGUAGE)));
247 object->SetProperty("colorMode", CreateJsValue(engine,
248 ConvertColorMode(configuration.GetItem(AAFwk::GlobalConfigurationKey::SYSTEM_COLORMODE))));
249
250 int32_t displayId = ConvertDisplayId(configuration.GetItem(ConfigurationInner::APPLICATION_DISPLAYID));
251
252 std::string direction = configuration.GetItem(displayId, ConfigurationInner::APPLICATION_DIRECTION);
253 object->SetProperty("direction", CreateJsValue(engine, ConvertDirection(direction)));
254
255 std::string density = configuration.GetItem(displayId, ConfigurationInner::APPLICATION_DENSITYDPI);
256 object->SetProperty("screenDensity", CreateJsValue(engine, ConvertDensity(density)));
257
258 object->SetProperty("displayId", CreateJsValue(engine, displayId));
259
260 std::string hasPointerDevice = configuration.GetItem(AAFwk::GlobalConfigurationKey::INPUT_POINTER_DEVICE);
261 object->SetProperty("hasPointerDevice", CreateJsValue(engine, hasPointerDevice == "true" ? true : false));
262
263 return objValue;
264 }
265
CreateJsExtensionAbilityInfo(NativeEngine & engine,const AppExecFwk::ExtensionAbilityInfo & info)266 NativeValue* CreateJsExtensionAbilityInfo(NativeEngine& engine, const AppExecFwk::ExtensionAbilityInfo& info)
267 {
268 HILOG_DEBUG("CreateJsExtensionAbilityInfo begin");
269 NativeValue* objValue = engine.CreateObject();
270 NativeObject* object = ConvertNativeValueTo<NativeObject>(objValue);
271 if (object == nullptr) {
272 return objValue;
273 }
274
275 object->SetProperty("bundleName", CreateJsValue(engine, info.bundleName));
276 object->SetProperty("moduleName", CreateJsValue(engine, info.moduleName));
277 object->SetProperty("name", CreateJsValue(engine, info.name));
278 object->SetProperty("labelId", CreateJsValue(engine, info.labelId));
279 object->SetProperty("descriptionId", CreateJsValue(engine, info.descriptionId));
280 object->SetProperty("iconId", CreateJsValue(engine, info.iconId));
281 object->SetProperty("isVisible", CreateJsValue(engine, info.visible));
282 object->SetProperty("extensionAbilityType", CreateJsValue(engine, info.type));
283 NativeValue *permissionArrayValue = engine.CreateArray(info.permissions.size());
284 NativeArray *permissionArray = ConvertNativeValueTo<NativeArray>(permissionArrayValue);
285 if (permissionArray != nullptr) {
286 uint32_t index = 0;
287 for (auto permission : info.permissions) {
288 permissionArray->SetElement(index++, CreateJsValue(engine, permission));
289 }
290 }
291 object->SetProperty("permissions", permissionArrayValue);
292 object->SetProperty("applicationInfo", CreateJsApplicationInfo(engine, info.applicationInfo));
293 object->SetProperty("metadata", CreateJsMetadataArray(engine, info.metadata));
294 object->SetProperty("enabled", CreateJsValue(engine, info.enabled));
295 object->SetProperty("readPermission", CreateJsValue(engine, info.readPermission));
296 object->SetProperty("writePermission", CreateJsValue(engine, info.writePermission));
297 HILOG_DEBUG("CreateJsExtensionAbilityInfo end");
298 return objValue;
299 }
300 } // namespace AbilityRuntime
301 } // namespace OHOS
302