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(DMS_GET_WINDOW_FAILED_FROM_SCB);
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("Second get persistentId failed, stop start ability");
950 return OnContinueEnd(DMS_GET_WINDOW_FAILED_FROM_SCB);
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(OHOS::AAFwk::Want & want,int32_t requestCode)1010 int32_t DSchedContinue::StartAbility(OHOS::AAFwk::Want& want, int32_t requestCode)
1011 {
1012 want.SetParam(OHOS::AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY, 0);
1013 int32_t ret = AAFwk::AbilityManagerClient::GetInstance()->Connect();
1014 if (ret != ERR_OK) {
1015 HILOGE("connect ability server failed %{public}d", ret);
1016 return ret;
1017 }
1018
1019 int32_t activeAccountId = 0;
1020 ret = DistributedSchedService::GetInstance().QueryOsAccount(activeAccountId);
1021 if (ret != ERR_OK) {
1022 HILOGE("QueryOsAccount failed %{public}d", ret);
1023 return ret;
1024 }
1025
1026 continueInfo_.sinkAbilityName_ = want.GetElement().GetAbilityName();
1027 DmsRadar::GetInstance().ClickIconDmsStartAbility("StartAbility", ret);
1028
1029 HILOGI("call StartAbility start, flag is %{public}d", want.GetFlags());
1030 ret = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, DEFAULT_REQUEST_CODE, activeAccountId);
1031 if (ret != ERR_OK) {
1032 HILOGE("failed %{public}d", ret);
1033 return ret;
1034 }
1035 return ret;
1036 }
1037
ExecuteNotifyComplete(int32_t result)1038 int32_t DSchedContinue::ExecuteNotifyComplete(int32_t result)
1039 {
1040 HILOGI("ExecuteNotifyComplete start, result %{public}d", result);
1041 DmsContinueTime::GetInstance().SetDurationEnd(CONTINUE_START_ABILITY_TIME, GetTickCount());
1042
1043 int32_t ret = 0;
1044 if (direction_ == CONTINUE_SINK) {
1045 auto cmd = std::make_shared<DSchedContinueEndCmd>();
1046 PackEndCmd(cmd, result);
1047
1048 ret = SendCommand(cmd);
1049 if (ret != ERR_OK) {
1050 HILOGE("ExecuteNotifyComplete send end cmd failed, ret %{public}d", ret);
1051 return ret;
1052 }
1053
1054 UpdateState(DSCHED_CONTINUE_SINK_END_STATE);
1055 HILOGI("ExecuteNotifyComplete end");
1056 return ERR_OK;
1057 }
1058
1059 auto cmd = std::make_shared<DSchedContinueReplyCmd>();
1060 PackReplyCmd(cmd, DSCHED_CONTINUE_CMD_END, 0, result, "ExecuteNotifyComplete");
1061 ret = SendCommand(cmd);
1062 if (ret != ERR_OK) {
1063 HILOGE("ExecuteNotifyComplete send reply cmd failed, ret %{public}d", ret);
1064 return ret;
1065 }
1066
1067 UpdateState(DSCHED_CONTINUE_SOURCE_END_STATE);
1068 PostContinueEndTask(result);
1069
1070 HILOGI("ExecuteNotifyComplete end");
1071 return ERR_OK;
1072 }
1073
PackReplyCmd(std::shared_ptr<DSchedContinueReplyCmd> cmd,int32_t replyCmd,int32_t appVersion,int32_t result,const std::string reason)1074 int32_t DSchedContinue::PackReplyCmd(std::shared_ptr<DSchedContinueReplyCmd> cmd, int32_t replyCmd, int32_t appVersion,
1075 int32_t result, const std::string reason)
1076 {
1077 if (cmd == nullptr) {
1078 HILOGE("cmd is null");
1079 return INVALID_PARAMETERS_ERR;
1080 }
1081 cmd->version_ = version_;
1082 cmd->serviceType_ = SERVICE_TYPE_CONTINUE;
1083 cmd->subServiceType_ = subServiceType_;
1084 cmd->command_ = DSCHED_CONTINUE_CMD_REPLY;
1085 cmd->srcDeviceId_ = continueInfo_.sourceDeviceId_;
1086 cmd->srcBundleName_ = continueInfo_.sourceBundleName_;
1087 cmd->dstDeviceId_ = continueInfo_.sinkDeviceId_;
1088 cmd->dstBundleName_ = continueInfo_.sinkBundleName_;
1089 cmd->continueType_ = continueInfo_.continueType_;
1090 cmd->sourceMissionId_ = continueInfo_.missionId_;
1091 cmd->continueByType_ = continueByType_;
1092 cmd->dmsVersion_ = DMS_VERSION;
1093
1094 cmd->replyCmd_ = replyCmd;
1095 cmd->appVersion_ = appVersion;
1096 cmd->result_ = result;
1097 cmd->reason_ = reason;
1098 return ERR_OK;
1099 }
1100
ExecuteContinueEnd(int32_t result)1101 int32_t DSchedContinue::ExecuteContinueEnd(int32_t result)
1102 {
1103 HILOGW("ExecuteContinueEnd start, result %{public}d", result);
1104
1105 std::string peerDeviceId = (direction_ == CONTINUE_SOURCE) ?
1106 continueInfo_.sinkDeviceId_ : continueInfo_.sourceDeviceId_;
1107 if ((subServiceType_ == CONTINUE_PULL && direction_ == CONTINUE_SINK) ||
1108 (subServiceType_ == CONTINUE_PUSH && direction_ == CONTINUE_SOURCE)) {
1109 HILOGI("ExecuteContinueEnd disconnect peer device %{public}s", GetAnonymStr(peerDeviceId).c_str());
1110 DSchedTransportSoftbusAdapter::GetInstance().DisconnectDevice(peerDeviceId);
1111 }
1112
1113 eventData_.state_ = result != ERR_OK ? DMS_DSCHED_EVENT_STOP : DMS_DSCHED_EVENT_FINISH;
1114 if (result == ERR_OK && direction_ == CONTINUE_SOURCE && isSourceExit_) {
1115 int32_t ret = AbilityManagerClient::GetInstance()->CleanMission(continueInfo_.missionId_);
1116 HILOGD("ExecuteContinueEnd clean mission result: %{public}d", ret);
1117 }
1118
1119 if (direction_ == CONTINUE_SINK) {
1120 DmsRadar::GetInstance().ClickIconDmsRecvOver("NotifyContinuationResultFromRemote", result);
1121 }
1122
1123 NotifyContinuationCallbackResult(result);
1124 NotifyDSchedEventResult(result);
1125 DurationDumperComplete(result);
1126
1127 DSchedContinueManager::GetInstance().OnContinueEnd(continueInfo_);
1128 HILOGI("ExecuteContinueEnd end");
1129 return ERR_OK;
1130 }
1131
ConvertToDmsSdkErr(int32_t result)1132 int32_t DSchedContinue::ConvertToDmsSdkErr(int32_t result)
1133 {
1134 if (result == ERR_OK) {
1135 return result;
1136 }
1137
1138 auto it = DMS_CONVERT_TO_SDK_ERR_MAP.find(result);
1139 if (it != DMS_CONVERT_TO_SDK_ERR_MAP.end()) {
1140 return it->second;
1141 }
1142 return DmsInterfaceSdkErr::ERR_DMS_WORK_ABNORMALLY;
1143 }
1144
NotifyContinuationCallbackResult(int32_t result)1145 void DSchedContinue::NotifyContinuationCallbackResult(int32_t result)
1146 {
1147 HILOGD("continuation result is: %{public}d", result);
1148 if (callback_ == nullptr) {
1149 HILOGW("callback object null.");
1150 return;
1151 }
1152
1153 MessageParcel data;
1154 if (!data.WriteInterfaceToken(NAPI_MISSION_CALLBACK_INTERFACE_TOKEN)) {
1155 HILOGE("write token failed");
1156 return;
1157 }
1158 PARCEL_WRITE_HELPER_NORET(data, Int32, ConvertToDmsSdkErr(result));
1159 MessageParcel reply;
1160 MessageOption option;
1161 int32_t ret = callback_->SendRequest(NOTIFY_MISSION_CALLBACK_RESULT, data, reply, option);
1162 callback_ = nullptr;
1163 if (ret != ERR_OK) {
1164 HILOGE("send request failed, ret: %{public}d", ret);
1165 }
1166 return;
1167 }
1168
NotifyDSchedEventResult(int32_t result)1169 void DSchedContinue::NotifyDSchedEventResult(int32_t result)
1170 {
1171 result = (result == ERR_OK) ? ERR_OK : NOTIFYCOMPLETECONTINUATION_FAILED;
1172 DistributedSchedService::GetInstance().NotifyDSchedEventCallbackResult(result, eventData_);
1173 }
1174
DurationDumperComplete(int32_t result)1175 void DSchedContinue::DurationDumperComplete(int32_t result)
1176 {
1177 if (result != ERR_OK) {
1178 return;
1179 }
1180 if ((subServiceType_ == CONTINUE_PULL && direction_ == CONTINUE_SINK) ||
1181 (subServiceType_ == CONTINUE_PUSH && direction_ == CONTINUE_SOURCE)) {
1182 std::string strEndTime = DmsContinueTime::GetInstance().GetCurrentTime();
1183 DmsContinueTime::GetInstance().SetDurationEnd(CONTINUE_TOTAL_TIME, GetTickCount());
1184 DmsContinueTime::GetInstance().SetDurationStrTime(CONTINUE_END_TIME, strEndTime);
1185
1186 DmsUE::GetInstance().DmsContinueComplete(continueInfo_.sourceBundleName_, continueInfo_.sinkAbilityName_,
1187 continueInfo_.sourceDeviceId_, result);
1188
1189 DmsContinueTime::GetInstance().AppendInfo();
1190 DmsContinueTime::GetInstance().SetPull(false);
1191 }
1192 return;
1193 }
1194
ExecuteContinueError(int32_t result)1195 int32_t DSchedContinue::ExecuteContinueError(int32_t result)
1196 {
1197 HILOGI("start, result %{public}d", result);
1198 auto cmd = std::make_shared<DSchedContinueEndCmd>();
1199 PackEndCmd(cmd, result);
1200 SendCommand(cmd);
1201 if (direction_ == CONTINUE_SOURCE) {
1202 UpdateState(DSCHED_CONTINUE_SOURCE_END_STATE);
1203 } else {
1204 UpdateState(DSCHED_CONTINUE_SINK_END_STATE);
1205 }
1206 OnContinueEnd(result);
1207 HILOGI("ExecuteNotifyComplete end");
1208 return ERR_OK;
1209 }
1210
PackEndCmd(std::shared_ptr<DSchedContinueEndCmd> cmd,int32_t result)1211 int32_t DSchedContinue::PackEndCmd(std::shared_ptr<DSchedContinueEndCmd> cmd, int32_t result)
1212 {
1213 if (cmd == nullptr) {
1214 HILOGE("cmd is null");
1215 return INVALID_PARAMETERS_ERR;
1216 }
1217 cmd->version_ = version_;
1218 cmd->serviceType_ = SERVICE_TYPE_CONTINUE;
1219 cmd->subServiceType_ = subServiceType_;
1220 cmd->command_ = DSCHED_CONTINUE_CMD_END;
1221 cmd->srcDeviceId_ = continueInfo_.sourceDeviceId_;
1222 cmd->srcBundleName_ = continueInfo_.sourceBundleName_;
1223 cmd->dstDeviceId_ = continueInfo_.sinkDeviceId_;
1224 cmd->dstBundleName_ = continueInfo_.sinkBundleName_;
1225 cmd->continueType_ = continueInfo_.continueType_;
1226 cmd->sourceMissionId_ = continueInfo_.missionId_;
1227 cmd->continueByType_ = continueByType_;
1228 cmd->dmsVersion_ = DMS_VERSION;
1229
1230 cmd->result_ = result;
1231 return ERR_OK;
1232 }
1233
SendCommand(std::shared_ptr<DSchedContinueCmdBase> cmd)1234 int32_t DSchedContinue::SendCommand(std::shared_ptr<DSchedContinueCmdBase> cmd)
1235 {
1236 if (cmd == nullptr) {
1237 HILOGE("cmd is null");
1238 return INVALID_PARAMETERS_ERR;
1239 }
1240 HILOGI("SendCommand start, cmd %{public}d", cmd->command_);
1241 std::string jsonStr;
1242 int32_t ret = cmd->Marshal(jsonStr);
1243 if (ret != ERR_OK) {
1244 HILOGE("SendCommand marshal cmd %{public}d failed, ret %{public}d", cmd->command_, ret);
1245 return ret;
1246 }
1247 auto buffer = std::make_shared<DSchedDataBuffer>(jsonStr.length() + 1);
1248 ret = memcpy_s(buffer->Data(), buffer->Capacity(), jsonStr.c_str(), jsonStr.length());
1249 if (ret != ERR_OK) {
1250 HILOGE("SendCommand memcpy_s failed, cmd %{public}d, ret %{public}d", cmd->command_, ret);
1251 return ret;
1252 }
1253 ret = DSchedTransportSoftbusAdapter::GetInstance().SendData(softbusSessionId_, SERVICE_TYPE_CONTINUE, buffer);
1254 if (ret != ERR_OK) {
1255 HILOGE("SendCommand send data failed, cmd %{public}d, ret %{public}d", cmd->command_, ret);
1256 return ret;
1257 }
1258 HILOGI("SendCommand end, cmd %{public}d", cmd->command_);
1259 return ERR_OK;
1260 }
1261
GetSessionId()1262 int32_t DSchedContinue::GetSessionId()
1263 {
1264 return softbusSessionId_;
1265 }
1266
GetContinueInfo()1267 DSchedContinueInfo DSchedContinue::GetContinueInfo()
1268 {
1269 return continueInfo_;
1270 }
1271
GetLocalDeviceId(std::string & localDeviceId)1272 bool DSchedContinue::GetLocalDeviceId(std::string& localDeviceId)
1273 {
1274 if (!DtbschedmgrDeviceInfoStorage::GetInstance().GetLocalDeviceId(localDeviceId)) {
1275 HILOGE("GetLocalDeviceId failed");
1276 return false;
1277 }
1278 return true;
1279 }
1280
CheckDeviceIdFromRemote(const std::string & localDevId,const std::string & destDevId,const std::string & srcDevId)1281 bool DSchedContinue::CheckDeviceIdFromRemote(const std::string& localDevId, const std::string& destDevId,
1282 const std::string& srcDevId)
1283 {
1284 if (localDevId.empty() || destDevId.empty() || srcDevId.empty()) {
1285 HILOGE("CheckDeviceIdFromRemote failed");
1286 return false;
1287 }
1288 // destDevId set by remote must be same with localDevId
1289 if (localDevId != destDevId) {
1290 HILOGE("destDevId is not same with localDevId");
1291 return false;
1292 }
1293 HILOGD("CheckDeviceIdFromRemote srcDevId %{public}s", GetAnonymStr(srcDevId).c_str());
1294 HILOGD("CheckDeviceIdFromRemote localDevId %{public}s", GetAnonymStr(localDevId).c_str());
1295 HILOGD("CheckDeviceIdFromRemote destDevId %{public}s", GetAnonymStr(destDevId).c_str());
1296
1297 if (srcDevId == destDevId || srcDevId == localDevId) {
1298 HILOGE("destDevId is different with localDevId and destDevId");
1299 return false;
1300 }
1301
1302 if (srcDevId != continueInfo_.sourceDeviceId_) {
1303 HILOGE("srcDevId is not correct");
1304 return false;
1305 }
1306 return true;
1307 }
1308
OnDataRecv(int32_t command,std::shared_ptr<DSchedDataBuffer> dataBuffer)1309 void DSchedContinue::OnDataRecv(int32_t command, std::shared_ptr<DSchedDataBuffer> dataBuffer)
1310 {
1311 HILOGI("called, command %{public}d", command);
1312 if (dataBuffer == nullptr) {
1313 HILOGE("dataBuffer is null");
1314 return;
1315 }
1316 int32_t ret = 0;
1317 uint8_t *data = dataBuffer->Data();
1318 std::string jsonStr(reinterpret_cast<const char *>(data), dataBuffer->Capacity());
1319
1320 switch (command) {
1321 case DSCHED_CONTINUE_CMD_START: {
1322 HILOGW("continue already started, cmd abort.");
1323 break;
1324 }
1325 case DSCHED_CONTINUE_CMD_DATA: {
1326 auto dataCmd = std::make_shared<DSchedContinueDataCmd>();
1327 ret = dataCmd->Unmarshal(jsonStr);
1328 if (ret != ERR_OK) {
1329 HILOGE("Unmarshal data cmd failed, ret: %{public}d", ret);
1330 return;
1331 }
1332 dataCmd->want_.SetBundle(dataCmd->dstBundleName_);
1333 OnContinueDataCmd(dataCmd);
1334 break;
1335 }
1336 case DSCHED_CONTINUE_CMD_REPLY: {
1337 auto replyCmd = std::make_shared<DSchedContinueReplyCmd>();
1338 ret = replyCmd->Unmarshal(jsonStr);
1339 if (ret != ERR_OK) {
1340 HILOGE("Unmarshal reply cmd failed, ret: %{public}d", ret);
1341 return;
1342 }
1343 OnReplyCmd(replyCmd);
1344 break;
1345 }
1346 case DSCHED_CONTINUE_CMD_END: {
1347 auto endCmd = std::make_shared<DSchedContinueEndCmd>();
1348 ret = endCmd->Unmarshal(jsonStr);
1349 if (ret != ERR_OK) {
1350 HILOGE("Unmarshal end cmd failed, ret: %{public}d", ret);
1351 return;
1352 }
1353 OnContinueEndCmd(endCmd);
1354 break;
1355 }
1356 default:
1357 HILOGW("Invalid command.");
1358 break;
1359 }
1360 }
1361
UpdateState(DSchedContinueStateType stateType)1362 void DSchedContinue::UpdateState(DSchedContinueStateType stateType)
1363 {
1364 if (stateMachine_ == nullptr) {
1365 HILOGE("stateMachine is null");
1366 return;
1367 }
1368 stateMachine_->UpdateState(stateType);
1369 }
1370
OnShutDown()1371 void DSchedContinue::OnShutDown()
1372 {
1373 }
1374
OnBind()1375 void DSchedContinue::OnBind()
1376 {
1377 }
1378 } // namespace DistributedSchedule
1379 } // namespace OHOS
1380