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