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