1 /* 2 * Copyright (c) 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 "background_task_subscriber_stub.h" 17 18 #include <errors.h> 19 #include <ipc_skeleton.h> 20 21 #include "transient_task_log.h" 22 #include "background_task_subscriber_proxy.h" 23 #include "ibackground_task_subscriber_ipc_interface_code.h" 24 25 namespace OHOS { 26 namespace BackgroundTaskMgr { 27 namespace { 28 constexpr int32_t APP_FIRST_UID = 10000; 29 } 30 BackgroundTaskSubscriberStub()31 BackgroundTaskSubscriberStub::BackgroundTaskSubscriberStub() {} ~BackgroundTaskSubscriberStub()32 BackgroundTaskSubscriberStub::~BackgroundTaskSubscriberStub() {} 33 OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)34 ErrCode BackgroundTaskSubscriberStub::OnRemoteRequest(uint32_t code, 35 MessageParcel& data, MessageParcel& reply, MessageOption& option) 36 { 37 std::u16string descriptor = BackgroundTaskSubscriberStub::GetDescriptor(); 38 std::u16string remoteDescriptor = data.ReadInterfaceToken(); 39 if (descriptor != remoteDescriptor) { 40 BGTASK_LOGE("BackgroundTaskSubscriberStub Local descriptor not match remote."); 41 return ERR_TRANSACTION_FAILED; 42 } 43 44 auto uid = IPCSkeleton::GetCallingUid(); 45 if (uid >= APP_FIRST_UID) { 46 BGTASK_LOGE("BackgroundTaskSubscriberStub OnRemoteRequest failed, illegal calling uid %d.", uid); 47 return ERR_INVALID_DATA; 48 } 49 50 return OnRemoteRequestInner(code, data, reply, option); 51 } 52 OnRemoteRequestInner(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)53 ErrCode BackgroundTaskSubscriberStub::OnRemoteRequestInner(uint32_t code, 54 MessageParcel& data, MessageParcel& reply, MessageOption& option) 55 { 56 switch (code) { 57 case static_cast<uint32_t>(IBackgroundTaskSubscriberInterfaceCode::ON_CONNECTED): { 58 return HandleOnConnected(); 59 } 60 case static_cast<uint32_t>(IBackgroundTaskSubscriberInterfaceCode::ON_DISCONNECTED): { 61 return HandleOnDisconnected(); 62 } 63 case static_cast<uint32_t>(IBackgroundTaskSubscriberInterfaceCode::ON_TRANSIENT_TASK_START): 64 case static_cast<uint32_t>(IBackgroundTaskSubscriberInterfaceCode::ON_TRANSIENT_TASK_END): 65 case static_cast<uint32_t>(IBackgroundTaskSubscriberInterfaceCode::ON_TRANSIENT_TASK_ERR): 66 case static_cast<uint32_t>(IBackgroundTaskSubscriberInterfaceCode::ON_APP_TRANSIENT_TASK_START): 67 [[fallthrough]]; 68 case static_cast<uint32_t>(IBackgroundTaskSubscriberInterfaceCode::ON_APP_TRANSIENT_TASK_END): { 69 return HandleTransientTask(code, data); 70 } 71 case static_cast<uint32_t>(IBackgroundTaskSubscriberInterfaceCode::ON_CONTINUOUS_TASK_START): { 72 return HandleOnContinuousTaskStart(data); 73 } 74 case static_cast<uint32_t>(IBackgroundTaskSubscriberInterfaceCode::ON_CONTINUOUS_TASK_UPDATE): { 75 return HandleOnContinuousTaskUpdate(data); 76 } 77 case static_cast<uint32_t>(IBackgroundTaskSubscriberInterfaceCode::ON_CONTINUOUS_TASK_STOP): { 78 return HandleOnContinuousTaskCancel(data); 79 } 80 case static_cast<uint32_t>(IBackgroundTaskSubscriberInterfaceCode::ON_APP_CONTINUOUS_TASK_STOP): { 81 return HandleOnAppContinuousTaskStop(data); 82 } 83 case static_cast<uint32_t>(IBackgroundTaskSubscriberInterfaceCode::ON_APP_EFFICIENCY_RESOURCES_APPLY): { 84 return HandleOnAppEfficiencyResourcesApply(data); 85 } 86 case static_cast<uint32_t>(IBackgroundTaskSubscriberInterfaceCode::ON_APP_EFFICIENCY_RESOURCES_RESET): { 87 return HandleOnAppEfficiencyResourcesReset(data); 88 } 89 case static_cast<uint32_t>(IBackgroundTaskSubscriberInterfaceCode::ON_PROC_EFFICIENCY_RESOURCES_APPLY): { 90 return HandleOnProcEfficiencyResourcesApply(data); 91 } 92 case static_cast<uint32_t>(IBackgroundTaskSubscriberInterfaceCode::ON_PROC_EFFICIENCY_RESOURCES_RESET): { 93 return HandleOnProcEfficiencyResourcesReset(data); 94 } 95 default: 96 return IPCObjectStub::OnRemoteRequest(code, data, reply, option); 97 } 98 return ERR_OK; 99 } 100 HandleTransientTask(uint32_t code,MessageParcel & data)101 ErrCode BackgroundTaskSubscriberStub::HandleTransientTask(uint32_t code, MessageParcel &data) 102 { 103 switch (code) { 104 case static_cast<uint32_t>(IBackgroundTaskSubscriberInterfaceCode::ON_TRANSIENT_TASK_START): { 105 return HandleOnTransientTaskStart(data); 106 } 107 case static_cast<uint32_t>(IBackgroundTaskSubscriberInterfaceCode::ON_TRANSIENT_TASK_END): { 108 return HandleOnTransientTaskEnd(data); 109 } 110 case static_cast<uint32_t>(IBackgroundTaskSubscriberInterfaceCode::ON_TRANSIENT_TASK_ERR): { 111 return HandleOnTransientTaskErr(data); 112 } 113 case static_cast<uint32_t>(IBackgroundTaskSubscriberInterfaceCode::ON_APP_TRANSIENT_TASK_START): { 114 return HandleOnAppTransientTaskStart(data); 115 } 116 case static_cast<uint32_t>(IBackgroundTaskSubscriberInterfaceCode::ON_APP_TRANSIENT_TASK_END): { 117 return HandleOnAppTransientTaskEnd(data); 118 } 119 } 120 return ERR_OK; 121 } 122 HandleOnConnected()123 ErrCode BackgroundTaskSubscriberStub::HandleOnConnected() 124 { 125 OnConnected(); 126 return ERR_OK; 127 } 128 HandleOnDisconnected()129 ErrCode BackgroundTaskSubscriberStub::HandleOnDisconnected() 130 { 131 OnDisconnected(); 132 return ERR_OK; 133 } 134 HandleOnTransientTaskStart(MessageParcel & data)135 ErrCode BackgroundTaskSubscriberStub::HandleOnTransientTaskStart(MessageParcel& data) 136 { 137 auto info = TransientTaskAppInfo::Unmarshalling(data); 138 if (info == nullptr) { 139 BGTASK_LOGE("HandleOnTransientTaskStart Read parcel failed."); 140 return ERR_INVALID_DATA; 141 } 142 OnTransientTaskStart(info); 143 return ERR_NONE; 144 } 145 HandleOnTransientTaskEnd(MessageParcel & data)146 ErrCode BackgroundTaskSubscriberStub::HandleOnTransientTaskEnd(MessageParcel& data) 147 { 148 auto info = TransientTaskAppInfo::Unmarshalling(data); 149 if (info == nullptr) { 150 BGTASK_LOGE("HandleOnTransientTaskEnd Read parcel failed."); 151 return ERR_INVALID_DATA; 152 } 153 OnTransientTaskEnd(info); 154 return ERR_NONE; 155 } 156 HandleOnTransientTaskErr(MessageParcel & data)157 ErrCode BackgroundTaskSubscriberStub::HandleOnTransientTaskErr(MessageParcel& data) 158 { 159 auto info = TransientTaskAppInfo::Unmarshalling(data); 160 if (info == nullptr) { 161 BGTASK_LOGE("HandleOnTransientTaskErr Read parcel failed."); 162 return ERR_INVALID_DATA; 163 } 164 OnTransientTaskErr(info); 165 return ERR_NONE; 166 } 167 HandleOnAppTransientTaskStart(MessageParcel & data)168 ErrCode BackgroundTaskSubscriberStub::HandleOnAppTransientTaskStart(MessageParcel& data) 169 { 170 auto info = TransientTaskAppInfo::Unmarshalling(data); 171 if (info == nullptr) { 172 BGTASK_LOGE("HandleOnAppTransientTaskStart Read parcel failed."); 173 return ERR_INVALID_DATA; 174 } 175 OnAppTransientTaskStart(info); 176 return ERR_NONE; 177 } 178 HandleOnAppTransientTaskEnd(MessageParcel & data)179 ErrCode BackgroundTaskSubscriberStub::HandleOnAppTransientTaskEnd(MessageParcel& data) 180 { 181 auto info = TransientTaskAppInfo::Unmarshalling(data); 182 if (info == nullptr) { 183 BGTASK_LOGE("HandleOnAppTransientTaskEnd Read parcel failed."); 184 return ERR_INVALID_DATA; 185 } 186 OnAppTransientTaskEnd(info); 187 return ERR_NONE; 188 } 189 HandleOnContinuousTaskStart(MessageParcel & data)190 ErrCode BackgroundTaskSubscriberStub::HandleOnContinuousTaskStart(MessageParcel &data) 191 { 192 std::shared_ptr<ContinuousTaskCallbackInfo> continuousTaskCallbackInfo 193 = std::shared_ptr<ContinuousTaskCallbackInfo>(data.ReadParcelable<ContinuousTaskCallbackInfo>()); 194 if (!continuousTaskCallbackInfo) { 195 BGTASK_LOGE("HandleOnContinuousTaskStart ContinuousTaskCallbackInfo ReadParcelable failed"); 196 return ERR_BGTASK_PARCELABLE_FAILED; 197 } 198 199 OnContinuousTaskStart(continuousTaskCallbackInfo); 200 return ERR_OK; 201 } 202 HandleOnContinuousTaskUpdate(MessageParcel & data)203 ErrCode BackgroundTaskSubscriberStub::HandleOnContinuousTaskUpdate(MessageParcel &data) 204 { 205 std::shared_ptr<ContinuousTaskCallbackInfo> continuousTaskCallbackInfo 206 = std::shared_ptr<ContinuousTaskCallbackInfo>(data.ReadParcelable<ContinuousTaskCallbackInfo>()); 207 if (!continuousTaskCallbackInfo) { 208 BGTASK_LOGE("HandleOnContinuousTaskUpdate ContinuousTaskCallbackInfo ReadParcelable failed"); 209 return ERR_BGTASK_PARCELABLE_FAILED; 210 } 211 212 OnContinuousTaskUpdate(continuousTaskCallbackInfo); 213 return ERR_OK; 214 } 215 HandleOnContinuousTaskCancel(MessageParcel & data)216 ErrCode BackgroundTaskSubscriberStub::HandleOnContinuousTaskCancel(MessageParcel &data) 217 { 218 std::shared_ptr<ContinuousTaskCallbackInfo> continuousTaskCallbackInfo 219 = std::shared_ptr<ContinuousTaskCallbackInfo>(data.ReadParcelable<ContinuousTaskCallbackInfo>()); 220 if (!continuousTaskCallbackInfo) { 221 BGTASK_LOGE("HandleOnContinuousTaskCancel ContinuousTaskCallbackInfo ReadParcelable failed"); 222 return ERR_BGTASK_PARCELABLE_FAILED; 223 } 224 225 OnContinuousTaskStop(continuousTaskCallbackInfo); 226 return ERR_OK; 227 } 228 HandleOnAppContinuousTaskStop(MessageParcel & data)229 ErrCode BackgroundTaskSubscriberStub::HandleOnAppContinuousTaskStop(MessageParcel &data) 230 { 231 int32_t uid; 232 if (!data.ReadInt32(uid)) { 233 BGTASK_LOGE("HandleOnAppContinuousTaskStop read uid failed"); 234 return ERR_BGTASK_PARCELABLE_FAILED; 235 } 236 237 OnAppContinuousTaskStop(uid); 238 return ERR_OK; 239 } 240 HandleOnAppEfficiencyResourcesApply(MessageParcel & data)241 ErrCode BackgroundTaskSubscriberStub::HandleOnAppEfficiencyResourcesApply(MessageParcel &data) 242 { 243 std::shared_ptr<ResourceCallbackInfo> resourceCallbackInfo 244 = std::shared_ptr<ResourceCallbackInfo>(data.ReadParcelable<ResourceCallbackInfo>()); 245 if (!resourceCallbackInfo) { 246 BGTASK_LOGE("HandleOnAppEfficiencyResourcesApply ReadParcelable failed"); 247 return ERR_BGTASK_PARCELABLE_FAILED; 248 } 249 OnAppEfficiencyResourcesApply(resourceCallbackInfo); 250 return ERR_OK; 251 } 252 HandleOnAppEfficiencyResourcesReset(MessageParcel & data)253 ErrCode BackgroundTaskSubscriberStub::HandleOnAppEfficiencyResourcesReset(MessageParcel &data) 254 { 255 std::shared_ptr<ResourceCallbackInfo> resourceCallbackInfo 256 = std::shared_ptr<ResourceCallbackInfo>(data.ReadParcelable<ResourceCallbackInfo>()); 257 if (!resourceCallbackInfo) { 258 BGTASK_LOGE("HandleOnAppEfficiencyResourcesReset ReadParcelable failed"); 259 return ERR_BGTASK_PARCELABLE_FAILED; 260 } 261 OnAppEfficiencyResourcesReset(resourceCallbackInfo); 262 return ERR_OK; 263 } 264 HandleOnProcEfficiencyResourcesApply(MessageParcel & data)265 ErrCode BackgroundTaskSubscriberStub::HandleOnProcEfficiencyResourcesApply(MessageParcel &data) 266 { 267 std::shared_ptr<ResourceCallbackInfo> resourceCallbackInfo 268 = std::shared_ptr<ResourceCallbackInfo>(data.ReadParcelable<ResourceCallbackInfo>()); 269 if (!resourceCallbackInfo) { 270 BGTASK_LOGE("HandleOnProcEfficiencyResourcesApply ContinuousTaskCallbackInfo ReadParcelable failed"); 271 return ERR_BGTASK_PARCELABLE_FAILED; 272 } 273 OnProcEfficiencyResourcesApply(resourceCallbackInfo); 274 return ERR_OK; 275 } 276 HandleOnProcEfficiencyResourcesReset(MessageParcel & data)277 ErrCode BackgroundTaskSubscriberStub::HandleOnProcEfficiencyResourcesReset(MessageParcel &data) 278 { 279 std::shared_ptr<ResourceCallbackInfo> resourceCallbackInfo 280 = std::shared_ptr<ResourceCallbackInfo>(data.ReadParcelable<ResourceCallbackInfo>()); 281 if (!resourceCallbackInfo) { 282 BGTASK_LOGE("HandleOnProcEfficiencyResourcesReset ReadParcelable failed"); 283 return ERR_BGTASK_PARCELABLE_FAILED; 284 } 285 OnProcEfficiencyResourcesReset(resourceCallbackInfo); 286 return ERR_OK; 287 } 288 } // namespace BackgroundTaskMgr 289 } // namespace OHOS