1 /* 2 * Copyright (c) 2022-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 */ 15 16 #ifndef OHOS_DM_MINE_SOFTBUS_LISTENER_H 17 #define OHOS_DM_MINE_SOFTBUS_LISTENER_H 18 19 #include <map> 20 #include <memory> 21 #include <mutex> 22 #include <string> 23 #include <sstream> 24 #include <type_traits> 25 #include <vector> 26 27 #include "softbus_listener.h" 28 #include "dm_device_info.h" 29 #include "dm_publish_info.h" 30 #include "dm_radar_helper.h" 31 #include "dm_timer.h" 32 #include "dm_subscribe_info.h" 33 #include "i_softbus_discovering_callback.h" 34 #include "inner_session.h" 35 #include "session.h" 36 #include "nlohmann/json.hpp" 37 38 using std::vector; 39 using std::string; 40 using json = nlohmann::json; 41 42 namespace OHOS { 43 namespace DistributedHardware { 44 constexpr uint32_t DM_HASH_DATA_LEN = 16; 45 constexpr uint32_t DM_DEVICE_NUMBER_LEN = 11; 46 constexpr uint32_t DM_DE_LEN = 16; 47 constexpr uint32_t EVP_OK = 1; 48 49 typedef struct { 50 string type; 51 string value; 52 } VertexOptionInfo; 53 54 typedef struct { 55 char version; 56 char headDataLen; 57 char tlvDataLen; 58 char pkgNameHash[DM_HASH_DATA_LEN]; 59 char findMode; 60 char trustFilter; 61 } BroadcastHead; 62 63 typedef struct { 64 string deviceAlias; 65 int32_t startNumber; 66 int32_t endNumber; 67 } ScopeOptionInfo; 68 69 typedef struct { 70 char version; 71 char dataLen; 72 bool isExistCredential; 73 char pkgNameHash[DM_HASH_DATA_LEN]; 74 } ReturnwaveHead; 75 76 typedef struct { 77 bool snHashValid; 78 bool typeHashValid; 79 bool udidHashValid; 80 bool aliasHashValid; 81 bool numberValid; 82 char snHash[DM_HASH_DATA_LEN]; 83 char typeHash[DM_HASH_DATA_LEN]; 84 char udidHash[DM_HASH_DATA_LEN]; 85 char aliasHash[DM_HASH_DATA_LEN]; 86 char number[DM_DEVICE_NUMBER_LEN]; 87 } DevicePolicyInfo; 88 89 typedef enum { 90 BUSINESS_EXACT_MATCH = 0x01, 91 BUSINESS_PARTIAL_MATCH, 92 BUSINESS_EXACT_NOT_MATCH, 93 } Action; 94 95 class MineSoftbusListener { 96 public: 97 MineSoftbusListener(); 98 ~MineSoftbusListener(); 99 100 int32_t StopRefreshSoftbusLNN(uint16_t subscribeId); 101 int32_t RefreshSoftbusLNN(const string &pkgName, const string &searchJson, const DmSubscribeInfo &subscribeInfo); 102 int32_t RegisterSoftbusLnnOpsCbk(const std::string &pkgName, 103 const std::shared_ptr<ISoftbusDiscoveringCallback> callback); 104 int32_t UnRegisterSoftbusLnnOpsCbk(const std::string &pkgName); 105 static void OnPublishResult(int publishId, PublishResult reason); 106 static void OnPublishDeviceFound(const DeviceInfo *deviceInfo); 107 static void OnRePublish(void); 108 static IDmRadarHelper* GetDmRadarHelperObj(); 109 static bool IsDmRadarHelperReady(); 110 static bool CloseDmRadarHelperObj(std::string name); 111 private: 112 int32_t InitSoftPublishLNN(); 113 int32_t ParseSearchJson(const string &pkgName, const string &searchJsonStr, char *output, size_t *outLen); 114 int32_t ParseSearchAllDevice(const json &object, const string &pkgName, char *output, size_t *outLen); 115 int32_t ParseSearchScopeDevice(const json &object, const string &pkgName, char *output, size_t *outLen); 116 int32_t ParseSearchVertexDevice(const json &object, const string &pkgName, char *output, size_t *outLen); 117 int32_t SetBroadcastHead(const json &object, const string &pkgName, BroadcastHead &broadcastHead); 118 void AddHeadToBroadcast(const BroadcastHead &broadcastHead, char *output); 119 int32_t ParseScopeDeviceJsonArray(const std::vector<ScopeOptionInfo> &optionInfo, char *output, size_t *outLen); 120 int32_t ParseVertexDeviceJsonArray(const std::vector<VertexOptionInfo> &optionInfo, char *output, size_t *outLen); 121 static int32_t GetSha256Hash(const char *data, size_t len, char *output); 122 int32_t SetBroadcastTrustOptions(const json &object, BroadcastHead &broadcastHead); 123 int32_t SetBroadcastPkgname(const string &pkgName, BroadcastHead &broadcastHead); 124 int32_t SendBroadcastInfo(const string &pkgName, SubscribeInfo &subscribeInfo, char *output, size_t outputLen); 125 void SetSubscribeInfo(const DmSubscribeInfo &dmSubscribeInfo, SubscribeInfo &subscribeInfo); 126 int32_t PublishDeviceDiscovery(void); 127 static void MatchSearchDealTask(void); 128 static int32_t ParseBroadcastInfo(DeviceInfo &deviceInfo); 129 static bool GetBroadcastData(DeviceInfo &deviceInfo, char *output, size_t outLen); 130 static Action MatchSearchAllDevice(DeviceInfo &deviceInfo, const BroadcastHead &broadcastHead); 131 static void GetScopeDevicePolicyInfo(DevicePolicyInfo &devicePolicyInfo); 132 static Action MatchSearchScopeDevice(DeviceInfo &deviceInfo, char *output, 133 const DevicePolicyInfo &devicePolicyInfo, const BroadcastHead &broadcastHead); 134 static void GetVertexDevicePolicyInfo(DevicePolicyInfo &devicePolicyInfo); 135 static Action MatchSearchVertexDevice(DeviceInfo &deviceInfo, char *output, 136 const DevicePolicyInfo &devicePolicyInfo, const BroadcastHead &broadcastHead); 137 static int32_t SendReturnwave(DeviceInfo &deviceInfo, const BroadcastHead &broadcastHead, Action matchResult); 138 static bool GetDeviceAliasHash(char *output); 139 static bool GetDeviceSnHash(char *output); 140 static bool GetDeviceUdidHash(char *output); 141 static bool GetDeviceTypeHash(char *output); 142 static bool GetDeviceNumber(char *output); 143 static bool CheckDeviceAliasMatch(const DevicePolicyInfo &devicePolicyInfo, const char *data); 144 static bool CheckDeviceNumberMatch(const DevicePolicyInfo &devicePolicyInfo, 145 int32_t startNumber, int32_t endNumber); 146 static bool CheckDeviceSnMatch(const DevicePolicyInfo &devicePolicyInfo, const char *data); 147 static bool CheckDeviceTypeMatch(const DevicePolicyInfo &devicePolicyInfo, const char *data); 148 static bool CheckDeviceUdidMatch(const DevicePolicyInfo &devicePolicyInfo, const char *data); 149 static Action GetMatchResult(const vector<int> &matchItemNum, const vector<int> &matchItemResult); 150 int32_t DmBase64Encode(char *output, size_t outputLen, const char *input, size_t inputLen, size_t &base64OutLen); 151 int32_t DmBase64Decode(char *output, size_t outputLen, const char *input, size_t inputLen, size_t &base64OutLen); 152 }; 153 } // namespace DistributedHardware 154 } // namespace OHOS 155 #endif // OHOS_DM_MINE_SOFTBUS_LISTENER_H 156