• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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