1 /*
2 * Copyright (c) 2020 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 "bundle_info_utils.h"
17
18 #include "ability_info_utils.h"
19 #include "module_info_utils.h"
20 #include "securec.h"
21
22 namespace OHOS {
23 const uint8_t GET_BUNDLE_WITH_ABILITIES = 1;
24
FreeBundleInfos(BundleInfo * bundleInfos,uint32_t len)25 void BundleInfoUtils::FreeBundleInfos(BundleInfo *bundleInfos, uint32_t len)
26 {
27 if (bundleInfos == nullptr) {
28 return;
29 }
30 for (uint32_t i = 0; i < len; ++i) {
31 ClearBundleInfo(bundleInfos + i);
32 }
33 AdapterFree(bundleInfos);
34 }
35
FreeBundleInfo(BundleInfo * bundleInfo)36 void BundleInfoUtils::FreeBundleInfo(BundleInfo *bundleInfo)
37 {
38 if (bundleInfo == nullptr) {
39 return;
40 }
41 ClearBundleInfo(bundleInfo);
42 AdapterFree(bundleInfo);
43 }
44
CopyBundleInfo(int32_t flags,BundleInfo * des,BundleInfo src)45 void BundleInfoUtils::CopyBundleInfo(int32_t flags, BundleInfo *des, BundleInfo src)
46 {
47 if (des == nullptr) {
48 return;
49 }
50
51 SetBundleInfoBundleName(des, src.bundleName);
52 SetBundleInfoLabel(des, src.label);
53 SetBundleInfoVersionName(des, src.versionName);
54 SetBundleInfoBigIconPath(des, src.bigIconPath);
55 SetBundleInfoCodePath(des, src.codePath);
56 SetBundleInfoDataPath(des, src.dataPath);
57 SetBundleInfoVendor(des, src.vendor);
58 SetBundleInfoModuleInfos(des, src.moduleInfos, src.numOfModule);
59 des->isSystemApp = src.isSystemApp;
60 des->versionCode = src.versionCode;
61 des->compatibleApi = src.compatibleApi;
62 des->targetApi = src.targetApi;
63 SetBundleInfoAppId(des, src.appId);
64 #ifdef OHOS_APPEXECFWK_BMS_BUNDLEMANAGER
65 des->isKeepAlive = src.isKeepAlive;
66 des->isNativeApp = src.isNativeApp;
67 des->uid = src.uid;
68 des->gid = src.gid;
69 if (flags == GET_BUNDLE_WITH_ABILITIES) {
70 SetBundleInfoAbilityInfos(des, src.abilityInfos, src.numOfAbility);
71 } else {
72 des->abilityInfos = nullptr;
73 des->numOfAbility = 0;
74 }
75 #else
76 SetBundleInfoSmallIconPath(des, src.smallIconPath);
77 if (flags == GET_BUNDLE_WITH_ABILITIES) {
78 if (src.abilityInfo != nullptr) {
79 SetBundleInfoAbilityInfo(des, *(src.abilityInfo));
80 }
81 } else {
82 des->abilityInfo = nullptr;
83 }
84 #endif
85 }
86
SetBundleInfoBundleName(BundleInfo * bundleInfo,const char * bundleName)87 bool BundleInfoUtils::SetBundleInfoBundleName(BundleInfo *bundleInfo, const char *bundleName)
88 {
89 if (bundleInfo == nullptr || bundleName == nullptr) {
90 return false;
91 }
92
93 AdapterFree(bundleInfo->bundleName);
94 bundleInfo->bundleName = Utils::Strdup(bundleName);
95 return bundleInfo->bundleName != nullptr;
96 }
97
SetBundleInfoVendor(BundleInfo * bundleInfo,const char * vendor)98 bool BundleInfoUtils::SetBundleInfoVendor(BundleInfo *bundleInfo, const char *vendor)
99 {
100 if (bundleInfo == nullptr || vendor == nullptr) {
101 return false;
102 }
103
104 AdapterFree(bundleInfo->vendor);
105 bundleInfo->vendor = Utils::Strdup(vendor);
106 return bundleInfo->vendor != nullptr;
107 }
108
SetBundleInfoLabel(BundleInfo * bundleInfo,const char * label)109 bool BundleInfoUtils::SetBundleInfoLabel(BundleInfo *bundleInfo, const char *label)
110 {
111 if (bundleInfo == nullptr || label == nullptr) {
112 return false;
113 }
114
115 AdapterFree(bundleInfo->label);
116 bundleInfo->label = Utils::Strdup(label);
117 return bundleInfo->label != nullptr;
118 }
119
SetBundleInfoVersionName(BundleInfo * bundleInfo,const char * versionName)120 bool BundleInfoUtils::SetBundleInfoVersionName(BundleInfo *bundleInfo, const char *versionName)
121 {
122 if (bundleInfo == nullptr || versionName == nullptr) {
123 return false;
124 }
125
126 AdapterFree(bundleInfo->versionName);
127 bundleInfo->versionName = Utils::Strdup(versionName);
128 return bundleInfo->versionName != nullptr;
129 }
130
SetBundleInfoBigIconPath(BundleInfo * bundleInfo,const char * bigIconPath)131 bool BundleInfoUtils::SetBundleInfoBigIconPath(BundleInfo *bundleInfo, const char *bigIconPath)
132 {
133 if (bundleInfo == nullptr || bigIconPath == nullptr) {
134 return false;
135 }
136
137 AdapterFree(bundleInfo->bigIconPath);
138 bundleInfo->bigIconPath = Utils::Strdup(bigIconPath);
139 return bundleInfo->bigIconPath != nullptr;
140 }
141
SetBundleInfoCodePath(BundleInfo * bundleInfo,const char * codePath)142 bool BundleInfoUtils::SetBundleInfoCodePath(BundleInfo *bundleInfo, const char *codePath)
143 {
144 if (bundleInfo == nullptr || codePath == nullptr) {
145 return false;
146 }
147
148 AdapterFree(bundleInfo->codePath);
149 bundleInfo->codePath = Utils::Strdup(codePath);
150 return bundleInfo->codePath != nullptr;
151 }
152
SetBundleInfoDataPath(BundleInfo * bundleInfo,const char * dataPath)153 bool BundleInfoUtils::SetBundleInfoDataPath(BundleInfo *bundleInfo, const char *dataPath)
154 {
155 if (bundleInfo == nullptr || dataPath == nullptr) {
156 return false;
157 }
158
159 AdapterFree(bundleInfo->dataPath);
160 bundleInfo->dataPath = Utils::Strdup(dataPath);
161 return bundleInfo->dataPath != nullptr;
162 }
163
SetBundleInfoModuleInfos(BundleInfo * bundleInfo,const ModuleInfo * moduleInfos,uint32_t numOfModule)164 bool BundleInfoUtils::SetBundleInfoModuleInfos(BundleInfo *bundleInfo, const ModuleInfo *moduleInfos,
165 uint32_t numOfModule)
166 {
167 if (numOfModule == 0) {
168 return true;
169 }
170
171 if (moduleInfos == nullptr || bundleInfo == nullptr) {
172 return false;
173 }
174
175 bundleInfo->numOfModule = numOfModule;
176 bundleInfo->moduleInfos = reinterpret_cast<ModuleInfo *>(AdapterMalloc(sizeof(ModuleInfo) * numOfModule));
177 if (bundleInfo->moduleInfos == nullptr) {
178 return false;
179 }
180
181 int32_t ret = memset_s(bundleInfo->moduleInfos, sizeof(ModuleInfo) * numOfModule, 0,
182 sizeof(ModuleInfo) * numOfModule);
183 if (ret != EOK) {
184 AdapterFree(bundleInfo->moduleInfos);
185 return false;
186 }
187
188 for (uint32_t i = 0; i < numOfModule; i++) {
189 ModuleInfoUtils::CopyModuleInfo(bundleInfo->moduleInfos + i, moduleInfos[i]);
190 }
191 return true;
192 }
193
ClearModuleInfos(ModuleInfo * moduleInfos,uint32_t numOfModule)194 void BundleInfoUtils::ClearModuleInfos(ModuleInfo *moduleInfos, uint32_t numOfModule)
195 {
196 if (moduleInfos == nullptr || numOfModule == 0) {
197 return;
198 }
199
200 for (uint32_t i = 0; i < numOfModule; i++) {
201 ClearModuleInfo(moduleInfos + i);
202 }
203 }
204
SetBundleInfoAppId(BundleInfo * bundleInfo,const char * appId)205 bool BundleInfoUtils::SetBundleInfoAppId(BundleInfo *bundleInfo, const char *appId)
206 {
207 if (bundleInfo == nullptr || appId == nullptr) {
208 return false;
209 }
210
211 AdapterFree(bundleInfo->appId);
212 bundleInfo->appId = Utils::Strdup(appId);
213 return bundleInfo->appId != nullptr;
214 }
215
216 #ifdef OHOS_APPEXECFWK_BMS_BUNDLEMANAGER
SetBundleInfoAbilityInfos(BundleInfo * bundleInfo,const AbilityInfo * abilityInfos,uint32_t numOfAbility)217 bool BundleInfoUtils::SetBundleInfoAbilityInfos(BundleInfo *bundleInfo, const AbilityInfo *abilityInfos,
218 uint32_t numOfAbility)
219 {
220 if (numOfAbility == 0) {
221 return true;
222 }
223
224 if (abilityInfos == nullptr || bundleInfo == nullptr) {
225 return false;
226 }
227
228 bundleInfo->numOfAbility = numOfAbility;
229 bundleInfo->abilityInfos = reinterpret_cast<AbilityInfo *>(AdapterMalloc(sizeof(AbilityInfo) * numOfAbility));
230 if (bundleInfo->abilityInfos == nullptr) {
231 return false;
232 }
233 int32_t ret = memset_s(bundleInfo->abilityInfos, sizeof(AbilityInfo) * numOfAbility, 0,
234 sizeof(AbilityInfo) * numOfAbility);
235 if (ret != EOK) {
236 AdapterFree(bundleInfo->abilityInfos);
237 return false;
238 }
239
240 for (uint32_t i = 0; i < numOfAbility; i++) {
241 AbilityInfoUtils::CopyAbilityInfo(bundleInfo->abilityInfos + i, abilityInfos[i]);
242 }
243 return true;
244 }
245
ClearAbilityInfos(AbilityInfo * abilityInfos,uint32_t numOfAbility)246 void BundleInfoUtils::ClearAbilityInfos(AbilityInfo *abilityInfos, uint32_t numOfAbility)
247 {
248 if (abilityInfos == nullptr || numOfAbility == 0) {
249 return;
250 }
251
252 for (uint32_t i = 0; i < numOfAbility; i++) {
253 ClearAbilityInfo(abilityInfos + i);
254 }
255 }
256 #else
SetBundleInfoSmallIconPath(BundleInfo * bundleInfo,const char * smallIconPath)257 bool BundleInfoUtils::SetBundleInfoSmallIconPath(BundleInfo *bundleInfo, const char *smallIconPath)
258 {
259 if (bundleInfo == nullptr || smallIconPath == nullptr) {
260 return false;
261 }
262
263 AdapterFree(bundleInfo->smallIconPath);
264 bundleInfo->smallIconPath = Utils::Strdup(smallIconPath);
265 return bundleInfo->smallIconPath != nullptr;
266 }
267
SetBundleInfoAbilityInfo(BundleInfo * bundleInfo,AbilityInfo abilityInfo)268 bool BundleInfoUtils::SetBundleInfoAbilityInfo(BundleInfo *bundleInfo, AbilityInfo abilityInfo)
269 {
270 if (bundleInfo == nullptr) {
271 return false;
272 }
273
274 ClearAbilityInfo(bundleInfo->abilityInfo);
275 AdapterFree(bundleInfo->abilityInfo);
276 bundleInfo->abilityInfo = reinterpret_cast<AbilityInfo *>(AdapterMalloc(sizeof(AbilityInfo)));
277 if (bundleInfo->abilityInfo == nullptr ||
278 memset_s(bundleInfo->abilityInfo, sizeof(AbilityInfo), 0, sizeof(AbilityInfo)) != EOK) {
279 AdapterFree(bundleInfo->abilityInfo);
280 return false;
281 }
282
283 AbilityInfoUtils::CopyAbilityInfo(bundleInfo->abilityInfo, abilityInfo);
284 return true;
285 }
286 #endif
287 } // OHOS