1 /* 2 * Copyright (c) 2023-2024 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 */ 15 16 #ifndef OHOS_DISCOVERY_MANAGER_H 17 #define OHOS_DISCOVERY_MANAGER_H 18 19 #include <set> 20 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE)) 21 #include "deviceprofile_connector.h" 22 #endif 23 #include "discovery_filter.h" 24 #include "idevice_manager_service_listener.h" 25 #include "dm_timer.h" 26 #include "mine_softbus_listener.h" 27 28 namespace OHOS { 29 namespace DistributedHardware { 30 typedef struct DiscoveryContext { 31 std::string pkgName; 32 std::string extra; 33 uint16_t subscribeId; 34 std::string filterOp; 35 std::vector<DeviceFilters> filters; 36 } DiscoveryContext; 37 38 typedef struct MultiUserDiscovery { 39 std::string pkgName; 40 int32_t userId; 41 } MultiUserDiscovery; 42 43 typedef enum { 44 PROXY_TRANSMISION = 0, 45 PROXY_HEARTBEAT = 1, 46 PROXY_HICAR = 2, 47 PROXY_ACS = 3, 48 PROXY_SHARE = 4, 49 PROXY_CASTPLUS = 5, 50 PROXY_DM = 6, 51 PROXY_WEAR = 7, 52 PROXY_WINPC = 8, 53 PROXY_COLLABORATION_FWK = 9, 54 PROXY_DMSDP = 10, 55 CUSTOM_UNKNOWN, 56 } MetaNodeType; 57 58 class DiscoveryManager : public ISoftbusDiscoveringCallback, public std::enable_shared_from_this<DiscoveryManager> { 59 public: 60 DiscoveryManager(std::shared_ptr<SoftbusListener> softbusListener, 61 std::shared_ptr<IDeviceManagerServiceListener> listener); 62 ~DiscoveryManager() override; 63 64 // interfaces from ISoftbusDiscoveringCallback 65 void OnDeviceFound(const std::string &pkgName, const DmDeviceInfo &info, bool isOnline) override; 66 void OnDiscoveringResult(const std::string &pkgName, int32_t subscribeId, int32_t result) override; 67 int32_t StartDiscovering(const std::string &pkgName, const std::map<std::string, std::string> &discoverParam, 68 const std::map<std::string, std::string> &filterOptions); 69 int32_t StopDiscovering(const std::string &pkgName, uint16_t subscribeId); 70 int32_t EnableDiscoveryListener(const std::string &pkgName, const std::map<std::string, std::string> &discoverParam, 71 const std::map<std::string, std::string> &filterOptions); 72 int32_t DisableDiscoveryListener(const std::string &pkgName, const std::map<std::string, std::string> &extraParam); 73 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE)) 74 static IDeviceProfileConnector* GetCommonDependencyObj(); 75 static bool IsCommonDependencyReady(); 76 static bool CloseCommonDependencyObj(); 77 #endif 78 void ClearDiscoveryCache(const ProcessInfo &processInfo); 79 std::set<uint16_t> ClearDiscoveryPkgName(const std::string &pkgName); 80 81 private: 82 void StartDiscoveryTimer(const std::string &pkgName); 83 void HandleDiscoveryTimeout(const std::string &pkgName); 84 int32_t StartDiscovering4MetaType(const std::string &pkgName, DmSubscribeInfo &dmSubInfo, 85 const std::map<std::string, std::string> ¶m); 86 int32_t StartDiscoveringNoMetaType(const std::string &pkgName, DmSubscribeInfo &dmSubInfo, 87 const std::map<std::string, std::string> ¶m); 88 int32_t StartDiscovering4MineLibary(const std::string &pkgName, DmSubscribeInfo &dmSubInfo, 89 const std::string &searchJson); 90 int32_t HandleDiscoveryQueue(const std::string &pkgName, uint16_t subscribeId, 91 const std::map<std::string, std::string> &filterOps); 92 int32_t GetDeviceAclParam(const std::string &pkgName, int32_t userId, std::string deviceId, bool &isOnline, 93 int32_t &authForm); 94 void ConfigDiscParam(const std::map<std::string, std::string> &discoverParam, DmSubscribeInfo *dmSubInfo); 95 bool CompareCapability(uint32_t capabilityType, const std::string &capabilityStr); 96 void OnDeviceFound(const std::string &pkgName, const uint32_t capabilityType, 97 const DmDeviceInfo &info, const DeviceFilterPara &filterPara); 98 void UpdateInfoFreq(const std::map<std::string, std::string> &discoverParam, DmSubscribeInfo &dmSubInfo); 99 void UpdateInfoMedium(const std::map<std::string, std::string> &discoverParam, DmSubscribeInfo &dmSubInfo); 100 std::string AddMultiUserIdentify(const std::string &pkgName); 101 std::string RemoveMultiUserIdentify(const std::string &pkgName); 102 void GetPkgNameAndUserId(const std::string &pkgName, std::string &callerPkgName, int32_t &userId); 103 int32_t GenInnerSubId(const std::string &pkgName, uint16_t subId); 104 int32_t GetAndRemoveInnerSubId(const std::string &pkgName, uint16_t subId); 105 int32_t StopDiscoveringByInnerSubId(const std::string &pkgName, uint16_t subscribeId); 106 107 private: 108 std::mutex locks_; 109 std::mutex subIdMapLocks_; 110 std::shared_ptr<DmTimer> timer_; 111 // Caller subId to inner subId. The key is the caller pkgName, the value is 112 // a list of externals subId to inner subId. 113 std::map<std::string, std::map<uint16_t, uint16_t>> pkgName2SubIdMap_; 114 std::shared_ptr<SoftbusListener> softbusListener_; 115 std::shared_ptr<MineSoftbusListener> mineSoftbusListener_; 116 std::shared_ptr<IDeviceManagerServiceListener> listener_; 117 std::map<std::string, DiscoveryContext> discoveryContextMap_; 118 119 std::set<std::string> pkgNameSet_; 120 std::map<std::string, std::string> capabilityMap_; 121 std::mutex capabilityMapLocks_; 122 std::mutex multiUserDiscLocks_; 123 std::map<std::string, MultiUserDiscovery> multiUserDiscMap_; 124 125 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE)) 126 static bool isSoLoaded_; 127 static IDeviceProfileConnector *dpConnector_; 128 static void *dpConnectorHandle_; 129 #endif 130 131 std::set<uint16_t> randSubIdSet_; 132 }; 133 } // namespace DistributedHardware 134 } // namespace OHOS 135 #endif // OHOS_DISCOVERY_MANAGER_H 136