1 /*
2 * Copyright (c) 2024 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 <cstdint>
17 #include <string>
18
19 #include "bundle_manager_utils.h"
20 #include "ipc_skeleton.h"
21 #include "bundle_info.h"
22 #include "bundle_mgr_proxy.h"
23 #include "common_func.h"
24 #include "bundle_manager_convert.h"
25 #include "app_log_wrapper.h"
26
27 namespace OHOS {
28 namespace CJSystemapi {
29 namespace BundleManager {
30 namespace Convert {
31
32 const std::string PATH_PREFIX = "/data/app/el1/bundle/public";
33 const std::string CODE_PATH_PREFIX = "/data/storage/el1/bundle/";
34 const std::string CONTEXT_DATA_STORAGE_BUNDLE("/data/storage/el1/bundle/");
35
MallocCString(const std::string & origin)36 char *MallocCString(const std::string &origin)
37 {
38 if (origin.empty()) {
39 return nullptr;
40 }
41 auto len = origin.length() + 1;
42 char* res = static_cast<char *>(malloc(sizeof(char) * len));
43 if (res == nullptr) {
44 APP_LOGE("MallocCString malloc failed");
45 return nullptr;
46 }
47 return std::char_traits<char>::copy(res, origin.c_str(), len);
48 }
49
ClearCharPointer(char ** ptr,int count)50 void ClearCharPointer(char** ptr, int count)
51 {
52 for (int i = 0; i < count; i++) {
53 free(ptr[i]);
54 ptr[i] = nullptr;
55 }
56 }
57
ConvertArrString(const std::vector<std::string> & vecStr)58 CArrString ConvertArrString(const std::vector<std::string>& vecStr)
59 {
60 if (vecStr.size() == 0) {
61 return {nullptr, 0};
62 }
63 char **retValue = static_cast<char **>(malloc(sizeof(char *) * vecStr.size()));
64 if (retValue == nullptr) {
65 return {nullptr, 0};
66 }
67
68 for (size_t i = 0; i < vecStr.size(); i++) {
69 retValue[i] = MallocCString(vecStr[i]);
70 if (retValue[i] == nullptr) {
71 ClearCharPointer(retValue, i);
72 free(retValue);
73 return {nullptr, 0};
74 }
75 }
76
77 return {retValue, vecStr.size()};
78 }
79
FreeCArrString(CArrString & cArrString)80 void FreeCArrString(CArrString& cArrString)
81 {
82 if (cArrString.head == nullptr) {
83 return;
84 }
85 for (int64_t i = 0; i < cArrString.size; i++) {
86 free(cArrString.head[i]);
87 cArrString.head[i] = nullptr;
88 }
89 free(cArrString.head);
90 cArrString.head = nullptr;
91 cArrString.size = 0;
92 }
93
ConvertUsedScene(const AppExecFwk::RequestPermissionUsedScene & usedScence)94 RetUsedScene ConvertUsedScene(const AppExecFwk::RequestPermissionUsedScene& usedScence)
95 {
96 RetUsedScene uScene;
97 uScene.abilities = ConvertArrString(usedScence.abilities);
98 uScene.when = MallocCString(usedScence.when);
99 return uScene;
100 }
101
FreeRetUsedScene(RetUsedScene & uScene)102 void FreeRetUsedScene(RetUsedScene& uScene)
103 {
104 FreeCArrString(uScene.abilities);
105 free(uScene.when);
106 uScene.when = nullptr;
107 }
108
ConvertMetadata(const AppExecFwk::Metadata & cData)109 RetMetadata ConvertMetadata(const AppExecFwk::Metadata& cData)
110 {
111 RetMetadata data;
112 data.name = MallocCString(cData.name);
113 data.value = MallocCString(cData.value);
114 data.resource = MallocCString(cData.resource);
115 return data;
116 }
117
FreeRetMetadata(RetMetadata & data)118 void FreeRetMetadata(RetMetadata& data)
119 {
120 free(data.name);
121 data.name = nullptr;
122 free(data.value);
123 data.value = nullptr;
124 free(data.resource);
125 data.resource = nullptr;
126 }
127
ConvertResource(const AppExecFwk::Resource & cRes)128 CResource ConvertResource(const AppExecFwk::Resource& cRes)
129 {
130 CResource res;
131 res.bundleName = MallocCString(cRes.bundleName);
132 res.moduleName = MallocCString(cRes.moduleName);
133 res.id = cRes.id;
134 return res;
135 }
136
FreeCResource(CResource & res)137 void FreeCResource(CResource& res)
138 {
139 free(res.bundleName);
140 res.bundleName = nullptr;
141 free(res.moduleName);
142 res.moduleName = nullptr;
143 }
144
ConvertArrMetadata(const std::vector<AppExecFwk::Metadata> & cData)145 CArrMetadata ConvertArrMetadata(const std::vector<AppExecFwk::Metadata>& cData)
146 {
147 CArrMetadata data;
148 data.size = static_cast<int64_t>(cData.size());
149 data.head = nullptr;
150 if (data.size > 0) {
151 RetMetadata *retValue = reinterpret_cast<RetMetadata *>(malloc(sizeof(RetMetadata) * data.size));
152 if (retValue != nullptr) {
153 for (int32_t i = 0; i < data.size; i++) {
154 retValue[i] = ConvertMetadata(cData[i]);
155 }
156 data.head = retValue;
157 } else {
158 APP_LOGE("ConvertArrMetadata malloc failed");
159 return data;
160 }
161 }
162 return data;
163 }
164
FreeCArrMetadata(CArrMetadata & data)165 void FreeCArrMetadata(CArrMetadata& data)
166 {
167 if (data.head == nullptr) {
168 return;
169 }
170 for (int64_t i = 0; i < data.size; i++) {
171 FreeRetMetadata(data.head[i]);
172 }
173 free(data.head);
174 data.head = nullptr;
175 data.size = 0;
176 }
177
ConvertArrMoMeta(const std::map<std::string,std::vector<AppExecFwk::Metadata>> & metadata)178 CArrMoMeta ConvertArrMoMeta(const std::map<std::string, std::vector<AppExecFwk::Metadata>>& metadata)
179 {
180 CArrMoMeta arrMdata;
181 arrMdata.size = static_cast<int64_t>(metadata.size());
182 arrMdata.head = nullptr;
183 if (arrMdata.size > 0) {
184 ModuleMetadata* retValue = reinterpret_cast<ModuleMetadata *>(malloc(sizeof(ModuleMetadata) * arrMdata.size));
185 if (retValue != nullptr) {
186 int32_t i = 0;
187 for (const auto &item : metadata) {
188 retValue[i].moduleName = MallocCString(item.first);
189 retValue[i++].metadata = ConvertArrMetadata(item.second);
190 }
191 } else {
192 APP_LOGE("ConvertArrMoMeta malloc failed");
193 return arrMdata;
194 }
195 arrMdata.head = retValue;
196 }
197 return arrMdata;
198 }
199
FreeModuleMetadata(ModuleMetadata & metadata)200 void FreeModuleMetadata(ModuleMetadata& metadata)
201 {
202 free(metadata.moduleName);
203 metadata.moduleName = nullptr;
204 FreeCArrMetadata(metadata.metadata);
205 }
206
FreeCArrMoMeta(CArrMoMeta & arrMdata)207 void FreeCArrMoMeta(CArrMoMeta& arrMdata)
208 {
209 if (arrMdata.head == nullptr) {
210 return;
211 }
212 for (int64_t i = 0; i < arrMdata.size; i++) {
213 FreeModuleMetadata(arrMdata.head[i]);
214 }
215 free(arrMdata.head);
216 arrMdata.head = nullptr;
217 arrMdata.size = 0;
218 }
219
ConvertSkillUri(const AppExecFwk::SkillUri & cUri)220 RetSkillUri ConvertSkillUri(const AppExecFwk::SkillUri& cUri)
221 {
222 RetSkillUri skillUri;
223 skillUri.scheme = MallocCString(cUri.scheme);
224 skillUri.host = MallocCString(cUri.host);
225 skillUri.port = MallocCString(cUri.port);
226 skillUri.path = MallocCString(cUri.path);
227 skillUri.pathStartWith = MallocCString(cUri.pathStartWith);
228 skillUri.pathRegex = MallocCString(cUri.pathRegex);
229 skillUri.type = MallocCString(cUri.type);
230 skillUri.utd = MallocCString(cUri.utd);
231 skillUri.maxFileSupported = cUri.maxFileSupported;
232 skillUri.linkFeature = MallocCString(cUri.linkFeature);
233 return skillUri;
234 }
235
FreeRetSkillUri(RetSkillUri & skillUri)236 void FreeRetSkillUri(RetSkillUri& skillUri)
237 {
238 free(skillUri.scheme);
239 skillUri.scheme = nullptr;
240 free(skillUri.host);
241 skillUri.host = nullptr;
242 free(skillUri.port);
243 skillUri.port = nullptr;
244 free(skillUri.path);
245 skillUri.path = nullptr;
246 free(skillUri.pathStartWith);
247 skillUri.pathStartWith = nullptr;
248 free(skillUri.pathRegex);
249 skillUri.pathRegex = nullptr;
250 free(skillUri.type);
251 skillUri.type = nullptr;
252 free(skillUri.utd);
253 skillUri.utd = nullptr;
254 free(skillUri.linkFeature);
255 skillUri.linkFeature = nullptr;
256 }
257
ConvertArrSkillUris(const std::vector<AppExecFwk::SkillUri> & cUris)258 RetCArrSkillUri ConvertArrSkillUris(const std::vector<AppExecFwk::SkillUri>& cUris)
259 {
260 RetCArrSkillUri skillUris;
261 skillUris.size = static_cast<int64_t>(cUris.size());
262 skillUris.head = nullptr;
263
264 if (skillUris.size == 0) {
265 return skillUris;
266 }
267 RetSkillUri *retValue = reinterpret_cast<RetSkillUri *>(malloc(sizeof(RetSkillUri) * skillUris.size));
268 if (retValue != nullptr) {
269 for (int32_t i = 0; i < skillUris.size; i++) {
270 retValue[i] = ConvertSkillUri(cUris[i]);
271 }
272 skillUris.head = retValue;
273 } else {
274 APP_LOGE("ConvertArrSkillUris malloc failed");
275 return skillUris;
276 }
277 return skillUris;
278 }
279
FreeRetCArrSkillUri(RetCArrSkillUri & skillUris)280 void FreeRetCArrSkillUri(RetCArrSkillUri& skillUris)
281 {
282 if (skillUris.head == nullptr) {
283 return;
284 }
285 for (int64_t i = 0; i < skillUris.size; i++) {
286 FreeRetSkillUri(skillUris.head[i]);
287 }
288 free(skillUris.head);
289 skillUris.head = nullptr;
290 skillUris.size = 0;
291 }
292
ConvertSkill(const AppExecFwk::Skill & cSkill)293 RetSkill ConvertSkill(const AppExecFwk::Skill& cSkill)
294 {
295 RetSkill skill;
296 skill.actions = ConvertArrString(cSkill.actions);
297 skill.entities = ConvertArrString(cSkill.entities);
298 skill.uris = ConvertArrSkillUris(cSkill.uris);
299 skill.domainVerify = cSkill.domainVerify;
300 return skill;
301 }
302
FreeRetSkill(RetSkill & skill)303 void FreeRetSkill(RetSkill& skill)
304 {
305 FreeCArrString(skill.actions);
306 FreeCArrString(skill.entities);
307 FreeRetCArrSkillUri(skill.uris);
308 }
309
ConvertSkills(const std::vector<AppExecFwk::Skill> & cSkills)310 RetCArrSkill ConvertSkills(const std::vector<AppExecFwk::Skill>& cSkills)
311 {
312 RetCArrSkill skills;
313 skills.size = static_cast<int64_t>(cSkills.size());
314 skills.head = nullptr;
315 if (skills.size == 0) {
316 return skills;
317 }
318 RetSkill *retValue = reinterpret_cast<RetSkill *>(malloc(sizeof(RetSkill) * skills.size));
319 if (retValue != nullptr) {
320 for (int32_t i = 0; i < skills.size; i++) {
321 retValue[i] = ConvertSkill(cSkills[i]);
322 }
323 skills.head = retValue;
324 } else {
325 APP_LOGE("ConvertSkills malloc failed");
326 return skills;
327 }
328 return skills;
329 }
330
FreeRetCArrSkill(RetCArrSkill & skills)331 void FreeRetCArrSkill(RetCArrSkill& skills)
332 {
333 if (skills.head == nullptr) {
334 return;
335 }
336 for (int64_t i = 0; i < skills.size; i++) {
337 FreeRetSkill(skills.head[i]);
338 }
339 free(skills.head);
340 skills.head = nullptr;
341 skills.size = 0;
342 }
343
ConvertRequestPermission(const AppExecFwk::RequestPermission & requestPermission)344 RetReqPermissionDetail ConvertRequestPermission(const AppExecFwk::RequestPermission& requestPermission)
345 {
346 RetReqPermissionDetail reqPer;
347 reqPer.name = MallocCString(requestPermission.name);
348 reqPer.moduleName = MallocCString(requestPermission.moduleName);
349 reqPer.reason = MallocCString(requestPermission.reason);
350 reqPer.reasonId = requestPermission.reasonId;
351 reqPer.usedScence = ConvertUsedScene(requestPermission.usedScene);
352 return reqPer;
353 }
354
FreeRetReqPermissionDetail(RetReqPermissionDetail & reqPer)355 void FreeRetReqPermissionDetail(RetReqPermissionDetail& reqPer)
356 {
357 free(reqPer.name);
358 reqPer.name = nullptr;
359 free(reqPer.moduleName);
360 reqPer.moduleName = nullptr;
361 free(reqPer.reason);
362 reqPer.reason = nullptr;
363 FreeRetUsedScene(reqPer.usedScence);
364 }
365
ConvertApplicationInfo(const AppExecFwk::ApplicationInfo & cAppInfo)366 RetApplicationInfo ConvertApplicationInfo(const AppExecFwk::ApplicationInfo& cAppInfo)
367 {
368 RetApplicationInfo appInfo;
369 appInfo.name = MallocCString(cAppInfo.name);
370 appInfo.description = MallocCString(cAppInfo.description);
371 appInfo.descriptionId = cAppInfo.descriptionId;
372 appInfo.enabled = cAppInfo.enabled;
373 appInfo.label = MallocCString(cAppInfo.label);
374 appInfo.labelId = cAppInfo.labelId;
375 appInfo.icon = MallocCString(cAppInfo.iconPath);
376 appInfo.iconId = cAppInfo.iconId;
377 appInfo.process = MallocCString(cAppInfo.process);
378
379 appInfo.permissions = ConvertArrString(cAppInfo.permissions);
380
381 appInfo.codePath = MallocCString(cAppInfo.codePath);
382
383 appInfo.metadataArray = ConvertArrMoMeta(cAppInfo.metadata);
384
385 appInfo.removable = cAppInfo.removable;
386 appInfo.accessTokenId = cAppInfo.accessTokenId;
387 appInfo.uid = cAppInfo.uid;
388
389 appInfo.iconResource = ConvertResource(cAppInfo.iconResource);
390 appInfo.labelResource = ConvertResource(cAppInfo.labelResource);
391 appInfo.descriptionResource = ConvertResource(cAppInfo.descriptionResource);
392
393 appInfo.appDistributionType = MallocCString(cAppInfo.appDistributionType);
394 appInfo.appProvisionType = MallocCString(cAppInfo.appProvisionType);
395 appInfo.systemApp = cAppInfo.isSystemApp;
396 appInfo.bundleType = static_cast<int32_t>(cAppInfo.bundleType);
397 appInfo.debug = cAppInfo.debug;
398 appInfo.dataUnclearable = !cAppInfo.userDataClearable;
399 appInfo.cloudFileSyncEnabled = cAppInfo.cloudFileSyncEnabled;
400 return appInfo;
401 }
402
ConvertApplicationInfoV2(const AppExecFwk::ApplicationInfo & cAppInfo)403 RetApplicationInfoV2 ConvertApplicationInfoV2(const AppExecFwk::ApplicationInfo& cAppInfo)
404 {
405 RetApplicationInfoV2 appInfo;
406 appInfo.name = MallocCString(cAppInfo.name);
407 appInfo.description = MallocCString(cAppInfo.description);
408 appInfo.descriptionId = cAppInfo.descriptionId;
409 appInfo.enabled = cAppInfo.enabled;
410 appInfo.label = MallocCString(cAppInfo.label);
411 appInfo.labelId = cAppInfo.labelId;
412 appInfo.icon = MallocCString(cAppInfo.iconPath);
413 appInfo.iconId = cAppInfo.iconId;
414 appInfo.process = MallocCString(cAppInfo.process);
415
416 appInfo.permissions = ConvertArrString(cAppInfo.permissions);
417
418 appInfo.codePath = MallocCString(cAppInfo.codePath);
419
420 appInfo.metadataArray = ConvertArrMoMeta(cAppInfo.metadata);
421
422 appInfo.removable = cAppInfo.removable;
423 appInfo.accessTokenId = cAppInfo.accessTokenId;
424 appInfo.uid = cAppInfo.uid;
425
426 appInfo.iconResource = ConvertResource(cAppInfo.iconResource);
427 appInfo.labelResource = ConvertResource(cAppInfo.labelResource);
428 appInfo.descriptionResource = ConvertResource(cAppInfo.descriptionResource);
429
430 appInfo.appDistributionType = MallocCString(cAppInfo.appDistributionType);
431 appInfo.appProvisionType = MallocCString(cAppInfo.appProvisionType);
432 appInfo.systemApp = cAppInfo.isSystemApp;
433 appInfo.bundleType = static_cast<int32_t>(cAppInfo.bundleType);
434 appInfo.debug = cAppInfo.debug;
435 appInfo.dataUnclearable = !cAppInfo.userDataClearable;
436 appInfo.cloudFileSyncEnabled = cAppInfo.cloudFileSyncEnabled;
437 std::string externalNativeLibraryPath = "";
438 if (!cAppInfo.nativeLibraryPath.empty()) {
439 externalNativeLibraryPath = CONTEXT_DATA_STORAGE_BUNDLE + cAppInfo.nativeLibraryPath;
440 }
441 appInfo.nativeLibraryPath = MallocCString(externalNativeLibraryPath);
442 appInfo.multiAppMode.multiAppModeType = static_cast<int32_t>(cAppInfo.multiAppMode.multiAppModeType);
443 appInfo.multiAppMode.count = cAppInfo.multiAppMode.maxCount;
444 appInfo.appIndex = cAppInfo.appIndex;
445 appInfo.installSource = MallocCString(cAppInfo.installSource);
446 appInfo.releaseType = MallocCString(cAppInfo.apiReleaseType);
447 return appInfo;
448 }
449
FreeRetApplicationInfoV2(RetApplicationInfoV2 & appInfo)450 void FreeRetApplicationInfoV2(RetApplicationInfoV2& appInfo)
451 {
452 free(appInfo.name);
453 appInfo.name = nullptr;
454 free(appInfo.description);
455 appInfo.description = nullptr;
456 free(appInfo.label);
457 appInfo.label = nullptr;
458 free(appInfo.icon);
459 appInfo.icon = nullptr;
460 free(appInfo.process);
461 appInfo.process = nullptr;
462 FreeCArrString(appInfo.permissions);
463 free(appInfo.codePath);
464 appInfo.codePath = nullptr;
465 FreeCArrMoMeta(appInfo.metadataArray);
466 FreeCResource(appInfo.iconResource);
467 FreeCResource(appInfo.labelResource);
468 FreeCResource(appInfo.descriptionResource);
469 free(appInfo.appDistributionType);
470 appInfo.appDistributionType = nullptr;
471 free(appInfo.appProvisionType);
472 appInfo.appProvisionType = nullptr;
473 free(appInfo.nativeLibraryPath);
474 appInfo.nativeLibraryPath = nullptr;
475 free(appInfo.installSource);
476 appInfo.installSource = nullptr;
477 free(appInfo.releaseType);
478 appInfo.releaseType = nullptr;
479 }
480
ConvertExtensionAbilityInfo(const AppExecFwk::ExtensionAbilityInfo & extensionInfos)481 RetExtensionAbilityInfo ConvertExtensionAbilityInfo(const AppExecFwk::ExtensionAbilityInfo& extensionInfos)
482 {
483 RetExtensionAbilityInfo exInfo;
484 exInfo.bundleName = MallocCString(extensionInfos.bundleName);
485 exInfo.moduleName = MallocCString(extensionInfos.moduleName);
486 exInfo.name = MallocCString(extensionInfos.name);
487 exInfo.labelId = extensionInfos.labelId;
488 exInfo.descriptionId = extensionInfos.descriptionId;
489 exInfo.iconId = extensionInfos.iconId;
490 exInfo.exported = extensionInfos.visible;
491 exInfo.extensionAbilityType = static_cast<int32_t>(extensionInfos.type);
492 exInfo.permissions = ConvertArrString(extensionInfos.permissions);
493 exInfo.applicationInfo = ConvertApplicationInfo(extensionInfos.applicationInfo);
494 exInfo.metadata = ConvertArrMetadata(extensionInfos.metadata);
495 exInfo.enabled = extensionInfos.enabled;
496 exInfo.readPermission = MallocCString(extensionInfos.readPermission);
497 exInfo.writePermission = MallocCString(extensionInfos.writePermission);
498 exInfo.extensionAbilityTypeName = MallocCString(extensionInfos.extensionTypeName);
499 return exInfo;
500 }
501
ConvertExtensionAbilityInfoV2(const AppExecFwk::ExtensionAbilityInfo & extensionInfos)502 RetExtensionAbilityInfoV2 ConvertExtensionAbilityInfoV2(const AppExecFwk::ExtensionAbilityInfo& extensionInfos)
503 {
504 RetExtensionAbilityInfoV2 exInfo;
505 exInfo.bundleName = MallocCString(extensionInfos.bundleName);
506 exInfo.moduleName = MallocCString(extensionInfos.moduleName);
507 exInfo.name = MallocCString(extensionInfos.name);
508 exInfo.labelId = extensionInfos.labelId;
509 exInfo.descriptionId = extensionInfos.descriptionId;
510 exInfo.iconId = extensionInfos.iconId;
511 exInfo.exported = extensionInfos.visible;
512 exInfo.extensionAbilityType = static_cast<int32_t>(extensionInfos.type);
513 exInfo.permissions = ConvertArrString(extensionInfos.permissions);
514 exInfo.applicationInfo = ConvertApplicationInfoV2(extensionInfos.applicationInfo);
515 exInfo.metadata = ConvertArrMetadata(extensionInfos.metadata);
516 exInfo.enabled = extensionInfos.enabled;
517 exInfo.readPermission = MallocCString(extensionInfos.readPermission);
518 exInfo.writePermission = MallocCString(extensionInfos.writePermission);
519 exInfo.extensionAbilityTypeName = MallocCString(extensionInfos.extensionTypeName);
520 exInfo.skills = ConvertSkills(extensionInfos.skills);
521 exInfo.appIndex = extensionInfos.appIndex;
522 return exInfo;
523 }
524
FreeRetExtensionAbilityInfoV2(RetExtensionAbilityInfoV2 & exInfo)525 void FreeRetExtensionAbilityInfoV2(RetExtensionAbilityInfoV2& exInfo)
526 {
527 free(exInfo.bundleName);
528 exInfo.bundleName = nullptr;
529 free(exInfo.moduleName);
530 exInfo.moduleName = nullptr;
531 free(exInfo.name);
532 exInfo.name = nullptr;
533 FreeCArrString(exInfo.permissions);
534 FreeRetApplicationInfoV2(exInfo.applicationInfo);
535 FreeCArrMetadata(exInfo.metadata);
536 free(exInfo.readPermission);
537 exInfo.readPermission = nullptr;
538 free(exInfo.writePermission);
539 exInfo.writePermission = nullptr;
540 free(exInfo.extensionAbilityTypeName);
541 exInfo.extensionAbilityTypeName = nullptr;
542 FreeRetCArrSkill(exInfo.skills);
543 }
544
ConvertArrExtensionAbilityInfo(const std::vector<AppExecFwk::ExtensionAbilityInfo> & extensionInfos)545 CArrRetExtensionAbilityInfo ConvertArrExtensionAbilityInfo(
546 const std::vector<AppExecFwk::ExtensionAbilityInfo>& extensionInfos)
547 {
548 CArrRetExtensionAbilityInfo exAbInfo;
549 exAbInfo.size = static_cast<int64_t>(extensionInfos.size());
550 exAbInfo.head = nullptr;
551 if (exAbInfo.size > 0) {
552 RetExtensionAbilityInfo *retValue = reinterpret_cast<RetExtensionAbilityInfo *>
553 (malloc(sizeof(RetExtensionAbilityInfo) * exAbInfo.size));
554 if (retValue != nullptr) {
555 for (int32_t i = 0; i < exAbInfo.size; i++) {
556 retValue[i] = ConvertExtensionAbilityInfo(extensionInfos[i]);
557 }
558 exAbInfo.head = retValue;
559 } else {
560 APP_LOGE("ConvertArrExtensionAbilityInfo malloc failed");
561 return exAbInfo;
562 }
563 }
564 return exAbInfo;
565 }
566
ConvertArrExtensionAbilityInfoV2(const std::vector<AppExecFwk::ExtensionAbilityInfo> & extensionInfos)567 CArrRetExtensionAbilityInfoV2 ConvertArrExtensionAbilityInfoV2(
568 const std::vector<AppExecFwk::ExtensionAbilityInfo>& extensionInfos)
569 {
570 CArrRetExtensionAbilityInfoV2 exAbInfo;
571 exAbInfo.size = static_cast<int64_t>(extensionInfos.size());
572 exAbInfo.head = nullptr;
573 if (exAbInfo.size > 0) {
574 RetExtensionAbilityInfoV2 *retValue = reinterpret_cast<RetExtensionAbilityInfoV2 *>
575 (malloc(sizeof(RetExtensionAbilityInfoV2) * exAbInfo.size));
576 if (retValue != nullptr) {
577 for (int32_t i = 0; i < exAbInfo.size; i++) {
578 retValue[i] = ConvertExtensionAbilityInfoV2(extensionInfos[i]);
579 }
580 exAbInfo.head = retValue;
581 } else {
582 APP_LOGE("ConvertArrExtensionAbilityInfo malloc failed");
583 return exAbInfo;
584 }
585 }
586 return exAbInfo;
587 }
588
FreeCArrRetExtensionAbilityInfoV2(CArrRetExtensionAbilityInfoV2 exAbInfo)589 void FreeCArrRetExtensionAbilityInfoV2(CArrRetExtensionAbilityInfoV2 exAbInfo)
590 {
591 if (exAbInfo.head == nullptr) {
592 return;
593 }
594 for (int64_t i = 0; i < exAbInfo.size; i++) {
595 FreeRetExtensionAbilityInfoV2(exAbInfo.head[i]);
596 }
597 free(exAbInfo.head);
598 exAbInfo.head = nullptr;
599 exAbInfo.size = 0;
600 }
601
ConvertSignatureInfo(const AppExecFwk::SignatureInfo & cSignatureInfo)602 RetSignatureInfo ConvertSignatureInfo(const AppExecFwk::SignatureInfo& cSignatureInfo)
603 {
604 RetSignatureInfo signatureInfo;
605 signatureInfo.appId = MallocCString(cSignatureInfo.appId);
606 signatureInfo.fingerprint = MallocCString(cSignatureInfo.fingerprint);
607 signatureInfo.appIdentifier = MallocCString(cSignatureInfo.appIdentifier);
608 return signatureInfo;
609 }
610
FreeRetSignatureInfo(RetSignatureInfo & signatureInfo)611 void FreeRetSignatureInfo(RetSignatureInfo& signatureInfo)
612 {
613 free(signatureInfo.appId);
614 signatureInfo.appId = nullptr;
615 free(signatureInfo.fingerprint);
616 signatureInfo.fingerprint = nullptr;
617 free(signatureInfo.appIdentifier);
618 signatureInfo.appIdentifier = nullptr;
619 }
620
ConvertAbilityInfo(const AppExecFwk::AbilityInfo & cAbilityInfos)621 RetAbilityInfo ConvertAbilityInfo(const AppExecFwk::AbilityInfo& cAbilityInfos)
622 {
623 RetAbilityInfo abInfo;
624 abInfo.bundleName = MallocCString(cAbilityInfos.bundleName);
625 abInfo.moduleName = MallocCString(cAbilityInfos.moduleName);
626 abInfo.name = MallocCString(cAbilityInfos.name);
627 abInfo.label = MallocCString(cAbilityInfos.label);
628 abInfo.labelId = cAbilityInfos.labelId;
629 abInfo.description = MallocCString(cAbilityInfos.description);
630 abInfo.descriptionId = cAbilityInfos.descriptionId;
631 abInfo.icon = MallocCString(cAbilityInfos.iconPath);
632 abInfo.iconId = cAbilityInfos.iconId;
633 abInfo.process = MallocCString(cAbilityInfos.process);
634 abInfo.exported = cAbilityInfos.visible;
635 abInfo.orientation = static_cast<int32_t>(cAbilityInfos.orientation);
636 abInfo.launchType = static_cast<int32_t>(cAbilityInfos.launchMode);
637 abInfo.permissions = ConvertArrString(cAbilityInfos.permissions);
638 abInfo.deviceTypes = ConvertArrString(cAbilityInfos.deviceTypes);
639 abInfo.applicationInfo = ConvertApplicationInfo(cAbilityInfos.applicationInfo);
640 abInfo.metadata = ConvertArrMetadata(cAbilityInfos.metadata);
641 abInfo.enabled = cAbilityInfos.enabled;
642
643 abInfo.supportWindowModes.size = static_cast<int64_t>(cAbilityInfos.windowModes.size());
644 abInfo.supportWindowModes.head = nullptr;
645 if (abInfo.supportWindowModes.size > 0) {
646 int32_t *retValue = static_cast<int32_t *>(malloc(sizeof(int32_t) * abInfo.supportWindowModes.size));
647 if (retValue != nullptr) {
648 for (int32_t i = 0; i < abInfo.supportWindowModes.size; i++) {
649 retValue[i] = static_cast<int32_t>(cAbilityInfos.windowModes[i]);
650 }
651 abInfo.supportWindowModes.head = retValue;
652 } else {
653 APP_LOGE("ConvertAbilityInfo malloc failed");
654 return abInfo;
655 }
656 }
657
658 abInfo.windowSize.maxWindowRatio = cAbilityInfos.maxWindowRatio;
659 abInfo.windowSize.minWindowRatio = cAbilityInfos.minWindowRatio;
660 abInfo.windowSize.maxWindowWidth = cAbilityInfos.maxWindowWidth;
661 abInfo.windowSize.minWindowWidth = cAbilityInfos.minWindowWidth;
662 abInfo.windowSize.maxWindowHeight = cAbilityInfos.maxWindowHeight;
663 abInfo.windowSize.minWindowHeight = cAbilityInfos.minWindowHeight;
664 return abInfo;
665 }
666
ConvertAbilityInfoV2(const AppExecFwk::AbilityInfo & cAbilityInfos)667 RetAbilityInfoV2 ConvertAbilityInfoV2(const AppExecFwk::AbilityInfo& cAbilityInfos)
668 {
669 RetAbilityInfoV2 abInfo;
670 abInfo.bundleName = MallocCString(cAbilityInfos.bundleName);
671 abInfo.moduleName = MallocCString(cAbilityInfos.moduleName);
672 abInfo.name = MallocCString(cAbilityInfos.name);
673 abInfo.label = MallocCString(cAbilityInfos.label);
674 abInfo.labelId = cAbilityInfos.labelId;
675 abInfo.description = MallocCString(cAbilityInfos.description);
676 abInfo.descriptionId = cAbilityInfos.descriptionId;
677 abInfo.icon = MallocCString(cAbilityInfos.iconPath);
678 abInfo.iconId = cAbilityInfos.iconId;
679 abInfo.process = MallocCString(cAbilityInfos.process);
680 abInfo.exported = cAbilityInfos.visible;
681 abInfo.orientation = static_cast<int32_t>(cAbilityInfos.orientation);
682 abInfo.launchType = static_cast<int32_t>(cAbilityInfos.launchMode);
683 abInfo.permissions = ConvertArrString(cAbilityInfos.permissions);
684 abInfo.deviceTypes = ConvertArrString(cAbilityInfos.deviceTypes);
685 abInfo.applicationInfo = ConvertApplicationInfoV2(cAbilityInfos.applicationInfo);
686 abInfo.metadata = ConvertArrMetadata(cAbilityInfos.metadata);
687 abInfo.enabled = cAbilityInfos.enabled;
688
689 abInfo.supportWindowModes.size = static_cast<int64_t>(cAbilityInfos.windowModes.size());
690 abInfo.supportWindowModes.head = nullptr;
691 if (abInfo.supportWindowModes.size > 0) {
692 int32_t *retValue = static_cast<int32_t *>(malloc(sizeof(int32_t) * abInfo.supportWindowModes.size));
693 if (retValue != nullptr) {
694 for (int32_t i = 0; i < abInfo.supportWindowModes.size; i++) {
695 retValue[i] = static_cast<int32_t>(cAbilityInfos.windowModes[i]);
696 }
697 abInfo.supportWindowModes.head = retValue;
698 } else {
699 APP_LOGE("ConvertAbilityInfo malloc failed");
700 return abInfo;
701 }
702 }
703
704 abInfo.windowSize.maxWindowRatio = cAbilityInfos.maxWindowRatio;
705 abInfo.windowSize.minWindowRatio = cAbilityInfos.minWindowRatio;
706 abInfo.windowSize.maxWindowWidth = cAbilityInfos.maxWindowWidth;
707 abInfo.windowSize.minWindowWidth = cAbilityInfos.minWindowWidth;
708 abInfo.windowSize.maxWindowHeight = cAbilityInfos.maxWindowHeight;
709 abInfo.windowSize.minWindowHeight = cAbilityInfos.minWindowHeight;
710
711 abInfo.excludeFromDock = cAbilityInfos.excludeFromDock;
712 abInfo.skills = ConvertSkills(cAbilityInfos.skills);
713 return abInfo;
714 }
715
FreeRetAbilityInfoV2(RetAbilityInfoV2 & abInfo)716 void FreeRetAbilityInfoV2(RetAbilityInfoV2& abInfo)
717 {
718 free(abInfo.bundleName);
719 abInfo.bundleName = nullptr;
720 free(abInfo.moduleName);
721 abInfo.moduleName = nullptr;
722 free(abInfo.name);
723 abInfo.name = nullptr;
724 free(abInfo.label);
725 abInfo.label = nullptr;
726 free(abInfo.description);
727 abInfo.description = nullptr;
728 free(abInfo.icon);
729 abInfo.icon = nullptr;
730 free(abInfo.process);
731 abInfo.process = nullptr;
732 FreeCArrString(abInfo.permissions);
733 FreeCArrString(abInfo.deviceTypes);
734 FreeRetApplicationInfoV2(abInfo.applicationInfo);
735 FreeCArrMetadata(abInfo.metadata);
736 free(abInfo.supportWindowModes.head);
737 abInfo.supportWindowModes.head = nullptr;
738 FreeRetCArrSkill(abInfo.skills);
739 }
740
ConvertArrAbilityInfo(const std::vector<AppExecFwk::AbilityInfo> & abilityInfos)741 CArrRetAbilityInfo ConvertArrAbilityInfo(const std::vector<AppExecFwk::AbilityInfo>& abilityInfos)
742 {
743 CArrRetAbilityInfo abInfo;
744 abInfo.size = static_cast<int64_t>(abilityInfos.size());
745 abInfo.head = nullptr;
746 if (abInfo.size > 0) {
747 RetAbilityInfo *retValue = reinterpret_cast<RetAbilityInfo *>(malloc(sizeof(RetAbilityInfo) * abInfo.size));
748 if (retValue != nullptr) {
749 for (int32_t i = 0; i < abInfo.size; i++) {
750 retValue[i] = ConvertAbilityInfo(abilityInfos[i]);
751 }
752 abInfo.head = retValue;
753 } else {
754 APP_LOGE("ConvertArrAbilityInfo malloc failed");
755 return abInfo;
756 }
757 }
758 return abInfo;
759 }
760
ConvertArrAbilityInfoV2(const std::vector<AppExecFwk::AbilityInfo> & abilityInfos)761 CArrRetAbilityInfoV2 ConvertArrAbilityInfoV2(const std::vector<AppExecFwk::AbilityInfo>& abilityInfos)
762 {
763 CArrRetAbilityInfoV2 abInfo;
764 abInfo.size = static_cast<int64_t>(abilityInfos.size());
765 abInfo.head = nullptr;
766 if (abInfo.size > 0) {
767 RetAbilityInfoV2 *retValue =
768 reinterpret_cast<RetAbilityInfoV2 *>(malloc(sizeof(RetAbilityInfoV2) * abInfo.size));
769 if (retValue != nullptr) {
770 for (int32_t i = 0; i < abInfo.size; i++) {
771 retValue[i] = ConvertAbilityInfoV2(abilityInfos[i]);
772 }
773 abInfo.head = retValue;
774 } else {
775 APP_LOGE("ConvertArrAbilityInfo malloc failed");
776 return abInfo;
777 }
778 }
779 return abInfo;
780 }
781
FreeCArrRetAbilityInfoV2(CArrRetAbilityInfoV2 & abInfo)782 void FreeCArrRetAbilityInfoV2(CArrRetAbilityInfoV2& abInfo)
783 {
784 if (abInfo.head == nullptr) {
785 return;
786 }
787 for (int64_t i = 0; i < abInfo.size; i++) {
788 FreeRetAbilityInfoV2(abInfo.head[i]);
789 }
790 free(abInfo.head);
791 abInfo.head = nullptr;
792 abInfo.size = 0;
793 }
794
ConvertPreloadItem(const std::vector<AppExecFwk::PreloadItem> & preloads)795 CArrRetPreloadItem ConvertPreloadItem(const std::vector<AppExecFwk::PreloadItem>& preloads)
796 {
797 CArrRetPreloadItem pLoad;
798 pLoad.size = static_cast<int64_t>(preloads.size());
799 pLoad.head = nullptr;
800 if (pLoad.size > 0) {
801 RetPreloadItem *retValue = reinterpret_cast<RetPreloadItem *>(malloc(sizeof(RetPreloadItem) * pLoad.size));
802 if (retValue != nullptr) {
803 for (int32_t i = 0; i < pLoad.size; i++) {
804 retValue[i].moduleName = MallocCString(preloads[i].moduleName);
805 }
806 pLoad.head = retValue;
807 } else {
808 APP_LOGE("ConvertPreloadItem malloc failed");
809 return pLoad;
810 }
811 }
812 return pLoad;
813 }
814
FreeCArrRetPreloadItem(CArrRetPreloadItem pLoad)815 void FreeCArrRetPreloadItem(CArrRetPreloadItem pLoad)
816 {
817 if (pLoad.head == nullptr) {
818 return;
819 }
820 for (int64_t i = 0; i < pLoad.size; i++) {
821 free(pLoad.head[i].moduleName);
822 pLoad.head[i].moduleName = nullptr;
823 }
824 free(pLoad.head);
825 pLoad.head = nullptr;
826 pLoad.size = 0;
827 }
828
ConvertDependency(const std::vector<AppExecFwk::Dependency> & dependencies)829 CArrRetDependency ConvertDependency(const std::vector<AppExecFwk::Dependency>& dependencies)
830 {
831 CArrRetDependency dep;
832 dep.size = static_cast<int64_t>(dependencies.size());
833 dep.head = nullptr;
834 if (dep.size > 0) {
835 RetDependency *retValue = reinterpret_cast<RetDependency *>(malloc(sizeof(RetDependency) * dep.size));
836 if (retValue != nullptr) {
837 for (int32_t i = 0; i < dep.size; i++) {
838 retValue[i].bundleName = MallocCString(dependencies[i].bundleName);
839 retValue[i].moduleName = MallocCString(dependencies[i].moduleName);
840 retValue[i].versionCode = dependencies[i].versionCode;
841 }
842 dep.head = retValue;
843 } else {
844 APP_LOGE("ConvertDependency malloc failed");
845 return dep;
846 }
847 }
848 return dep;
849 }
850
FreeCArrRetDependency(CArrRetDependency & dep)851 void FreeCArrRetDependency(CArrRetDependency& dep)
852 {
853 if (dep.head == nullptr) {
854 return;
855 }
856 for (int64_t i = 0; i < dep.size; i++) {
857 free(dep.head[i].bundleName);
858 dep.head[i].bundleName = nullptr;
859 free(dep.head[i].moduleName);
860 dep.head[i].moduleName = nullptr;
861 }
862 free(dep.head);
863 dep.head = nullptr;
864 dep.size = 0;
865 }
866
ConvertArrDataItem(const std::map<std::string,std::string> & data)867 CArrDataItem ConvertArrDataItem(const std::map<std::string, std::string>& data)
868 {
869 CArrDataItem dataItems;
870 dataItems.size = static_cast<int64_t>(data.size());
871 dataItems.head = nullptr;
872
873 if (dataItems.size == 0) {
874 return dataItems;
875 }
876 CDataItem *retValue = reinterpret_cast<CDataItem *>
877 (malloc(sizeof(CDataItem) * dataItems.size));
878 if (retValue != nullptr) {
879 int i = 0;
880 for (auto it = data.begin(); it != data.end(); ++it) {
881 retValue[i].key = MallocCString(it->first);
882 retValue[i].value = MallocCString(it->second);
883 i = i + 1;
884 }
885 dataItems.head = retValue;
886 } else {
887 APP_LOGE("ConvertArrDataItem malloc failed");
888 return dataItems;
889 }
890 return dataItems;
891 }
892
FreeCArrDataItem(CArrDataItem & dataItems)893 void FreeCArrDataItem(CArrDataItem& dataItems)
894 {
895 if (dataItems.head == nullptr) {
896 return;
897 }
898 for (int64_t i = 0; i < dataItems.size; i++) {
899 free(dataItems.head[i].key);
900 dataItems.head[i].key = nullptr;
901 free(dataItems.head[i].value);
902 dataItems.head[i].value = nullptr;
903 }
904 free(dataItems.head);
905 dataItems.head = nullptr;
906 dataItems.size = 0;
907 }
908
ConvertRouterItem(const AppExecFwk::RouterItem & router)909 CRouterItem ConvertRouterItem(const AppExecFwk::RouterItem& router)
910 {
911 CRouterItem routerItem;
912 routerItem.name = MallocCString(router.name);
913 routerItem.pageSourceFile = MallocCString(router.pageSourceFile);
914 routerItem.buildFunction = MallocCString(router.buildFunction);
915 routerItem.data = ConvertArrDataItem(router.data);
916 routerItem.customData = MallocCString(router.customData);
917 return routerItem;
918 }
919
FreeCRouterItem(CRouterItem & routerItem)920 void FreeCRouterItem(CRouterItem& routerItem)
921 {
922 free(routerItem.name);
923 routerItem.name = nullptr;
924 free(routerItem.pageSourceFile);
925 routerItem.pageSourceFile = nullptr;
926 free(routerItem.buildFunction);
927 routerItem.buildFunction = nullptr;
928 FreeCArrDataItem(routerItem.data);
929 free(routerItem.customData);
930 routerItem.customData = nullptr;
931 }
932
ConvertRouterMap(const std::vector<AppExecFwk::RouterItem> & routerArray)933 CArrRouterItem ConvertRouterMap(const std::vector<AppExecFwk::RouterItem>& routerArray)
934 {
935 CArrRouterItem routerMap;
936 routerMap.size = static_cast<int64_t>(routerArray.size());
937 routerMap.head = nullptr;
938
939 if (routerMap.size == 0) {
940 return routerMap;
941 }
942
943 CRouterItem *retValue = reinterpret_cast<CRouterItem *>
944 (malloc(sizeof(CRouterItem) * routerMap.size));
945 if (retValue != nullptr) {
946 for (int32_t i = 0; i < routerMap.size; i++) {
947 retValue[i] = ConvertRouterItem(routerArray[i]);
948 }
949 routerMap.head = retValue;
950 } else {
951 APP_LOGE("ConvertRouterMap malloc failed");
952 return routerMap;
953 }
954 return routerMap;
955 }
956
FreeCArrRouterItem(CArrRouterItem & routerMap)957 void FreeCArrRouterItem(CArrRouterItem& routerMap)
958 {
959 if (routerMap.head == nullptr) {
960 return;
961 }
962 for (int64_t i = 0; i < routerMap.size; i++) {
963 FreeCRouterItem(routerMap.head[i]);
964 }
965 free(routerMap.head);
966 routerMap.head = nullptr;
967 routerMap.size = 0;
968 }
969
ConvertHapModuleInfo(const AppExecFwk::HapModuleInfo & hapModuleInfo)970 RetHapModuleInfo ConvertHapModuleInfo(const AppExecFwk::HapModuleInfo& hapModuleInfo)
971 {
972 RetHapModuleInfo hapInfo;
973 hapInfo.name = MallocCString(hapModuleInfo.name);
974 hapInfo.icon = MallocCString(hapModuleInfo.iconPath);
975 hapInfo.iconId = hapModuleInfo.iconId;
976 hapInfo.label = MallocCString(hapModuleInfo.label);
977 hapInfo.labelId = hapModuleInfo.labelId;
978 hapInfo.description = MallocCString(hapModuleInfo.description);
979 hapInfo.descriptionId = hapModuleInfo.descriptionId;
980 hapInfo.mainElementName = MallocCString(hapModuleInfo.mainElementName);
981
982 hapInfo.abilitiesInfo = ConvertArrAbilityInfo(hapModuleInfo.abilityInfos);
983
984 hapInfo.extensionAbilitiesInfo = ConvertArrExtensionAbilityInfo(hapModuleInfo.extensionInfos);
985
986 hapInfo.metadata = ConvertArrMetadata(hapModuleInfo.metadata);
987
988 hapInfo.deviceTypes = ConvertArrString(hapModuleInfo.deviceTypes);
989
990 hapInfo.installationFree = hapModuleInfo.installationFree;
991 hapInfo.hashValue = MallocCString(hapModuleInfo.hashValue);
992 hapInfo.moduleType = static_cast<int32_t>(hapModuleInfo.moduleType);
993
994 hapInfo.preloads = ConvertPreloadItem(hapModuleInfo.preloads);
995
996 hapInfo.dependencies = ConvertDependency(hapModuleInfo.dependencies);
997
998 if (!hapModuleInfo.fileContextMenu.empty()) {
999 hapInfo.fileContextMenuConfig = MallocCString(hapModuleInfo.fileContextMenu);
1000 } else {
1001 hapInfo.fileContextMenuConfig = MallocCString("");
1002 }
1003 return hapInfo;
1004 }
1005
ConvertHapModuleInfoV2(const AppExecFwk::HapModuleInfo & hapModuleInfo)1006 RetHapModuleInfoV2 ConvertHapModuleInfoV2(const AppExecFwk::HapModuleInfo& hapModuleInfo)
1007 {
1008 RetHapModuleInfoV2 hapInfo;
1009 hapInfo.name = MallocCString(hapModuleInfo.name);
1010 hapInfo.icon = MallocCString(hapModuleInfo.iconPath);
1011 hapInfo.iconId = hapModuleInfo.iconId;
1012 hapInfo.label = MallocCString(hapModuleInfo.label);
1013 hapInfo.labelId = hapModuleInfo.labelId;
1014 hapInfo.description = MallocCString(hapModuleInfo.description);
1015 hapInfo.descriptionId = hapModuleInfo.descriptionId;
1016 hapInfo.mainElementName = MallocCString(hapModuleInfo.mainElementName);
1017
1018 hapInfo.abilitiesInfo = ConvertArrAbilityInfoV2(hapModuleInfo.abilityInfos);
1019
1020 hapInfo.extensionAbilitiesInfo = ConvertArrExtensionAbilityInfoV2(hapModuleInfo.extensionInfos);
1021
1022 hapInfo.metadata = ConvertArrMetadata(hapModuleInfo.metadata);
1023
1024 hapInfo.deviceTypes = ConvertArrString(hapModuleInfo.deviceTypes);
1025
1026 hapInfo.installationFree = hapModuleInfo.installationFree;
1027 hapInfo.hashValue = MallocCString(hapModuleInfo.hashValue);
1028 hapInfo.moduleType = static_cast<int32_t>(hapModuleInfo.moduleType);
1029
1030 hapInfo.preloads = ConvertPreloadItem(hapModuleInfo.preloads);
1031
1032 hapInfo.dependencies = ConvertDependency(hapModuleInfo.dependencies);
1033
1034 if (!hapModuleInfo.fileContextMenu.empty()) {
1035 hapInfo.fileContextMenuConfig = MallocCString(hapModuleInfo.fileContextMenu);
1036 } else {
1037 hapInfo.fileContextMenuConfig = MallocCString("");
1038 }
1039 hapInfo.routerMap = ConvertRouterMap(hapModuleInfo.routerArray);
1040
1041 size_t result = hapModuleInfo.hapPath.find(PATH_PREFIX);
1042 if (result != std::string::npos) {
1043 size_t pos = hapModuleInfo.hapPath.find_last_of('/');
1044 std::string codePath = CODE_PATH_PREFIX;
1045 if (pos != std::string::npos && pos != hapModuleInfo.hapPath.size() - 1) {
1046 codePath += hapModuleInfo.hapPath.substr(pos + 1);
1047 }
1048 hapInfo.codePath = MallocCString(codePath);
1049 } else {
1050 hapInfo.codePath = MallocCString(hapModuleInfo.hapPath);
1051 }
1052
1053 std::string externalNativeLibraryPath = "";
1054 if (!hapModuleInfo.nativeLibraryPath.empty() && !hapModuleInfo.moduleName.empty()) {
1055 externalNativeLibraryPath = CONTEXT_DATA_STORAGE_BUNDLE + hapModuleInfo.nativeLibraryPath;
1056 }
1057 hapInfo.nativeLibraryPath = MallocCString(externalNativeLibraryPath);
1058 return hapInfo;
1059 }
1060
FreeRetHapModuleInfoV2(RetHapModuleInfoV2 & hapInfo)1061 void FreeRetHapModuleInfoV2(RetHapModuleInfoV2& hapInfo)
1062 {
1063 free(hapInfo.name);
1064 hapInfo.name = nullptr;
1065 free(hapInfo.icon);
1066 hapInfo.icon = nullptr;
1067 free(hapInfo.label);
1068 hapInfo.label = nullptr;
1069 free(hapInfo.description);
1070 hapInfo.description = nullptr;
1071 free(hapInfo.mainElementName);
1072 hapInfo.mainElementName = nullptr;
1073 FreeCArrRetAbilityInfoV2(hapInfo.abilitiesInfo);
1074 FreeCArrRetExtensionAbilityInfoV2(hapInfo.extensionAbilitiesInfo);
1075 FreeCArrMetadata(hapInfo.metadata);
1076 FreeCArrString(hapInfo.deviceTypes);
1077 free(hapInfo.hashValue);
1078 hapInfo.hashValue = nullptr;
1079 FreeCArrRetPreloadItem(hapInfo.preloads);
1080 FreeCArrRetDependency(hapInfo.dependencies);
1081 free(hapInfo.fileContextMenuConfig);
1082 hapInfo.fileContextMenuConfig = nullptr;
1083 FreeCArrRouterItem(hapInfo.routerMap);
1084 free(hapInfo.codePath);
1085 hapInfo.codePath = nullptr;
1086 free(hapInfo.nativeLibraryPath);
1087 hapInfo.nativeLibraryPath = nullptr;
1088 }
1089
1090 extern "C" {
1091 #define EXPORT __attribute__((visibility("default")))
OHOS_ConvertAbilityInfoV2(void * param)1092 EXPORT RetAbilityInfoV2 OHOS_ConvertAbilityInfoV2(void* param)
1093 {
1094 RetAbilityInfoV2 retInfo = {};
1095 auto abilityInfo = reinterpret_cast<AppExecFwk::AbilityInfo*>(param);
1096 if (abilityInfo == nullptr) {
1097 return retInfo;
1098 }
1099 return ConvertAbilityInfoV2(*abilityInfo);
1100 }
1101
OHOS_ConvertHapInfoV2(void * param)1102 EXPORT RetHapModuleInfoV2 OHOS_ConvertHapInfoV2(void* param)
1103 {
1104 RetHapModuleInfoV2 retInfo = {};
1105 auto hapModuleInfo = reinterpret_cast<AppExecFwk::HapModuleInfo*>(param);
1106 if (hapModuleInfo == nullptr) {
1107 return retInfo;
1108 }
1109 return ConvertHapModuleInfoV2(*hapModuleInfo);
1110 }
1111 }
1112
ConvertArrHapInfo(const std::vector<AppExecFwk::HapModuleInfo> & hapModuleInfos)1113 CArrHapInfo ConvertArrHapInfo(const std::vector<AppExecFwk::HapModuleInfo>& hapModuleInfos)
1114 {
1115 CArrHapInfo hapInfos;
1116 hapInfos.size = static_cast<int64_t>(hapModuleInfos.size());
1117 hapInfos.head = nullptr;
1118 if (hapInfos.size == 0) {
1119 return hapInfos;
1120 }
1121 RetHapModuleInfo *retValue = reinterpret_cast<RetHapModuleInfo *>(malloc(sizeof(RetHapModuleInfo) * hapInfos.size));
1122 if (retValue == nullptr) {
1123 APP_LOGE("ConvertArrHapInfo malloc failed");
1124 return hapInfos;
1125 }
1126 for (int32_t i = 0; i < hapInfos.size; i++) {
1127 retValue[i] = ConvertHapModuleInfo(hapModuleInfos[i]);
1128 }
1129 hapInfos.head = retValue;
1130 return hapInfos;
1131 }
1132
ConvertArrHapInfoV2(const std::vector<AppExecFwk::HapModuleInfo> & hapModuleInfos)1133 CArrHapInfoV2 ConvertArrHapInfoV2(const std::vector<AppExecFwk::HapModuleInfo>& hapModuleInfos)
1134 {
1135 CArrHapInfoV2 hapInfos;
1136 hapInfos.size = static_cast<int64_t>(hapModuleInfos.size());
1137 hapInfos.head = nullptr;
1138 if (hapInfos.size == 0) {
1139 return hapInfos;
1140 }
1141 RetHapModuleInfoV2 *retValue =
1142 reinterpret_cast<RetHapModuleInfoV2 *>(malloc(sizeof(RetHapModuleInfoV2) * hapInfos.size));
1143 if (retValue == nullptr) {
1144 APP_LOGE("ConvertArrHapInfo malloc failed");
1145 return hapInfos;
1146 }
1147 for (int32_t i = 0; i < hapInfos.size; i++) {
1148 retValue[i] = ConvertHapModuleInfoV2(hapModuleInfos[i]);
1149 }
1150 hapInfos.head = retValue;
1151 return hapInfos;
1152 }
1153
FreeCArrHapInfoV2(CArrHapInfoV2 hapInfos)1154 void FreeCArrHapInfoV2(CArrHapInfoV2 hapInfos)
1155 {
1156 if (hapInfos.head == nullptr) {
1157 return;
1158 }
1159 for (int64_t i = 0; i < hapInfos.size; i++) {
1160 FreeRetHapModuleInfoV2(hapInfos.head[i]);
1161 }
1162 free(hapInfos.head);
1163 hapInfos.head = nullptr;
1164 hapInfos.size = 0;
1165 }
1166
ConvertArrReqPerDetail(const std::vector<AppExecFwk::RequestPermission> & reqPermissionDetails)1167 CArrReqPerDetail ConvertArrReqPerDetail(const std::vector<AppExecFwk::RequestPermission>& reqPermissionDetails)
1168 {
1169 CArrReqPerDetail perDetail;
1170 perDetail.size = static_cast<int64_t>(reqPermissionDetails.size());
1171 perDetail.head = nullptr;
1172 if (perDetail.size > 0) {
1173 RetReqPermissionDetail *retValue = reinterpret_cast<RetReqPermissionDetail *>
1174 (malloc(sizeof(RetReqPermissionDetail) * perDetail.size));
1175 if (retValue != nullptr) {
1176 for (int32_t i = 0; i < perDetail.size; i++) {
1177 retValue[i] = ConvertRequestPermission(reqPermissionDetails[i]);
1178 }
1179 perDetail.head = retValue;
1180 } else {
1181 APP_LOGE("ConvertArrReqPerDetail malloc failed");
1182 return perDetail;
1183 }
1184 }
1185 return perDetail;
1186 }
1187
FreeCArrReqPerDetail(CArrReqPerDetail & perDetail)1188 void FreeCArrReqPerDetail(CArrReqPerDetail& perDetail)
1189 {
1190 if (perDetail.head == nullptr) {
1191 return;
1192 }
1193 for (int64_t i = 0; i < perDetail.size; i++) {
1194 FreeRetReqPermissionDetail(perDetail.head[i]);
1195 }
1196 free(perDetail.head);
1197 perDetail.head = nullptr;
1198 perDetail.size = 0;
1199 }
1200
InitSignInfo()1201 RetSignatureInfo InitSignInfo()
1202 {
1203 RetSignatureInfo signatureInfo = {nullptr, nullptr, nullptr};
1204 return signatureInfo;
1205 }
1206
InitApplicationInfo()1207 RetApplicationInfo InitApplicationInfo()
1208 {
1209 RetApplicationInfo appInfo;
1210 appInfo.name = nullptr;
1211 appInfo.description = nullptr;
1212 appInfo.descriptionId = 0;
1213 appInfo.enabled = true;
1214 appInfo.label = nullptr;
1215 appInfo.labelId = 0;
1216 appInfo.icon = nullptr;
1217 appInfo.iconId = 0;
1218 appInfo.process = nullptr;
1219 appInfo.permissions = {nullptr, 0};
1220 appInfo.codePath = nullptr;
1221 appInfo.metadataArray = {nullptr, 0};
1222 appInfo.removable = true;
1223 appInfo.accessTokenId = 0;
1224 appInfo.uid = -1;
1225 appInfo.iconResource = {nullptr, nullptr, 0};
1226 appInfo.labelResource = {nullptr, nullptr, 0};
1227 appInfo.descriptionResource = {nullptr, nullptr, 0};
1228 appInfo.appDistributionType = MallocCString("none");
1229 appInfo.appProvisionType = MallocCString("release");
1230 appInfo.systemApp = false;
1231 appInfo.bundleType = 0;
1232 appInfo.debug = false;
1233 appInfo.dataUnclearable = false;
1234 appInfo.cloudFileSyncEnabled = false;
1235 return appInfo;
1236 }
1237
InitApplicationInfoV2()1238 RetApplicationInfoV2 InitApplicationInfoV2()
1239 {
1240 RetApplicationInfoV2 appInfo;
1241 appInfo.name = nullptr;
1242 appInfo.description = nullptr;
1243 appInfo.descriptionId = 0;
1244 appInfo.enabled = true;
1245 appInfo.label = nullptr;
1246 appInfo.labelId = 0;
1247 appInfo.icon = nullptr;
1248 appInfo.iconId = 0;
1249 appInfo.process = nullptr;
1250 appInfo.permissions = {nullptr, 0};
1251 appInfo.codePath = nullptr;
1252 appInfo.metadataArray = {nullptr, 0};
1253 appInfo.removable = true;
1254 appInfo.accessTokenId = 0;
1255 appInfo.uid = -1;
1256 appInfo.iconResource = {nullptr, nullptr, 0};
1257 appInfo.labelResource = {nullptr, nullptr, 0};
1258 appInfo.descriptionResource = {nullptr, nullptr, 0};
1259 appInfo.appDistributionType = MallocCString("none");
1260 appInfo.appProvisionType = MallocCString("release");
1261 appInfo.systemApp = false;
1262 appInfo.bundleType = 0;
1263 appInfo.debug = false;
1264 appInfo.dataUnclearable = false;
1265 appInfo.cloudFileSyncEnabled = false;
1266 appInfo.nativeLibraryPath = MallocCString("");
1267 appInfo.multiAppMode.multiAppModeType = static_cast<uint8_t>(0);
1268 appInfo.multiAppMode.count = 0;
1269 appInfo.appIndex = 0;
1270 appInfo.installSource = MallocCString("");
1271 appInfo.releaseType = MallocCString("");
1272 return appInfo;
1273 }
1274
ConvertBundleInfo(const AppExecFwk::BundleInfo & cBundleInfo,int32_t flags)1275 RetBundleInfo ConvertBundleInfo(const AppExecFwk::BundleInfo& cBundleInfo, int32_t flags)
1276 {
1277 RetBundleInfo bundleInfo;
1278 bundleInfo.name = MallocCString(cBundleInfo.name);
1279 bundleInfo.vendor = MallocCString(cBundleInfo.vendor);
1280 bundleInfo.versionCode = cBundleInfo.versionCode;
1281 bundleInfo.versionName = MallocCString(cBundleInfo.versionName);
1282 bundleInfo.minCompatibleVersionCode = cBundleInfo.minCompatibleVersionCode;
1283 bundleInfo.targetVersion = cBundleInfo.targetVersion;
1284 if ((static_cast<uint32_t>(flags) &
1285 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION)) ==
1286 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION)
1287 ) {
1288 bundleInfo.appInfo = ConvertApplicationInfo(cBundleInfo.applicationInfo);
1289 } else {
1290 bundleInfo.appInfo = InitApplicationInfo();
1291 }
1292
1293 bundleInfo.hapInfo = ConvertArrHapInfo(cBundleInfo.hapModuleInfos);
1294 bundleInfo.perDetail = ConvertArrReqPerDetail(cBundleInfo.reqPermissionDetails);
1295
1296 bundleInfo.state.size = static_cast<int64_t>(cBundleInfo.reqPermissionStates.size());
1297 bundleInfo.state.head = nullptr;
1298 if (bundleInfo.state.size > 0) {
1299 int32_t *retValue = static_cast<int32_t *>(malloc(sizeof(int32_t) * bundleInfo.state.size));
1300 if (retValue != nullptr) {
1301 for (int32_t i = 0; i < bundleInfo.state.size; i++) {
1302 retValue[i] = static_cast<int32_t>(cBundleInfo.reqPermissionStates[i]);
1303 }
1304 bundleInfo.state.head = retValue;
1305 } else {
1306 APP_LOGE("ConvertBundleInfo malloc failed");
1307 return bundleInfo;
1308 }
1309 }
1310
1311 if ((static_cast<uint32_t>(flags) &
1312 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SIGNATURE_INFO)) ==
1313 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SIGNATURE_INFO)
1314 ) {
1315 bundleInfo.signInfo = ConvertSignatureInfo(cBundleInfo.signatureInfo);
1316 } else {
1317 bundleInfo.signInfo = InitSignInfo();
1318 }
1319 bundleInfo.installTime = cBundleInfo.installTime;
1320 bundleInfo.updateTime = cBundleInfo.updateTime;
1321 bundleInfo.uid = cBundleInfo.uid;
1322 return bundleInfo;
1323 }
1324
ConvertBundleInfoV2(const AppExecFwk::BundleInfo & cBundleInfo,int32_t flags)1325 RetBundleInfoV2 ConvertBundleInfoV2(const AppExecFwk::BundleInfo& cBundleInfo, int32_t flags)
1326 {
1327 RetBundleInfoV2 bundleInfo;
1328 bundleInfo.name = MallocCString(cBundleInfo.name);
1329 bundleInfo.vendor = MallocCString(cBundleInfo.vendor);
1330 bundleInfo.versionCode = cBundleInfo.versionCode;
1331 bundleInfo.versionName = MallocCString(cBundleInfo.versionName);
1332 bundleInfo.minCompatibleVersionCode = cBundleInfo.minCompatibleVersionCode;
1333 bundleInfo.targetVersion = cBundleInfo.targetVersion;
1334 if ((static_cast<uint32_t>(flags) &
1335 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION)) ==
1336 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION)
1337 ) {
1338 bundleInfo.appInfo = ConvertApplicationInfoV2(cBundleInfo.applicationInfo);
1339 } else {
1340 bundleInfo.appInfo = InitApplicationInfoV2();
1341 }
1342
1343 bundleInfo.hapInfo = ConvertArrHapInfoV2(cBundleInfo.hapModuleInfos);
1344 bundleInfo.perDetail = ConvertArrReqPerDetail(cBundleInfo.reqPermissionDetails);
1345
1346 bundleInfo.state.size = static_cast<int64_t>(cBundleInfo.reqPermissionStates.size());
1347 bundleInfo.state.head = nullptr;
1348 if (bundleInfo.state.size > 0) {
1349 int32_t *retValue = static_cast<int32_t *>(malloc(sizeof(int32_t) * bundleInfo.state.size));
1350 if (retValue != nullptr) {
1351 for (int32_t i = 0; i < bundleInfo.state.size; i++) {
1352 retValue[i] = static_cast<int32_t>(cBundleInfo.reqPermissionStates[i]);
1353 }
1354 bundleInfo.state.head = retValue;
1355 } else {
1356 APP_LOGE("ConvertBundleInfo malloc failed");
1357 return bundleInfo;
1358 }
1359 }
1360
1361 if ((static_cast<uint32_t>(flags) &
1362 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SIGNATURE_INFO)) ==
1363 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_SIGNATURE_INFO)
1364 ) {
1365 bundleInfo.signInfo = ConvertSignatureInfo(cBundleInfo.signatureInfo);
1366 } else {
1367 bundleInfo.signInfo = InitSignInfo();
1368 }
1369 bundleInfo.installTime = cBundleInfo.installTime;
1370 bundleInfo.updateTime = cBundleInfo.updateTime;
1371 bundleInfo.uid = cBundleInfo.uid;
1372 bundleInfo.routerMap = ConvertRouterMap(cBundleInfo.routerArray);
1373 bundleInfo.appIndex = cBundleInfo.appIndex;
1374 return bundleInfo;
1375 }
1376
FreeRetBundleInfoV2(RetBundleInfoV2 & bundleInfo)1377 void FreeRetBundleInfoV2(RetBundleInfoV2& bundleInfo)
1378 {
1379 free(bundleInfo.name);
1380 bundleInfo.name = nullptr;
1381 free(bundleInfo.vendor);
1382 bundleInfo.vendor = nullptr;
1383 free(bundleInfo.versionName);
1384 bundleInfo.versionName = nullptr;
1385 FreeRetApplicationInfoV2(bundleInfo.appInfo);
1386 FreeCArrHapInfoV2(bundleInfo.hapInfo);
1387 FreeCArrReqPerDetail(bundleInfo.perDetail);
1388 free(bundleInfo.state.head);
1389 bundleInfo.state.head = nullptr;
1390 FreeRetSignatureInfo(bundleInfo.signInfo);
1391 FreeCArrRouterItem(bundleInfo.routerMap);
1392 }
1393
1394 } // Convert
1395 } // BundleManager
1396 } // CJSystemapi
1397 } // OHOS