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