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