1 /*
2 * Copyright (c) 2021 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.h"
17
18 #include "nlohmann/json.hpp"
19
20 #include "string_ex.h"
21
22 #include "app_log_wrapper.h"
23 #include "bundle_constants.h"
24 #include "parcel_macro.h"
25
26 namespace OHOS {
27 namespace AppExecFwk {
28 namespace {
29 constexpr int8_t MAX_DEVICETYPE_SIZE = 50;
30 }
31 using namespace Constants;
ReadFromParcel(Parcel & parcel)32 bool CompatibleAbilityInfo::ReadFromParcel(Parcel& parcel)
33 {
34 APP_LOGD("CompatibleAbilityInfo::ReadFromParcel called");
35 package = Str16ToStr8(parcel.ReadString16());
36 name = Str16ToStr8(parcel.ReadString16());
37 originalClassName = Str16ToStr8(parcel.ReadString16());
38 label = Str16ToStr8(parcel.ReadString16());
39 description = Str16ToStr8(parcel.ReadString16());
40 iconPath = Str16ToStr8(parcel.ReadString16());
41 uri = Str16ToStr8(parcel.ReadString16());
42 moduleName = Str16ToStr8(parcel.ReadString16());
43 process = Str16ToStr8(parcel.ReadString16());
44 targetAbility = Str16ToStr8(parcel.ReadString16());
45 appName = Str16ToStr8(parcel.ReadString16());
46 privacyUrl = Str16ToStr8(parcel.ReadString16());
47 privacyName = Str16ToStr8(parcel.ReadString16());
48 downloadUrl = Str16ToStr8(parcel.ReadString16());
49 versionName = Str16ToStr8(parcel.ReadString16());
50 backgroundModes = parcel.ReadUint32();
51 packageSize = parcel.ReadUint32();
52 visible = parcel.ReadBool();
53 formEnabled = parcel.ReadBool();
54 multiUserShared = parcel.ReadBool();
55
56 int32_t typeData;
57 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, typeData);
58 type = static_cast<AbilityType>(typeData);
59
60 int32_t orientationData;
61 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, orientationData);
62 orientation = static_cast<DisplayOrientation>(orientationData);
63
64 int32_t launchModeData;
65 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, launchModeData);
66 launchMode = static_cast<LaunchMode>(launchModeData);
67
68 int32_t permissionsSize;
69 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, permissionsSize);
70 if (permissionsSize > Constants::MAX_LIMIT_SIZE) {
71 APP_LOGE("permissions size is overflow");
72 return false;
73 }
74 for (int32_t i = 0; i < permissionsSize; i++) {
75 std::string permission = Str16ToStr8(parcel.ReadString16());
76 if (permission.empty()) {
77 APP_LOGE("ReadParcelable<string> failed");
78 return false;
79 }
80 permissions.emplace_back(permission);
81 }
82
83 int32_t deviceTypeSize;
84 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, deviceTypeSize);
85 if (deviceTypeSize > MAX_DEVICETYPE_SIZE) {
86 APP_LOGE("device type size is overflow");
87 return false;
88 }
89 for (auto i = 0; i < deviceTypeSize; i++) {
90 std::string deviceType = Str16ToStr8(parcel.ReadString16());
91 if (deviceType.empty()) {
92 APP_LOGE("ReadParcelable<string> failed");
93 return false;
94 }
95 deviceTypes.emplace_back(deviceType);
96 }
97
98 int32_t deviceCapabilitySize;
99 READ_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, deviceCapabilitySize);
100 if (deviceCapabilitySize > Constants::MAX_LIMIT_SIZE) {
101 APP_LOGE("device capability size is overflow");
102 return false;
103 }
104 for (auto i = 0; i < deviceCapabilitySize; i++) {
105 std::string deviceCapability = Str16ToStr8(parcel.ReadString16());
106 if (deviceCapability.empty()) {
107 APP_LOGE("ReadParcelable<string> failed");
108 return false;
109 }
110 deviceCapabilities.emplace_back(deviceCapability);
111 }
112
113 supportPipMode = parcel.ReadBool();
114 grantPermission = parcel.ReadBool();
115 readPermission = Str16ToStr8(parcel.ReadString16());
116 writePermission = Str16ToStr8(parcel.ReadString16());
117 uriPermissionMode = Str16ToStr8(parcel.ReadString16());
118 uriPermissionPath = Str16ToStr8(parcel.ReadString16());
119 directLaunch = parcel.ReadBool();
120 bundleName = Str16ToStr8(parcel.ReadString16());
121 className = Str16ToStr8(parcel.ReadString16());
122 deviceId = Str16ToStr8(parcel.ReadString16());
123 std::unique_ptr<CompatibleApplicationInfo> appInfo(parcel.ReadParcelable<CompatibleApplicationInfo>());
124 if (!appInfo) {
125 APP_LOGE("ReadParcelable<CompatibleApplicationInfo> failed");
126 return false;
127 }
128 applicationInfo = *appInfo;
129 formEntity = static_cast<uint32_t>(parcel.ReadInt32());
130 minFormHeight = parcel.ReadInt32();
131 defaultFormHeight = parcel.ReadInt32();
132 minFormWidth = parcel.ReadInt32();
133 defaultFormWidth = parcel.ReadInt32();
134 iconId = parcel.ReadUint32();
135 descriptionId = parcel.ReadUint32();
136 labelId = parcel.ReadUint32();
137 enabled = parcel.ReadBool();
138 return true;
139 }
140
Unmarshalling(Parcel & parcel)141 CompatibleAbilityInfo* CompatibleAbilityInfo::Unmarshalling(Parcel& parcel)
142 {
143 APP_LOGD("CompatibleAbilityInfo::Unmarshalling called");
144 CompatibleAbilityInfo* info = new (std::nothrow) CompatibleAbilityInfo();
145 if (info && !info->ReadFromParcel(parcel)) {
146 APP_LOGW("read from parcel failed");
147 delete info;
148 info = nullptr;
149 }
150 return info;
151 }
152
Marshalling(Parcel & parcel) const153 bool CompatibleAbilityInfo::Marshalling(Parcel& parcel) const
154 {
155 APP_LOGD("CompatibleAbilityInfo::Marshalling called");
156 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(package));
157 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(name));
158 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(originalClassName));
159 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(label));
160 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(description));
161 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(iconPath));
162 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(uri));
163 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(moduleName));
164 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(process));
165 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(targetAbility));
166 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(appName));
167 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(privacyUrl));
168 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(privacyName));
169 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(downloadUrl));
170 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(versionName));
171 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Uint32, parcel, backgroundModes);
172 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Uint32, parcel, packageSize);
173 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, visible);
174 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, formEnabled);
175 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, multiUserShared);
176 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, static_cast<int32_t>(type));
177 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, static_cast<int32_t>(orientation));
178 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, static_cast<int32_t>(launchMode));
179 const auto permissionsSize = static_cast<int32_t>(permissions.size());
180 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, permissionsSize);
181 for (auto i = 0; i < permissionsSize; i++) {
182 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(permissions[i]));
183 }
184 const auto deviceTypeSize = static_cast<int32_t>(deviceTypes.size());
185 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, deviceTypeSize);
186 for (auto i = 0; i < deviceTypeSize; i++) {
187 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(deviceTypes[i]));
188 }
189 const auto deviceCapabilitySize = static_cast<int32_t>(deviceCapabilities.size());
190 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, deviceCapabilitySize);
191 for (auto i = 0; i < deviceCapabilitySize; i++) {
192 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(deviceCapabilities[i]));
193 }
194 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, supportPipMode);
195 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, grantPermission);
196 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(readPermission));
197 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(writePermission));
198 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(uriPermissionMode));
199 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(uriPermissionPath));
200 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, directLaunch);
201 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(bundleName));
202 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(className));
203 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(String16, parcel, Str8ToStr16(deviceId));
204 APP_LOGE("CompatibleAbilityInfo::Marshalling start to write application info");
205 if (!parcel.WriteParcelable(&applicationInfo)) {
206 return false;
207 }
208 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, formEntity);
209 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, minFormHeight);
210 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, defaultFormHeight);
211 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, minFormWidth);
212 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Int32, parcel, defaultFormWidth);
213 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Uint32, parcel, iconId);
214 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Uint32, parcel, descriptionId);
215 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Uint32, parcel, labelId);
216 WRITE_PARCEL_AND_RETURN_FALSE_IF_FAIL(Bool, parcel, enabled);
217 return true;
218 }
219
ConvertToAbilityInfo(AbilityInfo & abilityInfo) const220 void CompatibleAbilityInfo::ConvertToAbilityInfo(AbilityInfo& abilityInfo) const
221 {
222 APP_LOGD("CompatibleAbilityInfo::ConvertToAbilityInfo called");
223 abilityInfo.package = package;
224 abilityInfo.name = name;
225 abilityInfo.label = label;
226 abilityInfo.description = description;
227 abilityInfo.iconPath = iconPath;
228 abilityInfo.uri = uri;
229 abilityInfo.moduleName = moduleName;
230 abilityInfo.process = process;
231 abilityInfo.targetAbility = targetAbility;
232 abilityInfo.appName = appName;
233 abilityInfo.privacyUrl = privacyUrl;
234 abilityInfo.privacyName = privacyName;
235 abilityInfo.downloadUrl = downloadUrl;
236 abilityInfo.versionName = versionName;
237 abilityInfo.backgroundModes = backgroundModes;
238 abilityInfo.packageSize = packageSize;
239 abilityInfo.visible = visible;
240 abilityInfo.formEnabled = formEnabled;
241 abilityInfo.multiUserShared = multiUserShared;
242 abilityInfo.type = type;
243 abilityInfo.subType = subType;
244 abilityInfo.orientation = orientation;
245 abilityInfo.launchMode = launchMode;
246 abilityInfo.permissions = permissions;
247 abilityInfo.deviceTypes = deviceTypes;
248 abilityInfo.deviceCapabilities = deviceCapabilities;
249 abilityInfo.supportPipMode = supportPipMode;
250 abilityInfo.grantPermission = grantPermission;
251 abilityInfo.readPermission = readPermission;
252 abilityInfo.writePermission = writePermission;
253 abilityInfo.uriPermissionMode = uriPermissionMode;
254 abilityInfo.uriPermissionPath = uriPermissionPath;
255 abilityInfo.directLaunch = directLaunch;
256 abilityInfo.bundleName = bundleName;
257 abilityInfo.className = className;
258 abilityInfo.originalClassName = originalClassName;
259 abilityInfo.deviceId = deviceId;
260 ApplicationInfo convertedApplicationInfo;
261 applicationInfo.ConvertToApplicationInfo(convertedApplicationInfo);
262 abilityInfo.applicationInfo = convertedApplicationInfo;
263 abilityInfo.formEntity = formEntity;
264 abilityInfo.minFormHeight = minFormHeight;
265 abilityInfo.defaultFormHeight = defaultFormHeight;
266 abilityInfo.minFormWidth = minFormWidth;
267 abilityInfo.defaultFormWidth = defaultFormWidth;
268 abilityInfo.iconId = iconId;
269 abilityInfo.labelId = labelId;
270 abilityInfo.descriptionId = descriptionId;
271 abilityInfo.enabled = enabled;
272 abilityInfo.originalBundleName = bundleName;
273 }
274 } // namespace AppExecFwk
275 } // namespace OHOS