• 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 "hap_module_info.h"
17 
18 #include "bundle_constants.h"
19 #include "json_util.h"
20 #include "message_parcel.h"
21 #include "nlohmann/json.hpp"
22 #include "parcel_macro.h"
23 #include "string_ex.h"
24 
25 namespace OHOS {
26 namespace AppExecFwk {
27 namespace {
28 const std::string HAP_MODULE_INFO_NAME = "name";
29 const std::string HAP_MODULE_INFO_PACKAGE = "package";
30 const std::string HAP_MODULE_INFO_DESCRIPTION = "description";
31 const std::string HAP_MODULE_INFO_DESCRIPTION_ID = "descriptionId";
32 const std::string HAP_MODULE_INFO_ICON_PATH = "iconPath";
33 const std::string HAP_MODULE_INFO_ICON_ID = "iconId";
34 const std::string HAP_MODULE_INFO_LABEL = "label";
35 const std::string HAP_MODULE_INFO_LABEL_ID = "labelId";
36 const std::string HAP_MODULE_INFO_BACKGROUND_IMG = "backgroundImg";
37 const std::string HAP_MODULE_INFO_MAIN_ABILITY = "mainAbility";
38 const std::string HAP_MODULE_INFO_SRC_PATH = "srcPath";
39 const std::string HAP_MODULE_INFO_HASH_VALUE = "hashValue";
40 const std::string HAP_MODULE_INFO_SUPPORTED_MODES = "supportedModes";
41 const std::string HAP_MODULE_INFO_REQ_CAPABILITIES = "reqCapabilities";
42 const std::string HAP_MODULE_INFO_DEVICE_TYPES = "deviceTypes";
43 const std::string HAP_MODULE_INFO_ABILITY_INFOS = "abilityInfos";
44 const std::string HAP_MODULE_INFO_COLOR_MODE = "colorMode";
45 const std::string HAP_MODULE_INFO_MAIN_ELEMENTNAME = "mainElementName";
46 const std::string HAP_MODULE_INFO_PAGES = "pages";
47 const std::string HAP_MODULE_INFO_PROCESS = "process";
48 const std::string HAP_MODULE_INFO_RESOURCE_PATH = "resourcePath";
49 const std::string HAP_MODULE_INFO_SRC_ENTRANCE = "srcEntrance";
50 const std::string HAP_MODULE_INFO_UI_SYNTAX = "uiSyntax";
51 const std::string HAP_MODULE_INFO_VIRTUAL_MACHINE = "virtualMachine";
52 const std::string HAP_MODULE_INFO_DELIVERY_WITH_INSTALL = "deliveryWithInstall";
53 const std::string HAP_MODULE_INFO_INSTALLATION_FREE = "installationFree";
54 const std::string HAP_MODULE_INFO_IS_MODULE_JSON = "isModuleJson";
55 const std::string HAP_MODULE_INFO_IS_STAGE_BASED_MODEL = "isStageBasedModel";
56 const std::string HAP_MODULE_INFO_IS_REMOVABLE = "isRemovable";
57 const std::string HAP_MODULE_INFO_MODULE_TYPE = "moduleType";
58 const std::string HAP_MODULE_INFO_EXTENSION_INFOS = "extensionInfos";
59 const std::string HAP_MODULE_INFO_META_DATA = "metadata";
60 const std::string HAP_MODULE_INFO_DEPENDENCIES = "dependencies";
61 const std::string HAP_MODULE_INFO_UPGRADE_FLAG = "upgradeFlag";
62 const std::string HAP_MODULE_INFO_HAP_PATH = "hapPath";
63 const std::string HAP_MODULE_INFO_COMPILE_MODE = "compileMode";
64 const std::string HAP_MODULE_INFO_HQF_INFO = "hqfInfo";
65 const std::string HAP_MODULE_INFO_IS_LIB_ISOLATED = "isLibIsolated";
66 const std::string HAP_MODULE_INFO_NATIVE_LIBRARY_PATH = "nativeLibraryPath";
67 const std::string HAP_MODULE_INFO_CPU_ABI = "cpuAbi";
68 const std::string HAP_MODULE_INFO_MODULE_SOURCE_DIR = "moduleSourceDir";
69 const std::string HAP_MODULE_INFO_ATOMIC_SERVICE_MODULE_TYPE = "atomicServiceModuleType";
70 const std::string HAP_MODULE_INFO_PRELOADS = "preloads";
71 const std::string PRELOAD_ITEM_MODULE_NAME = "moduleName";
72 }
73 
ReadFromParcel(Parcel & parcel)74 bool PreloadItem::ReadFromParcel(Parcel &parcel)
75 {
76     moduleName = Str16ToStr8(parcel.ReadString16());
77     return true;
78 }
79 
Marshalling(Parcel & parcel) const80 bool PreloadItem::Marshalling(Parcel &parcel) const
81 {
82     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(moduleName));
83     return true;
84 }
85 
Unmarshalling(Parcel & parcel)86 PreloadItem *PreloadItem::Unmarshalling(Parcel &parcel)
87 {
88     PreloadItem *info = new (std::nothrow) PreloadItem();
89     if (info && !info->ReadFromParcel(parcel)) {
90         APP_LOGW("read from parcel failed");
91         delete info;
92         info = nullptr;
93     }
94     return info;
95 }
96 
to_json(nlohmann::json & jsonObject,const PreloadItem & preloadItem)97 void to_json(nlohmann::json &jsonObject, const PreloadItem &preloadItem)
98 {
99     jsonObject = nlohmann::json {
100         {PRELOAD_ITEM_MODULE_NAME, preloadItem.moduleName}
101     };
102 }
103 
from_json(const nlohmann::json & jsonObject,PreloadItem & preloadItem)104 void from_json(const nlohmann::json &jsonObject, PreloadItem &preloadItem)
105 {
106     const auto &jsonObjectEnd = jsonObject.end();
107     int32_t parseResult = ERR_OK;
108     GetValueIfFindKey<std::string>(jsonObject,
109         jsonObjectEnd,
110         PRELOAD_ITEM_MODULE_NAME,
111         preloadItem.moduleName,
112         JsonType::STRING,
113         false,
114         parseResult,
115         ArrayType::NOT_ARRAY);
116     if (parseResult != ERR_OK) {
117         APP_LOGE("read PreloadItem from database error, error code : %{public}d", parseResult);
118     }
119 }
120 
ReadFromParcel(Parcel & parcel)121 bool HapModuleInfo::ReadFromParcel(Parcel &parcel)
122 {
123     name = Str16ToStr8(parcel.ReadString16());
124     package = Str16ToStr8(parcel.ReadString16());
125     moduleName = Str16ToStr8(parcel.ReadString16());
126     description = Str16ToStr8(parcel.ReadString16());
127     descriptionId = parcel.ReadInt32();
128     iconPath = Str16ToStr8(parcel.ReadString16());
129     iconId = parcel.ReadInt32();
130     label = Str16ToStr8(parcel.ReadString16());
131     labelId = parcel.ReadInt32();
132     backgroundImg = Str16ToStr8(parcel.ReadString16());
133     mainAbility = Str16ToStr8(parcel.ReadString16());
134     srcPath = Str16ToStr8(parcel.ReadString16());
135     hashValue = Str16ToStr8(parcel.ReadString16());
136     hapPath = Str16ToStr8(parcel.ReadString16());
137     supportedModes = parcel.ReadInt32();
138 
139     int32_t reqCapabilitiesSize;
140     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, reqCapabilitiesSize);
141     CONTAINER_SECURITY_VERIFY(parcel, reqCapabilitiesSize, &reqCapabilities);
142     for (auto i = 0; i < reqCapabilitiesSize; i++) {
143         reqCapabilities.emplace_back(Str16ToStr8(parcel.ReadString16()));
144     }
145 
146     int32_t deviceTypesSize;
147     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, deviceTypesSize);
148     CONTAINER_SECURITY_VERIFY(parcel, deviceTypesSize, &deviceTypes);
149     for (auto i = 0; i < deviceTypesSize; i++) {
150         deviceTypes.emplace_back(Str16ToStr8(parcel.ReadString16()));
151     }
152 
153     int32_t dependenciesSize;
154     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, dependenciesSize);
155     CONTAINER_SECURITY_VERIFY(parcel, dependenciesSize, &dependencies);
156     for (auto i = 0; i < dependenciesSize; i++) {
157         dependencies.emplace_back(Str16ToStr8(parcel.ReadString16()));
158     }
159 
160     int32_t abilityInfosSize;
161     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, abilityInfosSize);
162     CONTAINER_SECURITY_VERIFY(parcel, abilityInfosSize, &abilityInfos);
163     for (auto i = 0; i < abilityInfosSize; i++) {
164         std::unique_ptr<AbilityInfo> abilityInfo(parcel.ReadParcelable<AbilityInfo>());
165         if (!abilityInfo) {
166             APP_LOGE("ReadParcelable<AbilityInfo> failed");
167             return false;
168         }
169         abilityInfos.emplace_back(*abilityInfo);
170     }
171 
172     colorMode = static_cast<ModuleColorMode>(parcel.ReadInt32());
173     bundleName = Str16ToStr8(parcel.ReadString16());
174     mainElementName = Str16ToStr8(parcel.ReadString16());
175     pages = Str16ToStr8(parcel.ReadString16());
176     process = Str16ToStr8(parcel.ReadString16());
177     resourcePath = Str16ToStr8(parcel.ReadString16());
178     srcEntrance = Str16ToStr8(parcel.ReadString16());
179     uiSyntax = Str16ToStr8(parcel.ReadString16());
180     virtualMachine = Str16ToStr8(parcel.ReadString16());
181     deliveryWithInstall = parcel.ReadBool();
182     installationFree = parcel.ReadBool();
183     isModuleJson = parcel.ReadBool();
184     isStageBasedModel = parcel.ReadBool();
185 
186     int32_t isRemovableSize;
187     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, isRemovableSize);
188     CONTAINER_SECURITY_VERIFY(parcel, isRemovableSize, &isRemovable);
189     for (auto i = 0; i < isRemovableSize; i++) {
190         std::string key = Str16ToStr8(parcel.ReadString16());
191         bool isRemove = parcel.ReadBool();
192         isRemovable[key] = isRemove;
193     }
194     moduleType = static_cast<ModuleType>(parcel.ReadInt32());
195 
196     int32_t extensionInfosSize;
197     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, extensionInfosSize);
198     CONTAINER_SECURITY_VERIFY(parcel, extensionInfosSize, &extensionInfos);
199     for (auto i = 0; i < extensionInfosSize; i++) {
200         std::unique_ptr<ExtensionAbilityInfo> extensionAbilityInfo(parcel.ReadParcelable<ExtensionAbilityInfo>());
201         if (!extensionAbilityInfo) {
202             APP_LOGE("ReadParcelable<ExtensionAbilityInfo> failed");
203             return false;
204         }
205         extensionInfos.emplace_back(*extensionAbilityInfo);
206     }
207 
208     int32_t metadataSize;
209     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, metadataSize);
210     CONTAINER_SECURITY_VERIFY(parcel, metadataSize, &metadata);
211     for (int32_t i = 0; i < metadataSize; ++i) {
212         std::unique_ptr<Metadata> meta(parcel.ReadParcelable<Metadata>());
213         if (!meta) {
214             APP_LOGE("ReadParcelable<Metadata> failed");
215             return false;
216         }
217         metadata.emplace_back(*meta);
218     }
219 
220     upgradeFlag = parcel.ReadInt32();
221     compileMode = static_cast<CompileMode>(parcel.ReadInt32());
222     std::unique_ptr<HqfInfo> hqfInfoPtr(parcel.ReadParcelable<HqfInfo>());
223     if (hqfInfoPtr == nullptr) {
224         APP_LOGE("ReadParcelable<HqfInfo> failed");
225         return false;
226     }
227     hqfInfo = *hqfInfoPtr;
228     isLibIsolated = parcel.ReadBool();
229     nativeLibraryPath = Str16ToStr8(parcel.ReadString16());
230     cpuAbi = Str16ToStr8(parcel.ReadString16());
231     moduleSourceDir = Str16ToStr8(parcel.ReadString16());
232 
233     atomicServiceModuleType = static_cast<AtomicServiceModuleType>(parcel.ReadInt32());
234 
235     int32_t preloadsSize;
236     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, preloadsSize);
237     CONTAINER_SECURITY_VERIFY(parcel, preloadsSize, &preloads);
238     for (int32_t i = 0; i < preloadsSize; ++i) {
239         std::unique_ptr<PreloadItem> preload(parcel.ReadParcelable<PreloadItem>());
240         if (!preload) {
241             APP_LOGE("ReadParcelable<PreloadItem> failed");
242             return false;
243         }
244         preloads.emplace_back(*preload);
245     }
246     return true;
247 }
248 
Unmarshalling(Parcel & parcel)249 HapModuleInfo *HapModuleInfo::Unmarshalling(Parcel &parcel)
250 {
251     HapModuleInfo *info = new (std::nothrow) HapModuleInfo();
252     if (info && !info->ReadFromParcel(parcel)) {
253         APP_LOGW("read from parcel failed");
254         delete info;
255         info = nullptr;
256     }
257     return info;
258 }
259 
Marshalling(Parcel & parcel) const260 bool HapModuleInfo::Marshalling(Parcel &parcel) const
261 {
262     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(name));
263     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(package));
264     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(moduleName));
265     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(description));
266     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, descriptionId);
267     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(iconPath));
268     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, iconId);
269     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(label));
270     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, labelId);
271     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(backgroundImg));
272     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(mainAbility));
273     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(srcPath));
274     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(hashValue));
275     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(hapPath));
276     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, supportedModes);
277 
278     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, reqCapabilities.size());
279     for (auto &reqCapability : reqCapabilities) {
280         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(reqCapability));
281     }
282 
283     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, deviceTypes.size());
284     for (auto &deviceType : deviceTypes) {
285         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(deviceType));
286     }
287 
288     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, dependencies.size());
289     for (auto &dependency : dependencies) {
290         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(dependency));
291     }
292 
293     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, abilityInfos.size());
294     for (auto &abilityInfo : abilityInfos) {
295         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Parcelable, parcel, &abilityInfo);
296     }
297 
298     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, static_cast<int32_t>(colorMode));
299     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(bundleName));
300     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(mainElementName));
301     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(pages));
302     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(process));
303     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(resourcePath));
304     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(srcEntrance));
305     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(uiSyntax));
306     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(virtualMachine));
307     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, deliveryWithInstall);
308     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, installationFree);
309     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, isModuleJson);
310     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, isStageBasedModel);
311 
312     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, isRemovable.size());
313     for (auto &item : isRemovable) {
314         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(item.first));
315         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, item.second);
316     }
317 
318     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, static_cast<int32_t>(moduleType));
319 
320     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, extensionInfos.size());
321     for (auto &extensionInfo : extensionInfos) {
322         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Parcelable, parcel, &extensionInfo);
323     }
324 
325     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, metadata.size());
326     for (auto &mete : metadata) {
327         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Parcelable, parcel, &mete);
328     }
329 
330     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, upgradeFlag);
331     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, static_cast<int32_t>(compileMode));
332     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Parcelable, parcel, &hqfInfo);
333     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, isLibIsolated);
334     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(nativeLibraryPath));
335     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(cpuAbi));
336     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(moduleSourceDir));
337 
338     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, static_cast<int32_t>(atomicServiceModuleType));
339 
340     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, preloads.size());
341     for (auto &item : preloads) {
342         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Parcelable, parcel, &item);
343     }
344     return true;
345 }
346 
to_json(nlohmann::json & jsonObject,const HapModuleInfo & hapModuleInfo)347 void to_json(nlohmann::json &jsonObject, const HapModuleInfo &hapModuleInfo)
348 {
349     jsonObject = nlohmann::json {
350         {HAP_MODULE_INFO_NAME, hapModuleInfo.name},
351         {HAP_MODULE_INFO_PACKAGE, hapModuleInfo.package},
352         {Constants::MODULE_NAME, hapModuleInfo.moduleName},
353         {HAP_MODULE_INFO_DESCRIPTION, hapModuleInfo.description},
354         {HAP_MODULE_INFO_DESCRIPTION_ID, hapModuleInfo.descriptionId},
355         {HAP_MODULE_INFO_ICON_PATH, hapModuleInfo.iconPath},
356         {HAP_MODULE_INFO_ICON_ID, hapModuleInfo.iconId},
357         {HAP_MODULE_INFO_LABEL, hapModuleInfo.label},
358         {HAP_MODULE_INFO_LABEL_ID, hapModuleInfo.labelId},
359         {HAP_MODULE_INFO_BACKGROUND_IMG, hapModuleInfo.backgroundImg},
360         {HAP_MODULE_INFO_MAIN_ABILITY, hapModuleInfo.mainAbility},
361         {HAP_MODULE_INFO_SRC_PATH, hapModuleInfo.srcPath},
362         {HAP_MODULE_INFO_HASH_VALUE, hapModuleInfo.hashValue},
363         {HAP_MODULE_INFO_HAP_PATH, hapModuleInfo.hapPath},
364         {HAP_MODULE_INFO_SUPPORTED_MODES, hapModuleInfo.supportedModes},
365         {HAP_MODULE_INFO_REQ_CAPABILITIES, hapModuleInfo.reqCapabilities},
366         {HAP_MODULE_INFO_DEVICE_TYPES, hapModuleInfo.deviceTypes},
367         {HAP_MODULE_INFO_ABILITY_INFOS, hapModuleInfo.abilityInfos},
368         {HAP_MODULE_INFO_COLOR_MODE, hapModuleInfo.colorMode},
369         {Constants::BUNDLE_NAME, hapModuleInfo.bundleName},
370         {HAP_MODULE_INFO_MAIN_ELEMENTNAME, hapModuleInfo.mainElementName},
371         {HAP_MODULE_INFO_PAGES, hapModuleInfo.pages},
372         {HAP_MODULE_INFO_PROCESS, hapModuleInfo.process},
373         {HAP_MODULE_INFO_RESOURCE_PATH, hapModuleInfo.resourcePath},
374         {HAP_MODULE_INFO_SRC_ENTRANCE, hapModuleInfo.srcEntrance},
375         {HAP_MODULE_INFO_UI_SYNTAX, hapModuleInfo.uiSyntax},
376         {HAP_MODULE_INFO_VIRTUAL_MACHINE, hapModuleInfo.virtualMachine},
377         {HAP_MODULE_INFO_DELIVERY_WITH_INSTALL, hapModuleInfo.deliveryWithInstall},
378         {HAP_MODULE_INFO_INSTALLATION_FREE, hapModuleInfo.installationFree},
379         {HAP_MODULE_INFO_IS_MODULE_JSON, hapModuleInfo.isModuleJson},
380         {HAP_MODULE_INFO_IS_STAGE_BASED_MODEL, hapModuleInfo.isStageBasedModel},
381         {HAP_MODULE_INFO_IS_REMOVABLE, hapModuleInfo.isRemovable},
382         {HAP_MODULE_INFO_UPGRADE_FLAG, hapModuleInfo.upgradeFlag},
383         {HAP_MODULE_INFO_MODULE_TYPE, hapModuleInfo.moduleType},
384         {HAP_MODULE_INFO_EXTENSION_INFOS, hapModuleInfo.extensionInfos},
385         {HAP_MODULE_INFO_META_DATA, hapModuleInfo.metadata},
386         {HAP_MODULE_INFO_DEPENDENCIES, hapModuleInfo.dependencies},
387         {HAP_MODULE_INFO_COMPILE_MODE, hapModuleInfo.compileMode},
388         {HAP_MODULE_INFO_HQF_INFO, hapModuleInfo.hqfInfo},
389         {HAP_MODULE_INFO_IS_LIB_ISOLATED, hapModuleInfo.isLibIsolated},
390         {HAP_MODULE_INFO_NATIVE_LIBRARY_PATH, hapModuleInfo.nativeLibraryPath},
391         {HAP_MODULE_INFO_CPU_ABI, hapModuleInfo.cpuAbi},
392         {HAP_MODULE_INFO_MODULE_SOURCE_DIR, hapModuleInfo.moduleSourceDir},
393         {HAP_MODULE_INFO_ATOMIC_SERVICE_MODULE_TYPE, hapModuleInfo.atomicServiceModuleType},
394         {HAP_MODULE_INFO_PRELOADS, hapModuleInfo.preloads}
395     };
396 }
397 
from_json(const nlohmann::json & jsonObject,HapModuleInfo & hapModuleInfo)398 void from_json(const nlohmann::json &jsonObject, HapModuleInfo &hapModuleInfo)
399 {
400     const auto &jsonObjectEnd = jsonObject.end();
401     int32_t parseResult = ERR_OK;
402     GetValueIfFindKey<std::string>(jsonObject,
403         jsonObjectEnd,
404         HAP_MODULE_INFO_NAME,
405         hapModuleInfo.name,
406         JsonType::STRING,
407         false,
408         parseResult,
409         ArrayType::NOT_ARRAY);
410     GetValueIfFindKey<std::string>(jsonObject,
411         jsonObjectEnd,
412         HAP_MODULE_INFO_PACKAGE,
413         hapModuleInfo.package,
414         JsonType::STRING,
415         false,
416         parseResult,
417         ArrayType::NOT_ARRAY);
418     GetValueIfFindKey<std::string>(jsonObject,
419         jsonObjectEnd,
420         Constants::MODULE_NAME,
421         hapModuleInfo.moduleName,
422         JsonType::STRING,
423         false,
424         parseResult,
425         ArrayType::NOT_ARRAY);
426     GetValueIfFindKey<std::string>(jsonObject,
427         jsonObjectEnd,
428         HAP_MODULE_INFO_DESCRIPTION,
429         hapModuleInfo.description,
430         JsonType::STRING,
431         false,
432         parseResult,
433         ArrayType::NOT_ARRAY);
434     GetValueIfFindKey<int>(jsonObject,
435         jsonObjectEnd,
436         HAP_MODULE_INFO_DESCRIPTION_ID,
437         hapModuleInfo.descriptionId,
438         JsonType::NUMBER,
439         false,
440         parseResult,
441         ArrayType::NOT_ARRAY);
442     GetValueIfFindKey<std::string>(jsonObject,
443         jsonObjectEnd,
444         HAP_MODULE_INFO_ICON_PATH,
445         hapModuleInfo.iconPath,
446         JsonType::STRING,
447         false,
448         parseResult,
449         ArrayType::NOT_ARRAY);
450     GetValueIfFindKey<int>(jsonObject,
451         jsonObjectEnd,
452         HAP_MODULE_INFO_ICON_ID,
453         hapModuleInfo.iconId,
454         JsonType::NUMBER,
455         false,
456         parseResult,
457         ArrayType::NOT_ARRAY);
458     GetValueIfFindKey<std::string>(jsonObject,
459         jsonObjectEnd,
460         HAP_MODULE_INFO_LABEL,
461         hapModuleInfo.label,
462         JsonType::STRING,
463         false,
464         parseResult,
465         ArrayType::NOT_ARRAY);
466     GetValueIfFindKey<int>(jsonObject,
467         jsonObjectEnd,
468         HAP_MODULE_INFO_LABEL_ID,
469         hapModuleInfo.labelId,
470         JsonType::NUMBER,
471         false,
472         parseResult,
473         ArrayType::NOT_ARRAY);
474     GetValueIfFindKey<std::string>(jsonObject,
475         jsonObjectEnd,
476         HAP_MODULE_INFO_BACKGROUND_IMG,
477         hapModuleInfo.backgroundImg,
478         JsonType::STRING,
479         false,
480         parseResult,
481         ArrayType::NOT_ARRAY);
482     GetValueIfFindKey<std::string>(jsonObject,
483         jsonObjectEnd,
484         HAP_MODULE_INFO_MAIN_ABILITY,
485         hapModuleInfo.mainAbility,
486         JsonType::STRING,
487         false,
488         parseResult,
489         ArrayType::NOT_ARRAY);
490     GetValueIfFindKey<std::string>(jsonObject,
491         jsonObjectEnd,
492         HAP_MODULE_INFO_SRC_PATH,
493         hapModuleInfo.srcPath,
494         JsonType::STRING,
495         false,
496         parseResult,
497         ArrayType::NOT_ARRAY);
498     GetValueIfFindKey<std::string>(jsonObject,
499         jsonObjectEnd,
500         HAP_MODULE_INFO_HASH_VALUE,
501         hapModuleInfo.hashValue,
502         JsonType::STRING,
503         false,
504         parseResult,
505         ArrayType::NOT_ARRAY);
506     GetValueIfFindKey<std::string>(jsonObject,
507         jsonObjectEnd,
508         HAP_MODULE_INFO_HAP_PATH,
509         hapModuleInfo.hapPath,
510         JsonType::STRING,
511         false,
512         parseResult,
513         ArrayType::NOT_ARRAY);
514     GetValueIfFindKey<int>(jsonObject,
515         jsonObjectEnd,
516         HAP_MODULE_INFO_SUPPORTED_MODES,
517         hapModuleInfo.supportedModes,
518         JsonType::NUMBER,
519         false,
520         parseResult,
521         ArrayType::NOT_ARRAY);
522     GetValueIfFindKey<std::vector<std::string>>(jsonObject,
523         jsonObjectEnd,
524         HAP_MODULE_INFO_REQ_CAPABILITIES,
525         hapModuleInfo.reqCapabilities,
526         JsonType::ARRAY,
527         false,
528         parseResult,
529         ArrayType::STRING);
530     GetValueIfFindKey<std::vector<std::string>>(jsonObject,
531         jsonObjectEnd,
532         HAP_MODULE_INFO_DEVICE_TYPES,
533         hapModuleInfo.deviceTypes,
534         JsonType::ARRAY,
535         false,
536         parseResult,
537         ArrayType::STRING);
538     GetValueIfFindKey<std::vector<AbilityInfo>>(jsonObject,
539         jsonObjectEnd,
540         HAP_MODULE_INFO_ABILITY_INFOS,
541         hapModuleInfo.abilityInfos,
542         JsonType::ARRAY,
543         false,
544         parseResult,
545         ArrayType::OBJECT);
546     GetValueIfFindKey<ModuleColorMode>(jsonObject,
547         jsonObjectEnd,
548         HAP_MODULE_INFO_COLOR_MODE,
549         hapModuleInfo.colorMode,
550         JsonType::NUMBER,
551         false,
552         parseResult,
553         ArrayType::NOT_ARRAY);
554     GetValueIfFindKey<std::string>(jsonObject,
555         jsonObjectEnd,
556         Constants::BUNDLE_NAME,
557         hapModuleInfo.bundleName,
558         JsonType::STRING,
559         false,
560         parseResult,
561         ArrayType::NOT_ARRAY);
562     GetValueIfFindKey<std::string>(jsonObject,
563         jsonObjectEnd,
564         HAP_MODULE_INFO_MAIN_ELEMENTNAME,
565         hapModuleInfo.mainElementName,
566         JsonType::STRING,
567         false,
568         parseResult,
569         ArrayType::NOT_ARRAY);
570     GetValueIfFindKey<std::string>(jsonObject,
571         jsonObjectEnd,
572         HAP_MODULE_INFO_PAGES,
573         hapModuleInfo.pages,
574         JsonType::STRING,
575         false,
576         parseResult,
577         ArrayType::NOT_ARRAY);
578     GetValueIfFindKey<std::string>(jsonObject,
579         jsonObjectEnd,
580         HAP_MODULE_INFO_PROCESS,
581         hapModuleInfo.process,
582         JsonType::STRING,
583         false,
584         parseResult,
585         ArrayType::NOT_ARRAY);
586     GetValueIfFindKey<std::string>(jsonObject,
587         jsonObjectEnd,
588         HAP_MODULE_INFO_RESOURCE_PATH,
589         hapModuleInfo.resourcePath,
590         JsonType::STRING,
591         false,
592         parseResult,
593         ArrayType::NOT_ARRAY);
594     GetValueIfFindKey<std::string>(jsonObject,
595         jsonObjectEnd,
596         HAP_MODULE_INFO_SRC_ENTRANCE,
597         hapModuleInfo.srcEntrance,
598         JsonType::STRING,
599         false,
600         parseResult,
601         ArrayType::NOT_ARRAY);
602     GetValueIfFindKey<std::string>(jsonObject,
603         jsonObjectEnd,
604         HAP_MODULE_INFO_UI_SYNTAX,
605         hapModuleInfo.uiSyntax,
606         JsonType::STRING,
607         false,
608         parseResult,
609         ArrayType::NOT_ARRAY);
610     GetValueIfFindKey<std::string>(jsonObject,
611         jsonObjectEnd,
612         HAP_MODULE_INFO_VIRTUAL_MACHINE,
613         hapModuleInfo.virtualMachine,
614         JsonType::STRING,
615         false,
616         parseResult,
617         ArrayType::NOT_ARRAY);
618     GetValueIfFindKey<bool>(jsonObject,
619         jsonObjectEnd,
620         HAP_MODULE_INFO_DELIVERY_WITH_INSTALL,
621         hapModuleInfo.deliveryWithInstall,
622         JsonType::BOOLEAN,
623         false,
624         parseResult,
625         ArrayType::NOT_ARRAY);
626     GetValueIfFindKey<bool>(jsonObject,
627         jsonObjectEnd,
628         HAP_MODULE_INFO_INSTALLATION_FREE,
629         hapModuleInfo.installationFree,
630         JsonType::BOOLEAN,
631         false,
632         parseResult,
633         ArrayType::NOT_ARRAY);
634     GetValueIfFindKey<bool>(jsonObject,
635         jsonObjectEnd,
636         HAP_MODULE_INFO_IS_MODULE_JSON,
637         hapModuleInfo.isModuleJson,
638         JsonType::BOOLEAN,
639         false,
640         parseResult,
641         ArrayType::NOT_ARRAY);
642     GetValueIfFindKey<bool>(jsonObject,
643         jsonObjectEnd,
644         HAP_MODULE_INFO_IS_STAGE_BASED_MODEL,
645         hapModuleInfo.isStageBasedModel,
646         JsonType::BOOLEAN,
647         false,
648         parseResult,
649         ArrayType::NOT_ARRAY);
650     GetValueIfFindKey<std::map<std::string, bool>>(jsonObject,
651         jsonObjectEnd,
652         HAP_MODULE_INFO_IS_REMOVABLE,
653         hapModuleInfo.isRemovable,
654         JsonType::OBJECT,
655         false,
656         parseResult,
657         ArrayType::NOT_ARRAY);
658     GetValueIfFindKey<int32_t>(jsonObject,
659         jsonObjectEnd,
660         HAP_MODULE_INFO_UPGRADE_FLAG,
661         hapModuleInfo.upgradeFlag,
662         JsonType::NUMBER,
663         false,
664         parseResult,
665         ArrayType::NOT_ARRAY);
666     GetValueIfFindKey<ModuleType>(jsonObject,
667         jsonObjectEnd,
668         HAP_MODULE_INFO_MODULE_TYPE,
669         hapModuleInfo.moduleType,
670         JsonType::NUMBER,
671         false,
672         parseResult,
673         ArrayType::NOT_ARRAY);
674     GetValueIfFindKey<std::vector<ExtensionAbilityInfo>>(jsonObject,
675         jsonObjectEnd,
676         HAP_MODULE_INFO_EXTENSION_INFOS,
677         hapModuleInfo.extensionInfos,
678         JsonType::ARRAY,
679         false,
680         parseResult,
681         ArrayType::OBJECT);
682     GetValueIfFindKey<std::vector<Metadata>>(jsonObject,
683         jsonObjectEnd,
684         HAP_MODULE_INFO_META_DATA,
685         hapModuleInfo.metadata,
686         JsonType::ARRAY,
687         false,
688         parseResult,
689         ArrayType::OBJECT);
690     GetValueIfFindKey<std::vector<std::string>>(jsonObject,
691         jsonObjectEnd,
692         HAP_MODULE_INFO_DEPENDENCIES,
693         hapModuleInfo.dependencies,
694         JsonType::ARRAY,
695         false,
696         parseResult,
697         ArrayType::STRING);
698     GetValueIfFindKey<CompileMode>(jsonObject,
699         jsonObjectEnd,
700         HAP_MODULE_INFO_COMPILE_MODE,
701         hapModuleInfo.compileMode,
702         JsonType::NUMBER,
703         false,
704         parseResult,
705         ArrayType::NOT_ARRAY);
706     GetValueIfFindKey<HqfInfo>(jsonObject,
707         jsonObjectEnd,
708         HAP_MODULE_INFO_HQF_INFO,
709         hapModuleInfo.hqfInfo,
710         JsonType::OBJECT,
711         false,
712         parseResult,
713         ArrayType::NOT_ARRAY);
714     GetValueIfFindKey<bool>(jsonObject,
715         jsonObjectEnd,
716         HAP_MODULE_INFO_IS_LIB_ISOLATED,
717         hapModuleInfo.isLibIsolated,
718         JsonType::BOOLEAN,
719         false,
720         parseResult,
721         ArrayType::NOT_ARRAY);
722     GetValueIfFindKey<std::string>(jsonObject,
723         jsonObjectEnd,
724         HAP_MODULE_INFO_NATIVE_LIBRARY_PATH,
725         hapModuleInfo.nativeLibraryPath,
726         JsonType::STRING,
727         false,
728         parseResult,
729         ArrayType::NOT_ARRAY);
730     GetValueIfFindKey<std::string>(jsonObject,
731         jsonObjectEnd,
732         HAP_MODULE_INFO_CPU_ABI,
733         hapModuleInfo.cpuAbi,
734         JsonType::STRING,
735         false,
736         parseResult,
737         ArrayType::NOT_ARRAY);
738     GetValueIfFindKey<std::string>(jsonObject,
739         jsonObjectEnd,
740         HAP_MODULE_INFO_MODULE_SOURCE_DIR,
741         hapModuleInfo.moduleSourceDir,
742         JsonType::STRING,
743         false,
744         parseResult,
745         ArrayType::NOT_ARRAY);
746     GetValueIfFindKey<AtomicServiceModuleType>(jsonObject,
747         jsonObjectEnd,
748         HAP_MODULE_INFO_ATOMIC_SERVICE_MODULE_TYPE,
749         hapModuleInfo.atomicServiceModuleType,
750         JsonType::NUMBER,
751         false,
752         parseResult,
753         ArrayType::NOT_ARRAY);
754     GetValueIfFindKey<std::vector<PreloadItem>>(jsonObject,
755         jsonObjectEnd,
756         HAP_MODULE_INFO_PRELOADS,
757         hapModuleInfo.preloads,
758         JsonType::ARRAY,
759         false,
760         parseResult,
761         ArrayType::OBJECT);
762     if (parseResult != ERR_OK) {
763         APP_LOGW("HapModuleInfo from_json error, error code : %{public}d", parseResult);
764     }
765 }
766 }  // namespace AppExecFwk
767 }  // namespace OHOS
768