1686862fbSopenharmony_ci/*
2686862fbSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
3686862fbSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4686862fbSopenharmony_ci * you may not use this file except in compliance with the License.
5686862fbSopenharmony_ci * You may obtain a copy of the License at
6686862fbSopenharmony_ci *
7686862fbSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8686862fbSopenharmony_ci *
9686862fbSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10686862fbSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11686862fbSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12686862fbSopenharmony_ci * See the License for the specific language governing permissions and
13686862fbSopenharmony_ci * limitations under the License.
14686862fbSopenharmony_ci */
15686862fbSopenharmony_ci
16686862fbSopenharmony_ci#ifndef OHOS_DSCHED_CONTINUE_MANAGER_H
17686862fbSopenharmony_ci#define OHOS_DSCHED_CONTINUE_MANAGER_H
18686862fbSopenharmony_ci
19686862fbSopenharmony_ci#include <map>
20686862fbSopenharmony_ci#include <string>
21686862fbSopenharmony_ci#include <atomic>
22686862fbSopenharmony_ci
23686862fbSopenharmony_ci#include "dsched_data_buffer.h"
24686862fbSopenharmony_ci#include "dsched_continue.h"
25686862fbSopenharmony_ci#include "idata_listener.h"
26686862fbSopenharmony_ci#include "iremote_object.h"
27686862fbSopenharmony_ci#include "single_instance.h"
28686862fbSopenharmony_ci#include "want.h"
29686862fbSopenharmony_ci
30686862fbSopenharmony_cinamespace OHOS {
31686862fbSopenharmony_cinamespace DistributedSchedule {
32686862fbSopenharmony_cinamespace {
33686862fbSopenharmony_ciconstexpr int32_t MAX_CONCURRENT_SINK = 1;
34686862fbSopenharmony_ciconstexpr int32_t MAX_CONCURRENT_SOURCE = 1;
35686862fbSopenharmony_ciconstexpr int32_t CONTINUE_TIMEOUT = 10000;
36686862fbSopenharmony_ci}
37686862fbSopenharmony_ciclass DSchedContinueManager {
38686862fbSopenharmony_ciDECLARE_SINGLE_INSTANCE_BASE(DSchedContinueManager);
39686862fbSopenharmony_cipublic:
40686862fbSopenharmony_ci    explicit DSchedContinueManager();
41686862fbSopenharmony_ci    ~DSchedContinueManager();
42686862fbSopenharmony_ci    int32_t ContinueMission(const std::string &srcDeviceId, const std::string &dstDeviceId,
43686862fbSopenharmony_ci        int32_t missionId, const sptr<IRemoteObject>& callback, const OHOS::AAFwk::WantParams &wantParams);
44686862fbSopenharmony_ci    int32_t ContinueMission(const DSchedContinueInfo& continueInfo, const sptr<IRemoteObject> &callback,
45686862fbSopenharmony_ci        const OHOS::AAFwk::WantParams &wantParams);
46686862fbSopenharmony_ci    int32_t StartContinuation(const OHOS::AAFwk::Want& want, int32_t missionId, int32_t callerUid, int32_t status,
47686862fbSopenharmony_ci        uint32_t accessToken);
48686862fbSopenharmony_ci    int32_t NotifyCompleteContinuation(const std::u16string& devId, int32_t sessionId, bool isSuccess,
49686862fbSopenharmony_ci        const std::string &callerBundleName);
50686862fbSopenharmony_ci    int32_t OnContinueEnd(const DSchedContinueInfo& info);
51686862fbSopenharmony_ci
52686862fbSopenharmony_ci    void Init();
53686862fbSopenharmony_ci    void UnInit();
54686862fbSopenharmony_ci    void NotifyAllConnectDecision(std::string peerDeviceId, bool isSupport);
55686862fbSopenharmony_ci    void OnDataRecv(int32_t sessionId, std::shared_ptr<DSchedDataBuffer> dataBuffer);
56686862fbSopenharmony_ci    void OnShutdown(int32_t socket, bool isSelfCalled);
57686862fbSopenharmony_ci
58686862fbSopenharmony_ci    int32_t GetContinueInfo(std::string &srcDeviceId, std::string &dstDeviceId);
59686862fbSopenharmony_ci    std::shared_ptr<DSchedContinue> GetDSchedContinueByWant(const OHOS::AAFwk::Want& want, int32_t missionId);
60686862fbSopenharmony_ci    std::shared_ptr<DSchedContinue> GetDSchedContinueByDevId(const std::u16string& devId, int32_t missionId);
61686862fbSopenharmony_ci    void NotifyTerminateContinuation(const int32_t missionId);
62686862fbSopenharmony_ci
63686862fbSopenharmony_ciprivate:
64686862fbSopenharmony_ci    void StartEvent();
65686862fbSopenharmony_ci    void HandleContinueMission(const std::string& srcDeviceId, const std::string& dstDeviceId, int32_t missionId,
66686862fbSopenharmony_ci        const sptr<IRemoteObject>& callback, const OHOS::AAFwk::WantParams& wantParams);
67686862fbSopenharmony_ci    void HandleContinueMission(const DSchedContinueInfo& continueInfo,
68686862fbSopenharmony_ci        const sptr<IRemoteObject>& callback, const OHOS::AAFwk::WantParams& wantParams);
69686862fbSopenharmony_ci    bool GetFirstBundleName(DSchedContinueInfo &info, std::string &firstBundleNamme, std::string bundleName,
70686862fbSopenharmony_ci        std::string deviceId);
71686862fbSopenharmony_ci    void HandleContinueMissionWithBundleName(DSchedContinueInfo &info, const sptr<IRemoteObject> &callback,
72686862fbSopenharmony_ci        const OHOS::AAFwk::WantParams &wantParams);
73686862fbSopenharmony_ci    void HandleStartContinuation(const OHOS::AAFwk::Want& want, int32_t missionId, int32_t callerUid,
74686862fbSopenharmony_ci        int32_t status, uint32_t accessToken);
75686862fbSopenharmony_ci    void HandleNotifyCompleteContinuation(const std::u16string& devId, int32_t missionId, bool isSuccess,
76686862fbSopenharmony_ci        const std::string &callerBundleName);
77686862fbSopenharmony_ci    void HandleContinueEnd(const DSchedContinueInfo& info);
78686862fbSopenharmony_ci    void HandleDataRecv(int32_t sessionId, std::shared_ptr<DSchedDataBuffer> dataBuffer);
79686862fbSopenharmony_ci    void NotifyContinueDataRecv(int32_t sessionId, int32_t command, const std::string& jsonStr,
80686862fbSopenharmony_ci        std::shared_ptr<DSchedDataBuffer> dataBuffer);
81686862fbSopenharmony_ci    int32_t CheckContinuationLimit(const std::string& srcDeviceId, const std::string& dstDeviceId, int32_t &direction);
82686862fbSopenharmony_ci    void WaitAllConnectDecision(int32_t direction, const DSchedContinueInfo &info, int32_t timeout);
83686862fbSopenharmony_ci    void SetTimeOut(const DSchedContinueInfo& info, int32_t timeout);
84686862fbSopenharmony_ci    void RemoveTimeout(const DSchedContinueInfo& info);
85686862fbSopenharmony_ci
86686862fbSopenharmony_ci    class SoftbusListener : public IDataListener {
87686862fbSopenharmony_ci        void OnBind(int32_t socket, PeerSocketInfo info);
88686862fbSopenharmony_ci        void OnShutdown(int32_t socket, bool isSelfCalled);
89686862fbSopenharmony_ci        void OnDataRecv(int32_t socket, std::shared_ptr<DSchedDataBuffer> dataBuffer);
90686862fbSopenharmony_ci    };
91686862fbSopenharmony_ci
92686862fbSopenharmony_ciprivate:
93686862fbSopenharmony_ci#ifdef DMSFWK_ALL_CONNECT_MGR
94686862fbSopenharmony_ci    static constexpr int32_t CONNECT_DECISION_WAIT_S = 60;
95686862fbSopenharmony_ci#endif
96686862fbSopenharmony_ci
97686862fbSopenharmony_ci    std::thread eventThread_;
98686862fbSopenharmony_ci    std::condition_variable eventCon_;
99686862fbSopenharmony_ci    std::mutex eventMutex_;
100686862fbSopenharmony_ci    std::shared_ptr<OHOS::AppExecFwk::EventHandler> eventHandler_;
101686862fbSopenharmony_ci    std::shared_ptr<DSchedContinueManager::SoftbusListener> softbusListener_;
102686862fbSopenharmony_ci
103686862fbSopenharmony_ci    std::map<DSchedContinueInfo, std::shared_ptr<DSchedContinue>> continues_;
104686862fbSopenharmony_ci    std::mutex continueMutex_;
105686862fbSopenharmony_ci
106686862fbSopenharmony_ci#ifdef DMSFWK_ALL_CONNECT_MGR
107686862fbSopenharmony_ci    std::mutex connectDecisionMutex_;
108686862fbSopenharmony_ci    std::condition_variable connectDecisionCond_;
109686862fbSopenharmony_ci    std::map<std::string, std::atomic<bool>> peerConnectDecision_;
110686862fbSopenharmony_ci#endif
111686862fbSopenharmony_ci
112686862fbSopenharmony_ci    std::atomic<int32_t> cntSink_ {0};
113686862fbSopenharmony_ci    std::atomic<int32_t> cntSource_ {0};
114686862fbSopenharmony_ci};
115686862fbSopenharmony_ci}  // namespace DistributedSchedule
116686862fbSopenharmony_ci}  // namespace OHOS
117686862fbSopenharmony_ci#endif  // OHOS_DSCHED_CONTINUE_MANAGER_H
118