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