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