1 /*
2 * Copyright (c) 2024 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 "dsched_continue.h"
17
18 #include <chrono>
19 #include <sys/prctl.h>
20 #include <thread>
21
22 #include "ability_manager_client.h"
23 #include "bool_wrapper.h"
24 #include "bundle/bundle_manager_internal.h"
25 #include "continue_scene_session_handler.h"
26 #include "datetime_ex.h"
27 #include "dfx/distributed_radar.h"
28 #include "dfx/distributed_ue.h"
29 #include "dfx/dms_continue_time_dumper.h"
30 #include "distributed_sched_permission.h"
31 #include "distributed_sched_service.h"
32 #include "distributed_sched_utils.h"
33 #include "dsched_continue_event.h"
34 #include "dsched_continue_manager.h"
35 #include "dsched_data_buffer.h"
36 #include "dtbschedmgr_device_info_storage.h"
37 #include "dtbschedmgr_log.h"
38 #include "mission/distributed_bm_storage.h"
39 #include "ipc_skeleton.h"
40 #include "parcel_helper.h"
41 #ifdef SUPPORT_DISTRIBUTED_MISSION_MANAGER
42 #include "mission/dms_continue_send_manager.h"
43 #endif
44 #include "scene_board_judgement.h"
45 #include "softbus_adapter/transport/dsched_transport_softbus_adapter.h"
46 #include "softbus_error_code.h"
47
48 namespace OHOS {
49 namespace DistributedSchedule {
50 using namespace AAFwk;
51 namespace {
52 const std::string TAG = "DSchedContinue";
53 const std::string VERSION_CODE_KEY = "version";
54 const std::string DMS_SRC_NETWORK_ID = "dmsSrcNetworkId";
55 const std::string DMS_VERSION_ID = "dmsVersion";
56 const std::string SUPPORT_CONTINUE_PAGE_STACK_KEY = "ohos.extra.param.key.supportContinuePageStack";
57 const std::string SUPPORT_CONTINUE_SOURCE_EXIT_KEY = "ohos.extra.param.key.supportContinueSourceExit";
58 const std::string SUPPORT_CONTINUE_MODULE_NAME_UPDATE_KEY = "ohos.extra.param.key.supportContinueModuleNameUpdate";
59 const std::string DMSDURATION_SAVETIME = "ohos.dschedule.SaveDataTime";
60 const std::string DMS_PERSISTENT_ID = "ohos.dms.persistentId";
61 const std::string DMS_CONTINUE_SESSION_ID = "ohos.dms.continueSessionId";
62 const std::string QUICK_START_CONFIGURATION = "_ContinueQuickStart";
63 const std::u16string NAPI_MISSION_CALLBACK_INTERFACE_TOKEN = u"ohos.DistributedSchedule.IMissionCallback";
64
65 constexpr int32_t DSCHED_CONTINUE_PROTOCOL_VERSION = 1;
66 constexpr uint32_t MAX_MODULENAME_LEN = 2048;
67 constexpr int32_t DEFAULT_REQUEST_CODE = -1;
68 constexpr int32_t NOTIFY_MISSION_CALLBACK_RESULT = 4;
69 constexpr int32_t DMS_VERSION = 5;
70 constexpr int32_t START_PERMISSION = 0;
71
72 constexpr int32_t CONTINUE_BEGIN_TIME = 0;
73 constexpr int32_t CONTINUE_END_TIME = 1;
74 constexpr int32_t CONTINUE_TOTAL_TIME = 2;
75 constexpr int32_t CONTINUE_FIRST_TRANS_TIME = 3;
76 constexpr int32_t CONTINUE_DATA_TRANS_TIME = 5;
77 constexpr int32_t CONTINUE_START_ABILITY_TIME = 6;
78 constexpr int32_t GET_ABILITY_STATE_RETRY_TIMES = 40;
79 constexpr int32_t GET_ABILITY_STATE_SLEEP_TIME = 50;
80 }
81
82 const std::map<int32_t, int32_t> DSchedContinue::DMS_CONVERT_TO_SDK_ERR_MAP = {
83 std::map<int32_t, int32_t>::value_type(SoftBusErrNo::SOFTBUS_CONN_PASSIVE_TYPE_AP_STA_CHIP_CONFLICT,
84 DmsInterfaceSdkErr::ERR_BIND_REMOTE_HOTSPOT_ENABLE_STATE),
85 std::map<int32_t, int32_t>::value_type(SoftBusErrNo::SOFTBUS_CONN_PASSIVE_TYPE_AP_P2P_CHIP_CONFLICT,
86 DmsInterfaceSdkErr::ERR_BIND_REMOTE_HOTSPOT_ENABLE_STATE),
87 std::map<int32_t, int32_t>::value_type(SoftBusErrNo::SOFTBUS_CONN_PASSIVE_TYPE_AP_HML_CHIP_CONFLICT,
88 DmsInterfaceSdkErr::ERR_BIND_REMOTE_HOTSPOT_ENABLE_STATE),
89 std::map<int32_t, int32_t>::value_type(SoftBusErrNo::SOFTBUS_CONN_PASSIVE_TYPE_AP_STA_HML_CHIP_CONFLICT,
90 DmsInterfaceSdkErr::ERR_BIND_REMOTE_HOTSPOT_ENABLE_STATE),
91 std::map<int32_t, int32_t>::value_type(SoftBusErrNo::SOFTBUS_CONN_PASSIVE_TYPE_AP_STA_P2P_CHIP_CONFLICT,
92 DmsInterfaceSdkErr::ERR_BIND_REMOTE_HOTSPOT_ENABLE_STATE),
93 std::map<int32_t, int32_t>::value_type(SoftBusErrNo::SOFTBUS_CONN_PASSIVE_TYPE_AP_P2P_HML_CHIP_CONFLICT,
94 DmsInterfaceSdkErr::ERR_BIND_REMOTE_HOTSPOT_ENABLE_STATE),
95 std::map<int32_t, int32_t>::value_type(ERROR_PEER_THREE_VAP_CONFLICT,
96 DmsInterfaceSdkErr::ERR_BIND_REMOTE_HOTSPOT_ENABLE_STATE),
97
98 std::map<int32_t, int32_t>::value_type(SoftBusErrNo::SOFTBUS_CONN_PASSIVE_TYPE_HML_NUM_LIMITED_CONFLICT,
99 DmsInterfaceSdkErr::ERR_BIND_REMOTE_IN_BUSY_LINK),
100 std::map<int32_t, int32_t>::value_type(SoftBusErrNo::SOFTBUS_CONN_PV1_PEER_GC_CONNECTED_TO_ANOTHER_DEVICE,
101 DmsInterfaceSdkErr::ERR_BIND_REMOTE_IN_BUSY_LINK),
102 std::map<int32_t, int32_t>::value_type(SoftBusErrNo::SOFTBUS_CONN_PV2_PEER_GC_CONNECTED_TO_ANOTHER_DEVICE,
103 DmsInterfaceSdkErr::ERR_BIND_REMOTE_IN_BUSY_LINK),
104 std::map<int32_t, int32_t>::value_type(SoftBusErrNo::SOFTBUS_CONN_PASSIVE_TYPE_STA_P2P_HML_55_CONFLICT,
105 DmsInterfaceSdkErr::ERR_BIND_REMOTE_IN_BUSY_LINK),
106 std::map<int32_t, int32_t>::value_type(SoftBusErrNo::SOFTBUS_CONN_PASSIVE_TYPE_STA_P2P_HML_225_CONFLICT,
107 DmsInterfaceSdkErr::ERR_BIND_REMOTE_IN_BUSY_LINK),
108 std::map<int32_t, int32_t>::value_type(SoftBusErrNo::SOFTBUS_CONN_PASSIVE_TYPE_STA_P2P_HML_255_CONFLICT,
109 DmsInterfaceSdkErr::ERR_BIND_REMOTE_IN_BUSY_LINK),
110 std::map<int32_t, int32_t>::value_type(SoftBusErrNo::SOFTBUS_CONN_PASSIVE_TYPE_STA_P2P_HML_525_CONFLICT,
111 DmsInterfaceSdkErr::ERR_BIND_REMOTE_IN_BUSY_LINK),
112 std::map<int32_t, int32_t>::value_type(SoftBusErrNo::SOFTBUS_CONN_PASSIVE_TYPE_STA_P2P_HML_555_CONFLICT,
113 DmsInterfaceSdkErr::ERR_BIND_REMOTE_IN_BUSY_LINK),
114 std::map<int32_t, int32_t>::value_type(SoftBusErrNo::SOFTBUS_CONN_PASSIVE_TYPE_P2P_GO_GC_CONFLICT,
115 DmsInterfaceSdkErr::ERR_BIND_REMOTE_IN_BUSY_LINK),
116
117 std::map<int32_t, int32_t>::value_type(CONTINUE_ALREADY_IN_PROGRESS,
118 DmsInterfaceSdkErr::ERR_CONTINUE_ALREADY_IN_PROGRESS),
119 };
120
DSchedContinue(int32_t subServiceType,int32_t direction,const sptr<IRemoteObject> & callback,const DSchedContinueInfo & continueInfo)121 DSchedContinue::DSchedContinue(int32_t subServiceType, int32_t direction, const sptr<IRemoteObject>& callback,
122 const DSchedContinueInfo& continueInfo) : subServiceType_(subServiceType), direction_(direction),
123 continueInfo_(continueInfo), callback_(callback)
124 {
125 HILOGI("DSchedContinue create");
126 version_ = DSCHED_CONTINUE_PROTOCOL_VERSION;
127 continueByType_ = !continueInfo.continueType_.empty();
128
129 SetEventData();
130 NotifyDSchedEventResult(ERR_OK);
131 }
132
DSchedContinue(std::shared_ptr<DSchedContinueStartCmd> startCmd,int32_t sessionId)133 DSchedContinue::DSchedContinue(std::shared_ptr<DSchedContinueStartCmd> startCmd, int32_t sessionId)
134 {
135 HILOGI("DSchedContinue create by start command");
136 if (startCmd == nullptr) {
137 HILOGE("startCmd is null");
138 return;
139 }
140 version_ = startCmd->version_;
141 subServiceType_ = startCmd->subServiceType_;
142 continueByType_ = startCmd->continueByType_;
143 direction_ = (startCmd->direction_ == CONTINUE_SOURCE) ? CONTINUE_SINK : CONTINUE_SOURCE;
144 continueInfo_.sourceDeviceId_ = startCmd->srcDeviceId_;
145 continueInfo_.sourceBundleName_ = startCmd->srcBundleName_;
146 continueInfo_.sinkDeviceId_ = startCmd->dstDeviceId_;
147 continueInfo_.sinkBundleName_ = startCmd->dstBundleName_;
148 continueInfo_.continueType_ = startCmd->continueType_;
149 continueInfo_.missionId_ = startCmd->sourceMissionId_;
150 softbusSessionId_ = sessionId;
151 SetEventData();
152 NotifyDSchedEventResult(ERR_OK);
153 if (continueInfo_.sourceBundleName_.empty() && continueInfo_.sinkBundleName_.empty()
154 && continueInfo_.missionId_ != 0) {
155 MissionInfo missionInfo;
156 if (AbilityManagerClient::GetInstance()->GetMissionInfo("", continueInfo_.missionId_, missionInfo) != ERR_OK) {
157 HILOGE("get missionInfo failed");
158 return;
159 }
160 continueInfo_.sourceBundleName_ = missionInfo.want.GetBundle();
161 continueInfo_.sinkBundleName_ = missionInfo.want.GetBundle();
162 }
163 }
164
~DSchedContinue()165 DSchedContinue::~DSchedContinue()
166 {
167 HILOGI("DSchedContinue delete enter");
168 if ((eventHandler_ != nullptr) && (eventHandler_->GetEventRunner() != nullptr)) {
169 eventHandler_->GetEventRunner()->Stop();
170 }
171 eventThread_.join();
172 eventHandler_ = nullptr;
173 HILOGI("DSchedContinue delete end");
174 }
175
SetEventData()176 void DSchedContinue::SetEventData()
177 {
178 HILOGI("called");
179 ContinueEventInfo srcContinueInfo;
180 DmsBmStorage::GetInstance()->GetContinueEventInfo(continueInfo_.sourceDeviceId_, continueInfo_.sourceBundleName_,
181 continueInfo_.continueType_, srcContinueInfo);
182 ContinueEventInfo dstContinueInfo;
183 DmsBmStorage::GetInstance()->GetContinueEventInfo(continueInfo_.sinkDeviceId_, continueInfo_.sinkBundleName_,
184 continueInfo_.continueType_, dstContinueInfo);
185 eventData_.eventResult_ = 0;
186 eventData_.srcNetworkId_ = srcContinueInfo.networkId;
187 eventData_.srcBundleName_ = srcContinueInfo.bundleName;
188 eventData_.srcModuleName_ = srcContinueInfo.moduleName;
189 eventData_.srcAbilityName_ = srcContinueInfo.abilityName;
190 eventData_.dstNetworkId_ = dstContinueInfo.networkId;
191 eventData_.destBundleName_ = dstContinueInfo.bundleName;
192 eventData_.destModuleName_ = dstContinueInfo.moduleName;
193 eventData_.destAbilityName_ = dstContinueInfo.abilityName;
194 eventData_.developerId_ = srcContinueInfo.developerId;
195 eventData_.dSchedEventType_ = DMS_CONTINUE;
196 eventData_.state_ = DMS_DSCHED_EVENT_START;
197 }
198
Init()199 int32_t DSchedContinue::Init()
200 {
201 HILOGI("DSchedContinue init start");
202 if (eventHandler_ != nullptr) {
203 HILOGI("Already inited, end.");
204 return ERR_OK;
205 }
206 auto dContinue = std::shared_ptr<DSchedContinue>(shared_from_this());
207 stateMachine_ = std::make_shared<DSchedContinueStateMachine>(dContinue);
208 if (direction_ == CONTINUE_SOURCE) {
209 UpdateState(DSCHED_CONTINUE_SOURCE_START_STATE);
210 } else {
211 UpdateState(DSCHED_CONTINUE_SINK_START_STATE);
212 }
213
214 eventThread_ = std::thread(&DSchedContinue::StartEventHandler, this);
215 std::unique_lock<std::mutex> lock(eventMutex_);
216 eventCon_.wait(lock, [this] {
217 return eventHandler_ != nullptr;
218 });
219 HILOGI("DSchedContinue init end");
220 return ERR_OK;
221 }
222
StartEventHandler()223 void DSchedContinue::StartEventHandler()
224 {
225 HILOGI("called");
226 std::string eventThreadName = "DSchedContinue_EventHandler";
227 prctl(PR_SET_NAME, eventThreadName.c_str());
228 auto runner = AppExecFwk::EventRunner::Create(false);
229 if (runner == nullptr) {
230 HILOGE("continue start eventHandler failed.");
231 return;
232 }
233 {
234 std::lock_guard<std::mutex> lock(eventMutex_);
235 eventHandler_ = std::make_shared<DSchedContinueEventHandler>(runner, shared_from_this());
236 }
237 eventCon_.notify_one();
238 runner->Run();
239 }
240
OnContinueMission(const OHOS::AAFwk::WantParams & wantParams)241 int32_t DSchedContinue::OnContinueMission(const OHOS::AAFwk::WantParams& wantParams)
242 {
243 HILOGI("called");
244 return PostStartTask(wantParams);
245 }
246
PostStartTask(const OHOS::AAFwk::WantParams & wantParams)247 int32_t DSchedContinue::PostStartTask(const OHOS::AAFwk::WantParams& wantParams)
248 {
249 DSchedContinueEventType eventType = (subServiceType_ == CONTINUE_PULL) ?
250 DSCHED_CONTINUE_REQ_PULL_EVENT : DSHCED_CONTINUE_REQ_PUSH_EVENT;
251 HILOGI("PostStartTask %{public}d, continueInfo: %{public}s", eventType, continueInfo_.toString().c_str());
252 if (eventHandler_ == nullptr) {
253 HILOGE("PostStartTask eventHandler is nullptr");
254 return INVALID_PARAMETERS_ERR;
255 }
256
257 auto wantParamsPtr = std::make_shared<OHOS::AAFwk::WantParams>(wantParams);
258 auto msgEvent = AppExecFwk::InnerEvent::Get(eventType, wantParamsPtr, 0);
259 if (!eventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
260 HILOGE("PostStartTask eventHandler send event type %{public}d fail", eventType);
261 return CONTINUE_SEND_EVENT_FAILED;
262 }
263 return ERR_OK;
264 }
265
OnStartCmd(int32_t appVersion)266 int32_t DSchedContinue::OnStartCmd(int32_t appVersion)
267 {
268 HILOGI("called");
269 return PostCotinueAbilityTask(appVersion);
270 }
271
PostCotinueAbilityTask(int32_t appVersion)272 int32_t DSchedContinue::PostCotinueAbilityTask(int32_t appVersion)
273 {
274 DSchedContinueEventType eventType = DSHCED_CONTINUE_ABILITY_EVENT;
275 HILOGI("PostCotinueAbilityTask %{public}d, continueInfo %{public}s", eventType,
276 continueInfo_.toString().c_str());
277 if (eventHandler_ == nullptr) {
278 HILOGE("PostCotinueAbilityTask eventHandler is nullptr");
279 return INVALID_PARAMETERS_ERR;
280 }
281 auto data = std::make_shared<int32_t>(appVersion);
282 auto msgEvent = AppExecFwk::InnerEvent::Get(eventType, data, 0);
283 if (!eventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
284 HILOGE("PostCotinueAbilityTask eventHandler send event type %{public}d fail", eventType);
285 return CONTINUE_SEND_EVENT_FAILED;
286 }
287 return ERR_OK;
288 }
289
OnReplyCmd(std::shared_ptr<DSchedContinueReplyCmd> cmd)290 int32_t DSchedContinue::OnReplyCmd(std::shared_ptr<DSchedContinueReplyCmd> cmd)
291 {
292 HILOGI("called");
293 return PostReplyTask(cmd);
294 }
295
PostReplyTask(std::shared_ptr<DSchedContinueReplyCmd> cmd)296 int32_t DSchedContinue::PostReplyTask(std::shared_ptr<DSchedContinueReplyCmd> cmd)
297 {
298 if (cmd == nullptr) {
299 HILOGE("cmd is null");
300 return INVALID_PARAMETERS_ERR;
301 }
302 HILOGI("PostReplyTask called, replyCmd: %{public}d, result: %{public}d, reason: %{public}s", cmd->replyCmd_,
303 cmd->result_, cmd->reason_.c_str());
304
305 DSchedContinueEventType eventType = DSCHED_CONTINUE_INVALID_EVENT;
306 switch (cmd->replyCmd_) {
307 case DSCHED_CONTINUE_CMD_START: {
308 eventType = DSHCED_CONTINUE_ABILITY_EVENT;
309 break;
310 }
311 case DSCHED_CONTINUE_CMD_END: {
312 eventType = DSCHED_CONTINUE_END_EVENT;
313 break;
314 }
315 default:
316 HILOGW("PostReplyTask %{public}d, receive irrelevant reply to cmd %{public}d", eventType,
317 cmd->replyCmd_);
318 return ERR_OK;
319 }
320
321 HILOGI("PostReplyTask %{public}d, continueInfo %{public}s", eventType, continueInfo_.toString().c_str());
322 if (eventHandler_ == nullptr) {
323 HILOGE("PostReplyTask eventHandler is nullptr");
324 return INVALID_PARAMETERS_ERR;
325 }
326
327 auto result = std::make_shared<int32_t>(cmd->result_);
328 auto msgEvent = AppExecFwk::InnerEvent::Get(eventType, result, 0);
329 if (!eventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
330 HILOGE("PostReplyTask eventHandler send event type %{public}d fail", eventType);
331 return CONTINUE_SEND_EVENT_FAILED;
332 }
333 return ERR_OK;
334 }
335
OnStartContinuation(const OHOS::AAFwk::Want & want,int32_t callerUid,int32_t status,uint32_t accessToken)336 int32_t DSchedContinue::OnStartContinuation(const OHOS::AAFwk::Want& want, int32_t callerUid,
337 int32_t status, uint32_t accessToken)
338 {
339 HILOGI("called");
340 return PostContinueSendTask(want, callerUid, status, accessToken);
341 }
342
PostContinueSendTask(const OHOS::AAFwk::Want & want,int32_t callerUid,int32_t status,uint32_t accessToken)343 int32_t DSchedContinue::PostContinueSendTask(const OHOS::AAFwk::Want& want, int32_t callerUid, int32_t status,
344 uint32_t accessToken)
345 {
346 HILOGI("PostContinueSendTask called");
347 if (eventHandler_ == nullptr) {
348 HILOGE("eventHandler_ is nullptr");
349 return INVALID_PARAMETERS_ERR;
350 }
351 DSchedContinueEventType eventType = DSHCED_CONTINUE_SEND_DATA_EVENT;
352 if (status != ERR_OK) {
353 HILOGE("continuation has been rejected, status: %{public}d", status);
354 eventType = DSCHED_CONTINUE_END_EVENT;
355 auto result = std::make_shared<int32_t>(status);
356 auto msgEvent = AppExecFwk::InnerEvent::Get(eventType, result, 0);
357 if (!eventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
358 HILOGE("PostContinueSendTask eventHandler send event type %{public}d fail", eventType);
359 return CONTINUE_SEND_EVENT_FAILED;
360 }
361 return ERR_OK;
362 }
363
364 HILOGI("PostContinueSendTask %{public}d, continueInfo %{public}s", eventType, continueInfo_.toString().c_str());
365 if (eventHandler_ == nullptr) {
366 HILOGE("PostContinueSendTask eventHandler is nullptr");
367 return INVALID_PARAMETERS_ERR;
368 }
369 auto data = std::make_shared<ContinueAbilityData>();
370 data->want = want;
371 data->callerUid = callerUid;
372 data->accessToken = accessToken;
373
374 auto msgEvent = AppExecFwk::InnerEvent::Get(eventType, data, 0);
375 if (!eventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
376 HILOGE("PostContinueSendTask eventHandler send event type %{public}d fail", eventType);
377 return CONTINUE_SEND_EVENT_FAILED;
378 }
379 return ERR_OK;
380 }
381
OnContinueDataCmd(std::shared_ptr<DSchedContinueDataCmd> cmd)382 int32_t DSchedContinue::OnContinueDataCmd(std::shared_ptr<DSchedContinueDataCmd> cmd)
383 {
384 HILOGI("called");
385 return PostContinueDataTask(cmd);
386 }
387
PostContinueDataTask(std::shared_ptr<DSchedContinueDataCmd> cmd)388 int32_t DSchedContinue::PostContinueDataTask(std::shared_ptr<DSchedContinueDataCmd> cmd)
389 {
390 DSchedContinueEventType eventType = DSCHED_CONTINUE_DATA_EVENT;
391 HILOGI("PostContinueDataTask %{public}d, continueInfo %{public}s", eventType, continueInfo_.toString().c_str());
392 if (eventHandler_ == nullptr) {
393 HILOGE("PostContinueDataTask eventHandler is nullptr");
394 return INVALID_PARAMETERS_ERR;
395 }
396
397 auto msgEvent = AppExecFwk::InnerEvent::Get(eventType, cmd, 0);
398 if (!eventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
399 HILOGE("PostContinueDataTask eventHandler send event type %{public}d fail", eventType);
400 return CONTINUE_SEND_EVENT_FAILED;
401 }
402 return ERR_OK;
403 }
404
OnNotifyComplete(int32_t missionId,bool isSuccess)405 int32_t DSchedContinue::OnNotifyComplete(int32_t missionId, bool isSuccess)
406 {
407 HILOGI("called");
408 if (!isSuccess) {
409 HILOGE("start ability not success");
410 PostNotifyCompleteTask(CONTINUE_CALL_START_ABILITY_FAILED);
411 return ERR_OK;
412 }
413 if (missionId <= 0) {
414 HILOGE("start ability returns invalid missionId");
415 PostNotifyCompleteTask(INVALID_PARAMETERS_ERR);
416 return ERR_OK;
417 }
418 PostNotifyCompleteTask(ERR_OK);
419 return ERR_OK;
420 }
421
OnContinueEndCmd(std::shared_ptr<DSchedContinueEndCmd> cmd)422 int32_t DSchedContinue::OnContinueEndCmd(std::shared_ptr<DSchedContinueEndCmd> cmd)
423 {
424 HILOGI("called");
425 if (cmd == nullptr) {
426 HILOGE("cmd is null");
427 return INVALID_PARAMETERS_ERR;
428 }
429 return PostNotifyCompleteTask(cmd->result_);
430 }
431
PostNotifyCompleteTask(int32_t result)432 int32_t DSchedContinue::PostNotifyCompleteTask(int32_t result)
433 {
434 DSchedContinueEventType eventType = DSCHED_CONTINUE_COMPLETE_EVENT;
435 HILOGI("PostNotifyCompleteTask %{public}d, continueInfo %{public}s", eventType,
436 continueInfo_.toString().c_str());
437
438 if (eventHandler_ == nullptr) {
439 HILOGE("PostNotifyCompleteTask eventHandler is nullptr");
440 return INVALID_PARAMETERS_ERR;
441 }
442
443 auto data = std::make_shared<int32_t>(result);
444 auto msgEvent = AppExecFwk::InnerEvent::Get(eventType, data, 0);
445 if (!eventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
446 HILOGE("PostNotifyCompleteTask eventHandler send event type %{public}d fail", eventType);
447 return CONTINUE_SEND_EVENT_FAILED;
448 }
449 return ERR_OK;
450 }
451
OnContinueEnd(int32_t result)452 int32_t DSchedContinue::OnContinueEnd(int32_t result)
453 {
454 HILOGI("called");
455 return PostContinueEndTask(result);
456 }
457
PostContinueEndTask(int32_t result)458 int32_t DSchedContinue::PostContinueEndTask(int32_t result)
459 {
460 DSchedContinueEventType eventType = DSCHED_CONTINUE_END_EVENT;
461 HILOGI("PostContinueEndTask %{public}d, continueInfo %{public}s", eventType, continueInfo_.toString().c_str());
462 if (eventHandler_ == nullptr) {
463 HILOGE("PostContinueEndTask eventHandler is nullptr");
464 return INVALID_PARAMETERS_ERR;
465 }
466
467 auto data = std::make_shared<int32_t>(result);
468 auto msgEvent = AppExecFwk::InnerEvent::Get(eventType, data, 0);
469 if (!eventHandler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
470 HILOGE("PostContinueEndTask eventHandler send event type %{public}d fail", eventType);
471 return CONTINUE_SEND_EVENT_FAILED;
472 }
473 return ERR_OK;
474 }
475
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)476 void DSchedContinue::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event)
477 {
478 if (event == nullptr || stateMachine_ == nullptr) {
479 HILOGE("event or state machine is null");
480 return;
481 }
482 auto eventId = event->GetInnerEventId();
483 HILOGI("process event %{public}d with state %{public}d", eventId, stateMachine_->GetStateType());
484 int32_t ret = stateMachine_->Execute(event);
485 if (ret != ERR_OK) {
486 HILOGE("event %{public}d execute failed, ret %{public}d", eventId, ret);
487 OnContinueEnd(ret);
488 }
489 return;
490 }
491
ExecuteContinueReq(std::shared_ptr<DistributedWantParams> wantParams)492 int32_t DSchedContinue::ExecuteContinueReq(std::shared_ptr<DistributedWantParams> wantParams)
493 {
494 HILOGI("ExecuteContinueReq start, continueInfo: %{public}s", continueInfo_.toString().c_str());
495 DurationDumperStart();
496
497 std::string peerDeviceId = (direction_ == CONTINUE_SOURCE) ?
498 continueInfo_.sinkDeviceId_ : continueInfo_.sourceDeviceId_;
499
500 DmsRadar::GetInstance().ClickIconDmsContinue("ContinueMission", ERR_OK, peerDeviceId,
501 continueInfo_.sourceBundleName_, continueInfo_.sinkBundleName_);
502
503 DmsUE::GetInstance().TriggerDmsContinue(continueInfo_.sinkBundleName_, continueInfo_.sinkAbilityName_,
504 continueInfo_.sourceDeviceId_, ERR_OK);
505
506 if (subServiceType_ == CONTINUE_PULL && CheckQuickStartConfiguration()) {
507 QuickStartAbility();
508 }
509
510 int32_t ret = DSchedTransportSoftbusAdapter::GetInstance().ConnectDevice(peerDeviceId, softbusSessionId_);
511 if (ret != ERR_OK) {
512 HILOGE("ExecuteContinueReq connect peer device %{public}s failed, ret %{public}d",
513 GetAnonymStr(peerDeviceId).c_str(), ret);
514 return ret;
515 }
516 HILOGI("ExecuteContinueReq peer %{public}s connected, sessionId %{public}d",
517 GetAnonymStr(peerDeviceId).c_str(), softbusSessionId_);
518
519 auto startCmd = std::make_shared<DSchedContinueStartCmd>();
520 ret = PackStartCmd(startCmd, wantParams);
521 if (ret != ERR_OK) {
522 HILOGE("ExecuteContinueReq pack start cmd failed, ret %{public}d", ret);
523 return ret;
524 }
525 ret = SendCommand(startCmd);
526 if (ret != ERR_OK) {
527 HILOGE("ExecuteContinueReq send start cmd failed, ret %{public}d", ret);
528 return ret;
529 }
530 if (direction_ == CONTINUE_SINK) {
531 UpdateState(DSCHED_CONTINUE_DATA_STATE);
532 DmsContinueTime::GetInstance().SetDurationEnd(CONTINUE_FIRST_TRANS_TIME, GetTickCount());
533 }
534 HILOGI("ExecuteContinueReq end");
535 return ERR_OK;
536 }
537
CheckQuickStartConfiguration()538 bool DSchedContinue::CheckQuickStartConfiguration()
539 {
540 std::string continueType = continueInfo_.continueType_;
541 std::string suffix = QUICK_START_CONFIGURATION;
542
543 if (suffix.length() > continueType.length()) {
544 return false;
545 }
546 return (continueType.rfind(suffix) == (continueType.length() - suffix.length()));
547 }
548
QuickStartAbility()549 int32_t DSchedContinue::QuickStartAbility()
550 {
551 HILOGI("called");
552 if (!Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
553 HILOGE("sceneBoard not available.");
554 return INVALID_PARAMETERS_ERR;
555 }
556
557 std::string abilityName = QuerySinkAbilityName();
558 if (abilityName.empty()) {
559 HILOGE("QuickStartAbility failed.");
560 return INVALID_PARAMETERS_ERR;
561 }
562 ContinueSceneSessionHandler::GetInstance().UpdateContinueSessionId(continueInfo_.sinkBundleName_, abilityName);
563 std::string continueSessionId = ContinueSceneSessionHandler::GetInstance().GetContinueSessionId();
564 HILOGI("continueSessionId is %{public}s", continueSessionId.c_str());
565
566 AAFwk::Want want;
567 want.SetElementName(continueInfo_.sinkBundleName_, abilityName);
568 want.SetParam(DMS_CONTINUE_SESSION_ID, continueSessionId);
569 want.SetFlags(AAFwk::Want::FLAG_ABILITY_PREPARE_CONTINUATION);
570
571 return StartAbility(want, DEFAULT_REQUEST_CODE);
572 }
573
QuerySinkAbilityName()574 std::string DSchedContinue::QuerySinkAbilityName()
575 {
576 std::string abilityName = GetAbilityNameByContinueType();
577 if (!abilityName.empty()) {
578 return abilityName;
579 }
580
581 AppExecFwk::BundleInfo localBundleInfo;
582 if (BundleManagerInternal::GetLocalBundleInfo(continueInfo_.sinkBundleName_, localBundleInfo) != ERR_OK) {
583 HILOGE("get local bundle info failed.");
584 return abilityName;
585 }
586 if (localBundleInfo.abilityInfos.empty() || localBundleInfo.abilityInfos.size() > 1) {
587 HILOGE("quick start is not supported, abilityInfos size: %{public}d",
588 static_cast<int32_t>(localBundleInfo.abilityInfos.size()));
589 return abilityName;
590 }
591
592 return localBundleInfo.abilityInfos.front().name;
593 }
594
GetAbilityNameByContinueType()595 std::string DSchedContinue::GetAbilityNameByContinueType()
596 {
597 std::string continueType = continueInfo_.continueType_;
598 if (CheckQuickStartConfiguration()) {
599 continueType = continueType.substr(0, continueType.rfind(QUICK_START_CONFIGURATION));
600 }
601 std::string abilityName = BundleManagerInternal::GetAbilityName(continueInfo_.sinkDeviceId_,
602 continueInfo_.sinkBundleName_, continueType);
603 if (!abilityName.empty()) {
604 return abilityName;
605 }
606
607 continueType += QUICK_START_CONFIGURATION;
608 abilityName = BundleManagerInternal::GetAbilityName(continueInfo_.sinkDeviceId_,
609 continueInfo_.sinkBundleName_, continueType);
610 return abilityName;
611 }
612
DurationDumperStart()613 void DSchedContinue::DurationDumperStart()
614 {
615 DmsContinueTime::GetInstance().Init();
616 DmsContinueTime::GetInstance().SetNetWorkId(continueInfo_.sourceDeviceId_, continueInfo_.sinkDeviceId_);
617 DmsContinueTime::GetInstance().SetPull(subServiceType_ == CONTINUE_PULL);
618
619 std::string strBeginTime = DmsContinueTime::GetInstance().GetCurrentTime();
620 DmsContinueTime::GetInstance().SetDurationStrTime(CONTINUE_BEGIN_TIME, strBeginTime);
621 int64_t tick = GetTickCount();
622 DmsContinueTime::GetInstance().SetDurationBegin(CONTINUE_TOTAL_TIME, tick);
623 DmsContinueTime::GetInstance().SetDurationBegin(CONTINUE_FIRST_TRANS_TIME, tick);
624 }
625
PackStartCmd(std::shared_ptr<DSchedContinueStartCmd> & cmd,std::shared_ptr<DistributedWantParams> wantParams)626 int32_t DSchedContinue::PackStartCmd(std::shared_ptr<DSchedContinueStartCmd>& cmd,
627 std::shared_ptr<DistributedWantParams> wantParams)
628 {
629 if (cmd == nullptr || wantParams == nullptr) {
630 HILOGE("cmd or wantParams is null");
631 return INVALID_PARAMETERS_ERR;
632 }
633 cmd->version_ = version_;
634 cmd->serviceType_ = SERVICE_TYPE_CONTINUE;
635 cmd->subServiceType_ = subServiceType_;
636 cmd->command_ = DSCHED_CONTINUE_CMD_START;
637 cmd->srcDeviceId_ = continueInfo_.sourceDeviceId_;
638 cmd->srcBundleName_ = continueInfo_.sourceBundleName_;
639 cmd->dstDeviceId_ = continueInfo_.sinkDeviceId_;
640 cmd->dstBundleName_ = continueInfo_.sinkBundleName_;
641 cmd->continueType_ = continueInfo_.continueType_;
642 cmd->sourceMissionId_ = continueInfo_.missionId_;
643 cmd->continueByType_ = continueByType_;
644 cmd->dmsVersion_ = DMS_VERSION;
645
646 cmd->direction_ = direction_;
647 if (subServiceType_ == CONTINUE_PULL && continueInfo_.missionId_ == 0) {
648 AppExecFwk::BundleInfo localBundleInfo;
649 int32_t ret = BundleManagerInternal::GetLocalBundleInfoV9(continueInfo_.sinkBundleName_, localBundleInfo);
650 if (ret != ERR_OK) {
651 HILOGE("pack start cmd failed, the bundle is not installed on local device.");
652 return ret;
653 }
654 cmd->appVersion_ = static_cast<int32_t>(localBundleInfo.versionCode);
655 }
656 cmd->wantParams_ = *wantParams;
657 return ERR_OK;
658 }
659
ExecuteContinueAbility(int32_t appVersion)660 int32_t DSchedContinue::ExecuteContinueAbility(int32_t appVersion)
661 {
662 HILOGI("ExecuteContinueAbility start, appVersion: %{public}d", appVersion);
663 DmsRadar::GetInstance().SaveDataDmsContinue("ContinueAbility", ERR_OK);
664
665 int32_t result = GetMissionIdByBundleName();
666 if (result != ERR_OK) {
667 HILOGE("ExecuteContinueAbility GetMissionIdByBundleName failed");
668 return result;
669 }
670
671 result = CheckContinueAbilityPermission();
672 if (result != ERR_OK) {
673 HILOGE("ExecuteContinueAbility CheckContinueAbilityPermission failed");
674 return result;
675 }
676
677 auto tick = GetTickCount();
678 DmsContinueTime::GetInstance().SetDurationEnd(CONTINUE_FIRST_TRANS_TIME, tick);
679 DmsContinueTime::GetInstance().SetSaveDataDurationBegin(tick);
680
681 HILOGI("ExecuteContinueAbility call continueAbility begin, continueInfo: %{public}s",
682 continueInfo_.toString().c_str());
683 result = AbilityManagerClient::GetInstance()->ContinueAbility(continueInfo_.sinkDeviceId_,
684 continueInfo_.missionId_, appVersion);
685 HILOGI("ExecuteContinueAbility call continueAbility end, result: %{public}d.", result);
686
687 if (result != ERR_OK) {
688 return CONTINUE_CALL_CONTINUE_ABILITY_FAILED;
689 }
690 UpdateState(DSCHED_CONTINUE_ABILITY_STATE);
691 HILOGI("ExecuteContinueAbility end");
692 return result;
693 }
694
GetMissionIdByBundleName()695 int32_t DSchedContinue::GetMissionIdByBundleName()
696 {
697 #ifdef SUPPORT_DISTRIBUTED_MISSION_MANAGER
698 if (continueInfo_.missionId_ == 0) {
699 return DMSContinueSendMgr::GetInstance().GetMissionIdByBundleName(continueInfo_.sourceBundleName_,
700 continueInfo_.missionId_);
701 }
702 #endif
703 return ERR_OK;
704 }
705
CheckContinueAbilityPermission()706 int32_t DSchedContinue::CheckContinueAbilityPermission()
707 {
708 if (!CheckBundleContinueConfig(continueInfo_.sourceBundleName_)) {
709 HILOGI("App does not allow continue in config file, bundle name %{public}s",
710 continueInfo_.sourceBundleName_.c_str());
711 return REMOTE_DEVICE_BIND_ABILITY_ERR;
712 }
713
714 MissionInfo missionInfo;
715 int32_t result = AbilityManagerClient::GetInstance()->GetMissionInfo("", continueInfo_.missionId_, missionInfo);
716 if (result != ERR_OK) {
717 HILOGE("get missionInfo failed");
718 return NO_MISSION_INFO_FOR_MISSION_ID;
719 }
720
721 if (missionInfo.continueState != AAFwk::ContinueState::CONTINUESTATE_ACTIVE) {
722 HILOGE("Mission continue state set to INACTIVE. Can't continue. Mission id: %{public}d",
723 continueInfo_.missionId_);
724 return MISSION_NOT_CONTINUE_ACTIVE;
725 }
726 return ERR_OK;
727 }
728
ExecuteContinueReply()729 int32_t DSchedContinue::ExecuteContinueReply()
730 {
731 HILOGI("ExecuteContinueReply start, continueInfo: %{public}s", continueInfo_.toString().c_str());
732
733 AppExecFwk::BundleInfo bundleInfo;
734 if (BundleManagerInternal::GetLocalBundleInfoV9(continueInfo_.sourceBundleName_, bundleInfo) != ERR_OK) {
735 HILOGE("ExecuteContinueReply get local bundleInfo failed, the bundle is not installed on local device.");
736 return INVALID_PARAMETERS_ERR;
737 }
738 auto cmd = std::make_shared<DSchedContinueReplyCmd>();
739 int32_t ret = PackReplyCmd(cmd, DSCHED_CONTINUE_CMD_START, bundleInfo.versionCode, ERR_OK, "ExecuteContinueReply");
740 if (ret != ERR_OK) {
741 HILOGE("ExecuteContinueReply pack reply cmd failed, ret %{public}d", ret);
742 return ret;
743 }
744 ret = SendCommand(cmd);
745 if (ret != ERR_OK) {
746 HILOGE("ExecuteContinueReply send reply cmd failed, ret %{public}d", ret);
747 return ret;
748 }
749
750 UpdateState(DSCHED_CONTINUE_DATA_STATE);
751 HILOGI("ExecuteContinueReply end");
752 return ERR_OK;
753 }
754
ExecuteContinueSend(std::shared_ptr<ContinueAbilityData> data)755 int32_t DSchedContinue::ExecuteContinueSend(std::shared_ptr<ContinueAbilityData> data)
756 {
757 HILOGI("ExecuteContinueSend start, continueInfo: %{public}s", continueInfo_.toString().c_str());
758 if (data == nullptr) {
759 return INVALID_PARAMETERS_ERR;
760 }
761 DurationDumperBeforeStartRemoteAbility();
762
763 SetCleanMissionFlag(data->want);
764
765 AAFwk::Want newWant = data->want;
766 if ((newWant.GetFlags() & AAFwk::Want::FLAG_ABILITY_CONTINUATION) == 0) {
767 HILOGE("StartContinuation want continuation flags invalid!");
768 return INVALID_REMOTE_PARAMETERS_ERR;
769 }
770
771 if (SetWantForContinuation(newWant) != ERR_OK) {
772 HILOGE("set new want failed");
773 return INVALID_PARAMETERS_ERR;
774 }
775
776 AppExecFwk::AbilityInfo abilityInfo;
777 CallerInfo callerInfo;
778 callerInfo.sourceDeviceId = continueInfo_.sourceDeviceId_;
779 callerInfo.uid = data->callerUid;
780 callerInfo.accessToken = data->accessToken;
781 if (!BundleManagerInternal::GetCallerAppIdFromBms(callerInfo.uid, callerInfo.callerAppId)) {
782 HILOGE("GetCallerAppIdFromBms failed");
783 return INVALID_PARAMETERS_ERR;
784 }
785 if (!BundleManagerInternal::GetBundleNameListFromBms(callerInfo.uid, callerInfo.bundleNames)) {
786 HILOGE("GetBundleNameListFromBms failed");
787 return INVALID_PARAMETERS_ERR;
788 }
789 callerInfo.extraInfoJson[DMS_VERSION_ID] = DMS_VERSION;
790 AccountInfo accountInfo;
791 int32_t ret = DistributedSchedPermission::GetInstance().GetAccountInfo(continueInfo_.sinkDeviceId_, callerInfo,
792 accountInfo);
793 if (ret != ERR_OK) {
794 HILOGE("GetAccountInfo failed");
795 return ret;
796 }
797
798 auto cmd = std::make_shared<DSchedContinueDataCmd>();
799 PackDataCmd(cmd, newWant, abilityInfo, callerInfo, accountInfo);
800 ret = SendCommand(cmd);
801 DmsRadar::GetInstance().SaveDataDmsRemoteWant("SendContinueData", ret);
802 if (ret != ERR_OK) {
803 HILOGE("ExecuteContinueSend send data cmd failed, ret %{public}d", ret);
804 return ret;
805 }
806
807 DmsContinueTime::GetInstance().SetDurationEnd(CONTINUE_DATA_TRANS_TIME, GetTickCount());
808 UpdateState(DSCHED_CONTINUE_SOURCE_WAIT_END_STATE);
809 HILOGI("ExecuteContinueSend end");
810 return ERR_OK;
811 }
812
DurationDumperBeforeStartRemoteAbility()813 void DSchedContinue::DurationDumperBeforeStartRemoteAbility()
814 {
815 auto tick = GetTickCount();
816 DmsContinueTime::GetInstance().SetSaveDataDurationEnd(tick);
817 DmsContinueTime::GetInstance().SetDurationBegin(CONTINUE_DATA_TRANS_TIME, tick);
818 DmsContinueTime::GetInstance().SetDurationBegin(CONTINUE_START_ABILITY_TIME, tick);
819 }
820
SetCleanMissionFlag(const OHOS::AAFwk::Want & want)821 void DSchedContinue::SetCleanMissionFlag(const OHOS::AAFwk::Want& want)
822 {
823 auto value = want.GetParams().GetParam(SUPPORT_CONTINUE_SOURCE_EXIT_KEY);
824 IBoolean *ao = IBoolean::Query(value);
825 if (ao != nullptr) {
826 isSourceExit_ = AAFwk::Boolean::Unbox(ao);
827 }
828 }
829
SetWantForContinuation(AAFwk::Want & newWant)830 int32_t DSchedContinue::SetWantForContinuation(AAFwk::Want& newWant)
831 {
832 newWant.SetParam("sessionId", continueInfo_.missionId_);
833 newWant.SetParam("deviceId", continueInfo_.sourceDeviceId_);
834
835 AppExecFwk::BundleInfo localBundleInfo;
836 if (BundleManagerInternal::GetLocalBundleInfo(newWant.GetBundle(), localBundleInfo) != ERR_OK) {
837 HILOGE("get local bundle info failed");
838 return INVALID_PARAMETERS_ERR;
839 }
840 newWant.SetParam(VERSION_CODE_KEY, static_cast<int32_t>(localBundleInfo.versionCode));
841 HILOGD("local version = %{public}u!", localBundleInfo.versionCode);
842
843 bool isPageStackContinue = newWant.GetBoolParam(SUPPORT_CONTINUE_PAGE_STACK_KEY, true);
844 std::string moduleName = newWant.GetStringParam(SUPPORT_CONTINUE_MODULE_NAME_UPDATE_KEY);
845 if (!isPageStackContinue && !moduleName.empty() && moduleName.length() <= MAX_MODULENAME_LEN) {
846 HILOGD("set application moduleName = %{public}s!", moduleName.c_str());
847 auto element = newWant.GetElement();
848 newWant.SetElementName(element.GetDeviceID(), element.GetBundleName(), element.GetAbilityName(), moduleName);
849 }
850
851 std::string saveDataTime =
852 DmsContinueTime::GetInstance().WriteDurationInfo(DmsContinueTime::GetInstance().GetSaveDataDuration());
853 newWant.SetParam(DMSDURATION_SAVETIME, saveDataTime);
854 if (subServiceType_ == CONTINUE_PUSH) {
855 DmsContinueTime::GetInstance().SetSrcBundleName(continueInfo_.sourceBundleName_);
856 DmsContinueTime::GetInstance().SetSrcAbilityName(newWant.GetElement().GetAbilityName());
857 DmsContinueTime::GetInstance().SetDstBundleName(continueInfo_.sinkBundleName_);
858 DmsContinueTime::GetInstance().SetDstAbilityName(newWant.GetElement().GetAbilityName());
859 }
860 return ERR_OK;
861 }
862
PackDataCmd(std::shared_ptr<DSchedContinueDataCmd> & cmd,const OHOS::AAFwk::Want & want,const AppExecFwk::AbilityInfo & abilityInfo,const CallerInfo & callerInfo,const AccountInfo & accountInfo)863 int32_t DSchedContinue::PackDataCmd(std::shared_ptr<DSchedContinueDataCmd>& cmd,
864 const OHOS::AAFwk::Want& want, const AppExecFwk::AbilityInfo& abilityInfo, const CallerInfo& callerInfo,
865 const AccountInfo& accountInfo)
866 {
867 if (cmd == nullptr) {
868 HILOGE("cmd is null");
869 return INVALID_PARAMETERS_ERR;
870 }
871 cmd->version_ = version_;
872 cmd->serviceType_ = SERVICE_TYPE_CONTINUE;
873 cmd->subServiceType_ = subServiceType_;
874 cmd->command_ = DSCHED_CONTINUE_CMD_DATA;
875 cmd->srcDeviceId_ = continueInfo_.sourceDeviceId_;
876 cmd->srcBundleName_ = continueInfo_.sourceBundleName_;
877 cmd->dstDeviceId_ = continueInfo_.sinkDeviceId_;
878 cmd->dstBundleName_ = continueInfo_.sinkBundleName_;
879 cmd->continueType_ = continueInfo_.continueType_;
880 cmd->sourceMissionId_ = continueInfo_.missionId_;
881 cmd->continueByType_ = continueByType_;
882 cmd->dmsVersion_ = DMS_VERSION;
883
884 cmd->want_ = want;
885 AppExecFwk::CompatibleAbilityInfo compatibleAbilityInfo;
886 abilityInfo.ConvertToCompatiableAbilityInfo(compatibleAbilityInfo);
887 cmd->abilityInfo_ = compatibleAbilityInfo;
888 cmd->callerInfo_ = callerInfo;
889 cmd->accountInfo_ = accountInfo;
890 cmd->requestCode_ = DEFAULT_REQUEST_CODE;
891
892 AppExecFwk::AppProvisionInfo appProvisionInfo;
893 BundleManagerInternal::GetAppProvisionInfo4CurrentUser(cmd->srcBundleName_, appProvisionInfo);
894 cmd->srcDeveloperId_ = appProvisionInfo.developerId;
895 return ERR_OK;
896 }
897
CheckStartPermission(std::shared_ptr<DSchedContinueDataCmd> cmd)898 int32_t DSchedContinue::CheckStartPermission(std::shared_ptr<DSchedContinueDataCmd> cmd)
899 {
900 if (cmd->srcBundleName_ == cmd->dstBundleName_) {
901 return DistributedSchedService::GetInstance().CheckTargetPermission(cmd->want_, cmd->callerInfo_,
902 cmd->accountInfo_, START_PERMISSION, true);
903 } else {
904 if (!BundleManagerInternal::IsSameDeveloperId(cmd->dstBundleName_, cmd->srcDeveloperId_)) {
905 return INVALID_PARAMETERS_ERR;
906 }
907 return DistributedSchedService::GetInstance().CheckTargetPermission4DiffBundle(cmd->want_, cmd->callerInfo_,
908 cmd->accountInfo_, START_PERMISSION, true);
909 }
910 }
911
ExecuteContinueData(std::shared_ptr<DSchedContinueDataCmd> cmd)912 int32_t DSchedContinue::ExecuteContinueData(std::shared_ptr<DSchedContinueDataCmd> cmd)
913 {
914 HILOGI("ExecuteContinueData start, continueInfo: %{public}s", continueInfo_.toString().c_str());
915 if (cmd == nullptr) {
916 HILOGE("cmd is null");
917 return INVALID_PARAMETERS_ERR;
918 }
919
920 DurationDumperBeforeStartAbility(cmd);
921
922 std::string localDeviceId;
923 std::string deviceId = cmd->want_.GetElement().GetDeviceID();
924 if (!GetLocalDeviceId(localDeviceId) ||
925 !CheckDeviceIdFromRemote(localDeviceId, deviceId, cmd->callerInfo_.sourceDeviceId)) {
926 HILOGE("check deviceId failed");
927 return INVALID_REMOTE_PARAMETERS_ERR;
928 }
929 int32_t ret = CheckStartPermission(cmd);
930 if (ret != ERR_OK) {
931 HILOGE("ExecuteContinueData CheckTargetPermission failed!");
932 return ret;
933 }
934
935 OHOS::AAFwk::Want want = cmd->want_;
936 UpdateWantForContinueType(want);
937 if (subServiceType_ == CONTINUE_PULL &&
938 !ContinueSceneSessionHandler::GetInstance().GetContinueSessionId().empty()) {
939 int32_t persistentId;
940 if (ContinueSceneSessionHandler::GetInstance().GetPersistentId(persistentId) != ERR_OK) {
941 HILOGE("get persistentId failed, stop start ability");
942 return OnContinueEnd(ERR_OK);
943 }
944 HILOGI("get persistentId success, persistentId: %{public}d", persistentId);
945 WaitAbilityStateInitial(persistentId);
946 want.SetParam(DMS_PERSISTENT_ID, persistentId);
947
948 if (ContinueSceneSessionHandler::GetInstance().GetPersistentId(persistentId) != ERR_OK) {
949 HILOGE("get persistentId failed, stop start ability");
950 return OnContinueEnd(ERR_OK);
951 }
952 }
953
954 ret = StartAbility(want, cmd->requestCode_);
955 if (ret == ERR_OK) {
956 UpdateState(DSCHED_CONTINUE_SINK_WAIT_END_STATE);
957 HILOGI("ExecuteContinueData end");
958 }
959 return ret;
960 }
961
UpdateWantForContinueType(OHOS::AAFwk::Want & want)962 int32_t DSchedContinue::UpdateWantForContinueType(OHOS::AAFwk::Want& want)
963 {
964 std::string srcAbilityName = want.GetElement().GetAbilityName();
965 std::string sinkAbilityName = GetAbilityNameByContinueType();
966 if (!sinkAbilityName.empty() && sinkAbilityName != srcAbilityName) {
967 OHOS::AppExecFwk::ElementName element = want.GetElement();
968 want.SetElementName(element.GetDeviceID(), element.GetBundleName(), sinkAbilityName);
969 want.RemoveParam(SUPPORT_CONTINUE_PAGE_STACK_KEY);
970 want.SetParam(SUPPORT_CONTINUE_PAGE_STACK_KEY, false);
971
972 DmsContinueTime::GetInstance().SetDstAbilityName(sinkAbilityName);
973 }
974 return ERR_OK;
975 }
976
DurationDumperBeforeStartAbility(std::shared_ptr<DSchedContinueDataCmd> cmd)977 void DSchedContinue::DurationDumperBeforeStartAbility(std::shared_ptr<DSchedContinueDataCmd> cmd)
978 {
979 if (subServiceType_ == CONTINUE_PULL && cmd != nullptr) {
980 std::string timeInfo = cmd->want_.GetStringParam(DMSDURATION_SAVETIME);
981 DmsContinueTime::GetInstance().ReadDurationInfo(timeInfo.c_str());
982 DmsContinueTime::GetInstance().SetSrcBundleName(continueInfo_.sourceBundleName_);
983 DmsContinueTime::GetInstance().SetSrcAbilityName(cmd->want_.GetElement().GetAbilityName());
984 DmsContinueTime::GetInstance().SetDstBundleName(continueInfo_.sinkBundleName_);
985 DmsContinueTime::GetInstance().SetDstAbilityName(cmd->want_.GetElement().GetAbilityName());
986 }
987 DmsContinueTime::GetInstance().SetDurationBegin(CONTINUE_START_ABILITY_TIME, GetTickCount());
988 }
989
WaitAbilityStateInitial(int32_t persistentId)990 bool DSchedContinue::WaitAbilityStateInitial(int32_t persistentId)
991 {
992 int32_t retryTimeout = GET_ABILITY_STATE_RETRY_TIMES;
993 int32_t err;
994 do {
995 bool state = false;
996 err = AAFwk::AbilityManagerClient::GetInstance()->GetAbilityStateByPersistentId(persistentId, state);
997 if (err == ERR_OK && state) {
998 HILOGI("ability state initial.");
999 return state;
1000 }
1001 HILOGI("waiting ability state initial...");
1002 std::this_thread::sleep_for(std::chrono::milliseconds(GET_ABILITY_STATE_SLEEP_TIME));
1003 } while (--retryTimeout > 0);
1004
1005 HILOGE("wait timeout, persistentId: %{public}d, errorCode: %{public}d",
1006 persistentId, err);
1007 return false;
1008 }
1009
StartAbility(const OHOS::AAFwk::Want & want,int32_t requestCode)1010 int32_t DSchedContinue::StartAbility(const OHOS::AAFwk::Want& want, int32_t requestCode)
1011 {
1012 int32_t ret = AAFwk::AbilityManagerClient::GetInstance()->Connect();
1013 if (ret != ERR_OK) {
1014 HILOGE("connect ability server failed %{public}d", ret);
1015 return ret;
1016 }
1017
1018 int32_t activeAccountId = 0;
1019 ret = DistributedSchedService::GetInstance().QueryOsAccount(activeAccountId);
1020 if (ret != ERR_OK) {
1021 HILOGE("QueryOsAccount failed %{public}d", ret);
1022 return ret;
1023 }
1024
1025 continueInfo_.sinkAbilityName_ = want.GetElement().GetAbilityName();
1026 DmsRadar::GetInstance().ClickIconDmsStartAbility("StartAbility", ret);
1027
1028 HILOGI("call StartAbility start, flag is %{public}d", want.GetFlags());
1029 ret = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, DEFAULT_REQUEST_CODE, activeAccountId);
1030 if (ret != ERR_OK) {
1031 HILOGE("failed %{public}d", ret);
1032 return ret;
1033 }
1034 return ret;
1035 }
1036
ExecuteNotifyComplete(int32_t result)1037 int32_t DSchedContinue::ExecuteNotifyComplete(int32_t result)
1038 {
1039 HILOGI("ExecuteNotifyComplete start, result %{public}d", result);
1040 DmsContinueTime::GetInstance().SetDurationEnd(CONTINUE_START_ABILITY_TIME, GetTickCount());
1041
1042 int32_t ret = 0;
1043 if (direction_ == CONTINUE_SINK) {
1044 auto cmd = std::make_shared<DSchedContinueEndCmd>();
1045 PackEndCmd(cmd, result);
1046
1047 ret = SendCommand(cmd);
1048 if (ret != ERR_OK) {
1049 HILOGE("ExecuteNotifyComplete send end cmd failed, ret %{public}d", ret);
1050 return ret;
1051 }
1052
1053 UpdateState(DSCHED_CONTINUE_SINK_END_STATE);
1054 HILOGI("ExecuteNotifyComplete end");
1055 return ERR_OK;
1056 }
1057
1058 auto cmd = std::make_shared<DSchedContinueReplyCmd>();
1059 PackReplyCmd(cmd, DSCHED_CONTINUE_CMD_END, 0, result, "ExecuteNotifyComplete");
1060 ret = SendCommand(cmd);
1061 if (ret != ERR_OK) {
1062 HILOGE("ExecuteNotifyComplete send reply cmd failed, ret %{public}d", ret);
1063 return ret;
1064 }
1065
1066 UpdateState(DSCHED_CONTINUE_SOURCE_END_STATE);
1067 PostContinueEndTask(result);
1068
1069 HILOGI("ExecuteNotifyComplete end");
1070 return ERR_OK;
1071 }
1072
PackReplyCmd(std::shared_ptr<DSchedContinueReplyCmd> cmd,int32_t replyCmd,int32_t appVersion,int32_t result,const std::string reason)1073 int32_t DSchedContinue::PackReplyCmd(std::shared_ptr<DSchedContinueReplyCmd> cmd, int32_t replyCmd, int32_t appVersion,
1074 int32_t result, const std::string reason)
1075 {
1076 if (cmd == nullptr) {
1077 HILOGE("cmd is null");
1078 return INVALID_PARAMETERS_ERR;
1079 }
1080 cmd->version_ = version_;
1081 cmd->serviceType_ = SERVICE_TYPE_CONTINUE;
1082 cmd->subServiceType_ = subServiceType_;
1083 cmd->command_ = DSCHED_CONTINUE_CMD_REPLY;
1084 cmd->srcDeviceId_ = continueInfo_.sourceDeviceId_;
1085 cmd->srcBundleName_ = continueInfo_.sourceBundleName_;
1086 cmd->dstDeviceId_ = continueInfo_.sinkDeviceId_;
1087 cmd->dstBundleName_ = continueInfo_.sinkBundleName_;
1088 cmd->continueType_ = continueInfo_.continueType_;
1089 cmd->sourceMissionId_ = continueInfo_.missionId_;
1090 cmd->continueByType_ = continueByType_;
1091 cmd->dmsVersion_ = DMS_VERSION;
1092
1093 cmd->replyCmd_ = replyCmd;
1094 cmd->appVersion_ = appVersion;
1095 cmd->result_ = result;
1096 cmd->reason_ = reason;
1097 return ERR_OK;
1098 }
1099
ExecuteContinueEnd(int32_t result)1100 int32_t DSchedContinue::ExecuteContinueEnd(int32_t result)
1101 {
1102 HILOGI("ExecuteContinueEnd start, result %{public}d", result);
1103
1104 std::string peerDeviceId = (direction_ == CONTINUE_SOURCE) ?
1105 continueInfo_.sinkDeviceId_ : continueInfo_.sourceDeviceId_;
1106 if ((subServiceType_ == CONTINUE_PULL && direction_ == CONTINUE_SINK) ||
1107 (subServiceType_ == CONTINUE_PUSH && direction_ == CONTINUE_SOURCE)) {
1108 HILOGI("ExecuteContinueEnd disconnect peer device %{public}s", GetAnonymStr(peerDeviceId).c_str());
1109 DSchedTransportSoftbusAdapter::GetInstance().DisconnectDevice(peerDeviceId);
1110 }
1111
1112 eventData_.state_ = result != ERR_OK ? DMS_DSCHED_EVENT_STOP : DMS_DSCHED_EVENT_FINISH;
1113 if (result == ERR_OK && direction_ == CONTINUE_SOURCE && isSourceExit_) {
1114 int32_t ret = AbilityManagerClient::GetInstance()->CleanMission(continueInfo_.missionId_);
1115 HILOGD("ExecuteContinueEnd clean mission result: %{public}d", ret);
1116 }
1117
1118 if (direction_ == CONTINUE_SINK) {
1119 DmsRadar::GetInstance().ClickIconDmsRecvOver("NotifyContinuationResultFromRemote", result);
1120 }
1121
1122 NotifyContinuationCallbackResult(result);
1123 NotifyDSchedEventResult(result);
1124 DurationDumperComplete(result);
1125
1126 DSchedContinueManager::GetInstance().OnContinueEnd(continueInfo_);
1127 HILOGI("ExecuteContinueEnd end");
1128 return ERR_OK;
1129 }
1130
ConvertToDmsSdkErr(int32_t result)1131 int32_t DSchedContinue::ConvertToDmsSdkErr(int32_t result)
1132 {
1133 if (result == ERR_OK) {
1134 return result;
1135 }
1136
1137 auto it = DMS_CONVERT_TO_SDK_ERR_MAP.find(result);
1138 if (it != DMS_CONVERT_TO_SDK_ERR_MAP.end()) {
1139 return it->second;
1140 }
1141 return DmsInterfaceSdkErr::ERR_DMS_WORK_ABNORMALLY;
1142 }
1143
NotifyContinuationCallbackResult(int32_t result)1144 void DSchedContinue::NotifyContinuationCallbackResult(int32_t result)
1145 {
1146 HILOGD("continuation result is: %{public}d", result);
1147 if (callback_ == nullptr) {
1148 HILOGW("callback object null.");
1149 return;
1150 }
1151
1152 MessageParcel data;
1153 if (!data.WriteInterfaceToken(NAPI_MISSION_CALLBACK_INTERFACE_TOKEN)) {
1154 HILOGE("write token failed");
1155 return;
1156 }
1157 PARCEL_WRITE_HELPER_NORET(data, Int32, ConvertToDmsSdkErr(result));
1158 MessageParcel reply;
1159 MessageOption option;
1160 int32_t ret = callback_->SendRequest(NOTIFY_MISSION_CALLBACK_RESULT, data, reply, option);
1161 callback_ = nullptr;
1162 if (ret != ERR_OK) {
1163 HILOGE("send request failed, ret: %{public}d", ret);
1164 }
1165 return;
1166 }
1167
NotifyDSchedEventResult(int32_t result)1168 void DSchedContinue::NotifyDSchedEventResult(int32_t result)
1169 {
1170 result = (result == ERR_OK) ? ERR_OK : NOTIFYCOMPLETECONTINUATION_FAILED;
1171 DistributedSchedService::GetInstance().NotifyDSchedEventCallbackResult(result, eventData_);
1172 }
1173
DurationDumperComplete(int32_t result)1174 void DSchedContinue::DurationDumperComplete(int32_t result)
1175 {
1176 if (result != ERR_OK) {
1177 return;
1178 }
1179 if ((subServiceType_ == CONTINUE_PULL && direction_ == CONTINUE_SINK) ||
1180 (subServiceType_ == CONTINUE_PUSH && direction_ == CONTINUE_SOURCE)) {
1181 std::string strEndTime = DmsContinueTime::GetInstance().GetCurrentTime();
1182 DmsContinueTime::GetInstance().SetDurationEnd(CONTINUE_TOTAL_TIME, GetTickCount());
1183 DmsContinueTime::GetInstance().SetDurationStrTime(CONTINUE_END_TIME, strEndTime);
1184
1185 DmsUE::GetInstance().DmsContinueComplete(continueInfo_.sourceBundleName_, continueInfo_.sinkAbilityName_,
1186 continueInfo_.sourceDeviceId_, result);
1187
1188 DmsContinueTime::GetInstance().AppendInfo();
1189 DmsContinueTime::GetInstance().SetPull(false);
1190 }
1191 return;
1192 }
1193
ExecuteContinueError(int32_t result)1194 int32_t DSchedContinue::ExecuteContinueError(int32_t result)
1195 {
1196 HILOGI("start, result %{public}d", result);
1197 auto cmd = std::make_shared<DSchedContinueEndCmd>();
1198 PackEndCmd(cmd, result);
1199 SendCommand(cmd);
1200 if (direction_ == CONTINUE_SOURCE) {
1201 UpdateState(DSCHED_CONTINUE_SOURCE_END_STATE);
1202 } else {
1203 UpdateState(DSCHED_CONTINUE_SINK_END_STATE);
1204 }
1205 OnContinueEnd(result);
1206 HILOGI("ExecuteNotifyComplete end");
1207 return ERR_OK;
1208 }
1209
PackEndCmd(std::shared_ptr<DSchedContinueEndCmd> cmd,int32_t result)1210 int32_t DSchedContinue::PackEndCmd(std::shared_ptr<DSchedContinueEndCmd> cmd, int32_t result)
1211 {
1212 if (cmd == nullptr) {
1213 HILOGE("cmd is null");
1214 return INVALID_PARAMETERS_ERR;
1215 }
1216 cmd->version_ = version_;
1217 cmd->serviceType_ = SERVICE_TYPE_CONTINUE;
1218 cmd->subServiceType_ = subServiceType_;
1219 cmd->command_ = DSCHED_CONTINUE_CMD_END;
1220 cmd->srcDeviceId_ = continueInfo_.sourceDeviceId_;
1221 cmd->srcBundleName_ = continueInfo_.sourceBundleName_;
1222 cmd->dstDeviceId_ = continueInfo_.sinkDeviceId_;
1223 cmd->dstBundleName_ = continueInfo_.sinkBundleName_;
1224 cmd->continueType_ = continueInfo_.continueType_;
1225 cmd->sourceMissionId_ = continueInfo_.missionId_;
1226 cmd->continueByType_ = continueByType_;
1227 cmd->dmsVersion_ = DMS_VERSION;
1228
1229 cmd->result_ = result;
1230 return ERR_OK;
1231 }
1232
SendCommand(std::shared_ptr<DSchedContinueCmdBase> cmd)1233 int32_t DSchedContinue::SendCommand(std::shared_ptr<DSchedContinueCmdBase> cmd)
1234 {
1235 if (cmd == nullptr) {
1236 HILOGE("cmd is null");
1237 return INVALID_PARAMETERS_ERR;
1238 }
1239 HILOGI("SendCommand start, cmd %{public}d", cmd->command_);
1240 std::string jsonStr;
1241 int32_t ret = cmd->Marshal(jsonStr);
1242 if (ret != ERR_OK) {
1243 HILOGE("SendCommand marshal cmd %{public}d failed, ret %{public}d", cmd->command_, ret);
1244 return ret;
1245 }
1246 auto buffer = std::make_shared<DSchedDataBuffer>(jsonStr.length() + 1);
1247 ret = memcpy_s(buffer->Data(), buffer->Capacity(), jsonStr.c_str(), jsonStr.length());
1248 if (ret != ERR_OK) {
1249 HILOGE("SendCommand memcpy_s failed, cmd %{public}d, ret %{public}d", cmd->command_, ret);
1250 return ret;
1251 }
1252 ret = DSchedTransportSoftbusAdapter::GetInstance().SendData(softbusSessionId_, SERVICE_TYPE_CONTINUE, buffer);
1253 if (ret != ERR_OK) {
1254 HILOGE("SendCommand send data failed, cmd %{public}d, ret %{public}d", cmd->command_, ret);
1255 return ret;
1256 }
1257 HILOGI("SendCommand end, cmd %{public}d", cmd->command_);
1258 return ERR_OK;
1259 }
1260
GetSessionId()1261 int32_t DSchedContinue::GetSessionId()
1262 {
1263 return softbusSessionId_;
1264 }
1265
GetContinueInfo()1266 DSchedContinueInfo DSchedContinue::GetContinueInfo()
1267 {
1268 return continueInfo_;
1269 }
1270
GetLocalDeviceId(std::string & localDeviceId)1271 bool DSchedContinue::GetLocalDeviceId(std::string& localDeviceId)
1272 {
1273 if (!DtbschedmgrDeviceInfoStorage::GetInstance().GetLocalDeviceId(localDeviceId)) {
1274 HILOGE("GetLocalDeviceId failed");
1275 return false;
1276 }
1277 return true;
1278 }
1279
CheckDeviceIdFromRemote(const std::string & localDevId,const std::string & destDevId,const std::string & srcDevId)1280 bool DSchedContinue::CheckDeviceIdFromRemote(const std::string& localDevId, const std::string& destDevId,
1281 const std::string& srcDevId)
1282 {
1283 if (localDevId.empty() || destDevId.empty() || srcDevId.empty()) {
1284 HILOGE("CheckDeviceIdFromRemote failed");
1285 return false;
1286 }
1287 // destDevId set by remote must be same with localDevId
1288 if (localDevId != destDevId) {
1289 HILOGE("destDevId is not same with localDevId");
1290 return false;
1291 }
1292 HILOGD("CheckDeviceIdFromRemote srcDevId %{public}s", GetAnonymStr(srcDevId).c_str());
1293 HILOGD("CheckDeviceIdFromRemote localDevId %{public}s", GetAnonymStr(localDevId).c_str());
1294 HILOGD("CheckDeviceIdFromRemote destDevId %{public}s", GetAnonymStr(destDevId).c_str());
1295
1296 if (srcDevId == destDevId || srcDevId == localDevId) {
1297 HILOGE("destDevId is different with localDevId and destDevId");
1298 return false;
1299 }
1300
1301 if (srcDevId != continueInfo_.sourceDeviceId_) {
1302 HILOGE("srcDevId is not correct");
1303 return false;
1304 }
1305 return true;
1306 }
1307
OnDataRecv(int32_t command,std::shared_ptr<DSchedDataBuffer> dataBuffer)1308 void DSchedContinue::OnDataRecv(int32_t command, std::shared_ptr<DSchedDataBuffer> dataBuffer)
1309 {
1310 HILOGI("called, command %{public}d", command);
1311 if (dataBuffer == nullptr) {
1312 HILOGE("dataBuffer is null");
1313 return;
1314 }
1315 int32_t ret = 0;
1316 uint8_t *data = dataBuffer->Data();
1317 std::string jsonStr(reinterpret_cast<const char *>(data), dataBuffer->Capacity());
1318
1319 switch (command) {
1320 case DSCHED_CONTINUE_CMD_START: {
1321 HILOGW("continue already started, cmd abort.");
1322 break;
1323 }
1324 case DSCHED_CONTINUE_CMD_DATA: {
1325 auto dataCmd = std::make_shared<DSchedContinueDataCmd>();
1326 ret = dataCmd->Unmarshal(jsonStr);
1327 if (ret != ERR_OK) {
1328 HILOGE("Unmarshal data cmd failed, ret: %{public}d", ret);
1329 return;
1330 }
1331 dataCmd->want_.SetBundle(dataCmd->dstBundleName_);
1332 OnContinueDataCmd(dataCmd);
1333 break;
1334 }
1335 case DSCHED_CONTINUE_CMD_REPLY: {
1336 auto replyCmd = std::make_shared<DSchedContinueReplyCmd>();
1337 ret = replyCmd->Unmarshal(jsonStr);
1338 if (ret != ERR_OK) {
1339 HILOGE("Unmarshal reply cmd failed, ret: %{public}d", ret);
1340 return;
1341 }
1342 OnReplyCmd(replyCmd);
1343 break;
1344 }
1345 case DSCHED_CONTINUE_CMD_END: {
1346 auto endCmd = std::make_shared<DSchedContinueEndCmd>();
1347 ret = endCmd->Unmarshal(jsonStr);
1348 if (ret != ERR_OK) {
1349 HILOGE("Unmarshal end cmd failed, ret: %{public}d", ret);
1350 return;
1351 }
1352 OnContinueEndCmd(endCmd);
1353 break;
1354 }
1355 default:
1356 HILOGW("Invalid command.");
1357 break;
1358 }
1359 }
1360
UpdateState(DSchedContinueStateType stateType)1361 void DSchedContinue::UpdateState(DSchedContinueStateType stateType)
1362 {
1363 if (stateMachine_ == nullptr) {
1364 HILOGE("stateMachine is null");
1365 return;
1366 }
1367 stateMachine_->UpdateState(stateType);
1368 }
1369
OnShutDown()1370 void DSchedContinue::OnShutDown()
1371 {
1372 }
1373
OnBind()1374 void DSchedContinue::OnBind()
1375 {
1376 }
1377 } // namespace DistributedSchedule
1378 } // namespace OHOS
1379