1c29fa5a6Sopenharmony_ci/* 2c29fa5a6Sopenharmony_ci * Copyright (c) 2023-2024 Huawei Device Co., Ltd. 3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License. 5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at 6c29fa5a6Sopenharmony_ci * 7c29fa5a6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8c29fa5a6Sopenharmony_ci * 9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and 13c29fa5a6Sopenharmony_ci * limitations under the License. 14c29fa5a6Sopenharmony_ci */ 15c29fa5a6Sopenharmony_ci 16c29fa5a6Sopenharmony_ci#include "cooperate_out.h" 17c29fa5a6Sopenharmony_ci 18c29fa5a6Sopenharmony_ci#include "devicestatus_define.h" 19c29fa5a6Sopenharmony_ci#include "utility.h" 20c29fa5a6Sopenharmony_ci 21c29fa5a6Sopenharmony_ci#undef LOG_TAG 22c29fa5a6Sopenharmony_ci#define LOG_TAG "CooperateOut" 23c29fa5a6Sopenharmony_ci 24c29fa5a6Sopenharmony_cinamespace OHOS { 25c29fa5a6Sopenharmony_cinamespace Msdp { 26c29fa5a6Sopenharmony_cinamespace DeviceStatus { 27c29fa5a6Sopenharmony_cinamespace Cooperate { 28c29fa5a6Sopenharmony_ci 29c29fa5a6Sopenharmony_ciCooperateOut::CooperateOut(IStateMachine &parent, IContext *env) 30c29fa5a6Sopenharmony_ci : ICooperateState(parent), env_(env) 31c29fa5a6Sopenharmony_ci{ 32c29fa5a6Sopenharmony_ci initial_ = std::make_shared<Initial>(*this); 33c29fa5a6Sopenharmony_ci Initial::BuildChains(initial_, *this); 34c29fa5a6Sopenharmony_ci current_ = initial_; 35c29fa5a6Sopenharmony_ci} 36c29fa5a6Sopenharmony_ci 37c29fa5a6Sopenharmony_ciCooperateOut::~CooperateOut() 38c29fa5a6Sopenharmony_ci{ 39c29fa5a6Sopenharmony_ci CHKPV(initial_); 40c29fa5a6Sopenharmony_ci Initial::RemoveChains(initial_); 41c29fa5a6Sopenharmony_ci} 42c29fa5a6Sopenharmony_ci 43c29fa5a6Sopenharmony_civoid CooperateOut::OnEvent(Context &context, const CooperateEvent &event) 44c29fa5a6Sopenharmony_ci{ 45c29fa5a6Sopenharmony_ci current_->OnEvent(context, event); 46c29fa5a6Sopenharmony_ci} 47c29fa5a6Sopenharmony_ci 48c29fa5a6Sopenharmony_civoid CooperateOut::OnEnterState(Context &context) 49c29fa5a6Sopenharmony_ci{ 50c29fa5a6Sopenharmony_ci CALL_INFO_TRACE; 51c29fa5a6Sopenharmony_ci env_->GetInput().SetPointerVisibility(false); 52c29fa5a6Sopenharmony_ci} 53c29fa5a6Sopenharmony_ci 54c29fa5a6Sopenharmony_civoid CooperateOut::OnLeaveState(Context &context) 55c29fa5a6Sopenharmony_ci{ 56c29fa5a6Sopenharmony_ci CALL_INFO_TRACE; 57c29fa5a6Sopenharmony_ci SetPointerVisible(context); 58c29fa5a6Sopenharmony_ci} 59c29fa5a6Sopenharmony_ci 60c29fa5a6Sopenharmony_civoid CooperateOut::SetPointerVisible(Context &context) 61c29fa5a6Sopenharmony_ci{ 62c29fa5a6Sopenharmony_ci CHKPV(env_); 63c29fa5a6Sopenharmony_ci bool hasLocalPointerDevice = env_->GetDeviceManager().HasLocalPointerDevice(); 64c29fa5a6Sopenharmony_ci bool visible = !context.NeedHideCursor() && hasLocalPointerDevice; 65c29fa5a6Sopenharmony_ci FI_HILOGI("Set pointer visible:%{public}s, HasLocalPointerDevice:%{public}s", 66c29fa5a6Sopenharmony_ci visible ? "true" : "false", hasLocalPointerDevice ? "true" : "false"); 67c29fa5a6Sopenharmony_ci env_->GetInput().SetPointerVisibility(visible, PRIORITY); 68c29fa5a6Sopenharmony_ci} 69c29fa5a6Sopenharmony_ci 70c29fa5a6Sopenharmony_civoid CooperateOut::OnSetCooperatePriv(uint32_t priv) 71c29fa5a6Sopenharmony_ci{ 72c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 73c29fa5a6Sopenharmony_ci env_->GetDragManager().SetCooperatePriv(priv); 74c29fa5a6Sopenharmony_ci} 75c29fa5a6Sopenharmony_ci 76c29fa5a6Sopenharmony_civoid CooperateOut::Initial::BuildChains(std::shared_ptr<Initial> self, CooperateOut &parent) 77c29fa5a6Sopenharmony_ci{} 78c29fa5a6Sopenharmony_ci 79c29fa5a6Sopenharmony_civoid CooperateOut::Initial::RemoveChains(std::shared_ptr<Initial> self) 80c29fa5a6Sopenharmony_ci{} 81c29fa5a6Sopenharmony_ci 82c29fa5a6Sopenharmony_ciCooperateOut::Initial::Initial(CooperateOut &parent) 83c29fa5a6Sopenharmony_ci : ICooperateStep(parent, nullptr), parent_(parent) 84c29fa5a6Sopenharmony_ci{ 85c29fa5a6Sopenharmony_ci AddHandler(CooperateEventType::DISABLE, [this](Context &context, const CooperateEvent &event) { 86c29fa5a6Sopenharmony_ci this->OnDisable(context, event); 87c29fa5a6Sopenharmony_ci }); 88c29fa5a6Sopenharmony_ci AddHandler(CooperateEventType::START, [this](Context &context, const CooperateEvent &event) { 89c29fa5a6Sopenharmony_ci this->OnStart(context, event); 90c29fa5a6Sopenharmony_ci }); 91c29fa5a6Sopenharmony_ci AddHandler(CooperateEventType::STOP, [this](Context &context, const CooperateEvent &event) { 92c29fa5a6Sopenharmony_ci this->OnStop(context, event); 93c29fa5a6Sopenharmony_ci }); 94c29fa5a6Sopenharmony_ci AddHandler(CooperateEventType::APP_CLOSED, [this](Context &context, const CooperateEvent &event) { 95c29fa5a6Sopenharmony_ci this->OnAppClosed(context, event); 96c29fa5a6Sopenharmony_ci }); 97c29fa5a6Sopenharmony_ci AddHandler(CooperateEventType::INPUT_HOTPLUG_EVENT, [this](Context &context, const CooperateEvent &event) { 98c29fa5a6Sopenharmony_ci this->OnHotplug(context, event); 99c29fa5a6Sopenharmony_ci }); 100c29fa5a6Sopenharmony_ci AddHandler(CooperateEventType::INPUT_POINTER_EVENT, [this](Context &context, const CooperateEvent &event) { 101c29fa5a6Sopenharmony_ci this->OnPointerEvent(context, event); 102c29fa5a6Sopenharmony_ci }); 103c29fa5a6Sopenharmony_ci AddHandler(CooperateEventType::DDM_BOARD_OFFLINE, [this](Context &context, const CooperateEvent &event) { 104c29fa5a6Sopenharmony_ci this->OnBoardOffline(context, event); 105c29fa5a6Sopenharmony_ci }); 106c29fa5a6Sopenharmony_ci AddHandler(CooperateEventType::DDP_COOPERATE_SWITCH_CHANGED, 107c29fa5a6Sopenharmony_ci [this](Context &context, const CooperateEvent &event) { 108c29fa5a6Sopenharmony_ci this->OnSwitchChanged(context, event); 109c29fa5a6Sopenharmony_ci }); 110c29fa5a6Sopenharmony_ci AddHandler(CooperateEventType::DSOFTBUS_SESSION_CLOSED, 111c29fa5a6Sopenharmony_ci [this](Context &context, const CooperateEvent &event) { 112c29fa5a6Sopenharmony_ci this->OnSoftbusSessionClosed(context, event); 113c29fa5a6Sopenharmony_ci }); 114c29fa5a6Sopenharmony_ci AddHandler(CooperateEventType::DSOFTBUS_COME_BACK, 115c29fa5a6Sopenharmony_ci [this](Context &context, const CooperateEvent &event) { 116c29fa5a6Sopenharmony_ci this->OnComeBack(context, event); 117c29fa5a6Sopenharmony_ci }); 118c29fa5a6Sopenharmony_ci AddHandler(CooperateEventType::DSOFTBUS_START_COOPERATE, 119c29fa5a6Sopenharmony_ci [this](Context &context, const CooperateEvent &event) { 120c29fa5a6Sopenharmony_ci this->OnRemoteStart(context, event); 121c29fa5a6Sopenharmony_ci }); 122c29fa5a6Sopenharmony_ci AddHandler(CooperateEventType::DSOFTBUS_STOP_COOPERATE, 123c29fa5a6Sopenharmony_ci [this](Context &context, const CooperateEvent &event) { 124c29fa5a6Sopenharmony_ci this->OnRemoteStop(context, event); 125c29fa5a6Sopenharmony_ci }); 126c29fa5a6Sopenharmony_ci AddHandler(CooperateEventType::DSOFTBUS_RELAY_COOPERATE, 127c29fa5a6Sopenharmony_ci [this](Context &context, const CooperateEvent &event) { 128c29fa5a6Sopenharmony_ci this->OnRelay(context, event); 129c29fa5a6Sopenharmony_ci }); 130c29fa5a6Sopenharmony_ci} 131c29fa5a6Sopenharmony_ci 132c29fa5a6Sopenharmony_civoid CooperateOut::Initial::OnDisable(Context &context, const CooperateEvent &event) 133c29fa5a6Sopenharmony_ci{ 134c29fa5a6Sopenharmony_ci FI_HILOGI("[disable cooperation] Stop cooperation"); 135c29fa5a6Sopenharmony_ci parent_.StopCooperate(context, event); 136c29fa5a6Sopenharmony_ci} 137c29fa5a6Sopenharmony_ci 138c29fa5a6Sopenharmony_civoid CooperateOut::Initial::OnStart(Context &context, const CooperateEvent &event) 139c29fa5a6Sopenharmony_ci{ 140c29fa5a6Sopenharmony_ci StartCooperateEvent param = std::get<StartCooperateEvent>(event.event); 141c29fa5a6Sopenharmony_ci 142c29fa5a6Sopenharmony_ci context.eventMgr_.StartCooperate(param); 143c29fa5a6Sopenharmony_ci FI_HILOGI("[start] Start cooperation with \'%{public}s\', report success when out", 144c29fa5a6Sopenharmony_ci Utility::Anonymize(context.Peer()).c_str()); 145c29fa5a6Sopenharmony_ci DSoftbusStartCooperateFinished failNotice { 146c29fa5a6Sopenharmony_ci .success = false, 147c29fa5a6Sopenharmony_ci .errCode = static_cast<int32_t>(CoordinationErrCode::UNEXPECTED_START_CALL) 148c29fa5a6Sopenharmony_ci }; 149c29fa5a6Sopenharmony_ci context.eventMgr_.StartCooperateFinish(failNotice); 150c29fa5a6Sopenharmony_ci} 151c29fa5a6Sopenharmony_ci 152c29fa5a6Sopenharmony_civoid CooperateOut::Initial::OnStop(Context &context, const CooperateEvent &event) 153c29fa5a6Sopenharmony_ci{ 154c29fa5a6Sopenharmony_ci StopCooperateEvent param = std::get<StopCooperateEvent>(event.event); 155c29fa5a6Sopenharmony_ci 156c29fa5a6Sopenharmony_ci context.eventMgr_.StopCooperate(param); 157c29fa5a6Sopenharmony_ci FI_HILOGI("[stop] Stop cooperation with \'%{public}s\', unchain:%{public}d", 158c29fa5a6Sopenharmony_ci Utility::Anonymize(context.Peer()).c_str(), param.isUnchained); 159c29fa5a6Sopenharmony_ci parent_.StopCooperate(context, event); 160c29fa5a6Sopenharmony_ci 161c29fa5a6Sopenharmony_ci DSoftbusStopCooperateFinished notice { 162c29fa5a6Sopenharmony_ci .normal = true, 163c29fa5a6Sopenharmony_ci }; 164c29fa5a6Sopenharmony_ci context.eventMgr_.StopCooperateFinish(notice); 165c29fa5a6Sopenharmony_ci 166c29fa5a6Sopenharmony_ci parent_.UnchainConnections(context, param); 167c29fa5a6Sopenharmony_ci} 168c29fa5a6Sopenharmony_ci 169c29fa5a6Sopenharmony_civoid CooperateOut::Initial::OnComeBack(Context &context, const CooperateEvent &event) 170c29fa5a6Sopenharmony_ci{ 171c29fa5a6Sopenharmony_ci CALL_INFO_TRACE; 172c29fa5a6Sopenharmony_ci DSoftbusComeBack notice = std::get<DSoftbusComeBack>(event.event); 173c29fa5a6Sopenharmony_ci 174c29fa5a6Sopenharmony_ci if (!context.IsPeer(notice.networkId)) { 175c29fa5a6Sopenharmony_ci return; 176c29fa5a6Sopenharmony_ci } 177c29fa5a6Sopenharmony_ci FI_HILOGI("[come back] From \'%{public}s\'", Utility::Anonymize(notice.networkId).c_str()); 178c29fa5a6Sopenharmony_ci context.OnRemoteStartCooperate(notice.extra); 179c29fa5a6Sopenharmony_ci parent_.OnSetCooperatePriv(notice.extra.priv); 180c29fa5a6Sopenharmony_ci DSoftbusStartCooperate startEvent { 181c29fa5a6Sopenharmony_ci .networkId = notice.networkId, 182c29fa5a6Sopenharmony_ci }; 183c29fa5a6Sopenharmony_ci context.eventMgr_.RemoteStart(startEvent); 184c29fa5a6Sopenharmony_ci context.inputEventInterceptor_.Disable(); 185c29fa5a6Sopenharmony_ci 186c29fa5a6Sopenharmony_ci context.RemoteStartSuccess(notice); 187c29fa5a6Sopenharmony_ci context.eventMgr_.RemoteStartFinish(notice); 188c29fa5a6Sopenharmony_ci TransiteTo(context, CooperateState::COOPERATE_STATE_FREE); 189c29fa5a6Sopenharmony_ci context.OnBack(); 190c29fa5a6Sopenharmony_ci} 191c29fa5a6Sopenharmony_ci 192c29fa5a6Sopenharmony_civoid CooperateOut::Initial::OnRemoteStart(Context &context, const CooperateEvent &event) 193c29fa5a6Sopenharmony_ci{ 194c29fa5a6Sopenharmony_ci DSoftbusStartCooperate notice = std::get<DSoftbusStartCooperate>(event.event); 195c29fa5a6Sopenharmony_ci 196c29fa5a6Sopenharmony_ci if (context.IsLocal(notice.networkId)) { 197c29fa5a6Sopenharmony_ci return; 198c29fa5a6Sopenharmony_ci } 199c29fa5a6Sopenharmony_ci FI_HILOGI("[remote start] Request from \'%{public}s\'", Utility::Anonymize(notice.networkId).c_str()); 200c29fa5a6Sopenharmony_ci if (context.IsPeer(notice.networkId)) { 201c29fa5a6Sopenharmony_ci FI_HILOGI("[remote start] Reset on request from peer"); 202c29fa5a6Sopenharmony_ci parent_.StopCooperate(context, event); 203c29fa5a6Sopenharmony_ci return; 204c29fa5a6Sopenharmony_ci } 205c29fa5a6Sopenharmony_ci context.OnRemoteStartCooperate(notice.extra); 206c29fa5a6Sopenharmony_ci context.eventMgr_.RemoteStart(notice); 207c29fa5a6Sopenharmony_ci context.inputEventInterceptor_.Disable(); 208c29fa5a6Sopenharmony_ci 209c29fa5a6Sopenharmony_ci DSoftbusStopCooperate stopNotice {}; 210c29fa5a6Sopenharmony_ci context.dsoftbus_.StopCooperate(context.Peer(), stopNotice); 211c29fa5a6Sopenharmony_ci 212c29fa5a6Sopenharmony_ci context.RemoteStartSuccess(notice); 213c29fa5a6Sopenharmony_ci context.inputEventBuilder_.Enable(context); 214c29fa5a6Sopenharmony_ci context.eventMgr_.RemoteStartFinish(notice); 215c29fa5a6Sopenharmony_ci FI_HILOGI("[remote start] Cooperation with \'%{public}s\' established", Utility::Anonymize(context.Peer()).c_str()); 216c29fa5a6Sopenharmony_ci TransiteTo(context, CooperateState::COOPERATE_STATE_IN); 217c29fa5a6Sopenharmony_ci context.OnTransitionIn(); 218c29fa5a6Sopenharmony_ci} 219c29fa5a6Sopenharmony_ci 220c29fa5a6Sopenharmony_civoid CooperateOut::Initial::OnRemoteStop(Context &context, const CooperateEvent &event) 221c29fa5a6Sopenharmony_ci{ 222c29fa5a6Sopenharmony_ci DSoftbusStopCooperate notice = std::get<DSoftbusStopCooperate>(event.event); 223c29fa5a6Sopenharmony_ci 224c29fa5a6Sopenharmony_ci if (!context.IsPeer(notice.networkId)) { 225c29fa5a6Sopenharmony_ci return; 226c29fa5a6Sopenharmony_ci } 227c29fa5a6Sopenharmony_ci FI_HILOGI("[remote stop] Notification from \'%{public}s\'", Utility::Anonymize(notice.networkId).c_str()); 228c29fa5a6Sopenharmony_ci context.eventMgr_.RemoteStop(notice); 229c29fa5a6Sopenharmony_ci context.inputEventInterceptor_.Disable(); 230c29fa5a6Sopenharmony_ci context.ResetCursorPosition(); 231c29fa5a6Sopenharmony_ci context.eventMgr_.RemoteStopFinish(notice); 232c29fa5a6Sopenharmony_ci TransiteTo(context, CooperateState::COOPERATE_STATE_FREE); 233c29fa5a6Sopenharmony_ci context.OnResetCooperation(); 234c29fa5a6Sopenharmony_ci} 235c29fa5a6Sopenharmony_ci 236c29fa5a6Sopenharmony_civoid CooperateOut::Initial::OnRelay(Context &context, const CooperateEvent &event) 237c29fa5a6Sopenharmony_ci{ 238c29fa5a6Sopenharmony_ci DSoftbusRelayCooperate notice = std::get<DSoftbusRelayCooperate>(event.event); 239c29fa5a6Sopenharmony_ci if (!context.IsPeer(notice.networkId)) { 240c29fa5a6Sopenharmony_ci return; 241c29fa5a6Sopenharmony_ci } 242c29fa5a6Sopenharmony_ci DSoftbusRelayCooperateFinished resp { 243c29fa5a6Sopenharmony_ci .targetNetworkId = notice.targetNetworkId, 244c29fa5a6Sopenharmony_ci }; 245c29fa5a6Sopenharmony_ci 246c29fa5a6Sopenharmony_ci int32_t ret = context.dsoftbus_.OpenSession(notice.targetNetworkId); 247c29fa5a6Sopenharmony_ci if (ret != RET_OK) { 248c29fa5a6Sopenharmony_ci FI_HILOGE("[relay cooperate] Failed to connect to \'%{public}s\'", 249c29fa5a6Sopenharmony_ci Utility::Anonymize(notice.targetNetworkId).c_str()); 250c29fa5a6Sopenharmony_ci resp.normal = false; 251c29fa5a6Sopenharmony_ci context.dsoftbus_.RelayCooperateFinish(notice.networkId, resp); 252c29fa5a6Sopenharmony_ci return; 253c29fa5a6Sopenharmony_ci } 254c29fa5a6Sopenharmony_ci 255c29fa5a6Sopenharmony_ci resp.normal = true; 256c29fa5a6Sopenharmony_ci context.dsoftbus_.RelayCooperateFinish(notice.networkId, resp); 257c29fa5a6Sopenharmony_ci 258c29fa5a6Sopenharmony_ci context.RelayCooperate(notice); 259c29fa5a6Sopenharmony_ci context.inputEventInterceptor_.Update(context); 260c29fa5a6Sopenharmony_ci FI_HILOGI("[relay cooperate] Relay cooperation to \'%{public}s\'", Utility::Anonymize(context.Peer()).c_str()); 261c29fa5a6Sopenharmony_ci context.OnRelayCooperation(context.Peer(), context.NormalizedCursorPosition()); 262c29fa5a6Sopenharmony_ci} 263c29fa5a6Sopenharmony_ci 264c29fa5a6Sopenharmony_civoid CooperateOut::Initial::OnHotplug(Context &context, const CooperateEvent &event) 265c29fa5a6Sopenharmony_ci{ 266c29fa5a6Sopenharmony_ci InputHotplugEvent notice = std::get<InputHotplugEvent>(event.event); 267c29fa5a6Sopenharmony_ci if (notice.deviceId != context.StartDeviceId()) { 268c29fa5a6Sopenharmony_ci return; 269c29fa5a6Sopenharmony_ci } 270c29fa5a6Sopenharmony_ci FI_HILOGI("Stop cooperation on unplug of dedicated pointer"); 271c29fa5a6Sopenharmony_ci parent_.StopCooperate(context, event); 272c29fa5a6Sopenharmony_ci} 273c29fa5a6Sopenharmony_ci 274c29fa5a6Sopenharmony_civoid CooperateOut::Initial::OnAppClosed(Context &context, const CooperateEvent &event) 275c29fa5a6Sopenharmony_ci{ 276c29fa5a6Sopenharmony_ci FI_HILOGI("[app closed] Close all connections"); 277c29fa5a6Sopenharmony_ci context.dsoftbus_.CloseAllSessions(); 278c29fa5a6Sopenharmony_ci FI_HILOGI("[app closed] Stop cooperation"); 279c29fa5a6Sopenharmony_ci parent_.StopCooperate(context, event); 280c29fa5a6Sopenharmony_ci} 281c29fa5a6Sopenharmony_ci 282c29fa5a6Sopenharmony_civoid CooperateOut::Initial::OnPointerEvent(Context &context, const CooperateEvent &event) 283c29fa5a6Sopenharmony_ci{ 284c29fa5a6Sopenharmony_ci InputPointerEvent notice = std::get<InputPointerEvent>(event.event); 285c29fa5a6Sopenharmony_ci 286c29fa5a6Sopenharmony_ci if ((notice.sourceType != MMI::PointerEvent::SOURCE_TYPE_MOUSE) || 287c29fa5a6Sopenharmony_ci (notice.deviceId == context.StartDeviceId())) { 288c29fa5a6Sopenharmony_ci return; 289c29fa5a6Sopenharmony_ci } 290c29fa5a6Sopenharmony_ci FI_HILOGI("Stop cooperation on operation of undedicated pointer"); 291c29fa5a6Sopenharmony_ci parent_.StopCooperate(context, event); 292c29fa5a6Sopenharmony_ci} 293c29fa5a6Sopenharmony_ci 294c29fa5a6Sopenharmony_civoid CooperateOut::Initial::OnBoardOffline(Context &context, const CooperateEvent &event) 295c29fa5a6Sopenharmony_ci{ 296c29fa5a6Sopenharmony_ci DDMBoardOfflineEvent notice = std::get<DDMBoardOfflineEvent>(event.event); 297c29fa5a6Sopenharmony_ci 298c29fa5a6Sopenharmony_ci if (!context.IsPeer(notice.networkId)) { 299c29fa5a6Sopenharmony_ci return; 300c29fa5a6Sopenharmony_ci } 301c29fa5a6Sopenharmony_ci FI_HILOGI("[board offline] Peer(\'%{public}s\') is offline", Utility::Anonymize(notice.networkId).c_str()); 302c29fa5a6Sopenharmony_ci parent_.StopCooperate(context, event); 303c29fa5a6Sopenharmony_ci} 304c29fa5a6Sopenharmony_ci 305c29fa5a6Sopenharmony_civoid CooperateOut::Initial::OnSwitchChanged(Context &context, const CooperateEvent &event) 306c29fa5a6Sopenharmony_ci{ 307c29fa5a6Sopenharmony_ci DDPCooperateSwitchChanged notice = std::get<DDPCooperateSwitchChanged>(event.event); 308c29fa5a6Sopenharmony_ci 309c29fa5a6Sopenharmony_ci if (!context.IsPeer(notice.networkId) || notice.normal) { 310c29fa5a6Sopenharmony_ci return; 311c29fa5a6Sopenharmony_ci } 312c29fa5a6Sopenharmony_ci FI_HILOGI("[switch off] Peer(\'%{public}s\') switch off", Utility::Anonymize(notice.networkId).c_str()); 313c29fa5a6Sopenharmony_ci parent_.StopCooperate(context, event); 314c29fa5a6Sopenharmony_ci} 315c29fa5a6Sopenharmony_ci 316c29fa5a6Sopenharmony_civoid CooperateOut::Initial::OnSoftbusSessionClosed(Context &context, const CooperateEvent &event) 317c29fa5a6Sopenharmony_ci{ 318c29fa5a6Sopenharmony_ci DSoftbusSessionClosed notice = std::get<DSoftbusSessionClosed>(event.event); 319c29fa5a6Sopenharmony_ci 320c29fa5a6Sopenharmony_ci if (!context.IsPeer(notice.networkId)) { 321c29fa5a6Sopenharmony_ci return; 322c29fa5a6Sopenharmony_ci } 323c29fa5a6Sopenharmony_ci FI_HILOGI("[dsoftbus session closed] Disconnected with \'%{public}s\'", 324c29fa5a6Sopenharmony_ci Utility::Anonymize(notice.networkId).c_str()); 325c29fa5a6Sopenharmony_ci parent_.StopCooperate(context, event); 326c29fa5a6Sopenharmony_ci} 327c29fa5a6Sopenharmony_ci 328c29fa5a6Sopenharmony_civoid CooperateOut::Initial::OnProgress(Context &context, const CooperateEvent &event) 329c29fa5a6Sopenharmony_ci{} 330c29fa5a6Sopenharmony_ci 331c29fa5a6Sopenharmony_civoid CooperateOut::Initial::OnReset(Context &context, const CooperateEvent &event) 332c29fa5a6Sopenharmony_ci{} 333c29fa5a6Sopenharmony_ci 334c29fa5a6Sopenharmony_civoid CooperateOut::StopCooperate(Context &context, const CooperateEvent &event) 335c29fa5a6Sopenharmony_ci{ 336c29fa5a6Sopenharmony_ci context.inputEventInterceptor_.Disable(); 337c29fa5a6Sopenharmony_ci 338c29fa5a6Sopenharmony_ci DSoftbusStopCooperate notice {}; 339c29fa5a6Sopenharmony_ci context.dsoftbus_.StopCooperate(context.Peer(), notice); 340c29fa5a6Sopenharmony_ci 341c29fa5a6Sopenharmony_ci context.ResetCursorPosition(); 342c29fa5a6Sopenharmony_ci TransiteTo(context, CooperateState::COOPERATE_STATE_FREE); 343c29fa5a6Sopenharmony_ci context.OnResetCooperation(); 344c29fa5a6Sopenharmony_ci} 345c29fa5a6Sopenharmony_ci 346c29fa5a6Sopenharmony_civoid CooperateOut::UnchainConnections(Context &context, const StopCooperateEvent &event) const 347c29fa5a6Sopenharmony_ci{ 348c29fa5a6Sopenharmony_ci if (event.isUnchained) { 349c29fa5a6Sopenharmony_ci FI_HILOGI("Unchain all connections"); 350c29fa5a6Sopenharmony_ci context.dsoftbus_.CloseAllSessions(); 351c29fa5a6Sopenharmony_ci context.eventMgr_.OnUnchain(event); 352c29fa5a6Sopenharmony_ci } 353c29fa5a6Sopenharmony_ci} 354c29fa5a6Sopenharmony_ci} // namespace Cooperate 355c29fa5a6Sopenharmony_ci} // namespace DeviceStatus 356c29fa5a6Sopenharmony_ci} // namespace Msdp 357c29fa5a6Sopenharmony_ci} // namespace OHOS 358