1c29fa5a6Sopenharmony_ci /*
2c29fa5a6Sopenharmony_ci * Copyright (c) 2023 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 COOPERATE_CLIENT_H
17c29fa5a6Sopenharmony_ci#define COOPERATE_CLIENT_H
18c29fa5a6Sopenharmony_ci
19c29fa5a6Sopenharmony_ci#include <functional>
20c29fa5a6Sopenharmony_ci#include <list>
21c29fa5a6Sopenharmony_ci#include <map>
22c29fa5a6Sopenharmony_ci#include <mutex>
23c29fa5a6Sopenharmony_ci#include <set>
24c29fa5a6Sopenharmony_ci#ifdef ENABLE_PERFORMANCE_CHECK
25c29fa5a6Sopenharmony_ci#include <chrono>
26c29fa5a6Sopenharmony_ci#include <vector>
27c29fa5a6Sopenharmony_ci#endif // ENABLE_PERFORMANCE_CHECK
28c29fa5a6Sopenharmony_ci
29c29fa5a6Sopenharmony_ci#include "nocopyable.h"
30c29fa5a6Sopenharmony_ci
31c29fa5a6Sopenharmony_ci#include "coordination_message.h"
32c29fa5a6Sopenharmony_ci#include "i_coordination_listener.h"
33c29fa5a6Sopenharmony_ci#include "i_event_listener.h"
34c29fa5a6Sopenharmony_ci#include "i_hotarea_listener.h"
35c29fa5a6Sopenharmony_ci#include "i_tunnel_client.h"
36c29fa5a6Sopenharmony_ci#include "net_packet.h"
37c29fa5a6Sopenharmony_ci#include "socket_client.h"
38c29fa5a6Sopenharmony_ci#include "stream_client.h"
39c29fa5a6Sopenharmony_ci
40c29fa5a6Sopenharmony_cinamespace OHOS {
41c29fa5a6Sopenharmony_cinamespace Msdp {
42c29fa5a6Sopenharmony_cinamespace DeviceStatus {
43c29fa5a6Sopenharmony_ciclass CooperateClient final {
44c29fa5a6Sopenharmony_cipublic:
45c29fa5a6Sopenharmony_ci    using CooperateMessageCallback = std::function<void(const std::string&, const CoordinationMsgInfo&)>;
46c29fa5a6Sopenharmony_ci    using CooperateStateCallback = std::function<void(bool)>;
47c29fa5a6Sopenharmony_ci    using CooperateListenerPtr = std::shared_ptr<ICoordinationListener>;
48c29fa5a6Sopenharmony_ci    using HotAreaListenerPtr = std::shared_ptr<IHotAreaListener>;
49c29fa5a6Sopenharmony_ci    using MouseLocationListenerPtr = std::shared_ptr<IEventListener>;
50c29fa5a6Sopenharmony_ci
51c29fa5a6Sopenharmony_ci    struct CooperateEvent {
52c29fa5a6Sopenharmony_ci        CooperateEvent(CooperateMessageCallback callback) : msgCb(callback) {}
53c29fa5a6Sopenharmony_ci        CooperateEvent(CooperateStateCallback callback) : stateCb(callback) {}
54c29fa5a6Sopenharmony_ci
55c29fa5a6Sopenharmony_ci        CooperateMessageCallback msgCb;
56c29fa5a6Sopenharmony_ci        CooperateStateCallback stateCb;
57c29fa5a6Sopenharmony_ci    };
58c29fa5a6Sopenharmony_ci
59c29fa5a6Sopenharmony_ci    CooperateClient() = default;
60c29fa5a6Sopenharmony_ci    ~CooperateClient() = default;
61c29fa5a6Sopenharmony_ci    DISALLOW_COPY_AND_MOVE(CooperateClient);
62c29fa5a6Sopenharmony_ci
63c29fa5a6Sopenharmony_ci    int32_t RegisterListener(ITunnelClient &tunnel,
64c29fa5a6Sopenharmony_ci        CooperateListenerPtr listener, bool isCheckPermission = false);
65c29fa5a6Sopenharmony_ci    int32_t UnregisterListener(ITunnelClient &tunnel,
66c29fa5a6Sopenharmony_ci        CooperateListenerPtr listener, bool isCheckPermission = false);
67c29fa5a6Sopenharmony_ci    int32_t Enable(ITunnelClient &tunnel,
68c29fa5a6Sopenharmony_ci        CooperateMessageCallback callback, bool isCheckPermission = false);
69c29fa5a6Sopenharmony_ci    int32_t Disable(ITunnelClient &tunnel,
70c29fa5a6Sopenharmony_ci        CooperateMessageCallback callback, bool isCheckPermission = false);
71c29fa5a6Sopenharmony_ci    int32_t Start(ITunnelClient &tunnel,
72c29fa5a6Sopenharmony_ci        const std::string &remoteNetworkId, int32_t startDeviceId,
73c29fa5a6Sopenharmony_ci        CooperateMessageCallback callback, bool isCheckPermission = false);
74c29fa5a6Sopenharmony_ci    int32_t Stop(ITunnelClient &tunnel,
75c29fa5a6Sopenharmony_ci        bool isUnchained, CooperateMessageCallback callback,
76c29fa5a6Sopenharmony_ci        bool isCheckPermission = false);
77c29fa5a6Sopenharmony_ci    int32_t GetCooperateState(ITunnelClient &tunnel,
78c29fa5a6Sopenharmony_ci        const std::string &networkId, CooperateStateCallback callback,
79c29fa5a6Sopenharmony_ci        bool isCheckPermission = false);
80c29fa5a6Sopenharmony_ci    int32_t GetCooperateState(ITunnelClient &tunnel, const std::string &udId, bool &state);
81c29fa5a6Sopenharmony_ci    int32_t RegisterEventListener(ITunnelClient &tunnel, const std::string &networkId,
82c29fa5a6Sopenharmony_ci        MouseLocationListenerPtr listener);
83c29fa5a6Sopenharmony_ci    int32_t UnregisterEventListener(ITunnelClient &tunnel, const std::string &networkId,
84c29fa5a6Sopenharmony_ci        MouseLocationListenerPtr listener = nullptr);
85c29fa5a6Sopenharmony_ci    int32_t AddHotAreaListener(ITunnelClient &tunnel, HotAreaListenerPtr listener);
86c29fa5a6Sopenharmony_ci    int32_t RemoveHotAreaListener(ITunnelClient &tunnel, HotAreaListenerPtr listener = nullptr);
87c29fa5a6Sopenharmony_ci
88c29fa5a6Sopenharmony_ci    int32_t OnCoordinationListener(const StreamClient &client, NetPacket &pkt);
89c29fa5a6Sopenharmony_ci    int32_t OnCoordinationMessage(const StreamClient &client, NetPacket &pkt);
90c29fa5a6Sopenharmony_ci    int32_t OnCoordinationState(const StreamClient &client, NetPacket &pkt);
91c29fa5a6Sopenharmony_ci    int32_t OnHotAreaListener(const StreamClient &client, NetPacket &pkt);
92c29fa5a6Sopenharmony_ci    int32_t OnMouseLocationListener(const StreamClient &client, NetPacket &pkt);
93c29fa5a6Sopenharmony_ci
94c29fa5a6Sopenharmony_ciprivate:
95c29fa5a6Sopenharmony_ci    int32_t GenerateRequestID();
96c29fa5a6Sopenharmony_ci    void OnDevCooperateListener(const std::string &networkId, CoordinationMessage msg);
97c29fa5a6Sopenharmony_ci    void OnCooperateMessageEvent(int32_t userData, const std::string &networkId, const CoordinationMsgInfo &msgInfo);
98c29fa5a6Sopenharmony_ci    void OnCooperateStateEvent(int32_t userData, bool state);
99c29fa5a6Sopenharmony_ci    void OnDevHotAreaListener(int32_t displayX, int32_t displayY, HotAreaType type, bool isEdge);
100c29fa5a6Sopenharmony_ci    void OnDevMouseLocationListener(const std::string &networkId, const Event &event);
101c29fa5a6Sopenharmony_ci#ifdef ENABLE_PERFORMANCE_CHECK
102c29fa5a6Sopenharmony_ci    void StartTrace(int32_t userData);
103c29fa5a6Sopenharmony_ci    void FinishTrace(int32_t userData, CoordinationMessage msg);
104c29fa5a6Sopenharmony_ci    int32_t GetFirstSuccessIndex();
105c29fa5a6Sopenharmony_ci    void DumpPerformanceInfo();
106c29fa5a6Sopenharmony_ci#endif // ENABLE_PERFORMANCE_CHECK
107c29fa5a6Sopenharmony_ci
108c29fa5a6Sopenharmony_ci    std::list<CooperateListenerPtr> devCooperateListener_;
109c29fa5a6Sopenharmony_ci    std::map<std::string, std::set<MouseLocationListenerPtr>> eventListener_;
110c29fa5a6Sopenharmony_ci    std::list<HotAreaListenerPtr> devHotAreaListener_;
111c29fa5a6Sopenharmony_ci    std::map<int32_t, CooperateEvent> devCooperateEvent_;
112c29fa5a6Sopenharmony_ci    mutable std::mutex mtx_;
113c29fa5a6Sopenharmony_ci    std::atomic_bool isListeningProcess_ { false };
114c29fa5a6Sopenharmony_ci
115c29fa5a6Sopenharmony_ci#ifdef ENABLE_PERFORMANCE_CHECK
116c29fa5a6Sopenharmony_ci    struct PerformanceInfo {
117c29fa5a6Sopenharmony_ci        std::map<int32_t, std::chrono::time_point<std::chrono::steady_clock>> traces_;
118c29fa5a6Sopenharmony_ci        int32_t activateNum { 0 };
119c29fa5a6Sopenharmony_ci        int32_t successNum { -1 };
120c29fa5a6Sopenharmony_ci        int32_t failNum { -1 };
121c29fa5a6Sopenharmony_ci        float successRate { 0.0f };
122c29fa5a6Sopenharmony_ci        int32_t averageDuration { -1 };
123c29fa5a6Sopenharmony_ci        int32_t failBeforeSuccess { -1 };
124c29fa5a6Sopenharmony_ci        int32_t firstSuccessDuration { -1 };
125c29fa5a6Sopenharmony_ci        int32_t maxDuration { std::numeric_limits<int32_t>::min() };
126c29fa5a6Sopenharmony_ci        int32_t minDuration { std::numeric_limits<int32_t>::max() };
127c29fa5a6Sopenharmony_ci        std::vector<int32_t> durationList;
128c29fa5a6Sopenharmony_ci    };
129c29fa5a6Sopenharmony_ci    std::mutex performanceLock_;
130c29fa5a6Sopenharmony_ci    PerformanceInfo performanceInfo_;
131c29fa5a6Sopenharmony_ci#endif // ENABLE_PERFORMANCE_CHECK
132c29fa5a6Sopenharmony_ci};
133c29fa5a6Sopenharmony_ci} // namespace DeviceStatus
134c29fa5a6Sopenharmony_ci} // namespace Msdp
135c29fa5a6Sopenharmony_ci} // namespace OHOS
136c29fa5a6Sopenharmony_ci#endif // COOPERATE_CLIENT_H
137