1 /*
2 * Copyright (c) 2021-2022 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 "app_scheduler_host.h"
17 #include "ability_info.h"
18 #include "appexecfwk_errors.h"
19 #include "hitrace_meter.h"
20 #include "hilog_wrapper.h"
21 #include "ipc_types.h"
22
23 namespace OHOS {
24 namespace AppExecFwk {
AppSchedulerHost()25 AppSchedulerHost::AppSchedulerHost()
26 {
27 memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_FOREGROUND_APPLICATION_TRANSACTION)] =
28 &AppSchedulerHost::HandleScheduleForegroundApplication;
29 memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_BACKGROUND_APPLICATION_TRANSACTION)] =
30 &AppSchedulerHost::HandleScheduleBackgroundApplication;
31 memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_TERMINATE_APPLICATION_TRANSACTION)] =
32 &AppSchedulerHost::HandleScheduleTerminateApplication;
33 memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_LOWMEMORY_APPLICATION_TRANSACTION)] =
34 &AppSchedulerHost::HandleScheduleLowMemory;
35 memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_SHRINK_MEMORY_APPLICATION_TRANSACTION)] =
36 &AppSchedulerHost::HandleScheduleShrinkMemory;
37 memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_MEMORYLEVEL_APPLICATION_TRANSACTION)] =
38 &AppSchedulerHost::HandleScheduleMemoryLevel;
39 memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_LAUNCH_ABILITY_TRANSACTION)] =
40 &AppSchedulerHost::HandleScheduleLaunchAbility;
41 memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_CLEAN_ABILITY_TRANSACTION)] =
42 &AppSchedulerHost::HandleScheduleCleanAbility;
43 memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_LAUNCH_APPLICATION_TRANSACTION)] =
44 &AppSchedulerHost::HandleScheduleLaunchApplication;
45 memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_PROFILE_CHANGED_TRANSACTION)] =
46 &AppSchedulerHost::HandleScheduleProfileChanged;
47 memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_CONFIGURATION_UPDATED)] =
48 &AppSchedulerHost::HandleScheduleConfigurationUpdated;
49 memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_PROCESS_SECURITY_EXIT_TRANSACTION)] =
50 &AppSchedulerHost::HandleScheduleProcessSecurityExit;
51 memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_ABILITY_STAGE_INFO)] =
52 &AppSchedulerHost::HandleScheduleAbilityStage;
53 memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_ACCEPT_WANT)] =
54 &AppSchedulerHost::HandleScheduleAcceptWant;
55 memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_NOTIFY_LOAD_REPAIR_PATCH)] =
56 &AppSchedulerHost::HandleNotifyLoadRepairPatch;
57 memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_NOTIFY_HOT_RELOAD_PAGE)] =
58 &AppSchedulerHost::HandleNotifyHotReloadPage;
59 memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_NOTIFY_UNLOAD_REPAIR_PATCH)] =
60 &AppSchedulerHost::HandleNotifyUnLoadRepairPatch;
61 memberFuncMap_[static_cast<uint32_t>(IAppScheduler::Message::SCHEDULE_UPDATE_APPLICATION_INFO_INSTALLED)] =
62 &AppSchedulerHost::HandleScheduleUpdateApplicationInfoInstalled;
63 }
64
~AppSchedulerHost()65 AppSchedulerHost::~AppSchedulerHost()
66 {
67 memberFuncMap_.clear();
68 }
69
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)70 int AppSchedulerHost::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
71 {
72 HILOG_INFO("AppSchedulerHost::OnReceived, code = %{public}u, flags= %{public}d.", code, option.GetFlags());
73 std::u16string descriptor = AppSchedulerHost::GetDescriptor();
74 std::u16string remoteDescriptor = data.ReadInterfaceToken();
75 if (descriptor != remoteDescriptor) {
76 HILOG_ERROR("local descriptor is not equal to remote");
77 return ERR_INVALID_STATE;
78 }
79
80 auto itFunc = memberFuncMap_.find(code);
81 if (itFunc != memberFuncMap_.end()) {
82 auto memberFunc = itFunc->second;
83 if (memberFunc != nullptr) {
84 return (this->*memberFunc)(data, reply);
85 }
86 }
87 return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
88 }
89
HandleScheduleForegroundApplication(MessageParcel & data,MessageParcel & reply)90 int32_t AppSchedulerHost::HandleScheduleForegroundApplication(MessageParcel &data, MessageParcel &reply)
91 {
92 HITRACE_METER(HITRACE_TAG_APP);
93 ScheduleForegroundApplication();
94 return NO_ERROR;
95 }
96
HandleScheduleBackgroundApplication(MessageParcel & data,MessageParcel & reply)97 int32_t AppSchedulerHost::HandleScheduleBackgroundApplication(MessageParcel &data, MessageParcel &reply)
98 {
99 HITRACE_METER(HITRACE_TAG_APP);
100 ScheduleBackgroundApplication();
101 return NO_ERROR;
102 }
103
HandleScheduleTerminateApplication(MessageParcel & data,MessageParcel & reply)104 int32_t AppSchedulerHost::HandleScheduleTerminateApplication(MessageParcel &data, MessageParcel &reply)
105 {
106 HITRACE_METER(HITRACE_TAG_APP);
107 ScheduleTerminateApplication();
108 return NO_ERROR;
109 }
110
HandleScheduleLowMemory(MessageParcel & data,MessageParcel & reply)111 int32_t AppSchedulerHost::HandleScheduleLowMemory(MessageParcel &data, MessageParcel &reply)
112 {
113 HITRACE_METER(HITRACE_TAG_APP);
114 ScheduleLowMemory();
115 return NO_ERROR;
116 }
117
HandleScheduleShrinkMemory(MessageParcel & data,MessageParcel & reply)118 int32_t AppSchedulerHost::HandleScheduleShrinkMemory(MessageParcel &data, MessageParcel &reply)
119 {
120 HITRACE_METER(HITRACE_TAG_APP);
121 ScheduleShrinkMemory(data.ReadInt32());
122 return NO_ERROR;
123 }
124
HandleScheduleMemoryLevel(MessageParcel & data,MessageParcel & reply)125 int32_t AppSchedulerHost::HandleScheduleMemoryLevel(MessageParcel &data, MessageParcel &reply)
126 {
127 HITRACE_METER(HITRACE_TAG_APP);
128 ScheduleMemoryLevel(data.ReadInt32());
129 return NO_ERROR;
130 }
131
HandleScheduleLaunchAbility(MessageParcel & data,MessageParcel & reply)132 int32_t AppSchedulerHost::HandleScheduleLaunchAbility(MessageParcel &data, MessageParcel &reply)
133 {
134 HITRACE_METER(HITRACE_TAG_APP);
135 std::unique_ptr<AbilityInfo> abilityInfo(data.ReadParcelable<AbilityInfo>());
136 if (!abilityInfo) {
137 HILOG_ERROR("ReadParcelable<AbilityInfo> failed");
138 return ERR_APPEXECFWK_PARCEL_ERROR;
139 }
140
141 sptr<IRemoteObject> token = nullptr;
142 if (data.ReadBool()) {
143 token = data.ReadRemoteObject();
144 }
145
146 std::shared_ptr<AAFwk::Want> want(data.ReadParcelable<AAFwk::Want>());
147 ScheduleLaunchAbility(*abilityInfo, token, want);
148 return NO_ERROR;
149 }
150
HandleScheduleCleanAbility(MessageParcel & data,MessageParcel & reply)151 int32_t AppSchedulerHost::HandleScheduleCleanAbility(MessageParcel &data, MessageParcel &reply)
152 {
153 HITRACE_METER(HITRACE_TAG_APP);
154 sptr<IRemoteObject> token = data.ReadRemoteObject();
155 ScheduleCleanAbility(token);
156 return NO_ERROR;
157 }
158
HandleScheduleLaunchApplication(MessageParcel & data,MessageParcel & reply)159 int32_t AppSchedulerHost::HandleScheduleLaunchApplication(MessageParcel &data, MessageParcel &reply)
160 {
161 HITRACE_METER(HITRACE_TAG_APP);
162 std::unique_ptr<AppLaunchData> launchData(data.ReadParcelable<AppLaunchData>());
163 std::unique_ptr<Configuration> config(data.ReadParcelable<Configuration>());
164 if (!launchData) {
165 HILOG_ERROR("ReadParcelable<launchData> failed");
166 return ERR_APPEXECFWK_PARCEL_ERROR;
167 }
168 if (!config) {
169 HILOG_ERROR("ReadParcelable<Configuration> failed");
170 return ERR_APPEXECFWK_PARCEL_ERROR;
171 }
172
173 ScheduleLaunchApplication(*launchData, *config);
174 return NO_ERROR;
175 }
176
HandleScheduleUpdateApplicationInfoInstalled(MessageParcel & data,MessageParcel & reply)177 int32_t AppSchedulerHost::HandleScheduleUpdateApplicationInfoInstalled(MessageParcel &data, MessageParcel &reply)
178 {
179 HITRACE_METER(HITRACE_TAG_APP);
180 std::unique_ptr<ApplicationInfo> appInfo(data.ReadParcelable<ApplicationInfo>());
181 if (!appInfo) {
182 HILOG_ERROR("ReadParcelable<ApplicationInfo> failed");
183 return ERR_APPEXECFWK_PARCEL_ERROR;
184 }
185
186 ScheduleUpdateApplicationInfoInstalled(*appInfo);
187 return NO_ERROR;
188 }
189
HandleScheduleAbilityStage(MessageParcel & data,MessageParcel & reply)190 int32_t AppSchedulerHost::HandleScheduleAbilityStage(MessageParcel &data, MessageParcel &reply)
191 {
192 HITRACE_METER(HITRACE_TAG_APP);
193 std::unique_ptr<HapModuleInfo> abilityStage(data.ReadParcelable<HapModuleInfo>());
194 if (!abilityStage) {
195 HILOG_ERROR("ReadParcelable<launchData> failed");
196 return ERR_APPEXECFWK_PARCEL_ERROR;
197 }
198
199 ScheduleAbilityStage(*abilityStage);
200 return NO_ERROR;
201 }
202
HandleScheduleProfileChanged(MessageParcel & data,MessageParcel & reply)203 int32_t AppSchedulerHost::HandleScheduleProfileChanged(MessageParcel &data, MessageParcel &reply)
204 {
205 HITRACE_METER(HITRACE_TAG_APP);
206 std::unique_ptr<Profile> profile(data.ReadParcelable<Profile>());
207 if (!profile) {
208 HILOG_ERROR("ReadParcelable<Profile> failed");
209 return ERR_APPEXECFWK_PARCEL_ERROR;
210 }
211
212 ScheduleProfileChanged(*profile);
213 return NO_ERROR;
214 }
215
HandleScheduleConfigurationUpdated(MessageParcel & data,MessageParcel & reply)216 int32_t AppSchedulerHost::HandleScheduleConfigurationUpdated(MessageParcel &data, MessageParcel &reply)
217 {
218 HITRACE_METER(HITRACE_TAG_APP);
219 std::unique_ptr<Configuration> configuration(data.ReadParcelable<Configuration>());
220 if (!configuration) {
221 HILOG_ERROR("ReadParcelable<Configuration> failed");
222 return ERR_APPEXECFWK_PARCEL_ERROR;
223 }
224
225 ScheduleConfigurationUpdated(*configuration);
226 return NO_ERROR;
227 }
228
HandleScheduleProcessSecurityExit(MessageParcel & data,MessageParcel & reply)229 int32_t AppSchedulerHost::HandleScheduleProcessSecurityExit(MessageParcel &data, MessageParcel &reply)
230 {
231 HITRACE_METER(HITRACE_TAG_APP);
232 ScheduleProcessSecurityExit();
233 return NO_ERROR;
234 }
235
HandleScheduleAcceptWant(MessageParcel & data,MessageParcel & reply)236 int32_t AppSchedulerHost::HandleScheduleAcceptWant(MessageParcel &data, MessageParcel &reply)
237 {
238 HITRACE_METER(HITRACE_TAG_APP);
239 AAFwk::Want *want = data.ReadParcelable<AAFwk::Want>();
240 if (want == nullptr) {
241 HILOG_ERROR("want is nullptr");
242 return ERR_INVALID_VALUE;
243 }
244 auto moduleName = data.ReadString();
245 ScheduleAcceptWant(*want, moduleName);
246 delete want;
247 return NO_ERROR;
248 }
249
HandleNotifyLoadRepairPatch(MessageParcel & data,MessageParcel & reply)250 int32_t AppSchedulerHost::HandleNotifyLoadRepairPatch(MessageParcel &data, MessageParcel &reply)
251 {
252 HITRACE_METER(HITRACE_TAG_APP);
253 std::string bundleName = data.ReadString();
254 auto callback = iface_cast<IQuickFixCallback>(data.ReadRemoteObject());
255 auto recordId = data.ReadInt32();
256 ScheduleNotifyLoadRepairPatch(bundleName, callback, recordId);
257 return NO_ERROR;
258 }
259
HandleNotifyHotReloadPage(MessageParcel & data,MessageParcel & reply)260 int32_t AppSchedulerHost::HandleNotifyHotReloadPage(MessageParcel &data, MessageParcel &reply)
261 {
262 HITRACE_METER(HITRACE_TAG_APP);
263 auto callback = iface_cast<IQuickFixCallback>(data.ReadRemoteObject());
264 auto recordId = data.ReadInt32();
265 ScheduleNotifyHotReloadPage(callback, recordId);
266 return NO_ERROR;
267 }
268
HandleNotifyUnLoadRepairPatch(MessageParcel & data,MessageParcel & reply)269 int32_t AppSchedulerHost::HandleNotifyUnLoadRepairPatch(MessageParcel &data, MessageParcel &reply)
270 {
271 HITRACE_METER(HITRACE_TAG_APP);
272 std::string bundleName = data.ReadString();
273 auto callback = iface_cast<IQuickFixCallback>(data.ReadRemoteObject());
274 auto recordId = data.ReadInt32();
275 ScheduleNotifyUnLoadRepairPatch(bundleName, callback, recordId);
276 return NO_ERROR;
277 }
278 } // namespace AppExecFwk
279 } // namespace OHOS
280