• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "mission/distributed_sched_continue_manager.h"
17 
18 #include "adapter/dnetwork_adapter.h"
19 #include "datetime_ex.h"
20 #include "distributed_sched_adapter.h"
21 #include "dtbschedmgr_log.h"
22 #include "parcel_helper.h"
23 #include "softbus_adapter/softbus_adapter.h"
24 #include <sys/prctl.h>
25 
26 namespace OHOS {
27 namespace DistributedSchedule {
28 namespace {
29 constexpr int32_t ON_CALLBACK = 0;
30 constexpr int32_t ACTIVE = 0;
31 constexpr int32_t INACTIVE = 1;
32 constexpr int32_t INDEX_2 = 2;
33 constexpr int32_t INDEX_3 = 3;
34 constexpr int32_t INDEX_4 = 4;
35 const std::string TAG = "DistributedSchedContinueManager";
36 const std::u16string DESCRIPTOR = u"ohos.aafwk.RemoteOnListener";
37 }
38 
39 IMPLEMENT_SINGLE_INSTANCE(DistributedSchedContinueManager);
40 
Init()41 void DistributedSchedContinueManager::Init()
42 {
43     HILOGI("Init start");
44     missionFocusedListener_ = new DistributedMissionFocusedListener();
45     int32_t ret = DistributedSchedAdapter::GetInstance().RegisterMissionListener(missionFocusedListener_);
46     if (ret != ERR_OK) {
47         HILOGE("get RegisterMissionListener failed, ret: %{public}d", ret);
48         return;
49     }
50     std::shared_ptr<SoftbusAdapterListener> missionBroadcastListener =
51         std::make_shared<DistributedMissionBroadcastListener>();
52     ret = SoftbusAdapter::GetInstance().RegisterSoftbusEventListener(missionBroadcastListener);
53     if (ret != ERR_OK) {
54         HILOGE("get RegisterSoftbusEventListener failed, ret: %{public}d", ret);
55         return;
56     }
57     missionDiedListener_ = new DistributedMissionDiedListener();
58     eventThread_ = std::thread(&DistributedSchedContinueManager::StartEvent, this);
59     std::unique_lock<std::mutex> lock(eventMutex_);
60     eventCon_.wait(lock, [this] {
61         return eventHandler_ != nullptr;
62     });
63     HILOGI("Init end");
64 }
65 
UnInit()66 void DistributedSchedContinueManager::UnInit()
67 {
68     HILOGI("UnInit start");
69     if (eventHandler_ != nullptr) {
70         eventHandler_->GetEventRunner()->Stop();
71         eventThread_.join();
72         eventHandler_ = nullptr;
73     } else {
74         HILOGE("eventHandler_ is nullptr");
75     }
76     HILOGI("UnInit end");
77 }
78 
NotifyMissionFocused(const int32_t missionId)79 void DistributedSchedContinueManager::NotifyMissionFocused(const int32_t missionId)
80 {
81     HILOGI("NotifyMissionFocused start, missionId: %{public}d", missionId);
82     auto feedfunc = [this, missionId]() {
83         DealFocusedBusiness(missionId);
84     };
85     if (eventHandler_ != nullptr) {
86         eventHandler_->PostTask(feedfunc);
87     } else {
88         HILOGE("eventHandler_ is nullptr");
89     }
90     HILOGI("NotifyMissionFocused end");
91 }
92 
NotifyMissionUnfocused(const int32_t missionId)93 void DistributedSchedContinueManager::NotifyMissionUnfocused(const int32_t missionId)
94 {
95     HILOGI("NotifyMissionUnfocused start, missionId: %{public}d", missionId);
96     auto feedfunc = [this, missionId]() {
97         DealUnfocusedBusiness(missionId);
98     };
99     if (eventHandler_ != nullptr) {
100         eventHandler_->PostTask(feedfunc);
101     } else {
102         HILOGE("eventHandler_ is nullptr");
103     }
104     HILOGI("NotifyMissionUnfocused end");
105 }
106 
NotifyDataRecv(std::string & senderNetworkId,uint8_t * payload,uint32_t dataLen)107 void DistributedSchedContinueManager::NotifyDataRecv(std::string& senderNetworkId, uint8_t* payload, uint32_t dataLen)
108 {
109     HILOGI("NotifyDataRecv start, senderNetworkId: %{public}s, dataLen: %{public}u",
110         DnetworkAdapter::AnonymizeNetworkId(senderNetworkId).c_str(), dataLen);
111     if (dataLen != DMS_SEND_LEN) {
112         HILOGE("dataLen error, dataLen: %{public}u", dataLen);
113         return;
114     }
115     uint8_t type = (payload[0] & DMS_0XF0) >> CONTINUE_SHIFT_04;
116     uint8_t len = payload[0] & DMS_0X0F;
117     if (len != sizeof(uint32_t) || (type != DMS_UNFOCUSED_TYPE && type != DMS_FOCUSED_TYPE)) {
118         HILOGE("len or type error, len: %{public}u, type: %{public}u", len, type);
119         return;
120     }
121     uint32_t accessTokenId = payload[1] << CONTINUE_SHIFT_24 | payload[INDEX_2] << CONTINUE_SHIFT_16 |
122         payload[INDEX_3] << CONTINUE_SHIFT_08 | payload[INDEX_4];
123     int32_t state = ACTIVE;
124     if (type == DMS_UNFOCUSED_TYPE) {
125         state = INACTIVE;
126     }
127     auto feedfunc = [this, senderNetworkId, accessTokenId, state]() mutable {
128         DealUnBroadcastdBusiness(senderNetworkId, accessTokenId, state);
129     };
130     if (eventHandler_ != nullptr) {
131         eventHandler_->PostTask(feedfunc);
132     } else {
133         HILOGE("eventHandler_ is nullptr");
134     }
135     HILOGI("NotifyDataRecv end");
136 }
137 
RegisterOnListener(const std::string & type,const sptr<IRemoteObject> & obj)138 int32_t DistributedSchedContinueManager::RegisterOnListener(const std::string& type, const sptr<IRemoteObject>& obj)
139 {
140     HILOGI("RegisterOnListener start, type: %{public}s", type.c_str());
141     onType_ = type;
142     std::lock_guard<std::mutex> registerOnListenerMapLock(eventMutex_);
143     auto iterItem = registerOnListener_.find(type);
144     if (iterItem == registerOnListener_.end()) {
145         HILOGD("The itemItem does not exist in the registerOnListener_, adding, type: %{public}s", type.c_str());
146         std::vector<sptr<IRemoteObject>> objs;
147         obj->AddDeathRecipient(missionDiedListener_);
148         objs.emplace_back(obj);
149         registerOnListener_[type] = objs;
150         HILOGI("RegisterOnListener end");
151         return ERR_OK;
152     }
153     for (auto iter : iterItem->second) {
154         if (iter == obj) {
155             HILOGI("already have obj");
156             return NO_MISSION_INFO_FOR_MISSION_ID;
157         }
158     }
159     obj->AddDeathRecipient(missionDiedListener_);
160     iterItem->second.emplace_back(obj);
161     HILOGI("RegisterOnListener end");
162     return ERR_OK;
163 }
164 
RegisterOffListener(const std::string & type,const sptr<IRemoteObject> & obj)165 int32_t DistributedSchedContinueManager::RegisterOffListener(const std::string& type, const sptr<IRemoteObject>& obj)
166 {
167     HILOGI("RegisterOffListener start, type: %{public}s", type.c_str());
168     if (obj == nullptr) {
169         HILOGE("obj is null, type: %{public}s", type.c_str());
170         return INVALID_PARAMETERS_ERR;
171     }
172     for (auto iterItem = registerOnListener_.begin(); iterItem != registerOnListener_.end();) {
173         for (auto iter = iterItem->second.begin(); iter != iterItem->second.end();) {
174             if (*iter == obj) {
175                 std::lock_guard<std::mutex> registerOnListenerMapLock(eventMutex_);
176                 iter = iterItem->second.erase(iter);
177                 obj->RemoveDeathRecipient(missionDiedListener_);
178                 break;
179             } else {
180                 iter++;
181             }
182         }
183         if (iterItem->second.empty()) {
184             std::lock_guard<std::mutex> registerOnListenerMapLock(eventMutex_);
185             iterItem = registerOnListener_.erase(iterItem);
186         } else {
187             iterItem++;
188         }
189     }
190     HILOGI("RegisterOffListener end");
191     return ERR_OK;
192 }
193 
GetMissionId(const std::string & bundleName,int32_t & missionId)194 int32_t DistributedSchedContinueManager::GetMissionId(const std::string& bundleName, int32_t& missionId)
195 {
196     HILOGI("GetMissionId start, bundleName: %{public}s", bundleName.c_str());
197     std::lock_guard<std::mutex> focusedMissionMapLock(eventMutex_);
198     auto iterItem = focusedMission_.find(bundleName);
199     if (iterItem == focusedMission_.end()) {
200         HILOGE("get iterItem failed from focusedMission_, bundleName: %{public}s", bundleName.c_str());
201         return INVALID_PARAMETERS_ERR;
202     }
203     missionId = iterItem->second;
204     HILOGI("get missionId end, missionId: %{public}d", missionId);
205     return ERR_OK;
206 }
207 
StartEvent()208 void DistributedSchedContinueManager::StartEvent()
209 {
210     HILOGI("StartEvent start");
211     prctl(PR_SET_NAME, CONTINUE_MANAGER.c_str());
212     auto runner = AppExecFwk::EventRunner::Create(false);
213     {
214         std::lock_guard<std::mutex> lock(eventMutex_);
215         eventHandler_ = std::make_shared<OHOS::AppExecFwk::EventHandler>(runner);
216     }
217     eventCon_.notify_one();
218     runner->Run();
219     HILOGI("StartEvent end");
220 }
221 
DealFocusedBusiness(const int32_t missionId)222 int32_t DistributedSchedContinueManager::DealFocusedBusiness(const int32_t missionId)
223 {
224     HILOGI("DealFocusedBusiness start, missionId: %{public}d", missionId);
225     AAFwk::MissionInfo info;
226     int32_t ret = AAFwk::AbilityManagerClient::GetInstance()->GetMissionInfo("", missionId, info);
227     if (ret != ERR_OK) {
228         HILOGE("get missionInfo failed, missionId: %{public}d, ret: %{public}d", missionId, ret);
229         return ret;
230     }
231     bool isMissionContibuable = info.continuable;
232     {
233         std::lock_guard<std::mutex> currentMissionIdLock(eventMutex_);
234         info_.currentMissionId = missionId;
235         info_.currentIsContibuable = isMissionContibuable;
236     }
237     if (!isMissionContibuable) {
238         HILOGE("can not MissionContinue, missionId: %{public}d", missionId);
239         return REMOTE_DEVICE_BIND_ABILITY_ERR;
240     }
241     std::string bundleName = info.want.GetBundle();
242     focusedMission_[bundleName] = missionId;
243 
244     if (info.continueState != AAFwk::ContinueState::CONTINUESTATE_ACTIVE) {
245         HILOGE("Mission continue state set to INACTIVE. Broadcast task abort.");
246         return INVALID_PARAMETERS_ERR;
247     }
248 
249     uint32_t accessTokenId;
250     ret = BundleManagerInternal::GetBundleIdFromBms(bundleName, accessTokenId);
251     if (ret != ERR_OK) {
252         HILOGE("get focused accessTokenId failed, accessTokenId: %{public}u, ret: %{public}d", accessTokenId, ret);
253         return ret;
254     }
255     HILOGE("get focused accessTokenId success, accessTokenId: %{public}u", accessTokenId);
256     uint32_t sendDataLen = DMS_SEND_LEN;
257     uint8_t data[DMS_SEND_LEN];
258     uint8_t type = DMS_FOCUSED_TYPE;
259     uint8_t len = sizeof(uint32_t);
260     data[0] = (type << CONTINUE_SHIFT_04) | len;
261     data[1] = (accessTokenId >> CONTINUE_SHIFT_24) & DMS_0XFF;
262     data[INDEX_2] = (accessTokenId >> CONTINUE_SHIFT_16) & DMS_0XFF;
263     data[INDEX_3] = (accessTokenId >> CONTINUE_SHIFT_08) & DMS_0XFF;
264     data[INDEX_4] = accessTokenId & DMS_0XFF;
265     ret = SoftbusAdapter::GetInstance().SendSoftbusEvent(data, sendDataLen);
266     if (ret != ERR_OK) {
267         HILOGE("SendSoftbusEvent focused failed,ret: %{public}d", ret);
268         return ret;
269     }
270     HILOGI("DealFocusedBusiness end");
271     return ERR_OK;
272 }
273 
CheckContinueState(const int32_t missionId)274 int32_t DistributedSchedContinueManager::CheckContinueState(const int32_t missionId)
275 {
276     AAFwk::MissionInfo info;
277     int32_t ret = AAFwk::AbilityManagerClient::GetInstance()->GetMissionInfo("", missionId, info);
278     if (ret != ERR_OK) {
279         HILOGE("get missionInfo failed, missionId: %{public}d, ret: %{public}d", missionId, ret);
280         return ERR_OK;
281     }
282     if (info.continueState != AAFwk::ContinueState::CONTINUESTATE_ACTIVE) {
283         HILOGE("Mission continue state set to INACTIVE. Broadcast task abort.");
284         return INVALID_PARAMETERS_ERR;
285     }
286     return ERR_OK;
287 }
288 
DealUnfocusedBusiness(const int32_t missionId)289 int32_t DistributedSchedContinueManager::DealUnfocusedBusiness(const int32_t missionId)
290 {
291     HILOGI("DealUnfocusedBusiness start, missionId: %{public}d", missionId);
292     std::string bundleName;
293     int32_t ret = GetBundleName(missionId, bundleName);
294     if (ret != ERR_OK) {
295         HILOGE("get bundleName failed, mission can not change, missionId: %{public}d, ret: %{public}d", missionId, ret);
296         return ret;
297     }
298     HILOGI("get bundleName ,mission can change, missionId: %{public}d, bundleName: %{public}s",
299         missionId, bundleName.c_str());
300 
301     bool isContinue = IsContinue(missionId, bundleName);
302     if (!isContinue) {
303         HILOGE("mission is not continue, missionId: %{public}d", missionId);
304         return NO_MISSION_INFO_FOR_MISSION_ID;
305     }
306 
307     ret = CheckContinueState(missionId);
308     if (ret != ERR_OK) {
309         HILOGE("Check mission continue state error, mission id : %{public}d, ret: %{public}d", missionId, ret);
310         return ret;
311     }
312 
313     uint32_t accessTokenId;
314     ret = BundleManagerInternal::GetBundleIdFromBms(bundleName, accessTokenId);
315     if (ret != ERR_OK) {
316         HILOGE("get unfocused accessTokenId failed, accessTokenId: %{public}u, ret: %{public}d", accessTokenId, ret);
317         return ret;
318     }
319     uint32_t sendDataLen = DMS_SEND_LEN;
320     uint8_t data[DMS_SEND_LEN];
321     uint8_t type = DMS_UNFOCUSED_TYPE;
322     uint8_t len = sizeof(uint32_t);
323     data[0] = (type << CONTINUE_SHIFT_04) | len;
324     data[1] = (accessTokenId >> CONTINUE_SHIFT_24) & DMS_0XFF;
325     data[INDEX_2] = (accessTokenId >> CONTINUE_SHIFT_16) & DMS_0XFF;
326     data[INDEX_3] = (accessTokenId >> CONTINUE_SHIFT_08) & DMS_0XFF;
327     data[INDEX_4] = accessTokenId & DMS_0XFF;
328     ret = SoftbusAdapter::GetInstance().SendSoftbusEvent(data, sendDataLen);
329     if (ret != ERR_OK) {
330         HILOGE("SendSoftbusEvent unfocused failed, sendDataLen: %{public}d, ret: %{public}d", sendDataLen, ret);
331     }
332     std::lock_guard<std::mutex> focusedMissionMapLock(eventMutex_);
333     auto iterItem = focusedMission_.find(bundleName);
334     if (iterItem == focusedMission_.end()) {
335         HILOGE("get iterItem failed from focusedMission_, missionId: %{public}d", missionId);
336     }
337     focusedMission_.erase(iterItem);
338     HILOGI("DealUnfocusedBusiness end");
339     return ERR_OK;
340 }
341 
DealUnBroadcastdBusiness(std::string & senderNetworkId,uint32_t accessTokenId,const int32_t state)342 int32_t DistributedSchedContinueManager::DealUnBroadcastdBusiness(std::string& senderNetworkId,
343     uint32_t accessTokenId, const int32_t state)
344 {
345     HILOGI("DealUnBroadcastdBusiness start, senderNetworkId: %{public}s, accessTokenId: %{public}d, state: %{public}d",
346         DnetworkAdapter::AnonymizeNetworkId(senderNetworkId).c_str(), accessTokenId, state);
347     std::string bundleName;
348     int32_t ret = BundleManagerInternal::GetBundleNameFromDbms(senderNetworkId, accessTokenId, bundleName);
349     if (ret != ERR_OK) {
350         HILOGE("get bundleName failed, senderNetworkId: %{public}s, accessTokenId: %{public}d, ret: %{public}d",
351             DnetworkAdapter::AnonymizeNetworkId(senderNetworkId).c_str(), accessTokenId, ret);
352         return ret;
353     }
354     HILOGI("get bundleName, bundleName: %{public}s", bundleName.c_str());
355     AppExecFwk::BundleInfo localBundleInfo;
356     if (BundleManagerInternal::GetLocalBundleInfoV9(bundleName, localBundleInfo) != ERR_OK) {
357         HILOGE("The app is not installed on the local device.");
358         return INVALID_PARAMETERS_ERR;
359     }
360     if (localBundleInfo.applicationInfo.bundleType != AppExecFwk::BundleType::APP) {
361         HILOGE("The bundleType must be app, but it is %{public}d", localBundleInfo.applicationInfo.bundleType);
362         return INVALID_PARAMETERS_ERR;
363     }
364     std::lock_guard<std::mutex> registerOnListenerMapLock(eventMutex_);
365     auto iterItem = registerOnListener_.find(onType_);
366     if (iterItem == registerOnListener_.end()) {
367         HILOGE("get iterItem failed from registerOnListener_, accessTokenId: %{public}d", accessTokenId);
368         return INVALID_PARAMETERS_ERR;
369     }
370     std::vector<sptr<IRemoteObject>> objs = iterItem->second;
371     for (auto iter : objs) {
372         NotifyRecvBroadcast(iter, senderNetworkId, bundleName, state);
373     }
374     HILOGI("DealUnBroadcastdBusiness end");
375     return ERR_OK;
376 }
377 
NotifyRecvBroadcast(const sptr<IRemoteObject> & obj,const std::string & networkId,const std::string & bundleName,const int32_t state)378 void DistributedSchedContinueManager::NotifyRecvBroadcast(const sptr<IRemoteObject>& obj,
379     const std::string& networkId, const std::string& bundleName, const int32_t state)
380 {
381     HILOGI("NotifyRecvBroadcast start");
382     if (obj == nullptr) {
383         HILOGE("obj is null");
384         return;
385     }
386     MessageParcel data;
387     MessageParcel reply;
388     MessageOption option(MessageOption::TF_ASYNC);
389     if (!data.WriteInterfaceToken(DESCRIPTOR)) {
390         HILOGE("NotifyRecvBroadcast write interface token failed");
391         return;
392     }
393     PARCEL_WRITE_HELPER_NORET(data, Int32, state);
394     PARCEL_WRITE_HELPER_NORET(data, String, networkId);
395     PARCEL_WRITE_HELPER_NORET(data, String, bundleName);
396     HILOGI("[PerformanceTest] NotifyRecvBroadcast called, IPC begin = %{public}" PRId64, GetTickCount());
397     int32_t error = obj->SendRequest(ON_CALLBACK, data, reply, option);
398     if (error != ERR_NONE) {
399         HILOGE("NotifyRecvBroadcast fail, error: %{public}d", error);
400         return;
401     }
402     HILOGI("NotifyRecvBroadcast end");
403 }
404 
GetBundleName(const int32_t missionId,std::string & bundleName)405 int32_t DistributedSchedContinueManager::GetBundleName(const int32_t missionId, std::string& bundleName)
406 {
407     for (auto iterItem = focusedMission_.begin(); iterItem != focusedMission_.end(); iterItem++) {
408         if (iterItem->second == missionId) {
409             bundleName = iterItem->first;
410             return ERR_OK;
411         }
412     }
413     return INVALID_PARAMETERS_ERR;
414 }
415 
IsContinue(const int32_t & missionId,const std::string & bundleName)416 bool DistributedSchedContinueManager::IsContinue(const int32_t& missionId, const std::string& bundleName)
417 {
418     if ((missionId != info_.currentMissionId && info_.currentIsContibuable == true)) {
419         /*missionId and currentMissionId are not equal but currentMission can change,
420             continue to not send unfocus broadcast*/
421         std::lock_guard<std::mutex> focusedMissionMapLock(eventMutex_);
422         focusedMission_.erase(bundleName);
423         HILOGI("mission is not continue, missionId: %{public}d, currentMissionId: %{public}d",
424             missionId, info_.currentMissionId);
425         return false;
426     }
427     /*missionId and currentMissionId are equal, or missionId and currentMissionId are not equal
428         and currentIsContibuable not change, continue to send unfocus broadcast*/
429     HILOGI("mission is continue, missionId: %{public}d, currentMissionId: %{public}d",
430         missionId, info_.currentMissionId);
431     return true;
432 }
433 
SetMissionContinueState(const int32_t missionId,const AAFwk::ContinueState & state)434 int32_t DistributedSchedContinueManager::SetMissionContinueState(const int32_t missionId,
435     const AAFwk::ContinueState &state)
436 {
437     HILOGI("SetMissionContinueState start, missionId: %{public}d, state: %{public}d", missionId, state);
438     auto feedfunc = [this, missionId, state]() {
439         DealSetMissionContinueStateBusiness(missionId, state);
440     };
441     if (eventHandler_ != nullptr) {
442         eventHandler_->PostTask(feedfunc);
443     } else {
444         HILOGE("eventHandler_ is nullptr");
445         return ERR_NULL_OBJECT;
446     }
447     HILOGI("SetMissionContinueState end");
448     return ERR_OK;
449 }
450 
DealSetMissionContinueStateBusiness(const int32_t missionId,const AAFwk::ContinueState & state)451 int32_t DistributedSchedContinueManager::DealSetMissionContinueStateBusiness(const int32_t missionId,
452     const AAFwk::ContinueState &state)
453 {
454     HILOGI("DealSetMissionContinueStateBusiness start, missionId: %{public}d, state: %{public}d", missionId, state);
455 
456     if (info_.currentMissionId != missionId) {
457         HILOGE("mission is not focused, broadcast task abort, missionId: %{public}d", missionId);
458         return INVALID_PARAMETERS_ERR;
459     }
460 
461     if (!info_.currentIsContibuable) {
462         HILOGE("mission is not continuable, broadcast task abort, missionId: %{public}d", missionId);
463         return INVALID_PARAMETERS_ERR;
464     }
465 
466     std::string bundleName;
467     int32_t ret = GetBundleName(missionId, bundleName);
468     if (ret != ERR_OK) {
469         HILOGE("get bundleName failed, broadcast task abort, missionId: %{public}d, ret: %{public}d",
470             missionId, ret);
471         return ret;
472     }
473     HILOGI("get bundleName success, missionId: %{public}d, bundleName: %{public}s", missionId, bundleName.c_str());
474 
475     uint32_t accessTokenId;
476     ret = BundleManagerInternal::GetBundleIdFromBms(bundleName, accessTokenId);
477     if (ret != ERR_OK) {
478         HILOGE("get setContinueState accessTokenId failed, accessTokenId: %{public}u, ret: %{public}d",
479             accessTokenId, ret);
480         return ret;
481     }
482 
483     uint32_t sendDataLen = DMS_SEND_LEN;
484     uint8_t data[DMS_SEND_LEN];
485     uint8_t len = sizeof(uint32_t);
486     uint8_t type = DMS_FOCUSED_TYPE;
487     if (state == AAFwk::ContinueState::CONTINUESTATE_INACTIVE) {
488         type = DMS_UNFOCUSED_TYPE;
489     }
490     data[0] = (type << CONTINUE_SHIFT_04) | len;
491     data[1] = (accessTokenId >> CONTINUE_SHIFT_24) & DMS_0XFF;
492     data[INDEX_2] = (accessTokenId >> CONTINUE_SHIFT_16) & DMS_0XFF;
493     data[INDEX_3] = (accessTokenId >> CONTINUE_SHIFT_08) & DMS_0XFF;
494     data[INDEX_4] = accessTokenId & DMS_0XFF;
495     ret = SoftbusAdapter::GetInstance().SendSoftbusEvent(data, sendDataLen);
496     if (ret != ERR_OK) {
497         HILOGE("SendSoftbusEvent setContinueState failed, sendDataLen: %{public}u, ret: %{public}d", sendDataLen, ret);
498         return ret;
499     }
500 
501     HILOGI("DealSetMissionContinueStateBusiness end. ContinueState set to: %{public}d", state);
502     return ERR_OK;
503 }
504 
NotifyDeid(const sptr<IRemoteObject> & obj)505 void DistributedSchedContinueManager::NotifyDeid(const sptr<IRemoteObject>& obj)
506 {
507     HILOGI("NotifyDeid start");
508     if (obj == nullptr) {
509         return;
510     }
511     for (auto iterItem = registerOnListener_.begin(); iterItem != registerOnListener_.end();) {
512         for (auto iter = iterItem->second.begin(); iter != iterItem->second.end();) {
513             if (*iter == obj) {
514                 obj->RemoveDeathRecipient(missionDiedListener_);
515                 iter = iterItem->second.erase(iter);
516             } else {
517                 iter++;
518             }
519         }
520         if (iterItem->second.empty()) {
521             std::lock_guard<std::mutex> registerOnListenerMapLock(eventMutex_);
522             iterItem = registerOnListener_.erase(iterItem);
523         } else {
524             iterItem++;
525         }
526     }
527     HILOGI("NotifyDeid end");
528 }
529 } // namespace DistributedSchedule
530 } // namespace OHOS
531