• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  * Description: implement the cast source connect
15  * Author: zhangge
16  * Create: 2022-08-23
17  */
18 
19 #ifndef CONNECTION_MANAGER_H
20 #define CONNECTION_MANAGER_H
21 
22 #include <map>
23 #include <mutex>
24 #include <optional>
25 #include <string>
26 
27 #include "cast_device_data_manager.h"
28 #include "cast_engine_common.h"
29 #include "cast_service_common.h"
30 #include "connection_manager_listener.h"
31 #include "dm_device_info.h"
32 #include "device_manager_callback.h"
33 #include "json.hpp"
34 #include "socket.h"
35 
36 namespace OHOS {
37 namespace CastEngine {
38 namespace CastEngineService {
39 using OHOS::DistributedHardware::BindTargetCallback;
40 using OHOS::DistributedHardware::UnbindTargetCallback;
41 using OHOS::DistributedHardware::DeviceStateCallback;
42 using OHOS::DistributedHardware::DmDeviceInfo;
43 using OHOS::DistributedHardware::PeerTargetId;
44 using nlohmann::json;
45 
46 class CastBindTargetCallback : public BindTargetCallback {
47 public:
48     void OnBindResult(const PeerTargetId &targetId, int32_t result, int32_t status, std::string content) override;
49 private:
50     void HandleBindAction(const CastInnerRemoteDevice &device, int action, const json &authInfo);
51     void HandleConnectDeviceAction(const CastInnerRemoteDevice &device, const json &authInfo);
52     bool GetSessionKey(const json &authInfo, uint8_t *sessionkey);
53     void HandleQueryIpAction(const CastInnerRemoteDevice &remoteDevice, const json &authInfo);
54     static const std::map<int32_t, int32_t> RESULT_REASON_MAP;
55     static const std::map<int32_t, int32_t> STATUS_REASON_MAP;
56 };
57 
58 class CastUnBindTargetCallback : public UnbindTargetCallback {
59 public:
60     void OnUnbindResult(const PeerTargetId &targetId, int32_t result, std::string content) override;
61 };
62 
63 class ConnectionManager {
64 public:
65     static ConnectionManager &GetInstance();
66 
67     void Init(std::shared_ptr<IConnectionManagerListener> listener);
68     void Deinit();
69 
70     bool IsDeviceTrusted(const std::string &deviceId, std::string &networkId);
71     DmDeviceInfo GetDmDeviceInfo(const std::string &deviceId);
72     bool EnableDiscoverable();
73     bool DisableDiscoverable();
74     void GrabDevice();
75 
76     bool OpenConsultSession(const CastInnerRemoteDevice &device);
77     void OnConsultDataReceived(int transportId, const void *data, unsigned int dataLen);
78     bool OnConsultSessionOpened(int transportId, bool isSource);
79     void OnConsultDataReceivedFromSink(int transportId, const void *data, unsigned int dataLen);
80     bool handleConsultData(const json &body, int transportId);
81 
82     bool ConnectDevice(const CastInnerRemoteDevice &dev, const ProtocolType &protocolType);
83     void DisconnectDevice(const std::string &deviceId);
84 
85     bool UpdateDeviceState(const std::string &deviceId, RemoteDeviceState state);
86     void UpdateGrabState(bool changeState, int32_t sessionId);
87 
88     int GetProtocolType() const;
89     void SetProtocolType(ProtocolType protocol);
90 
91     int32_t GetLocalDeviceInfo(CastLocalDevice &device);
92 
93     void NotifySessionIsReady(int transportId);
94     void NotifyDeviceIsOffline(const std::string &deviceId);
95     bool NotifyConnectStage(const CastInnerRemoteDevice &device, int result, int32_t reasonCode = REASON_DEFAULT);
96     bool NotifyListenerToLoadSinkSA(const std::string &networkId);
97 
98     void AddSessionListener(int castSessionId, std::shared_ptr<IConnectManagerSessionListener> listener);
99     void RemoveSessionListener(int castSessionId);
100 
101     int32_t GetSessionProtocolType(int sessionId, ProtocolType &protocolType);
102     int32_t SetSessionProtocolType(int sessionId, ProtocolType protocolType);
103 
104     void SetRTSPPort(int port);
105     void SendConsultInfo(const std::string &deviceId, int port);
106 
107     std::string GetConnectingDeviceId();
108     void SetConnectingDeviceId(std::string deviceId);
109     bool IsSingle(const CastInnerRemoteDevice &device);
110     bool IsHuaweiDevice(const CastInnerRemoteDevice &device);
111     bool IsThirdDevice(const CastInnerRemoteDevice &device);
112     bool IsBindTarget(std::string deviceId);
113 
114     bool SourceCheckConnectAccess(std::string &peerNetworkId);
115     bool SinkCheckConnectAccess(json &data, std::string &peerDeviceId);
116 
117     std::map<std::string, bool> isBindTargetMap_;
118     std::string connectingDeviceId_{};
119     time_t openSessionTime_;
120     std::string authTimeString_ = "";
121     long totalAuthTime_ = 0;
122 
123 private:
124     bool BindTarget(const CastInnerRemoteDevice &dev);
125     bool BuildBindParam(const CastInnerRemoteDevice &device, std::map<std::string, std::string> &bindParam);
126     std::string GetAuthVersion(const CastInnerRemoteDevice &device);
127 
128     bool QueryP2PIp(const CastInnerRemoteDevice &device);
129 
130     void SendConsultData(const CastInnerRemoteDevice &device, int port);
131     std::string GetConsultationData(const CastInnerRemoteDevice &device, int port, json &body);
132 
133     void EncryptPort(int port, const uint8_t *sessionKey, json &body);
134     void EncryptIp(const std::string &ip, const std::string &key, const uint8_t *sessionKey, json &body);
135     std::unique_ptr<uint8_t[]> intToByteArray(int32_t num);
136     std::string convLatin1ToUTF8(std::string &latin1);
137 
138     void DestroyConsulationSession(const std::string &deviceId);
139     int GetCastSessionId(int transportId);
140 
141     bool ParseAndCheckJsonData(const std::string &data, json &jsonData);
142     std::unique_ptr<CastInnerRemoteDevice> GetRemoteFromJsonData(const std::string &Data);
143     int OpenSoftBusSocket(
144         const std::optional<std::string> &networkId, const CastInnerRemoteDevice &device, int32_t &errorCode);
145     void WaitAndConnectTargetDevice(const CastInnerRemoteDevice &dev);
146 
147     bool IsWifiChannelFirst(const std::string &deviceId);
148     bool IsNeedDiscoveryDevice(const CastInnerRemoteDevice &dev);
149     bool IsDeviceConnectStateChange(const CastInnerRemoteDevice &device);
150 
151     int GetRTSPPort();
152     std::shared_ptr<IConnectManagerSessionListener> GetSessionListener(int castSessionId);
153     void SetListener(std::shared_ptr<IConnectionManagerListener> listener);
154     std::shared_ptr<IConnectionManagerListener> GetListener();
155     bool HasListener();
156     void ResetListener();
157 
158     std::mutex mutex_;
159     ProtocolType protocolType_ = ProtocolType::CAST_PLUS_MIRROR;
160     std::shared_ptr<IConnectionManagerListener> listener_;
161     std::map<int, std::shared_ptr<IConnectManagerSessionListener>> sessionListeners_;
162     std::map<int, int> transIdToCastSessionIdMap_;
163     bool isDiscoverable_{ false };
164     DeviceGrabState grabState_{ DeviceGrabState::NO_GRAB };
165     int32_t sessionId_{ -1 };
166     int rtspPort_{ INVALID_PORT };
167     bool isWifiFresh_ = false;
168 
169     // For synchronizing result of openSession between OpenConsultSession and OnOpenSession.
170     std::mutex openConsultingSessionMutex_;
171 };
172 
173 class CastDeviceStateCallback : public DeviceStateCallback {
174 public:
175     void OnDeviceOnline(const DmDeviceInfo &deviceInfo) override;
176     void OnDeviceOffline(const DmDeviceInfo &deviceInfo) override;
177     void OnDeviceChanged(const DmDeviceInfo &deviceInfo) override;
178     void OnDeviceReady(const DmDeviceInfo &deviceInfo) override;
179 };
180 } // namespace CastEngineService
181 } // namespace CastEngine
182 } // namespace OHOS
183 
184 #endif // CONNECTION_MANAGER_H