1 /*
2  * Copyright (c) 2020-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "ability_info_utils.h"
17 
18 #include "utils.h"
19 
20 namespace OHOS {
CopyAbilityInfo(AbilityInfo * des,AbilityInfo src)21 void AbilityInfoUtils::CopyAbilityInfo(AbilityInfo *des, AbilityInfo src)
22 {
23     if (des == nullptr) {
24         return;
25     }
26 
27     SetAbilityInfoBundleName(des, src.bundleName);
28 #ifdef OHOS_APPEXECFWK_BMS_BUNDLEMANAGER
29     des->isVisible = src.isVisible;
30     des->abilityType = src.abilityType;
31     des->launchMode = src.launchMode;
32     SetAbilityInfoModuleName(des, src.moduleName);
33     SetAbilityInfoName(des, src.name);
34     SetAbilityInfoDescription(des, src.description);
35     SetAbilityInfoIconPath(des, src.iconPath);
36     SetAbilityInfoDeviceId(des, src.deviceId);
37     SetAbilityInfoLabel(des, src.label);
38 #else
39     SetAbilityInfoSrcPath(des, src.srcPath);
40     SetAbilityInfoMetaData(des, src.metaData, METADATA_SIZE);
41     SetAbilityInfoSkill(des, src.skills);
42 #endif
43 }
44 
45 #ifdef _MINI_BMS_PARSE_METADATA_
CopyBundleProfileToAbilityInfo(AbilityInfo * des,const BundleProfile & src)46 void AbilityInfoUtils::CopyBundleProfileToAbilityInfo(AbilityInfo *des, const BundleProfile &src)
47 {
48     if (des == nullptr) {
49         return;
50     }
51     SetAbilityInfoMetaData(des, src.abilityInfos->metaData, METADATA_SIZE);
52     SetAbilityInfoSkill(des, src.abilityInfos->skills);
53 }
54 #endif
55 
SetAbilityInfoBundleName(AbilityInfo * abilityInfo,const char * bundleName)56 bool AbilityInfoUtils::SetAbilityInfoBundleName(AbilityInfo *abilityInfo, const char *bundleName)
57 {
58     if (abilityInfo == nullptr || bundleName == nullptr) {
59         return false;
60     }
61 
62     AdapterFree(abilityInfo->bundleName);
63     abilityInfo->bundleName = Utils::Strdup(bundleName);
64     return abilityInfo->bundleName != nullptr;
65 }
66 
67 #ifdef OHOS_APPEXECFWK_BMS_BUNDLEMANAGER
SetAbilityInfoModuleName(AbilityInfo * abilityInfo,const char * moduleName)68 bool AbilityInfoUtils::SetAbilityInfoModuleName(AbilityInfo *abilityInfo, const char *moduleName)
69 {
70     if (abilityInfo == nullptr || moduleName == nullptr) {
71         return false;
72     }
73 
74     AdapterFree(abilityInfo->moduleName);
75     abilityInfo->moduleName = Utils::Strdup(moduleName);
76     return abilityInfo->moduleName != nullptr;
77 }
78 
SetAbilityInfoName(AbilityInfo * abilityInfo,const char * name)79 bool AbilityInfoUtils::SetAbilityInfoName(AbilityInfo *abilityInfo, const char *name)
80 {
81     if (abilityInfo == nullptr || name == nullptr) {
82         return false;
83     }
84 
85     AdapterFree(abilityInfo->name);
86     abilityInfo->name = Utils::Strdup(name);
87     return abilityInfo->name != nullptr;
88 }
89 
SetAbilityInfoDescription(AbilityInfo * abilityInfo,const char * description)90 bool AbilityInfoUtils::SetAbilityInfoDescription(AbilityInfo *abilityInfo, const char *description)
91 {
92     if (abilityInfo == nullptr || description == nullptr) {
93         return false;
94     }
95 
96     AdapterFree(abilityInfo->description);
97     abilityInfo->description = Utils::Strdup(description);
98     return abilityInfo->description != nullptr;
99 }
100 
SetAbilityInfoIconPath(AbilityInfo * abilityInfo,const char * iconPath)101 bool AbilityInfoUtils::SetAbilityInfoIconPath(AbilityInfo *abilityInfo, const char *iconPath)
102 {
103     if (abilityInfo == nullptr || iconPath == nullptr) {
104         return false;
105     }
106 
107     AdapterFree(abilityInfo->iconPath);
108     abilityInfo->iconPath = Utils::Strdup(iconPath);
109     return abilityInfo->iconPath != nullptr;
110 }
111 
SetAbilityInfoDeviceId(AbilityInfo * abilityInfo,const char * deviceId)112 bool AbilityInfoUtils::SetAbilityInfoDeviceId(AbilityInfo *abilityInfo, const char *deviceId)
113 {
114     if (abilityInfo == nullptr || deviceId == nullptr) {
115         return false;
116     }
117 
118     AdapterFree(abilityInfo->deviceId);
119     abilityInfo->deviceId = Utils::Strdup(deviceId);
120     return abilityInfo->deviceId != nullptr;
121 }
122 
SetAbilityInfoLabel(AbilityInfo * abilityInfo,const char * label)123 bool AbilityInfoUtils::SetAbilityInfoLabel(AbilityInfo *abilityInfo, const char *label)
124 {
125     if (abilityInfo == nullptr || label == nullptr) {
126         return false;
127     }
128 
129     AdapterFree(abilityInfo->label);
130     abilityInfo->label = Utils::Strdup(label);
131     return abilityInfo->label != nullptr;
132 }
133 #else
SetAbilityInfoSrcPath(AbilityInfo * abilityInfo,const char * srcPath)134 bool AbilityInfoUtils::SetAbilityInfoSrcPath(AbilityInfo *abilityInfo, const char *srcPath)
135 {
136     if (abilityInfo == nullptr || srcPath == nullptr) {
137         return false;
138     }
139 
140     AdapterFree(abilityInfo->srcPath);
141     abilityInfo->srcPath = Utils::Strdup(srcPath);
142     return abilityInfo->srcPath != nullptr;
143 }
144 
SetAbilityInfoMetaData(AbilityInfo * abilityInfo,MetaData ** metaData,uint32_t numOfMetaData)145 bool AbilityInfoUtils::SetAbilityInfoMetaData(AbilityInfo *abilityInfo, MetaData **metaData, uint32_t numOfMetaData)
146 {
147     if (abilityInfo == nullptr || metaData == nullptr || numOfMetaData > METADATA_SIZE) {
148         return false;
149     }
150     ClearAbilityInfoMetaData(abilityInfo->metaData, METADATA_SIZE);
151     for (uint32_t i = 0; i < numOfMetaData; i++) {
152         if (metaData[i] != nullptr) {
153             abilityInfo->metaData[i] = reinterpret_cast<MetaData *>(AdapterMalloc(sizeof(MetaData)));
154             if (abilityInfo->metaData[i] == nullptr ||
155                 memset_s(abilityInfo->metaData[i], sizeof(MetaData), 0, sizeof(MetaData)) != EOK) {
156                 ClearAbilityInfoMetaData(abilityInfo->metaData, i);
157                 return false;
158             }
159             if (metaData[i]->name != nullptr) {
160                 abilityInfo->metaData[i]->name = Utils::Strdup(metaData[i]->name);
161             }
162             if (metaData[i]->value != nullptr) {
163                 abilityInfo->metaData[i]->value = Utils::Strdup(metaData[i]->value);
164             }
165             if (metaData[i]->extra != nullptr) {
166                 abilityInfo->metaData[i]->extra = Utils::Strdup(metaData[i]->extra);
167             }
168             if ((metaData[i]->name != nullptr && abilityInfo->metaData[i]->name == nullptr) ||
169                 (metaData[i]->value != nullptr && abilityInfo->metaData[i]->value == nullptr) ||
170                 (metaData[i]->extra != nullptr && abilityInfo->metaData[i]->extra == nullptr)) {
171                 ClearAbilityInfoMetaData(abilityInfo->metaData, i);
172                 return false;
173             }
174         }
175     }
176     return true;
177 }
178 
ClearStringArray(char * array[],int count)179 void AbilityInfoUtils::ClearStringArray(char *array[], int count)
180 {
181     for (int i = 0; i < count; i++) {
182         if (array[i] == nullptr) {
183             continue;
184         }
185         AdapterFree(array[i]);
186     }
187 }
188 
CopyStringArray(char * dst[],char * const src[],int count)189 void AbilityInfoUtils::CopyStringArray(char *dst[], char *const src[], int count)
190 {
191     for (int i = 0; i < count; i++) {
192         dst[i] = Utils::Strdup(src[i]);
193     }
194 }
195 
SetAbilityInfoSkill(AbilityInfo * abilityInfo,Skill * const skills[])196 bool AbilityInfoUtils::SetAbilityInfoSkill(AbilityInfo *abilityInfo, Skill * const skills[])
197 {
198     if (abilityInfo == nullptr || skills == nullptr) {
199         return false;
200     }
201     for (int i = 0; i < SKILL_SIZE; i++) {
202         if (abilityInfo->skills[i] != nullptr) {
203             ClearStringArray(abilityInfo->skills[i]->entities, MAX_SKILL_ITEM);
204             ClearStringArray(abilityInfo->skills[i]->actions, MAX_SKILL_ITEM);
205             AdapterFree(abilityInfo->skills[i]);
206         }
207         if (skills[i] == nullptr) {
208             return false;
209         }
210         abilityInfo->skills[i] = static_cast<Skill *>(AdapterMalloc(sizeof(Skill)));
211         CopyStringArray(abilityInfo->skills[i]->entities, skills[i]->entities, MAX_SKILL_ITEM);
212         CopyStringArray(abilityInfo->skills[i]->actions, skills[i]->actions, MAX_SKILL_ITEM);
213     }
214     return true;
215 }
216 
ClearExtendedInfo(AbilityInfo * abilityInfo)217 void AbilityInfoUtils::ClearExtendedInfo(AbilityInfo *abilityInfo)
218 {
219     for (int i = 0; i < METADATA_SIZE; i++) {
220         if (abilityInfo->metaData[i] == nullptr) {
221             continue;
222         }
223         AdapterFree(abilityInfo->metaData[i]->name);
224         AdapterFree(abilityInfo->metaData[i]->value);
225         AdapterFree(abilityInfo->metaData[i]->extra);
226         AdapterFree(abilityInfo->metaData[i]);
227     }
228     for (int i = 0; i < SKILL_SIZE; i++) {
229         if (abilityInfo->skills[i] == nullptr) {
230             continue;
231         }
232         ClearStringArray(abilityInfo->skills[i]->entities, MAX_SKILL_ITEM);
233         ClearStringArray(abilityInfo->skills[i]->actions, MAX_SKILL_ITEM);
234         AdapterFree(abilityInfo->skills[i]);
235     }
236 }
ClearAbilityInfoMetaData(MetaData ** metaData,uint32_t numOfMetaData)237 void AbilityInfoUtils::ClearAbilityInfoMetaData(MetaData **metaData, uint32_t numOfMetaData)
238 {
239     if (metaData == nullptr || numOfMetaData > METADATA_SIZE) {
240         return;
241     }
242     for (uint32_t i = 0; i < numOfMetaData; i++) {
243         if (metaData[i] != nullptr) {
244             AdapterFree(metaData[i]->name);
245             AdapterFree(metaData[i]->value);
246             AdapterFree(metaData[i]->extra);
247             AdapterFree(metaData[i]);
248         }
249     }
250 }
251 #endif
252 } // OHOS