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#ifndef I_COOPERATE_STATE_H
17c29fa5a6Sopenharmony_ci#define I_COOPERATE_STATE_H
18c29fa5a6Sopenharmony_ci
19c29fa5a6Sopenharmony_ci#include "cooperate_context.h"
20c29fa5a6Sopenharmony_ci
21c29fa5a6Sopenharmony_cinamespace OHOS {
22c29fa5a6Sopenharmony_cinamespace Msdp {
23c29fa5a6Sopenharmony_cinamespace DeviceStatus {
24c29fa5a6Sopenharmony_cinamespace Cooperate {
25c29fa5a6Sopenharmony_cinamespace {
26c29fa5a6Sopenharmony_ci    constexpr int32_t PRIORITY { 1 };
27c29fa5a6Sopenharmony_ci}
28c29fa5a6Sopenharmony_ciclass IStateMachine {
29c29fa5a6Sopenharmony_cipublic:
30c29fa5a6Sopenharmony_ci    IStateMachine() = default;
31c29fa5a6Sopenharmony_ci    virtual ~IStateMachine() = default;
32c29fa5a6Sopenharmony_ci
33c29fa5a6Sopenharmony_ci    virtual void TransiteTo(Context &context, CooperateState state) = 0;
34c29fa5a6Sopenharmony_ci};
35c29fa5a6Sopenharmony_ci
36c29fa5a6Sopenharmony_ciclass ICooperateState {
37c29fa5a6Sopenharmony_cipublic:
38c29fa5a6Sopenharmony_ci    ICooperateState(IStateMachine &parent) : parent_(parent) {}
39c29fa5a6Sopenharmony_ci    virtual ~ICooperateState() = default;
40c29fa5a6Sopenharmony_ci
41c29fa5a6Sopenharmony_ci    virtual void OnEvent(Context &context, const CooperateEvent &event) = 0;
42c29fa5a6Sopenharmony_ci    virtual void OnEnterState(Context &context) = 0;
43c29fa5a6Sopenharmony_ci    virtual void OnLeaveState(Context &context) = 0;
44c29fa5a6Sopenharmony_ci
45c29fa5a6Sopenharmony_ciprotected:
46c29fa5a6Sopenharmony_ci    class ICooperateStep {
47c29fa5a6Sopenharmony_ci    public:
48c29fa5a6Sopenharmony_ci        ICooperateStep(ICooperateState &parent, std::shared_ptr<ICooperateStep> prev);
49c29fa5a6Sopenharmony_ci        virtual ~ICooperateStep() = default;
50c29fa5a6Sopenharmony_ci
51c29fa5a6Sopenharmony_ci        virtual void OnEvent(Context &context, const CooperateEvent &event);
52c29fa5a6Sopenharmony_ci        virtual void OnProgress(Context &context, const CooperateEvent &event) = 0;
53c29fa5a6Sopenharmony_ci        virtual void OnReset(Context &context, const CooperateEvent &event) = 0;
54c29fa5a6Sopenharmony_ci
55c29fa5a6Sopenharmony_ci        void SetNext(std::shared_ptr<ICooperateStep> next);
56c29fa5a6Sopenharmony_ci
57c29fa5a6Sopenharmony_ci    protected:
58c29fa5a6Sopenharmony_ci        void AddHandler(CooperateEventType event, std::function<void(Context&, const CooperateEvent&)> handler)
59c29fa5a6Sopenharmony_ci        {
60c29fa5a6Sopenharmony_ci            handlers_.emplace(event, handler);
61c29fa5a6Sopenharmony_ci        }
62c29fa5a6Sopenharmony_ci
63c29fa5a6Sopenharmony_ci        void TransiteTo(Context &context, CooperateState state);
64c29fa5a6Sopenharmony_ci        void Switch(std::shared_ptr<ICooperateStep> step);
65c29fa5a6Sopenharmony_ci        void Proceed(Context &context, const CooperateEvent &event);
66c29fa5a6Sopenharmony_ci        void Reset(Context &context, const CooperateEvent &event);
67c29fa5a6Sopenharmony_ci
68c29fa5a6Sopenharmony_ci        ICooperateState &parent_;
69c29fa5a6Sopenharmony_ci        std::shared_ptr<ICooperateStep> prev_ { nullptr };
70c29fa5a6Sopenharmony_ci        std::shared_ptr<ICooperateStep> next_ { nullptr };
71c29fa5a6Sopenharmony_ci        std::map<CooperateEventType, std::function<void(Context&, const CooperateEvent&)>> handlers_;
72c29fa5a6Sopenharmony_ci    };
73c29fa5a6Sopenharmony_ci
74c29fa5a6Sopenharmony_ci    class Process final {
75c29fa5a6Sopenharmony_ci    public:
76c29fa5a6Sopenharmony_ci        Process() = default;
77c29fa5a6Sopenharmony_ci        ~Process() = default;
78c29fa5a6Sopenharmony_ci
79c29fa5a6Sopenharmony_ci        std::string Peer() const;
80c29fa5a6Sopenharmony_ci        int32_t StartDeviceId() const;
81c29fa5a6Sopenharmony_ci
82c29fa5a6Sopenharmony_ci        bool IsPeer(const std::string &networkId) const;
83c29fa5a6Sopenharmony_ci
84c29fa5a6Sopenharmony_ci        void StartCooperate(Context &context, const StartCooperateEvent &event);
85c29fa5a6Sopenharmony_ci        void RemoteStart(Context &context, const DSoftbusStartCooperate &event);
86c29fa5a6Sopenharmony_ci        void RelayCooperate(Context &context, const DSoftbusRelayCooperate &event);
87c29fa5a6Sopenharmony_ci
88c29fa5a6Sopenharmony_ci    private:
89c29fa5a6Sopenharmony_ci        std::string remoteNetworkId_;
90c29fa5a6Sopenharmony_ci        int32_t startDeviceId_ { -1 };
91c29fa5a6Sopenharmony_ci    };
92c29fa5a6Sopenharmony_ci
93c29fa5a6Sopenharmony_ci    void TransiteTo(Context &context, CooperateState state);
94c29fa5a6Sopenharmony_ci    void Switch(std::shared_ptr<ICooperateStep> step);
95c29fa5a6Sopenharmony_ci
96c29fa5a6Sopenharmony_ci    IStateMachine &parent_;
97c29fa5a6Sopenharmony_ci    std::shared_ptr<ICooperateStep> current_ { nullptr };
98c29fa5a6Sopenharmony_ci    Process process_;
99c29fa5a6Sopenharmony_ci};
100c29fa5a6Sopenharmony_ci} // namespace Cooperate
101c29fa5a6Sopenharmony_ci} // namespace DeviceStatus
102c29fa5a6Sopenharmony_ci} // namespace Msdp
103c29fa5a6Sopenharmony_ci} // namespace OHOS
104c29fa5a6Sopenharmony_ci#endif // I_COOPERATE_STATE_H
105