• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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