• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 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 "form_info.h"
17 
18 #include <errno.h>
19 #include <fcntl.h>
20 #include <string.h>
21 #include <unistd.h>
22 
23 #include "app_log_wrapper.h"
24 #include "bundle_constants.h"
25 #include "json_serializer.h"
26 #include "json_util.h"
27 #include "nlohmann/json.hpp"
28 #include "parcel_macro.h"
29 #include "string_ex.h"
30 
31 namespace OHOS {
32 namespace AppExecFwk {
33 namespace {
34 const char* JSON_KEY_COLOR_MODE = "colorMode";
35 const char* JSON_KEY_RENDERING_MODE = "renderingMode";
36 const char* JSON_KEY_PACKAGE = "package";
37 const char* JSON_KEY_SUPPORT_DIMENSIONS = "supportDimensions";
38 const char* JSON_KEY_DEFAULT_DIMENSION = "defaultDimension";
39 const char* JSON_KEY_UPDATE_ENABLED = "updateEnabled";
40 const char* JSON_KEY_SCHEDULED_UPDATE_TIME = "scheduledUpdateTime";
41 const char* JSON_KEY_MULTI_SCHEDULED_UPDATE_TIME = "multiScheduledUpdateTime";
42 const char* JSON_KEY_CONDITION_UPDATE = "conditionUpdate";
43 const char* JSON_KEY_UPDATE_DURATION = "updateDuration";
44 const char* JSON_KEY_DEEP_LINK = "deepLink";
45 const char* JSON_KEY_JS_COMPONENT_NAME = "jsComponentName";
46 const char* JSON_KEY_VALUE = "value";
47 const char* JSON_KEY_NAME = "name";
48 const char* JSON_KEY_ORIGINAL_BUNDLE_NAME = "originalBundleName";
49 const char* JSON_KEY_CUSTOMIZE_DATA = "customizeData";
50 const char* JSON_KEY_DISPLAY_NAME = "displayName";
51 const char* JSON_KEY_DISPLAY_NAME_ID = "displayNameId";
52 const char* JSON_KEY_DESCRIPTION = "description";
53 const char* JSON_KEY_DESCRIPTION_ID = "descriptionId";
54 const char* JSON_KEY_TYPE = "type";
55 const char* JSON_KEY_UI_SYNTAX = "uiSyntax";
56 const char* JSON_KEY_LANDSCAPE_LAYOUTS = "landscapeLayouts";
57 const char* JSON_KEY_FORMCONFIG_ABILITY = "formConfigAbility";
58 const char* JSON_KEY_FORM_VISIBLE_NOTIFY = "formVisibleNotify";
59 const char* JSON_KEY_RELATED_BUNDLE_NAME = "relatedBundleName";
60 const char* JSON_KEY_DEFAULT_FLAG = "defaultFlag";
61 const char* JSON_KEY_PORTRAIT_LAYOUTS = "portraitLayouts";
62 const char* JSON_KEY_SRC = "src";
63 const char* JSON_KEY_WINDOW = "window";
64 const char* JSON_KEY_DESIGN_WIDTH = "designWidth";
65 const char* JSON_KEY_AUTO_DESIGN_WIDTH = "autoDesignWidth";
66 const char* JSON_KEY_IS_STATIC = "isStatic";
67 const char* JSON_KEY_DATA_PROXY_ENABLED = "dataProxyEnabled";
68 const char* JSON_KEY_IS_DYNAMIC = "isDynamic";
69 const char* JSON_KEY_TRANSPARENCY_ENABLED = "transparencyEnabled";
70 const char* JSON_KEY_PRIVACY_LEVEL = "privacyLevel";
71 const char* JSON_KEY_FONT_SCALE_FOLLOW_SYSTEM = "fontScaleFollowSystem";
72 const char* JSON_KEY_SUPPORT_SHAPES = "supportShapes";
73 const char* JSON_KEY_VERSION_CODE = "versionCode";
74 const char* JSON_KEY_BUNDLE_TYPE = "bundleType";
75 const char* JSON_KEY_PREVIEW_IMAGES = "previewImages";
76 const char* JSON_KEY_ENABLE_BLUR_BACKGROUND = "enableBlurBackground";
77 }  // namespace
78 
FormInfo(const ExtensionAbilityInfo & abilityInfo,const ExtensionFormInfo & formInfo)79 FormInfo::FormInfo(const ExtensionAbilityInfo &abilityInfo, const ExtensionFormInfo &formInfo)
80 {
81     SetInfoByAbility(abilityInfo);
82     name = formInfo.name;
83     displayName = formInfo.displayName;
84     description = formInfo.description;
85     jsComponentName = "";
86     deepLink = "";
87     formConfigAbility = formInfo.formConfigAbility;
88     scheduledUpdateTime = formInfo.scheduledUpdateTime;
89     multiScheduledUpdateTime = formInfo.multiScheduledUpdateTime;
90     src = formInfo.src;
91     window.designWidth = formInfo.window.designWidth;
92     window.autoDesignWidth = formInfo.window.autoDesignWidth;
93     std::size_t pos = formInfo.displayName.find(':');
94     if (pos != std::string::npos) {
95         displayNameId = static_cast<uint32_t>(
96             atoi(formInfo.displayName.substr(pos + 1, formInfo.displayName.length() - pos - 1).c_str()));
97     }
98     pos = formInfo.description.find(':');
99     if (pos != std::string::npos) {
100         descriptionId = static_cast<uint32_t>(
101             atoi(formInfo.description.substr(pos + 1, formInfo.description.length() - pos - 1).c_str()));
102     }
103     updateDuration = formInfo.updateDuration;
104     defaultDimension = formInfo.defaultDimension;
105     defaultFlag = formInfo.isDefault;
106     formVisibleNotify = formInfo.formVisibleNotify;
107     updateEnabled = formInfo.updateEnabled;
108     type = formInfo.type;
109     uiSyntax = formInfo.uiSyntax;
110     colorMode = formInfo.colorMode;
111     renderingMode = formInfo.renderingMode;
112     for (const auto &dimension : formInfo.supportDimensions) {
113         supportDimensions.push_back(dimension);
114     }
115     for (const auto &metadata : formInfo.metadata) {
116         customizeDatas.push_back(metadata);
117     }
118     SetInfoByFormExt(formInfo);
119 }
120 
SetInfoByAbility(const ExtensionAbilityInfo & abilityInfo)121 void FormInfo::SetInfoByAbility(const ExtensionAbilityInfo &abilityInfo)
122 {
123     package = abilityInfo.bundleName + abilityInfo.moduleName;
124     bundleName = abilityInfo.bundleName;
125     originalBundleName = abilityInfo.bundleName;
126     relatedBundleName = abilityInfo.bundleName;
127     moduleName = abilityInfo.moduleName;
128     abilityName = abilityInfo.name;
129 }
130 
SetInfoByFormExt(const ExtensionFormInfo & formInfo)131 void FormInfo::SetInfoByFormExt(const ExtensionFormInfo &formInfo)
132 {
133     for (const auto &previewImage : formInfo.previewImages) {
134         formPreviewImages.push_back(previewImage);
135     }
136     for (const auto &conditionUpdateType : formInfo.conditionUpdate) {
137         conditionUpdate.push_back(conditionUpdateType);
138     }
139     dataProxyEnabled = formInfo.dataProxyEnabled;
140     isDynamic = formInfo.isDynamic;
141     transparencyEnabled = formInfo.transparencyEnabled;
142     fontScaleFollowSystem = formInfo.fontScaleFollowSystem;
143     for (const auto &shape : formInfo.supportShapes) {
144         supportShapes.push_back(shape);
145     }
146     enableBlurBackground = formInfo.enableBlurBackground;
147 }
148 
ReadCustomizeData(Parcel & parcel)149 bool FormInfo::ReadCustomizeData(Parcel &parcel)
150 {
151     int32_t customizeDataSize = 0;
152     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, customizeDataSize);
153     CONTAINER_SECURITY_VERIFY(parcel, customizeDataSize, &customizeDatas);
154     for (auto i = 0; i < customizeDataSize; ++i) {
155         FormCustomizeData customizeData;
156         std::string customizeName = Str16ToStr8(parcel.ReadString16());
157         std::string customizeValue = Str16ToStr8(parcel.ReadString16());
158         customizeData.name = customizeName;
159         customizeData.value = customizeValue;
160         customizeDatas.emplace_back(customizeData);
161     }
162     return true;
163 }
164 
ReadFromParcel(Parcel & parcel)165 bool FormInfo::ReadFromParcel(Parcel &parcel)
166 {
167     name = Str16ToStr8(parcel.ReadString16());
168     package = Str16ToStr8(parcel.ReadString16());
169     bundleName = Str16ToStr8(parcel.ReadString16());
170     moduleName = Str16ToStr8(parcel.ReadString16());
171     abilityName = Str16ToStr8(parcel.ReadString16());
172     displayName = Str16ToStr8(parcel.ReadString16());
173     description = Str16ToStr8(parcel.ReadString16());
174     formConfigAbility = Str16ToStr8(parcel.ReadString16());
175     scheduledUpdateTime = Str16ToStr8(parcel.ReadString16());
176     multiScheduledUpdateTime = Str16ToStr8(parcel.ReadString16());
177     jsComponentName = Str16ToStr8(parcel.ReadString16());
178     relatedBundleName = Str16ToStr8(parcel.ReadString16());
179     originalBundleName = Str16ToStr8(parcel.ReadString16());
180     deepLink = Str16ToStr8(parcel.ReadString16());
181     src = Str16ToStr8(parcel.ReadString16());
182     updateEnabled = parcel.ReadBool();
183     defaultFlag = parcel.ReadBool();
184     formVisibleNotify = parcel.ReadBool();
185     isStatic = parcel.ReadBool();
186     defaultDimension = parcel.ReadInt32();
187     displayNameId = parcel.ReadUint32();
188     descriptionId = parcel.ReadUint32();
189     updateDuration = parcel.ReadInt32();
190 
191     int32_t typeData;
192     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, typeData);
193     type = static_cast<FormType>(typeData);
194 
195     int32_t uiSyntaxData;
196     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, uiSyntaxData);
197     uiSyntax = static_cast<FormType>(uiSyntaxData);
198 
199     int32_t colorModeData;
200     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, colorModeData);
201     colorMode = static_cast<FormsColorMode>(colorModeData);
202 
203     int32_t renderingModeData;
204     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, renderingModeData);
205     renderingMode = static_cast<FormsRenderingMode>(renderingModeData);
206 
207     int32_t supportDimensionSize;
208     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, supportDimensionSize);
209     CONTAINER_SECURITY_VERIFY(parcel, supportDimensionSize, &supportDimensions);
210     for (int32_t i = 0; i < supportDimensionSize; i++) {
211         supportDimensions.emplace_back(parcel.ReadInt32());
212     }
213 
214     int32_t landscapeLayoutsSize;
215     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, landscapeLayoutsSize);
216     CONTAINER_SECURITY_VERIFY(parcel, landscapeLayoutsSize, &landscapeLayouts);
217     for (auto i = 0; i < landscapeLayoutsSize; i++) {
218         landscapeLayouts.emplace_back(Str16ToStr8(parcel.ReadString16()));
219     }
220 
221     int32_t portraitLayoutsSize;
222     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, portraitLayoutsSize);
223     CONTAINER_SECURITY_VERIFY(parcel, portraitLayoutsSize, &portraitLayouts);
224     for (auto i = 0; i < portraitLayoutsSize; i++) {
225         portraitLayouts.emplace_back(Str16ToStr8(parcel.ReadString16()));
226     }
227 
228     if (!ReadCustomizeData(parcel)) {
229         return false;
230     }
231 
232     window.designWidth = parcel.ReadInt32();
233     window.autoDesignWidth = parcel.ReadBool();
234     dataProxyEnabled = parcel.ReadBool();
235     isDynamic = parcel.ReadBool();
236     transparencyEnabled = parcel.ReadBool();
237     privacyLevel = parcel.ReadInt32();
238     fontScaleFollowSystem = parcel.ReadBool();
239 
240     int32_t supportShapeSize;
241     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, supportShapeSize);
242     CONTAINER_SECURITY_VERIFY(parcel, supportShapeSize, &supportShapes);
243     for (int32_t i = 0; i < supportShapeSize; i++) {
244         supportShapes.emplace_back(parcel.ReadInt32());
245     }
246     int32_t conditionUpdateSize;
247     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, conditionUpdateSize);
248     CONTAINER_SECURITY_VERIFY(parcel, conditionUpdateSize, &conditionUpdate);
249     for (int32_t i = 0; i < conditionUpdateSize; i++) {
250         conditionUpdate.emplace_back(parcel.ReadInt32());
251     }
252     versionCode = parcel.ReadUint32();
253     int32_t bundleTypeData;
254     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, bundleTypeData);
255     bundleType = static_cast<BundleType>(bundleTypeData);
256 
257     int32_t formPreviewImagesSize;
258     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, formPreviewImagesSize);
259     CONTAINER_SECURITY_VERIFY(parcel, formPreviewImagesSize, &formPreviewImages);
260     for (int32_t i = 0; i < formPreviewImagesSize; i++) {
261         formPreviewImages.emplace_back(parcel.ReadUint32());
262     }
263     enableBlurBackground = parcel.ReadBool();
264     return true;
265 }
266 
Unmarshalling(Parcel & parcel)267 FormInfo *FormInfo::Unmarshalling(Parcel &parcel)
268 {
269     std::unique_ptr<FormInfo> info = std::make_unique<FormInfo>();
270     if (!info->ReadFromParcel(parcel)) {
271         APP_LOGW("read from parcel failed");
272         info = nullptr;
273     }
274     return info.release();
275 }
276 
Marshalling(Parcel & parcel) const277 bool FormInfo::Marshalling(Parcel &parcel) const
278 {
279     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(name));
280     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(package));
281     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(bundleName));
282     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(moduleName));
283     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(abilityName));
284     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(displayName));
285     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(description));
286     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(formConfigAbility));
287     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(scheduledUpdateTime));
288     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(multiScheduledUpdateTime));
289     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(jsComponentName));
290     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(relatedBundleName));
291     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(originalBundleName));
292     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(deepLink));
293     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(src));
294     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, updateEnabled);
295     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, defaultFlag);
296     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, formVisibleNotify);
297     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, isStatic);
298     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, defaultDimension);
299     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Uint32, parcel, displayNameId);
300     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Uint32, parcel, descriptionId);
301     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, updateDuration);
302     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, static_cast<int32_t>(type));
303     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, static_cast<int32_t>(uiSyntax));
304     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, static_cast<int32_t>(colorMode));
305     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, static_cast<int32_t>(renderingMode));
306 
307     const auto supportDimensionSize = static_cast<int32_t>(supportDimensions.size());
308     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, supportDimensionSize);
309     for (auto i = 0; i < supportDimensionSize; i++) {
310         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, supportDimensions[i]);
311     }
312 
313     const auto landscapeLayoutsSize = static_cast<int32_t>(landscapeLayouts.size());
314     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, landscapeLayoutsSize);
315     for (auto i = 0; i < landscapeLayoutsSize; i++) {
316         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(landscapeLayouts[i]));
317     }
318 
319     const auto portraitLayoutsSize = static_cast<int32_t>(portraitLayouts.size());
320     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, portraitLayoutsSize);
321     for (auto i = 0; i < portraitLayoutsSize; i++) {
322         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(portraitLayouts[i]));
323     }
324 
325     const auto customizeDataSize = static_cast<int32_t>(customizeDatas.size());
326     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, customizeDataSize);
327     for (auto i = 0; i < customizeDataSize; i++) {
328         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(customizeDatas[i].name));
329         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(customizeDatas[i].value));
330     }
331 
332     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, window.designWidth);
333     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, window.autoDesignWidth);
334     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, dataProxyEnabled);
335     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, isDynamic);
336     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, transparencyEnabled);
337     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, privacyLevel);
338     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, fontScaleFollowSystem);
339 
340     const auto supportShapeSize = static_cast<int32_t>(supportShapes.size());
341     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, supportShapeSize);
342     for (auto i = 0; i < supportShapeSize; i++) {
343         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, supportShapes[i]);
344     }
345     const auto conditionUpdateSize = static_cast<int32_t>(conditionUpdate.size());
346     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, conditionUpdateSize);
347     for (auto i = 0; i < conditionUpdateSize; i++) {
348         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, conditionUpdate[i]);
349     }
350     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Uint32, parcel, versionCode);
351     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, static_cast<int32_t>(bundleType));
352 
353     const auto formPreviewImagesSize = static_cast<int32_t>(formPreviewImages.size());
354     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, formPreviewImagesSize);
355     for (auto i = 0; i < formPreviewImagesSize; i++) {
356         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Uint32, parcel, formPreviewImages[i]);
357     }
358     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, enableBlurBackground);
359     return true;
360 }
361 
IsValid() const362 bool FormInfo::IsValid() const
363 {
364     if (!window.autoDesignWidth && window.designWidth <= 0) {
365         APP_LOGW("Invalid FormInfo, window.designWidth <= 0");
366         return false;
367     }
368     return true;
369 }
370 
to_json(nlohmann::json & jsonObject,const FormCustomizeData & customizeDatas)371 void to_json(nlohmann::json &jsonObject, const FormCustomizeData &customizeDatas)
372 {
373     jsonObject = nlohmann::json{
374         {JSON_KEY_NAME, customizeDatas.name},
375         {JSON_KEY_VALUE, customizeDatas.value}
376     };
377 }
378 
to_json(nlohmann::json & jsonObject,const FormWindow & formWindow)379 void to_json(nlohmann::json &jsonObject, const FormWindow &formWindow)
380 {
381     jsonObject[JSON_KEY_DESIGN_WIDTH] = formWindow.designWidth;
382     jsonObject[JSON_KEY_AUTO_DESIGN_WIDTH] = formWindow.autoDesignWidth;
383 }
384 
to_json(nlohmann::json & jsonObject,const FormInfo & formInfo)385 void to_json(nlohmann::json &jsonObject, const FormInfo &formInfo)
386 {
387     jsonObject = nlohmann::json{
388         {JSON_KEY_NAME, formInfo.name},
389         {JSON_KEY_PACKAGE, formInfo.package},
390         {Constants::BUNDLE_NAME, formInfo.bundleName},
391         {Constants::MODULE_NAME, formInfo.moduleName},
392         {Constants::ABILITY_NAME, formInfo.abilityName},
393         {JSON_KEY_DISPLAY_NAME, formInfo.displayName},
394         {JSON_KEY_DESCRIPTION, formInfo.description},
395         {JSON_KEY_RELATED_BUNDLE_NAME, formInfo.relatedBundleName},
396         {JSON_KEY_JS_COMPONENT_NAME, formInfo.jsComponentName},
397         {JSON_KEY_DEEP_LINK, formInfo.deepLink},
398         {JSON_KEY_SRC, formInfo.src},
399         {JSON_KEY_FORMCONFIG_ABILITY, formInfo.formConfigAbility},
400         {JSON_KEY_SCHEDULED_UPDATE_TIME, formInfo.scheduledUpdateTime},
401         {JSON_KEY_MULTI_SCHEDULED_UPDATE_TIME, formInfo.multiScheduledUpdateTime},
402         {JSON_KEY_CONDITION_UPDATE, formInfo.conditionUpdate},
403         {JSON_KEY_ORIGINAL_BUNDLE_NAME, formInfo.originalBundleName},
404         {JSON_KEY_DISPLAY_NAME_ID, formInfo.displayNameId},
405         {JSON_KEY_DESCRIPTION_ID, formInfo.descriptionId},
406         {JSON_KEY_UPDATE_DURATION, formInfo.updateDuration},
407         {JSON_KEY_DEFAULT_DIMENSION, formInfo.defaultDimension},
408         {JSON_KEY_DEFAULT_FLAG, formInfo.defaultFlag},
409         {JSON_KEY_FORM_VISIBLE_NOTIFY, formInfo.formVisibleNotify},
410         {JSON_KEY_UPDATE_ENABLED, formInfo.updateEnabled},
411         {JSON_KEY_IS_STATIC, formInfo.isStatic},
412         {JSON_KEY_TYPE, formInfo.type},
413         {JSON_KEY_UI_SYNTAX, formInfo.uiSyntax},
414         {JSON_KEY_COLOR_MODE, formInfo.colorMode},
415         {JSON_KEY_RENDERING_MODE, formInfo.renderingMode},
416         {JSON_KEY_SUPPORT_DIMENSIONS, formInfo.supportDimensions},
417         {JSON_KEY_CUSTOMIZE_DATA, formInfo.customizeDatas},
418         {JSON_KEY_LANDSCAPE_LAYOUTS, formInfo.landscapeLayouts},
419         {JSON_KEY_PORTRAIT_LAYOUTS, formInfo.portraitLayouts},
420         {JSON_KEY_WINDOW, formInfo.window},
421         {JSON_KEY_DATA_PROXY_ENABLED, formInfo.dataProxyEnabled},
422         {JSON_KEY_IS_DYNAMIC, formInfo.isDynamic},
423         {JSON_KEY_TRANSPARENCY_ENABLED, formInfo.transparencyEnabled},
424         {JSON_KEY_PRIVACY_LEVEL, formInfo.privacyLevel},
425         {JSON_KEY_FONT_SCALE_FOLLOW_SYSTEM, formInfo.fontScaleFollowSystem},
426         {JSON_KEY_SUPPORT_SHAPES, formInfo.supportShapes},
427         {JSON_KEY_VERSION_CODE, formInfo.versionCode},
428         {JSON_KEY_BUNDLE_TYPE, formInfo.bundleType},
429         {JSON_KEY_PREVIEW_IMAGES, formInfo.formPreviewImages},
430         {JSON_KEY_ENABLE_BLUR_BACKGROUND, formInfo.enableBlurBackground}
431     };
432 }
433 
from_json(const nlohmann::json & jsonObject,FormCustomizeData & customizeDatas)434 void from_json(const nlohmann::json &jsonObject, FormCustomizeData &customizeDatas)
435 {
436     const auto &jsonObjectEnd = jsonObject.end();
437     int32_t parseResult = ERR_OK;
438     BMSJsonUtil::GetStrValueIfFindKey(jsonObject,
439         jsonObjectEnd,
440         JSON_KEY_NAME,
441         customizeDatas.name,
442         false,
443         parseResult);
444     BMSJsonUtil::GetStrValueIfFindKey(jsonObject,
445         jsonObjectEnd,
446         JSON_KEY_VALUE,
447         customizeDatas.value,
448         false,
449         parseResult);
450     if (parseResult != ERR_OK) {
451         APP_LOGE("read customizeDatas jsonObject error : %{public}d", parseResult);
452     }
453 }
454 
from_json(const nlohmann::json & jsonObject,FormWindow & formWindow)455 void from_json(const nlohmann::json &jsonObject, FormWindow &formWindow)
456 {
457     const auto &jsonObjectEnd = jsonObject.end();
458     int32_t parseResult = ERR_OK;
459     GetValueIfFindKey<int32_t>(jsonObject,
460         jsonObjectEnd,
461         JSON_KEY_DESIGN_WIDTH,
462         formWindow.designWidth,
463         JsonType::NUMBER,
464         false,
465         parseResult,
466         ArrayType::NOT_ARRAY);
467     BMSJsonUtil::GetBoolValueIfFindKey(jsonObject,
468         jsonObjectEnd,
469         JSON_KEY_AUTO_DESIGN_WIDTH,
470         formWindow.autoDesignWidth,
471         false,
472         parseResult);
473     if (parseResult != ERR_OK) {
474         APP_LOGE("read formWindow jsonObject error : %{public}d", parseResult);
475     }
476 }
477 
from_json(const nlohmann::json & jsonObject,FormInfo & formInfo)478 void from_json(const nlohmann::json &jsonObject, FormInfo &formInfo)
479 {
480     int32_t parseResult = ERR_OK;
481     const auto &jsonObjectEnd = jsonObject.end();
482     BMSJsonUtil::GetStrValueIfFindKey(jsonObject,
483         jsonObjectEnd,
484         Constants::BUNDLE_NAME,
485         formInfo.bundleName,
486         false,
487         parseResult);
488     BMSJsonUtil::GetStrValueIfFindKey(jsonObject,
489         jsonObjectEnd,
490         JSON_KEY_PACKAGE,
491         formInfo.package,
492         false,
493         parseResult);
494     BMSJsonUtil::GetStrValueIfFindKey(jsonObject,
495         jsonObjectEnd,
496         Constants::MODULE_NAME,
497         formInfo.moduleName,
498         false,
499         parseResult);
500     BMSJsonUtil::GetStrValueIfFindKey(jsonObject,
501         jsonObjectEnd,
502         Constants::ABILITY_NAME,
503         formInfo.abilityName,
504         false,
505         parseResult);
506     BMSJsonUtil::GetStrValueIfFindKey(jsonObject,
507         jsonObjectEnd,
508         JSON_KEY_NAME,
509         formInfo.name,
510         false,
511         parseResult);
512     BMSJsonUtil::GetStrValueIfFindKey(jsonObject,
513         jsonObjectEnd,
514         JSON_KEY_DISPLAY_NAME,
515         formInfo.displayName,
516         false,
517         parseResult);
518     BMSJsonUtil::GetStrValueIfFindKey(jsonObject,
519         jsonObjectEnd,
520         JSON_KEY_DESCRIPTION,
521         formInfo.description,
522         false,
523         parseResult);
524     BMSJsonUtil::GetStrValueIfFindKey(jsonObject,
525         jsonObjectEnd,
526         JSON_KEY_RELATED_BUNDLE_NAME,
527         formInfo.relatedBundleName,
528         false,
529         parseResult);
530     BMSJsonUtil::GetStrValueIfFindKey(jsonObject,
531         jsonObjectEnd,
532         JSON_KEY_JS_COMPONENT_NAME,
533         formInfo.jsComponentName,
534         false,
535         parseResult);
536     BMSJsonUtil::GetStrValueIfFindKey(jsonObject,
537         jsonObjectEnd,
538         JSON_KEY_DEEP_LINK,
539         formInfo.deepLink,
540         false,
541         parseResult);
542     BMSJsonUtil::GetStrValueIfFindKey(jsonObject,
543         jsonObjectEnd,
544         JSON_KEY_FORMCONFIG_ABILITY,
545         formInfo.formConfigAbility,
546         false,
547         parseResult);
548     BMSJsonUtil::GetStrValueIfFindKey(jsonObject,
549         jsonObjectEnd,
550         JSON_KEY_SCHEDULED_UPDATE_TIME,
551         formInfo.scheduledUpdateTime,
552         false,
553         parseResult);
554     BMSJsonUtil::GetStrValueIfFindKey(jsonObject,
555         jsonObjectEnd,
556         JSON_KEY_MULTI_SCHEDULED_UPDATE_TIME,
557         formInfo.multiScheduledUpdateTime,
558         false,
559         parseResult);
560     GetValueIfFindKey<std::vector<int32_t>>(jsonObject,
561         jsonObjectEnd,
562         JSON_KEY_CONDITION_UPDATE,
563         formInfo.conditionUpdate,
564         JsonType::ARRAY,
565         false,
566         parseResult,
567         ArrayType::NUMBER);
568     BMSJsonUtil::GetStrValueIfFindKey(jsonObject,
569         jsonObjectEnd,
570         JSON_KEY_SRC,
571         formInfo.src,
572         false,
573         parseResult);
574     BMSJsonUtil::GetStrValueIfFindKey(jsonObject,
575         jsonObjectEnd,
576         JSON_KEY_ORIGINAL_BUNDLE_NAME,
577         formInfo.originalBundleName,
578         false,
579         parseResult);
580     GetValueIfFindKey<uint32_t>(jsonObject,
581         jsonObjectEnd,
582         JSON_KEY_DISPLAY_NAME_ID,
583         formInfo.displayNameId,
584         JsonType::NUMBER,
585         false,
586         parseResult,
587         ArrayType::NOT_ARRAY);
588     GetValueIfFindKey<uint32_t>(jsonObject,
589         jsonObjectEnd,
590         JSON_KEY_DESCRIPTION_ID,
591         formInfo.descriptionId,
592         JsonType::NUMBER,
593         false,
594         parseResult,
595         ArrayType::NOT_ARRAY);
596     GetValueIfFindKey<int32_t>(jsonObject,
597         jsonObjectEnd,
598         JSON_KEY_UPDATE_DURATION,
599         formInfo.updateDuration,
600         JsonType::NUMBER,
601         false,
602         parseResult,
603         ArrayType::NOT_ARRAY);
604     GetValueIfFindKey<int32_t>(jsonObject,
605         jsonObjectEnd,
606         JSON_KEY_DEFAULT_DIMENSION,
607         formInfo.defaultDimension,
608         JsonType::NUMBER,
609         false,
610         parseResult,
611         ArrayType::NOT_ARRAY);
612     BMSJsonUtil::GetBoolValueIfFindKey(jsonObject,
613         jsonObjectEnd,
614         JSON_KEY_DEFAULT_FLAG,
615         formInfo.defaultFlag,
616         false,
617         parseResult);
618     BMSJsonUtil::GetBoolValueIfFindKey(jsonObject,
619         jsonObjectEnd,
620         JSON_KEY_FORM_VISIBLE_NOTIFY,
621         formInfo.formVisibleNotify,
622         false,
623         parseResult);
624     BMSJsonUtil::GetBoolValueIfFindKey(jsonObject,
625         jsonObjectEnd,
626         JSON_KEY_UPDATE_ENABLED,
627         formInfo.updateEnabled,
628         false,
629         parseResult);
630     BMSJsonUtil::GetBoolValueIfFindKey(jsonObject,
631         jsonObjectEnd,
632         JSON_KEY_IS_STATIC,
633         formInfo.isStatic,
634         false,
635         parseResult);
636     GetValueIfFindKey<FormType>(jsonObject,
637         jsonObjectEnd,
638         JSON_KEY_TYPE,
639         formInfo.type,
640         JsonType::NUMBER,
641         false,
642         parseResult,
643         ArrayType::NOT_ARRAY);
644     GetValueIfFindKey<FormsColorMode>(jsonObject,
645         jsonObjectEnd,
646         JSON_KEY_COLOR_MODE,
647         formInfo.colorMode,
648         JsonType::NUMBER,
649         false,
650         parseResult,
651         ArrayType::NOT_ARRAY);
652     GetValueIfFindKey<FormsRenderingMode>(jsonObject,
653         jsonObjectEnd,
654         JSON_KEY_RENDERING_MODE,
655         formInfo.renderingMode,
656         JsonType::NUMBER,
657         false,
658         parseResult,
659         ArrayType::NOT_ARRAY);
660     GetValueIfFindKey<std::vector<int32_t>>(jsonObject,
661         jsonObjectEnd,
662         JSON_KEY_SUPPORT_DIMENSIONS,
663         formInfo.supportDimensions,
664         JsonType::ARRAY,
665         false,
666         parseResult,
667         ArrayType::NUMBER);
668     GetValueIfFindKey<std::vector<FormCustomizeData>>(jsonObject,
669         jsonObjectEnd,
670         JSON_KEY_CUSTOMIZE_DATA,
671         formInfo.customizeDatas,
672         JsonType::ARRAY,
673         false,
674         parseResult,
675         ArrayType::OBJECT);
676     GetValueIfFindKey<std::vector<std::string>>(jsonObject,
677         jsonObjectEnd,
678         JSON_KEY_LANDSCAPE_LAYOUTS,
679         formInfo.landscapeLayouts,
680         JsonType::ARRAY,
681         false,
682         parseResult,
683         ArrayType::STRING);
684     GetValueIfFindKey<std::vector<std::string>>(jsonObject,
685         jsonObjectEnd,
686         JSON_KEY_PORTRAIT_LAYOUTS,
687         formInfo.portraitLayouts,
688         JsonType::ARRAY,
689         false,
690         parseResult,
691         ArrayType::STRING);
692     GetValueIfFindKey<FormWindow>(jsonObject,
693         jsonObjectEnd,
694         JSON_KEY_WINDOW,
695         formInfo.window,
696         JsonType::OBJECT,
697         false,
698         parseResult,
699         ArrayType::NOT_ARRAY);
700     GetValueIfFindKey<FormType>(jsonObject,
701         jsonObjectEnd,
702         JSON_KEY_UI_SYNTAX,
703         formInfo.uiSyntax,
704         JsonType::NUMBER,
705         false,
706         parseResult,
707         ArrayType::NOT_ARRAY);
708     BMSJsonUtil::GetBoolValueIfFindKey(jsonObject,
709         jsonObjectEnd,
710         JSON_KEY_DATA_PROXY_ENABLED,
711         formInfo.dataProxyEnabled,
712         false,
713         parseResult);
714     BMSJsonUtil::GetBoolValueIfFindKey(jsonObject,
715         jsonObjectEnd,
716         JSON_KEY_IS_DYNAMIC,
717         formInfo.isDynamic,
718         false,
719         parseResult);
720     BMSJsonUtil::GetBoolValueIfFindKey(jsonObject,
721         jsonObjectEnd,
722         JSON_KEY_TRANSPARENCY_ENABLED,
723         formInfo.transparencyEnabled,
724         false,
725         parseResult);
726     GetValueIfFindKey<int32_t>(jsonObject,
727         jsonObjectEnd,
728         JSON_KEY_PRIVACY_LEVEL,
729         formInfo.privacyLevel,
730         JsonType::NUMBER,
731         false,
732         parseResult,
733         ArrayType::NOT_ARRAY);
734     BMSJsonUtil::GetBoolValueIfFindKey(jsonObject,
735         jsonObjectEnd,
736         JSON_KEY_FONT_SCALE_FOLLOW_SYSTEM,
737         formInfo.fontScaleFollowSystem,
738         false,
739         parseResult);
740     GetValueIfFindKey<std::vector<int32_t>>(jsonObject,
741         jsonObjectEnd,
742         JSON_KEY_SUPPORT_SHAPES,
743         formInfo.supportShapes,
744         JsonType::ARRAY,
745         false,
746         parseResult,
747         ArrayType::NUMBER);
748     GetValueIfFindKey<uint32_t>(jsonObject,
749         jsonObjectEnd,
750         JSON_KEY_VERSION_CODE,
751         formInfo.versionCode,
752         JsonType::NUMBER,
753         false,
754         parseResult,
755         ArrayType::NOT_ARRAY);
756     GetValueIfFindKey<BundleType>(jsonObject,
757         jsonObjectEnd,
758         JSON_KEY_BUNDLE_TYPE,
759         formInfo.bundleType,
760         JsonType::NUMBER,
761         false,
762         parseResult,
763         ArrayType::NOT_ARRAY);
764     GetValueIfFindKey<std::vector<uint32_t>>(jsonObject,
765         jsonObjectEnd,
766         JSON_KEY_PREVIEW_IMAGES,
767         formInfo.formPreviewImages,
768         JsonType::ARRAY,
769         false,
770         parseResult,
771         ArrayType::NUMBER);
772     BMSJsonUtil::GetBoolValueIfFindKey(jsonObject,
773         jsonObjectEnd,
774         JSON_KEY_ENABLE_BLUR_BACKGROUND,
775         formInfo.enableBlurBackground,
776         false,
777         parseResult);
778     if (parseResult != ERR_OK) {
779         APP_LOGE("read formInfo jsonObject error : %{public}d", parseResult);
780     }
781 }
782 }  // namespace AppExecFwk
783 }  // namespace OHOS
784