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