• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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