• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 "extension_ability_info.h"
17 
18 #include <fcntl.h>
19 #include <string>
20 #include <unistd.h>
21 
22 #include "bundle_constants.h"
23 #include "json_util.h"
24 #include "nlohmann/json.hpp"
25 #include "parcel_macro.h"
26 #include "string_ex.h"
27 
28 namespace OHOS {
29 namespace AppExecFwk {
30 namespace {
31 const std::string NAME = "name";
32 const std::string SRC_ENTRANCE = "srcEntrance";
33 const std::string ICON = "icon";
34 const std::string ICON_ID = "iconId";
35 const std::string LABEL = "label";
36 const std::string LABEL_ID = "labelId";
37 const std::string DESCRIPTION = "description";
38 const std::string DESCRIPTION_ID = "descriptionId";
39 const std::string PRIORITY = "priority";
40 const std::string TYPE = "type";
41 const std::string EXTENSION_TYPE_NAME = "extensionTypeName";
42 const std::string PERMISSIONS = "permissions";
43 const std::string READ_PERMISSION = "readPermission";
44 const std::string WRITE_PERMISSION = "writePermission";
45 const std::string URI = "uri";
46 const std::string VISIBLE = "visible";
47 const std::string META_DATA = "metadata";
48 const std::string RESOURCE_PATH = "resourcePath";
49 const std::string ENABLED = "enabled";
50 const std::string PROCESS = "process";
51 const std::string COMPILE_MODE = "compileMode";
52 const std::string UID = "uid";
53 const size_t ABILITY_CAPACITY = 10240; // 10K
54 const std::string EXTENSION_PROCESS_MODE = "extensionProcessMode";
55 
56 const std::unordered_map<std::string, ExtensionAbilityType> EXTENSION_TYPE_MAP = {
57     { "form", ExtensionAbilityType::FORM },
58     { "workScheduler", ExtensionAbilityType::WORK_SCHEDULER },
59     { "inputMethod", ExtensionAbilityType::INPUTMETHOD },
60     { "service", ExtensionAbilityType::SERVICE },
61     { "accessibility", ExtensionAbilityType::ACCESSIBILITY },
62     { "dataShare", ExtensionAbilityType::DATASHARE },
63     { "fileShare", ExtensionAbilityType::FILESHARE },
64     { "staticSubscriber", ExtensionAbilityType::STATICSUBSCRIBER },
65     { "wallpaper", ExtensionAbilityType::WALLPAPER },
66     { "backup", ExtensionAbilityType::BACKUP },
67     { "window", ExtensionAbilityType::WINDOW },
68     { "enterpriseAdmin", ExtensionAbilityType::ENTERPRISE_ADMIN },
69     { "fileAccess", ExtensionAbilityType::FILEACCESS_EXTENSION },
70     { "thumbnail", ExtensionAbilityType::THUMBNAIL },
71     { "preview", ExtensionAbilityType::PREVIEW },
72     { "print", ExtensionAbilityType::PRINT },
73     { "share", ExtensionAbilityType::SHARE },
74     { "push", ExtensionAbilityType::PUSH },
75     { "driver", ExtensionAbilityType::DRIVER },
76     { "action", ExtensionAbilityType::ACTION },
77     { "adsService", ExtensionAbilityType::ADS_SERVICE },
78     { "autoFill/password", ExtensionAbilityType::AUTO_FILL_PASSWORD },
79     { "appAccountAuthorization", ExtensionAbilityType::APP_ACCOUNT_AUTHORIZATION },
80     { "ui", ExtensionAbilityType::UI },
81     { "remoteNotification", ExtensionAbilityType::REMOTE_NOTIFICATION },
82     { "remoteLocation", ExtensionAbilityType::REMOTE_LOCATION },
83     { "voip", ExtensionAbilityType::VOIP },
84     { "sysDialog/userAuth", ExtensionAbilityType::SYSDIALOG_USERAUTH },
85     { "sysDialog/common", ExtensionAbilityType::SYSDIALOG_COMMON },
86     { "sysPicker/mediaControl", ExtensionAbilityType::SYSPICKER_MEDIACONTROL },
87     { "sysDialog/atomicServicePanel", ExtensionAbilityType::SYSDIALOG_ATOMICSERVICEPANEL },
88     { "sysDialog/power", ExtensionAbilityType::SYSDIALOG_POWER },
89     { "sysPicker/share", ExtensionAbilityType::SYSPICKER_SHARE },
90     { "hms/account", ExtensionAbilityType::HMS_ACCOUNT },
91     { "ads", ExtensionAbilityType::ADS },
92     { "sysDialog/meetimeCall", ExtensionAbilityType::SYSDIALOG_MEETIMECALL },
93     { "sysDialog/meetimeContact", ExtensionAbilityType::SYSDIALOG_MEETIMECONTACT },
94     { "sysDialog/meetimeMessage", ExtensionAbilityType::SYSDIALOG_MEETIMEMESSAGE },
95     { "sysDialog/print", ExtensionAbilityType::SYSDIALOG_PRINT },
96     { "sysPicker/meetimeContact", ExtensionAbilityType::SYSPICKER_MEETIMECONTACT },
97     { "sysPicker/meetimeCallLog", ExtensionAbilityType::SYSPICKER_MEETIMECALLLOG },
98     { "sysPicker/photoPicker", ExtensionAbilityType::SYSPICKER_PHOTOPICKER },
99     { "sysPicker/camera", ExtensionAbilityType::SYSPICKER_CAMERA },
100     { "sys/commonUI", ExtensionAbilityType::SYS_COMMON_UI },
101     { "vpn", ExtensionAbilityType::VPN }
102 };
103 
104 const std::unordered_map<std::string, ExtensionProcessMode> EXTENSION_PROCESS_MODE_MAP = {
105     { "instance", ExtensionProcessMode::INSTANCE },
106     { "type", ExtensionProcessMode::TYPE },
107     { "bundle", ExtensionProcessMode::BUNDLE }
108 };
109 
ReadSkillInfoFromParcel(Parcel & parcel,std::vector<SkillUriForAbilityAndExtension> & skillUri)110 bool ReadSkillInfoFromParcel(Parcel &parcel, std::vector<SkillUriForAbilityAndExtension> &skillUri)
111 {
112     int32_t skillUriSize = 0;
113     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, skillUriSize);
114     CONTAINER_SECURITY_VERIFY(parcel, skillUriSize, &skillUri);
115     for (auto i = 0; i < skillUriSize; i++) {
116         SkillUriForAbilityAndExtension stctUri;
117         stctUri.scheme = Str16ToStr8(parcel.ReadString16());
118         stctUri.host = Str16ToStr8(parcel.ReadString16());
119         stctUri.port = Str16ToStr8(parcel.ReadString16());
120         stctUri.path = Str16ToStr8(parcel.ReadString16());
121         stctUri.pathStartWith = Str16ToStr8(parcel.ReadString16());
122         stctUri.pathRegex = Str16ToStr8(parcel.ReadString16());
123         stctUri.type = Str16ToStr8(parcel.ReadString16());
124         stctUri.utd = Str16ToStr8(parcel.ReadString16());
125         stctUri.maxFileSupported = parcel.ReadInt32();
126         skillUri.emplace_back(stctUri);
127     }
128     return true;
129 }
130 
ReadMetadataFromParcel(Parcel & parcel,std::vector<Metadata> & metadata)131 bool ReadMetadataFromParcel(Parcel &parcel, std::vector<Metadata> &metadata)
132 {
133     int32_t metadataSize = 0;
134     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, metadataSize);
135     CONTAINER_SECURITY_VERIFY(parcel, metadataSize, &metadata);
136     for (auto i = 0; i < metadataSize; i++) {
137         std::unique_ptr<Metadata> meta(parcel.ReadParcelable<Metadata>());
138         if (!meta) {
139             APP_LOGE("ReadParcelable<Metadata> failed");
140             return false;
141         }
142         metadata.emplace_back(*meta);
143     }
144     return true;
145 }
146 }; // namespace
147 
ReadFromParcel(Parcel & parcel)148 bool ExtensionAbilityInfo::ReadFromParcel(Parcel &parcel)
149 {
150     bundleName = Str16ToStr8(parcel.ReadString16());
151     moduleName = Str16ToStr8(parcel.ReadString16());
152     name = Str16ToStr8(parcel.ReadString16());
153     srcEntrance = Str16ToStr8(parcel.ReadString16());
154     icon = Str16ToStr8(parcel.ReadString16());
155     iconId = parcel.ReadInt32();
156     label = Str16ToStr8(parcel.ReadString16());
157     labelId = parcel.ReadInt32();
158     description = Str16ToStr8(parcel.ReadString16());
159     descriptionId = parcel.ReadInt32();
160     priority = parcel.ReadInt32();
161     int32_t permissionsSize;
162     READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, permissionsSize);
163     CONTAINER_SECURITY_VERIFY(parcel, permissionsSize, &permissions);
164     for (auto i = 0; i < permissionsSize; i++) {
165         permissions.emplace_back(Str16ToStr8(parcel.ReadString16()));
166     }
167     readPermission = Str16ToStr8(parcel.ReadString16());
168     writePermission = Str16ToStr8(parcel.ReadString16());
169     uri = Str16ToStr8(parcel.ReadString16());
170     type = static_cast<ExtensionAbilityType>(parcel.ReadInt32());
171     extensionTypeName = Str16ToStr8(parcel.ReadString16());
172     visible = parcel.ReadBool();
173     if (!ReadMetadataFromParcel(parcel, metadata)) {
174         APP_LOGE("Read meta data failed");
175         return false;
176     }
177 
178     std::unique_ptr<ApplicationInfo> appInfo(parcel.ReadParcelable<ApplicationInfo>());
179     if (!appInfo) {
180         APP_LOGE("ReadParcelable<ApplicationInfo> failed");
181         return false;
182     }
183     applicationInfo = *appInfo;
184 
185     resourcePath = Str16ToStr8(parcel.ReadString16());
186     hapPath = Str16ToStr8(parcel.ReadString16());
187     enabled = parcel.ReadBool();
188     process = Str16ToStr8(parcel.ReadString16());
189     compileMode = static_cast<CompileMode>(parcel.ReadInt32());
190     uid = parcel.ReadInt32();
191     if (!ReadSkillInfoFromParcel(parcel, skillUri)) {
192         APP_LOGE("Read skill info failed");
193         return false;
194     }
195     extensionProcessMode = static_cast<ExtensionProcessMode>(parcel.ReadInt32());
196     return true;
197 }
198 
Unmarshalling(Parcel & parcel)199 ExtensionAbilityInfo *ExtensionAbilityInfo::Unmarshalling(Parcel &parcel)
200 {
201     ExtensionAbilityInfo *info = new (std::nothrow) ExtensionAbilityInfo();
202     if (info && !info->ReadFromParcel(parcel)) {
203         APP_LOGW("read from parcel failed");
204         delete info;
205         info = nullptr;
206     }
207     return info;
208 }
209 
Marshalling(Parcel & parcel) const210 bool ExtensionAbilityInfo::Marshalling(Parcel &parcel) const
211 {
212     CHECK_PARCEL_CAPACITY(parcel, ABILITY_CAPACITY);
213     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(bundleName));
214     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(moduleName));
215     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(name));
216     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(srcEntrance));
217     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(icon));
218     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, iconId);
219     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(label));
220     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, labelId);
221     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(description));
222     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, descriptionId);
223     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, priority);
224     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, permissions.size());
225     for (auto &permission : permissions) {
226         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(permission));
227     }
228     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(readPermission));
229     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(writePermission));
230     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(uri));
231     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, static_cast<int32_t>(type));
232     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(extensionTypeName));
233     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, visible);
234     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, metadata.size());
235     for (auto &mete : metadata) {
236         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Parcelable, parcel, &mete);
237     }
238     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Parcelable, parcel, &applicationInfo);
239     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(resourcePath));
240     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(hapPath));
241     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, enabled);
242     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(process));
243     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, static_cast<int32_t>(compileMode));
244     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, uid);
245     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, skillUri.size());
246     for (auto &uri : skillUri) {
247         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(uri.scheme));
248         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(uri.host));
249         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(uri.port));
250         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(uri.path));
251         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(uri.pathStartWith));
252         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(uri.pathRegex));
253         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(uri.type));
254         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(uri.utd));
255         WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, uri.maxFileSupported);
256     }
257     WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, static_cast<int32_t>(extensionProcessMode));
258     return true;
259 }
260 
to_json(nlohmann::json & jsonObject,const ExtensionAbilityInfo & extensionInfo)261 void to_json(nlohmann::json &jsonObject, const ExtensionAbilityInfo &extensionInfo)
262 {
263     APP_LOGD("ExtensionAbilityInfo to_json begin");
264     jsonObject = nlohmann::json {
265         {Constants::BUNDLE_NAME, extensionInfo.bundleName},
266         {Constants::MODULE_NAME, extensionInfo.moduleName},
267         {NAME, extensionInfo.name},
268         {SRC_ENTRANCE, extensionInfo.srcEntrance},
269         {ICON, extensionInfo.icon},
270         {ICON_ID, extensionInfo.iconId},
271         {LABEL, extensionInfo.label},
272         {LABEL_ID, extensionInfo.labelId},
273         {DESCRIPTION, extensionInfo.description},
274         {DESCRIPTION_ID, extensionInfo.descriptionId},
275         {PRIORITY, extensionInfo.priority},
276         {TYPE, extensionInfo.type},
277         {EXTENSION_TYPE_NAME, extensionInfo.extensionTypeName},
278         {READ_PERMISSION, extensionInfo.readPermission},
279         {WRITE_PERMISSION, extensionInfo.writePermission},
280         {URI, extensionInfo.uri},
281         {PERMISSIONS, extensionInfo.permissions},
282         {VISIBLE, extensionInfo.visible},
283         {META_DATA, extensionInfo.metadata},
284         {RESOURCE_PATH, extensionInfo.resourcePath},
285         {Constants::HAP_PATH, extensionInfo.hapPath},
286         {ENABLED, extensionInfo.enabled},
287         {PROCESS, extensionInfo.process},
288         {COMPILE_MODE, extensionInfo.compileMode},
289         {UID, extensionInfo.uid},
290         {EXTENSION_PROCESS_MODE, extensionInfo.extensionProcessMode}
291     };
292 }
293 
from_json(const nlohmann::json & jsonObject,ExtensionAbilityInfo & extensionInfo)294 void from_json(const nlohmann::json &jsonObject, ExtensionAbilityInfo &extensionInfo)
295 {
296     APP_LOGD("ExtensionAbilityInfo from_json begin");
297     const auto &jsonObjectEnd = jsonObject.end();
298     int32_t parseResult = ERR_OK;
299     GetValueIfFindKey<std::string>(jsonObject,
300         jsonObjectEnd,
301         Constants::BUNDLE_NAME,
302         extensionInfo.bundleName,
303         JsonType::STRING,
304         false,
305         parseResult,
306         ArrayType::NOT_ARRAY);
307     GetValueIfFindKey<std::string>(jsonObject,
308         jsonObjectEnd,
309         Constants::MODULE_NAME,
310         extensionInfo.moduleName,
311         JsonType::STRING,
312         false,
313         parseResult,
314         ArrayType::NOT_ARRAY);
315     GetValueIfFindKey<std::string>(jsonObject,
316         jsonObjectEnd,
317         NAME,
318         extensionInfo.name,
319         JsonType::STRING,
320         false,
321         parseResult,
322         ArrayType::NOT_ARRAY);
323     GetValueIfFindKey<std::string>(jsonObject,
324         jsonObjectEnd,
325         SRC_ENTRANCE,
326         extensionInfo.srcEntrance,
327         JsonType::STRING,
328         false,
329         parseResult,
330         ArrayType::NOT_ARRAY);
331     GetValueIfFindKey<std::string>(jsonObject,
332         jsonObjectEnd,
333         ICON,
334         extensionInfo.icon,
335         JsonType::STRING,
336         false,
337         parseResult,
338         ArrayType::NOT_ARRAY);
339     GetValueIfFindKey<int32_t>(jsonObject,
340         jsonObjectEnd,
341         ICON_ID,
342         extensionInfo.iconId,
343         JsonType::NUMBER,
344         false,
345         parseResult,
346         ArrayType::NOT_ARRAY);
347     GetValueIfFindKey<std::string>(jsonObject,
348         jsonObjectEnd,
349         LABEL,
350         extensionInfo.label,
351         JsonType::STRING,
352         false,
353         parseResult,
354         ArrayType::NOT_ARRAY);
355     GetValueIfFindKey<int32_t>(jsonObject,
356         jsonObjectEnd,
357         LABEL_ID,
358         extensionInfo.labelId,
359         JsonType::NUMBER,
360         false,
361         parseResult,
362         ArrayType::NOT_ARRAY);
363     GetValueIfFindKey<std::string>(jsonObject,
364         jsonObjectEnd,
365         DESCRIPTION,
366         extensionInfo.description,
367         JsonType::STRING,
368         false,
369         parseResult,
370         ArrayType::NOT_ARRAY);
371     GetValueIfFindKey<int32_t>(jsonObject,
372         jsonObjectEnd,
373         DESCRIPTION_ID,
374         extensionInfo.descriptionId,
375         JsonType::NUMBER,
376         false,
377         parseResult,
378         ArrayType::NOT_ARRAY);
379     GetValueIfFindKey<int32_t>(jsonObject,
380         jsonObjectEnd,
381         PRIORITY,
382         extensionInfo.priority,
383         JsonType::NUMBER,
384         false,
385         parseResult,
386         ArrayType::NOT_ARRAY);
387     GetValueIfFindKey<ExtensionAbilityType>(jsonObject,
388         jsonObjectEnd,
389         TYPE,
390         extensionInfo.type,
391         JsonType::NUMBER,
392         false,
393         parseResult,
394         ArrayType::NOT_ARRAY);
395     GetValueIfFindKey<std::string>(jsonObject,
396         jsonObjectEnd,
397         EXTENSION_TYPE_NAME,
398         extensionInfo.extensionTypeName,
399         JsonType::STRING,
400         false,
401         parseResult,
402         ArrayType::NOT_ARRAY);
403     GetValueIfFindKey<std::string>(jsonObject,
404         jsonObjectEnd,
405         READ_PERMISSION,
406         extensionInfo.readPermission,
407         JsonType::STRING,
408         false,
409         parseResult,
410         ArrayType::NOT_ARRAY);
411     GetValueIfFindKey<std::string>(jsonObject,
412         jsonObjectEnd,
413         WRITE_PERMISSION,
414         extensionInfo.writePermission,
415         JsonType::STRING,
416         false,
417         parseResult,
418         ArrayType::NOT_ARRAY);
419     GetValueIfFindKey<std::string>(jsonObject,
420         jsonObjectEnd,
421         URI,
422         extensionInfo.uri,
423         JsonType::STRING,
424         false,
425         parseResult,
426         ArrayType::NOT_ARRAY);
427     GetValueIfFindKey<std::vector<std::string>>(jsonObject,
428         jsonObjectEnd,
429         PERMISSIONS,
430         extensionInfo.permissions,
431         JsonType::ARRAY,
432         false,
433         parseResult,
434         ArrayType::STRING);
435     GetValueIfFindKey<bool>(jsonObject,
436         jsonObjectEnd,
437         VISIBLE,
438         extensionInfo.visible,
439         JsonType::BOOLEAN,
440         false,
441         parseResult,
442         ArrayType::NOT_ARRAY);
443     GetValueIfFindKey<std::vector<Metadata>>(jsonObject,
444         jsonObjectEnd,
445         META_DATA,
446         extensionInfo.metadata,
447         JsonType::ARRAY,
448         false,
449         parseResult,
450         ArrayType::OBJECT);
451     GetValueIfFindKey<std::string>(jsonObject,
452         jsonObjectEnd,
453         RESOURCE_PATH,
454         extensionInfo.resourcePath,
455         JsonType::STRING,
456         false,
457         parseResult,
458         ArrayType::NOT_ARRAY);
459     GetValueIfFindKey<std::string>(jsonObject,
460         jsonObjectEnd,
461         Constants::HAP_PATH,
462         extensionInfo.hapPath,
463         JsonType::STRING,
464         false,
465         parseResult,
466         ArrayType::NOT_ARRAY);
467     GetValueIfFindKey<bool>(jsonObject,
468         jsonObjectEnd,
469         ENABLED,
470         extensionInfo.enabled,
471         JsonType::BOOLEAN,
472         false,
473         parseResult,
474         ArrayType::NOT_ARRAY);
475     GetValueIfFindKey<std::string>(jsonObject,
476         jsonObjectEnd,
477         PROCESS,
478         extensionInfo.process,
479         JsonType::STRING,
480         false,
481         parseResult,
482         ArrayType::NOT_ARRAY);
483     GetValueIfFindKey<CompileMode>(jsonObject,
484         jsonObjectEnd,
485         COMPILE_MODE,
486         extensionInfo.compileMode,
487         JsonType::NUMBER,
488         false,
489         parseResult,
490         ArrayType::NOT_ARRAY);
491     GetValueIfFindKey<int32_t>(jsonObject,
492         jsonObjectEnd,
493         UID,
494         extensionInfo.uid,
495         JsonType::NUMBER,
496         false,
497         parseResult,
498         ArrayType::NOT_ARRAY);
499     GetValueIfFindKey<ExtensionProcessMode>(jsonObject,
500         jsonObjectEnd,
501         EXTENSION_PROCESS_MODE,
502         extensionInfo.extensionProcessMode,
503         JsonType::NUMBER,
504         false,
505         parseResult,
506         ArrayType::NOT_ARRAY);
507     if (parseResult != ERR_OK) {
508         APP_LOGE("ExtensionAbilityInfo from_json error, error code : %{public}d", parseResult);
509     }
510 }
511 
ConvertToExtensionAbilityType(const std::string & type)512 ExtensionAbilityType ConvertToExtensionAbilityType(const std::string &type)
513 {
514     if (EXTENSION_TYPE_MAP.find(type) != EXTENSION_TYPE_MAP.end()) {
515         return EXTENSION_TYPE_MAP.at(type);
516     }
517 
518     return ExtensionAbilityType::UNSPECIFIED;
519 }
520 
ConvertToExtensionTypeName(ExtensionAbilityType type)521 std::string ConvertToExtensionTypeName(ExtensionAbilityType type)
522 {
523     for (const auto &[key, val] : EXTENSION_TYPE_MAP) {
524         if (val == type) {
525             return key;
526         }
527     }
528 
529     return "Unspecified";
530 }
531 
ConvertToExtensionProcessMode(const std::string & extensionProcessMode)532 ExtensionProcessMode ConvertToExtensionProcessMode(const std::string &extensionProcessMode)
533 {
534     if (EXTENSION_PROCESS_MODE_MAP.find(extensionProcessMode) != EXTENSION_PROCESS_MODE_MAP.end()) {
535         return EXTENSION_PROCESS_MODE_MAP.at(extensionProcessMode);
536     }
537 
538     return ExtensionProcessMode::UNDEFINED;
539 }
540 }  // namespace AppExecFwk
541 }  // namespace OHOS
542