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