• 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;
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