1 /*
2  * Copyright (c) 2022-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 #include "softbus_connector.h"
17 
18 #include <securec.h>
19 #include <unistd.h>
20 
21 #include "dm_anonymous.h"
22 #include "dm_constants.h"
23 #include "dm_crypto.h"
24 #include "dm_device_info.h"
25 #include "dm_log.h"
26 #include "dm_radar_helper.h"
27 #include "dm_softbus_cache.h"
28 #include "nlohmann/json.hpp"
29 #include "parameter.h"
30 #include "system_ability_definition.h"
31 
32 namespace OHOS {
33 namespace DistributedHardware {
34 const int32_t SOFTBUS_SUBSCRIBE_ID_MASK = 0x0000FFFF;
35 const int32_t SOFTBUS_DISCOVER_DEVICE_INFO_MAX_SIZE = 100;
36 const int32_t SOFTBUS_TRUSTDEVICE_UUIDHASH_INFO_MAX_SIZE = 100;
37 
38 constexpr const char* WIFI_IP = "WIFI_IP";
39 constexpr const char* WIFI_PORT = "WIFI_PORT";
40 constexpr const char* BR_MAC = "BR_MAC";
41 constexpr const char* BLE_MAC = "BLE_MAC";
42 constexpr const char* ETH_IP = "ETH_IP";
43 constexpr const char* ETH_PORT = "ETH_PORT";
44 
45 std::string SoftbusConnector::remoteUdidHash_ = "";
46 SoftbusConnector::PulishStatus SoftbusConnector::publishStatus = SoftbusConnector::STATUS_UNKNOWN;
47 std::map<std::string, std::shared_ptr<DeviceInfo>> SoftbusConnector::discoveryDeviceInfoMap_ = {};
48 std::map<std::string, std::shared_ptr<ISoftbusDiscoveryCallback>> SoftbusConnector::discoveryCallbackMap_ = {};
49 std::map<std::string, std::shared_ptr<ISoftbusPublishCallback>> SoftbusConnector::publishCallbackMap_ = {};
50 std::queue<std::string> SoftbusConnector::discoveryDeviceIdQueue_ = {};
51 std::unordered_map<std::string, std::string> SoftbusConnector::deviceUdidMap_ = {};
52 std::vector<std::string> SoftbusConnector::pkgNameVec_ = {};
53 std::mutex SoftbusConnector::discoveryCallbackMutex_;
54 std::mutex SoftbusConnector::discoveryDeviceInfoMutex_;
55 std::mutex SoftbusConnector::deviceUdidLocks_;
56 std::mutex SoftbusConnector::pkgNameVecMutex_;
57 
58 IPublishCb SoftbusConnector::softbusPublishCallback_ = {
59     .OnPublishResult = SoftbusConnector::OnSoftbusPublishResult,
60 };
61 IRefreshCallback SoftbusConnector::softbusDiscoveryCallback_ = {
62     .OnDeviceFound = SoftbusConnector::OnSoftbusDeviceFound,
63     .OnDiscoverResult = SoftbusConnector::OnSoftbusDiscoveryResult,
64 };
65 
66 IRefreshCallback SoftbusConnector::softbusDiscoveryByIdCallback_ = {
67     .OnDeviceFound = SoftbusConnector::OnSoftbusDeviceDiscovery,
68     .OnDiscoverResult = SoftbusConnector::OnSoftbusDiscoveryResult,
69 };
70 
SoftbusConnector()71 SoftbusConnector::SoftbusConnector()
72 {
73 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
74     softbusSession_ = std::make_shared<SoftbusSession>();
75 #endif
76     LOGD("SoftbusConnector constructor.");
77 }
78 
~SoftbusConnector()79 SoftbusConnector::~SoftbusConnector()
80 {
81     LOGD("SoftbusConnector destructor.");
82 }
83 
RegisterSoftbusStateCallback(const std::shared_ptr<ISoftbusStateCallback> callback)84 int32_t SoftbusConnector::RegisterSoftbusStateCallback(const std::shared_ptr<ISoftbusStateCallback> callback)
85 {
86     deviceStateManagerCallback_ = callback;
87     return DM_OK;
88 }
89 
UnRegisterSoftbusStateCallback()90 int32_t SoftbusConnector::UnRegisterSoftbusStateCallback()
91 {
92     deviceStateManagerCallback_ = nullptr;
93     return DM_OK;
94 }
95 
RegisterSoftbusDiscoveryCallback(const std::string & pkgName,const std::shared_ptr<ISoftbusDiscoveryCallback> callback)96 int32_t SoftbusConnector::RegisterSoftbusDiscoveryCallback(const std::string &pkgName,
97     const std::shared_ptr<ISoftbusDiscoveryCallback> callback)
98 {
99     std::lock_guard<std::mutex> lock(discoveryCallbackMutex_);
100     discoveryCallbackMap_.emplace(pkgName, callback);
101     return DM_OK;
102 }
103 
UnRegisterSoftbusDiscoveryCallback(const std::string & pkgName)104 int32_t SoftbusConnector::UnRegisterSoftbusDiscoveryCallback(const std::string &pkgName)
105 {
106     std::lock_guard<std::mutex> lock(discoveryCallbackMutex_);
107     discoveryCallbackMap_.erase(pkgName);
108     return DM_OK;
109 }
110 
RegisterSoftbusPublishCallback(const std::string & pkgName,const std::shared_ptr<ISoftbusPublishCallback> callback)111 int32_t SoftbusConnector::RegisterSoftbusPublishCallback(const std::string &pkgName,
112     const std::shared_ptr<ISoftbusPublishCallback> callback)
113 {
114     std::mutex registerCallback;
115     std::lock_guard<std::mutex> lock(registerCallback);
116     publishCallbackMap_.emplace(pkgName, callback);
117     return DM_OK;
118 }
119 
UnRegisterSoftbusPublishCallback(const std::string & pkgName)120 int32_t SoftbusConnector::UnRegisterSoftbusPublishCallback(const std::string &pkgName)
121 {
122     std::mutex unRegisterCallback;
123     std::lock_guard<std::mutex> lock(unRegisterCallback);
124     publishCallbackMap_.erase(pkgName);
125     return DM_OK;
126 }
127 
PublishDiscovery(const DmPublishInfo & dmPublishInfo)128 int32_t SoftbusConnector::PublishDiscovery(const DmPublishInfo &dmPublishInfo)
129 {
130     PublishInfo publishInfo;
131     (void)memset_s(&publishInfo, sizeof(PublishInfo), 0, sizeof(PublishInfo));
132     publishInfo.publishId = dmPublishInfo.publishId;
133     publishInfo.mode = static_cast<DiscoverMode>(dmPublishInfo.mode);
134     publishInfo.medium = ExchangeMedium::AUTO;
135     publishInfo.freq = static_cast<ExchangeFreq>(dmPublishInfo.freq);
136     publishInfo.capability = DM_CAPABILITY_OSD;
137     publishInfo.ranging = dmPublishInfo.ranging;
138     LOGI("start, publishId: %{public}d, mode: 0x%{public}x, ranging: %{public}d.", publishInfo.publishId,
139         publishInfo.mode, publishInfo.ranging);
140     int32_t ret = ::PublishLNN(DM_PKG_NAME, &publishInfo, &softbusPublishCallback_);
141     if (ret != DM_OK) {
142         LOGE("[SOFTBUS]PublishLNN failed, ret %{public}d.", ret);
143         return ret;
144     }
145     return ret;
146 }
147 
UnPublishDiscovery(int32_t publishId)148 int32_t SoftbusConnector::UnPublishDiscovery(int32_t publishId)
149 {
150     LOGI("UnPublishDiscovery begin, publishId: %{public}d.", publishId);
151     int32_t ret = ::StopPublishLNN(DM_PKG_NAME, publishId);
152     if (ret != DM_OK) {
153         LOGE("[SOFTBUS]StopPublishLNN failed with ret: %{public}d.", ret);
154         return ret;
155     }
156     return ret;
157 }
158 
StartDiscovery(const DmSubscribeInfo & dmSubscribeInfo)159 int32_t SoftbusConnector::StartDiscovery(const DmSubscribeInfo &dmSubscribeInfo)
160 {
161     SubscribeInfo subscribeInfo;
162     (void)memset_s(&subscribeInfo, sizeof(SubscribeInfo), 0, sizeof(SubscribeInfo));
163     subscribeInfo.subscribeId = dmSubscribeInfo.subscribeId;
164     subscribeInfo.mode = static_cast<DiscoverMode>(dmSubscribeInfo.mode);
165     subscribeInfo.medium = static_cast<ExchangeMedium>(dmSubscribeInfo.medium);
166     subscribeInfo.freq = static_cast<ExchangeFreq>(dmSubscribeInfo.freq);
167     subscribeInfo.isSameAccount = dmSubscribeInfo.isSameAccount;
168     subscribeInfo.isWakeRemote = dmSubscribeInfo.isWakeRemote;
169     subscribeInfo.capability = dmSubscribeInfo.capability;
170     LOGI("StartDiscovery begin, subscribeId: %{public}d, mode: 0x%{public}x, medium: %{public}d.",
171         subscribeInfo.subscribeId, subscribeInfo.mode, subscribeInfo.medium);
172     int32_t ret = ::RefreshLNN(DM_PKG_NAME, &subscribeInfo, &softbusDiscoveryCallback_);
173     struct RadarInfo info = {
174         .funcName = "StartDiscovery",
175         .toCallPkg = SOFTBUSNAME,
176         .stageRes = (ret == DM_OK) ?
177             static_cast<int32_t>(StageRes::STAGE_IDLE) : static_cast<int32_t>(StageRes::STAGE_FAIL),
178         .bizState = (ret == DM_OK) ?
179             static_cast<int32_t>(BizState::BIZ_STATE_START) : static_cast<int32_t>(BizState::BIZ_STATE_END),
180         .commServ = static_cast<int32_t>(CommServ::USE_SOFTBUS),
181         .errCode = ret,
182     };
183     if (!DmRadarHelper::GetInstance().ReportDiscoverRegCallback(info)) {
184         LOGE("ReportDiscoverRegCallback failed");
185     }
186     if (ret != DM_OK) {
187         LOGE("[SOFTBUS]RefreshLNN failed, ret: %{public}d.", ret);
188         return ret;
189     }
190     return ret;
191 }
192 
StartDiscovery(const uint16_t subscribeId)193 int32_t SoftbusConnector::StartDiscovery(const uint16_t subscribeId)
194 {
195     SubscribeInfo subscribeInfo;
196     (void)memset_s(&subscribeInfo, sizeof(SubscribeInfo), 0, sizeof(SubscribeInfo));
197     subscribeInfo.subscribeId = subscribeId;
198     subscribeInfo.mode = static_cast<DiscoverMode>(DmDiscoverMode::DM_DISCOVER_MODE_ACTIVE);
199     subscribeInfo.medium = static_cast<ExchangeMedium>(DmExchangeMedium::DM_AUTO);
200     subscribeInfo.freq = static_cast<ExchangeFreq>(DmExchangeFreq::DM_SUPER_HIGH);
201     subscribeInfo.isSameAccount = false;
202     subscribeInfo.isWakeRemote = false;
203     subscribeInfo.capability = DM_CAPABILITY_OSD;
204     LOGI("StartDiscovery by subscribeId begin, subscribeId: %{public}d, mode: 0x%{public}x, medium: %{public}d.",
205         subscribeId, subscribeInfo.mode, subscribeInfo.medium);
206     int32_t ret = ::RefreshLNN(DM_PKG_NAME, &subscribeInfo, &softbusDiscoveryByIdCallback_);
207     struct RadarInfo info = {
208         .funcName = "StartDiscovery",
209         .toCallPkg = SOFTBUSNAME,
210         .stageRes = (ret == DM_OK) ?
211             static_cast<int32_t>(StageRes::STAGE_IDLE) : static_cast<int32_t>(StageRes::STAGE_FAIL),
212         .bizState = (ret == DM_OK) ?
213             static_cast<int32_t>(BizState::BIZ_STATE_START) : static_cast<int32_t>(BizState::BIZ_STATE_END),
214         .commServ = static_cast<int32_t>(CommServ::USE_SOFTBUS),
215         .errCode = ret,
216     };
217     if (!DmRadarHelper::GetInstance().ReportDiscoverRegCallback(info)) {
218         LOGE("ReportDiscoverRegCallback failed");
219     }
220     if (ret != DM_OK) {
221         LOGE("[SOFTBUS]RefreshLNN failed, ret: %{public}d.", ret);
222         return ret;
223     }
224     return ret;
225 }
226 
StopDiscovery(uint16_t subscribeId)227 int32_t SoftbusConnector::StopDiscovery(uint16_t subscribeId)
228 {
229     LOGI("StopDiscovery begin, subscribeId: %{public}d.", (int32_t)subscribeId);
230     int32_t ret = ::StopRefreshLNN(DM_PKG_NAME, subscribeId);
231     struct RadarInfo info = {
232         .funcName = "StopDiscovery",
233         .hostName = SOFTBUSNAME,
234         .stageRes = (ret == DM_OK) ?
235             static_cast<int32_t>(StageRes::STAGE_CANCEL) : static_cast<int32_t>(StageRes::STAGE_FAIL),
236         .bizState = (ret == DM_OK) ?
237             static_cast<int32_t>(BizState::BIZ_STATE_CANCEL) : static_cast<int32_t>(BizState::BIZ_STATE_END),
238         .errCode = ret,
239     };
240     if (!DmRadarHelper::GetInstance().ReportDiscoverUserRes(info)) {
241         LOGE("ReportDiscoverUserRes failed");
242     }
243     if (ret != DM_OK) {
244         LOGE("[SOFTBUS]StopRefreshLNN failed, ret: %{public}d.", ret);
245         return ret;
246     }
247     return ret;
248 }
249 
JoinLnn(const std::string & deviceId)250 void SoftbusConnector::JoinLnn(const std::string &deviceId)
251 {
252     std::string connectAddr;
253     LOGI("start, deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
254     ConnectionAddr *addrInfo = GetConnectAddr(deviceId, connectAddr);
255     if (addrInfo == nullptr) {
256         LOGE("addrInfo is nullptr.");
257         return;
258     }
259     if (memcpy_s(addrInfo->info.ble.udidHash, UDID_HASH_LEN,
260         remoteUdidHash_.c_str(), remoteUdidHash_.length()) != 0) {
261         LOGE("memcpy remoteUdid hash failed, remoteUdidHash_: %{public}s.", GetAnonyString(remoteUdidHash_).c_str());
262         return;
263     }
264     int32_t ret = ::JoinLNN(DM_PKG_NAME, addrInfo, OnSoftbusJoinLNNResult);
265     if (ret != DM_OK) {
266         LOGE("[SOFTBUS]JoinLNN failed, ret: %{public}d.", ret);
267     }
268     return;
269 }
270 
GetUdidByNetworkId(const char * networkId,std::string & udid)271 int32_t SoftbusConnector::GetUdidByNetworkId(const char *networkId, std::string &udid)
272 {
273     LOGI("start, networkId: %{public}s.", GetAnonyString(std::string(networkId)).c_str());
274     return SoftbusCache::GetInstance().GetUdidFromCache(networkId, udid);
275 }
276 
GetUuidByNetworkId(const char * networkId,std::string & uuid)277 int32_t SoftbusConnector::GetUuidByNetworkId(const char *networkId, std::string &uuid)
278 {
279     LOGI("start, networkId: %{public}s.", GetAnonyString(std::string(networkId)).c_str());
280     return SoftbusCache::GetInstance().GetUuidFromCache(networkId, uuid);
281 }
282 
283 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
GetSoftbusSession()284 std::shared_ptr<SoftbusSession> SoftbusConnector::GetSoftbusSession()
285 {
286     return softbusSession_;
287 }
288 #endif
289 
HaveDeviceInMap(std::string deviceId)290 bool SoftbusConnector::HaveDeviceInMap(std::string deviceId)
291 {
292     std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
293     auto iter = discoveryDeviceInfoMap_.find(deviceId);
294     if (iter == discoveryDeviceInfoMap_.end()) {
295         LOGE("deviceInfo not found by deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
296         return false;
297     }
298     return true;
299 }
300 
GetConnectAddrByType(DeviceInfo * deviceInfo,ConnectionAddrType type)301 ConnectionAddr *SoftbusConnector::GetConnectAddrByType(DeviceInfo *deviceInfo, ConnectionAddrType type)
302 {
303     if (deviceInfo == nullptr) {
304         return nullptr;
305     }
306     for (uint32_t i = 0; i < deviceInfo->addrNum; ++i) {
307         if (deviceInfo->addr[i].type == type) {
308             return &deviceInfo->addr[i];
309         }
310     }
311     return nullptr;
312 }
313 
GetConnectAddr(const std::string & deviceId,std::string & connectAddr)314 ConnectionAddr *SoftbusConnector::GetConnectAddr(const std::string &deviceId, std::string &connectAddr)
315 {
316     DeviceInfo *deviceInfo = nullptr;
317     {
318         std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
319         auto iter = discoveryDeviceInfoMap_.find(deviceId);
320         if (iter == discoveryDeviceInfoMap_.end()) {
321             LOGE("deviceInfo not found by deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
322             return nullptr;
323         }
324         deviceInfo = iter->second.get();
325     }
326     if (deviceInfo->addrNum <= 0 || deviceInfo->addrNum >= CONNECTION_ADDR_MAX) {
327         LOGE("deviceInfo addrNum not valid, addrNum: %{public}d.", deviceInfo->addrNum);
328         return nullptr;
329     }
330     nlohmann::json jsonPara;
331     ConnectionAddr *addr = GetConnectAddrByType(deviceInfo, ConnectionAddrType::CONNECTION_ADDR_ETH);
332     if (addr != nullptr) {
333         LOGI("[SOFTBUS]get ETH ConnectionAddr for deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
334         jsonPara[ETH_IP] = addr->info.ip.ip;
335         jsonPara[ETH_PORT] = addr->info.ip.port;
336         connectAddr = jsonPara.dump();
337         return addr;
338     }
339     addr = GetConnectAddrByType(deviceInfo, ConnectionAddrType::CONNECTION_ADDR_WLAN);
340     if (addr != nullptr) {
341         jsonPara[WIFI_IP] = addr->info.ip.ip;
342         jsonPara[WIFI_PORT] = addr->info.ip.port;
343         LOGI("[SOFTBUS]get WLAN ConnectionAddr for deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
344         connectAddr = jsonPara.dump();
345         return addr;
346     }
347     addr = GetConnectAddrByType(deviceInfo, ConnectionAddrType::CONNECTION_ADDR_BR);
348     if (addr != nullptr) {
349         jsonPara[BR_MAC] = addr->info.br.brMac;
350         LOGI("[SOFTBUS]get BR ConnectionAddr for deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
351         connectAddr = jsonPara.dump();
352         return addr;
353     }
354     addr = GetConnectAddrByType(deviceInfo, ConnectionAddrType::CONNECTION_ADDR_BLE);
355     if (addr != nullptr) {
356         jsonPara[BLE_MAC] = addr->info.ble.bleMac;
357         connectAddr = jsonPara.dump();
358         return addr;
359     }
360     LOGE("[SOFTBUS]failed to get ConnectionAddr for deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
361     return nullptr;
362 }
363 
ConvertDeviceInfoToDmDevice(const DeviceInfo & deviceInfo,DmDeviceInfo & dmDeviceInfo)364 void SoftbusConnector::ConvertDeviceInfoToDmDevice(const DeviceInfo &deviceInfo, DmDeviceInfo &dmDeviceInfo)
365 {
366     (void)memset_s(&dmDeviceInfo, sizeof(DmDeviceInfo), 0, sizeof(DmDeviceInfo));
367     if (memcpy_s(dmDeviceInfo.deviceId, sizeof(dmDeviceInfo.deviceId), deviceInfo.devId,
368                  std::min(sizeof(dmDeviceInfo.deviceId), sizeof(deviceInfo.devId))) != DM_OK) {
369         LOGE("ConvertDeviceInfoToDmDevice copy deviceId data failed.");
370     }
371 
372     if (memcpy_s(dmDeviceInfo.deviceName, sizeof(dmDeviceInfo.deviceName), deviceInfo.devName,
373                  std::min(sizeof(dmDeviceInfo.deviceName), sizeof(deviceInfo.devName))) != DM_OK) {
374         LOGE("ConvertDeviceInfoToDmDevice copy deviceName data failed.");
375     }
376     dmDeviceInfo.deviceTypeId = deviceInfo.devType;
377     dmDeviceInfo.range = deviceInfo.range;
378 }
379 
ConvertDeviceInfoToDmDevice(const DeviceInfo & deviceInfo,DmDeviceBasicInfo & dmDeviceBasicInfo)380 void SoftbusConnector::ConvertDeviceInfoToDmDevice(const DeviceInfo &deviceInfo, DmDeviceBasicInfo &dmDeviceBasicInfo)
381 {
382     (void)memset_s(&dmDeviceBasicInfo, sizeof(DmDeviceBasicInfo), 0, sizeof(DmDeviceBasicInfo));
383     if (memcpy_s(dmDeviceBasicInfo.deviceId, sizeof(dmDeviceBasicInfo.deviceId), deviceInfo.devId,
384                  std::min(sizeof(dmDeviceBasicInfo.deviceId), sizeof(deviceInfo.devId))) != DM_OK) {
385         LOGE("ConvertDeviceInfoToDmDevice copy deviceId data failed.");
386     }
387 
388     if (memcpy_s(dmDeviceBasicInfo.deviceName, sizeof(dmDeviceBasicInfo.deviceName), deviceInfo.devName,
389                  std::min(sizeof(dmDeviceBasicInfo.deviceName), sizeof(deviceInfo.devName))) != DM_OK) {
390         LOGE("ConvertDeviceInfoToDmDevice copy deviceName data failed.");
391     }
392     dmDeviceBasicInfo.deviceTypeId = deviceInfo.devType;
393 }
394 
OnSoftbusPublishResult(int32_t publishId,PublishResult result)395 void SoftbusConnector::OnSoftbusPublishResult(int32_t publishId, PublishResult result)
396 {
397     LOGI("Callback In, publishId: %{public}d, result: %{public}d.", publishId, result);
398     std::mutex publishResult;
399     std::lock_guard<std::mutex> lock(publishResult);
400     for (auto &iter : publishCallbackMap_) {
401         iter.second->OnPublishResult(iter.first, publishId, result);
402     }
403 }
404 
OnSoftbusJoinLNNResult(ConnectionAddr * addr,const char * networkId,int32_t result)405 void SoftbusConnector::OnSoftbusJoinLNNResult(ConnectionAddr *addr, const char *networkId, int32_t result)
406 {
407     (void)addr;
408     (void)networkId;
409     LOGD("[SOFTBUS]OnSoftbusJoinLNNResult, result: %{public}d.", result);
410 }
411 
OnSoftbusDeviceFound(const DeviceInfo * device)412 void SoftbusConnector::OnSoftbusDeviceFound(const DeviceInfo *device)
413 {
414     if (device == nullptr) {
415         LOGE("[SOFTBUS]device is null.");
416         return;
417     }
418     std::string deviceId = device->devId;
419     LOGI("[SOFTBUS]notify found device: %{public}s found, range: %{public}d, isOnline: %{public}d.",
420         GetAnonyString(deviceId).c_str(), device->range, device->isOnline);
421     if (!device->isOnline) {
422         std::shared_ptr<DeviceInfo> infoPtr = std::make_shared<DeviceInfo>();
423         DeviceInfo *srcInfo = infoPtr.get();
424         int32_t ret = memcpy_s(srcInfo, sizeof(DeviceInfo), device, sizeof(DeviceInfo));
425         if (ret != DM_OK) {
426             LOGE("save discovery device info failed, ret: %{public}d.", ret);
427             return;
428         }
429         {
430             std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
431             if (discoveryDeviceInfoMap_.find(deviceId) == discoveryDeviceInfoMap_.end()) {
432                 discoveryDeviceIdQueue_.emplace(deviceId);
433             }
434             discoveryDeviceInfoMap_[deviceId] = infoPtr;
435 
436             // Remove the earliest element when reached the max size
437             if (discoveryDeviceIdQueue_.size() == SOFTBUS_DISCOVER_DEVICE_INFO_MAX_SIZE) {
438                 discoveryDeviceInfoMap_.erase(discoveryDeviceIdQueue_.front());
439                 discoveryDeviceIdQueue_.pop();
440             }
441         }
442     }
443 
444     DmDeviceInfo dmDeviceInfo;
445     ConvertDeviceInfoToDmDevice(*device, dmDeviceInfo);
446     std::lock_guard<std::mutex> lock(discoveryCallbackMutex_);
447     struct RadarInfo info = {
448         .funcName = "OnSoftbusDeviceFound",
449         .stageRes = static_cast<int32_t>(StageRes::STAGE_SUCC),
450         .peerNetId = "",
451         .peerUdid = device->devId,
452     };
453     if (!DmRadarHelper::GetInstance().ReportDiscoverResCallback(info)) {
454         LOGE("ReportDiscoverResCallback failed");
455     }
456     for (auto &iter : discoveryCallbackMap_) {
457         iter.second->OnDeviceFound(iter.first, dmDeviceInfo, device->isOnline);
458     }
459 }
460 
OnSoftbusDeviceDiscovery(const DeviceInfo * device)461 void SoftbusConnector::OnSoftbusDeviceDiscovery(const DeviceInfo *device)
462 {
463     if (device == nullptr) {
464         LOGE("[SOFTBUS]device is null.");
465         return;
466     }
467     std::string deviceId = device->devId;
468     LOGI("[SOFTBUS]notify discover device: %{public}s found, range: %{public}d, isOnline: %{public}d.",
469         GetAnonyString(deviceId).c_str(), device->range, device->isOnline);
470     if (!device->isOnline) {
471         std::shared_ptr<DeviceInfo> infoPtr = std::make_shared<DeviceInfo>();
472         DeviceInfo *srcInfo = infoPtr.get();
473         int32_t ret = memcpy_s(srcInfo, sizeof(DeviceInfo), device, sizeof(DeviceInfo));
474         if (ret != DM_OK) {
475             LOGE("save discovery device info failed, ret: %{public}d.", ret);
476             return;
477         }
478         {
479             std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
480             if (discoveryDeviceInfoMap_.find(deviceId) == discoveryDeviceInfoMap_.end()) {
481                 discoveryDeviceIdQueue_.emplace(deviceId);
482             }
483             discoveryDeviceInfoMap_[deviceId] = infoPtr;
484 
485             // Remove the earliest element when reached the max size
486             if (discoveryDeviceIdQueue_.size() == SOFTBUS_DISCOVER_DEVICE_INFO_MAX_SIZE) {
487                 discoveryDeviceInfoMap_.erase(discoveryDeviceIdQueue_.front());
488                 discoveryDeviceIdQueue_.pop();
489             }
490         }
491     }
492 
493     DmDeviceBasicInfo dmDeviceBasicInfo;
494     ConvertDeviceInfoToDmDevice(*device, dmDeviceBasicInfo);
495     std::lock_guard<std::mutex> lock(discoveryCallbackMutex_);
496     struct RadarInfo info = {
497         .funcName = "OnSoftbusDeviceDiscovery",
498         .stageRes = static_cast<int32_t>(StageRes::STAGE_SUCC),
499         .peerNetId = "",
500         .peerUdid = device->devId,
501 
502     };
503     if (!DmRadarHelper::GetInstance().ReportDiscoverResCallback(info)) {
504         LOGE("ReportDiscoverResCallback failed");
505     }
506     for (auto &iter : discoveryCallbackMap_) {
507         iter.second->OnDeviceFound(iter.first, dmDeviceBasicInfo, device->range, device->isOnline);
508     }
509 }
510 
OnSoftbusDiscoveryResult(int subscribeId,RefreshResult result)511 void SoftbusConnector::OnSoftbusDiscoveryResult(int subscribeId, RefreshResult result)
512 {
513     uint16_t originId = static_cast<uint16_t>((static_cast<uint32_t>(subscribeId)) & SOFTBUS_SUBSCRIBE_ID_MASK);
514     std::lock_guard<std::mutex> lock(discoveryCallbackMutex_);
515     if (result == REFRESH_LNN_SUCCESS) {
516         LOGI("[SOFTBUS]start to discovery device successfully with subscribeId: %{public}d, result: %{public}d.",
517             subscribeId, result);
518         for (auto &iter : discoveryCallbackMap_) {
519             iter.second->OnDiscoverySuccess(iter.first, originId);
520         }
521     } else {
522         LOGE("[SOFTBUS]fail to discovery device with subscribeId: %{public}d, result: %{public}d.", subscribeId,
523             result);
524         for (auto iter = discoveryCallbackMap_.begin(); iter != discoveryCallbackMap_.end();) {
525             iter->second->OnDiscoveryFailed(iter->first, originId, result);
526             iter = discoveryCallbackMap_.erase(iter);
527         }
528         struct RadarInfo info = {
529             .funcName = "OnSoftbusDiscoveryResult",
530             .stageRes = static_cast<int32_t>(StageRes::STAGE_FAIL),
531             .errCode = result,
532         };
533         if (!DmRadarHelper::GetInstance().ReportDiscoverResCallback(info)) {
534             LOGE("ReportDiscoverResCallback failed");
535         }
536     }
537 }
538 
GetDeviceUdidByUdidHash(const std::string & udidHash)539 std::string SoftbusConnector::GetDeviceUdidByUdidHash(const std::string &udidHash)
540 {
541     std::lock_guard<std::mutex> lock(deviceUdidLocks_);
542     for (auto &iter : deviceUdidMap_) {
543         if (iter.second == udidHash) {
544             return iter.first;
545         }
546     }
547     LOGE("fail to GetUdidByUdidHash, udidHash: %{public}s", GetAnonyString(udidHash).c_str());
548     return udidHash;
549 }
550 
GetDeviceUdidHashByUdid(const std::string & udid)551 std::string SoftbusConnector::GetDeviceUdidHashByUdid(const std::string &udid)
552 {
553     {
554         std::lock_guard<std::mutex> lock(deviceUdidLocks_);
555         auto iter = deviceUdidMap_.find(udid);
556         if (iter != deviceUdidMap_.end()) {
557             return deviceUdidMap_[udid];
558         }
559     }
560 
561     char udidHash[DM_MAX_DEVICE_ID_LEN] = {0};
562     if (Crypto::GetUdidHash(udid, reinterpret_cast<uint8_t *>(udidHash)) != DM_OK) {
563         LOGE("get udidhash by udid: %{public}s failed.", GetAnonyString(udid).c_str());
564         return "";
565     }
566     LOGI("get udidhash: %{public}s by udid: %{public}s.", GetAnonyString(udidHash).c_str(),
567         GetAnonyString(udid).c_str());
568     std::lock_guard<std::mutex> lock(deviceUdidLocks_);
569     deviceUdidMap_[udid] = udidHash;
570     return udidHash;
571 }
572 
EraseUdidFromMap(const std::string & udid)573 void SoftbusConnector::EraseUdidFromMap(const std::string &udid)
574 {
575     std::lock_guard<std::mutex> lock(deviceUdidLocks_);
576     auto iter = deviceUdidMap_.find(udid);
577     if (iter == deviceUdidMap_.end()) {
578         return;
579     }
580     size_t mapSize = deviceUdidMap_.size();
581     if (mapSize >= SOFTBUS_TRUSTDEVICE_UUIDHASH_INFO_MAX_SIZE) {
582         deviceUdidMap_.erase(udid);
583     }
584 }
585 
GetLocalDeviceName()586 std::string SoftbusConnector::GetLocalDeviceName()
587 {
588     NodeBasicInfo nodeBasicInfo;
589     int32_t ret = GetLocalNodeDeviceInfo(DM_PKG_NAME, &nodeBasicInfo);
590     if (ret != DM_OK) {
591         LOGE("[SOFTBUS]GetLocalNodeDeviceInfo failed, ret: %{public}d.", ret);
592         return "";
593     }
594     return nodeBasicInfo.deviceName;
595 }
596 
GetLocalDeviceTypeId()597 int32_t SoftbusConnector::GetLocalDeviceTypeId()
598 {
599     NodeBasicInfo nodeBasicInfo;
600     int32_t ret = GetLocalNodeDeviceInfo(DM_PKG_NAME, &nodeBasicInfo);
601     if (ret != DM_OK) {
602         LOGE("[SOFTBUS]GetLocalNodeDeviceInfo failed, ret: %{public}d.", ret);
603         return DmDeviceType::DEVICE_TYPE_UNKNOWN;
604     }
605     return nodeBasicInfo.deviceTypeId;
606 }
607 
GetLocalDeviceNetworkId()608 std::string SoftbusConnector::GetLocalDeviceNetworkId()
609 {
610     NodeBasicInfo nodeBasicInfo;
611     int32_t ret = GetLocalNodeDeviceInfo(DM_PKG_NAME, &nodeBasicInfo);
612     if (ret != DM_OK) {
613         LOGE("[SOFTBUS]GetLocalDeviceNetworkId failed, ret: %{public}d.", ret);
614         return "";
615     }
616     return nodeBasicInfo.networkId;
617 }
618 
AddMemberToDiscoverMap(const std::string & deviceId,std::shared_ptr<DeviceInfo> deviceInfo)619 int32_t SoftbusConnector::AddMemberToDiscoverMap(const std::string &deviceId, std::shared_ptr<DeviceInfo> deviceInfo)
620 {
621     if (deviceId.empty()) {
622         LOGE("AddMemberToDiscoverMap failed, deviceId is empty.");
623         return ERR_DM_INPUT_PARA_INVALID;
624     }
625     std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
626     discoveryDeviceInfoMap_[deviceId] = std::move(deviceInfo);
627     deviceInfo = nullptr;
628     return DM_OK;
629 }
630 
GetNetworkIdByDeviceId(const std::string & deviceId)631 std::string SoftbusConnector::GetNetworkIdByDeviceId(const std::string &deviceId)
632 {
633     LOGI("SoftbusConnector::GetNetworkIdByDeviceId");
634     int32_t deviceCount = 0;
635     NodeBasicInfo *nodeInfo = nullptr;
636     if (GetAllNodeDeviceInfo(DM_PKG_NAME, &nodeInfo, &deviceCount) != DM_OK) {
637         LOGE("[SOFTBUS]GetAllNodeDeviceInfo failed.");
638         return "";
639     }
640     for (int32_t i = 0; i < deviceCount; ++i) {
641         NodeBasicInfo *nodeBasicInfo = nodeInfo + i;
642         uint8_t mUdid[UDID_BUF_LEN] = {0};
643         if (GetNodeKeyInfo(DM_PKG_NAME, reinterpret_cast<char *>(nodeBasicInfo->networkId),
644             NodeDeviceInfoKey::NODE_KEY_UDID, mUdid, sizeof(mUdid)) != DM_OK) {
645             LOGE("[SOFTBUS]GetNodeKeyInfo failed.");
646         }
647         if (reinterpret_cast<char *>(mUdid) == deviceId) {
648             return static_cast<std::string>(nodeBasicInfo->networkId);
649         }
650     }
651     return "";
652 }
653 
SetPkgName(std::string pkgName)654 void SoftbusConnector::SetPkgName(std::string pkgName)
655 {
656     LOGI("SoftbusConnector::SetPkgName");
657     std::lock_guard<std::mutex> lock(pkgNameVecMutex_);
658     pkgNameVec_.push_back(pkgName);
659 }
660 
SetPkgNameVec(std::vector<std::string> pkgNameVec)661 void SoftbusConnector::SetPkgNameVec(std::vector<std::string> pkgNameVec)
662 {
663     LOGI("SoftbusConnector::SetPkgNameVec");
664     std::lock_guard<std::mutex> lock(pkgNameVecMutex_);
665     pkgNameVec_ = pkgNameVec;
666 }
667 
GetPkgName()668 std::vector<std::string> SoftbusConnector::GetPkgName()
669 {
670     LOGI("In");
671     std::lock_guard<std::mutex> lock(pkgNameVecMutex_);
672     return pkgNameVec_;
673 }
674 
ClearPkgName()675 void SoftbusConnector::ClearPkgName()
676 {
677     LOGI("In");
678     std::lock_guard<std::mutex> lock(pkgNameVecMutex_);
679     pkgNameVec_.clear();
680 }
681 
HandleDeviceOnline(std::string deviceId,int32_t authForm)682 void SoftbusConnector::HandleDeviceOnline(std::string deviceId, int32_t authForm)
683 {
684     LOGI("SoftbusConnector::HandleDeviceOnline");
685     deviceStateManagerCallback_->OnDeviceOnline(deviceId, authForm);
686     return;
687 }
688 
HandleDeviceOffline(std::string deviceId)689 void SoftbusConnector::HandleDeviceOffline(std::string deviceId)
690 {
691     LOGI("SoftbusConnector::HandleDeviceOffline");
692     deviceStateManagerCallback_->OnDeviceOffline(deviceId);
693     return;
694 }
695 
DeleteOffLineTimer(std::string & udidHash)696 void SoftbusConnector::DeleteOffLineTimer(std::string &udidHash)
697 {
698     LOGI("SoftbusConnector::DeleteOffLineTimer");
699     remoteUdidHash_ = udidHash;
700     if (deviceStateManagerCallback_ != nullptr) {
701         deviceStateManagerCallback_->DeleteOffLineTimer(udidHash);
702     }
703 }
704 
CheckIsOnline(const std::string & targetDeviceId)705 bool SoftbusConnector::CheckIsOnline(const std::string &targetDeviceId)
706 {
707     LOGI("Check the device is online.");
708     int32_t deviceCount = 0;
709     NodeBasicInfo *nodeInfo = nullptr;
710     if (GetAllNodeDeviceInfo(DM_PKG_NAME, &nodeInfo, &deviceCount) != DM_OK) {
711         LOGE("[SOFTBUS]GetAllNodeDeviceInfo failed.");
712         return ERR_DM_FAILED;
713     }
714     for (int32_t i = 0; i < deviceCount; ++i) {
715         NodeBasicInfo *nodeBasicInfo = nodeInfo + i;
716         uint8_t mUdid[UDID_BUF_LEN] = {0};
717         if (GetNodeKeyInfo(DM_PKG_NAME, reinterpret_cast<char *>(nodeBasicInfo->networkId),
718             NodeDeviceInfoKey::NODE_KEY_UDID, mUdid, sizeof(mUdid)) != DM_OK) {
719             LOGE("[SOFTBUS]GetNodeKeyInfo failed.");
720         }
721         std::string udid = reinterpret_cast<char *>(mUdid);
722         if (udid == targetDeviceId) {
723             LOGI("The device is online.");
724             return true;
725         }
726     }
727     LOGI("The device is not online.");
728     return false;
729 }
730 
GetDeviceInfoByDeviceId(const std::string & deviceId)731 DmDeviceInfo SoftbusConnector::GetDeviceInfoByDeviceId(const std::string &deviceId)
732 {
733     LOGI("SoftbusConnector::GetDeviceInfoBydeviceId");
734     DmDeviceInfo info;
735     int32_t deviceCount = 0;
736     NodeBasicInfo *nodeInfo = nullptr;
737     if (GetAllNodeDeviceInfo(DM_PKG_NAME, &nodeInfo, &deviceCount) != DM_OK) {
738         LOGE("[SOFTBUS]GetAllNodeDeviceInfo failed.");
739         return info;
740     }
741     char deviceIdHash[DM_MAX_DEVICE_ID_LEN] = {0};
742     if (Crypto::GetUdidHash(deviceId, reinterpret_cast<uint8_t *>(deviceIdHash)) != DM_OK) {
743         LOGE("get deviceIdHash by deviceId: %{public}s failed.", GetAnonyString(deviceId).c_str());
744         return info;
745     }
746     for (int32_t i = 0; i < deviceCount; ++i) {
747         NodeBasicInfo *nodeBasicInfo = nodeInfo + i;
748         uint8_t mUdid[UDID_BUF_LEN] = {0};
749         if (GetNodeKeyInfo(DM_PKG_NAME, nodeBasicInfo->networkId, NodeDeviceInfoKey::NODE_KEY_UDID,
750             mUdid, sizeof(mUdid)) != DM_OK) {
751             LOGE("[SOFTBUS]GetNodeKeyInfo failed.");
752             return info;
753         }
754         std::string udid = reinterpret_cast<char *>(mUdid);
755         if (udid != deviceId) {
756             continue;
757         } else {
758             ConvertNodeBasicInfoToDmDevice(*nodeBasicInfo, info);
759             if (memcpy_s(info.deviceId, DM_MAX_DEVICE_ID_LEN, deviceIdHash, DM_MAX_DEVICE_ID_LEN) != 0) {
760                 LOGE("Get deviceId: %{public}s failed.", GetAnonyString(deviceId).c_str());
761             }
762             break;
763         }
764     }
765     FreeNodeInfo(nodeInfo);
766     return info;
767 }
768 
ConvertNodeBasicInfoToDmDevice(const NodeBasicInfo & nodeBasicInfo,DmDeviceInfo & dmDeviceInfo)769 void SoftbusConnector::ConvertNodeBasicInfoToDmDevice(const NodeBasicInfo &nodeBasicInfo, DmDeviceInfo &dmDeviceInfo)
770 {
771     (void)memset_s(&dmDeviceInfo, sizeof(DmDeviceInfo), 0, sizeof(DmDeviceInfo));
772     if (memcpy_s(dmDeviceInfo.networkId, sizeof(dmDeviceInfo.networkId), nodeBasicInfo.networkId,
773                  std::min(sizeof(dmDeviceInfo.networkId), sizeof(nodeBasicInfo.networkId))) != DM_OK) {
774         LOGE("ConvertNodeBasicInfoToDmDevice copy deviceId data failed.");
775     }
776 
777     if (memcpy_s(dmDeviceInfo.deviceName, sizeof(dmDeviceInfo.deviceName), nodeBasicInfo.deviceName,
778                  std::min(sizeof(dmDeviceInfo.deviceName), sizeof(nodeBasicInfo.deviceName))) != DM_OK) {
779         LOGE("ConvertDeviceInfoToDmDevice copy deviceName data failed.");
780     }
781     dmDeviceInfo.deviceTypeId = nodeBasicInfo.deviceTypeId;
782     std::string extraData = dmDeviceInfo.extraData;
783     nlohmann::json extraJson;
784     if (!extraData.empty()) {
785         extraJson = nlohmann::json::parse(extraData, nullptr, false);
786     }
787     if (!extraJson.is_discarded()) {
788         extraJson[PARAM_KEY_OS_TYPE] = nodeBasicInfo.osType;
789         extraJson[PARAM_KEY_OS_VERSION] = std::string(nodeBasicInfo.osVersion);
790         dmDeviceInfo.extraData = to_string(extraJson);
791     }
792 }
793 } // namespace DistributedHardware
794 } // namespace OHOS
795