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