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