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