• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #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 "nlohmann/json.hpp"
26 #include "parameter.h"
27 #include "system_ability_definition.h"
28 
29 namespace OHOS {
30 namespace DistributedHardware {
31 const int32_t SOFTBUS_SUBSCRIBE_ID_MASK = 0x0000FFFF;
32 const int32_t SOFTBUS_DISCOVER_DEVICE_INFO_MAX_SIZE = 20;
33 
34 constexpr const char* WIFI_IP = "WIFI_IP";
35 constexpr const char* WIFI_PORT = "WIFI_PORT";
36 constexpr const char* BR_MAC = "BR_MAC";
37 constexpr const char* BLE_MAC = "BLE_MAC";
38 constexpr const char* ETH_IP = "ETH_IP";
39 constexpr const char* ETH_PORT = "ETH_PORT";
40 
41 SoftbusConnector::PulishStatus SoftbusConnector::publishStatus = SoftbusConnector::STATUS_UNKNOWN;
42 std::map<std::string, std::shared_ptr<DeviceInfo>> SoftbusConnector::discoveryDeviceInfoMap_ = {};
43 std::map<std::string, std::shared_ptr<ISoftbusStateCallback>> SoftbusConnector::stateCallbackMap_ = {};
44 std::map<std::string, std::shared_ptr<ISoftbusDiscoveryCallback>> SoftbusConnector::discoveryCallbackMap_ = {};
45 std::map<std::string, std::shared_ptr<ISoftbusPublishCallback>> SoftbusConnector::publishCallbackMap_ = {};
46 std::mutex SoftbusConnector::discoveryDeviceInfoMutex_;
47 std::mutex SoftbusConnector::stateCallbackMutex_;
48 std::mutex SoftbusConnector::discoveryCallbackMutex_;
49 std::mutex SoftbusConnector::publishCallbackMutex_;
50 
51 IPublishCb SoftbusConnector::softbusPublishCallback_ = {
52     .OnPublishResult = SoftbusConnector::OnSoftbusPublishResult,
53 };
54 IRefreshCallback SoftbusConnector::softbusDiscoveryCallback_ = {
55     .OnDeviceFound = SoftbusConnector::OnSoftbusDeviceFound,
56     .OnDiscoverResult = SoftbusConnector::OnSoftbusDiscoveryResult,
57 };
58 
SoftbusConnector()59 SoftbusConnector::SoftbusConnector()
60 {
61     softbusSession_ = std::make_shared<SoftbusSession>();
62 }
63 
~SoftbusConnector()64 SoftbusConnector::~SoftbusConnector()
65 {
66     LOGI("SoftbusConnector destructor");
67 }
68 
RegisterSoftbusDiscoveryCallback(const std::string & pkgName,const std::shared_ptr<ISoftbusDiscoveryCallback> callback)69 int32_t SoftbusConnector::RegisterSoftbusDiscoveryCallback(const std::string &pkgName,
70     const std::shared_ptr<ISoftbusDiscoveryCallback> callback)
71 {
72 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
73     std::lock_guard<std::mutex> lock(discoveryCallbackMutex_);
74 #endif
75 
76     discoveryCallbackMap_.emplace(pkgName, callback);
77     return DM_OK;
78 }
79 
UnRegisterSoftbusDiscoveryCallback(const std::string & pkgName)80 int32_t SoftbusConnector::UnRegisterSoftbusDiscoveryCallback(const std::string &pkgName)
81 {
82 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
83     std::lock_guard<std::mutex> lock(discoveryCallbackMutex_);
84 #endif
85 
86     discoveryCallbackMap_.erase(pkgName);
87     return DM_OK;
88 }
89 
RegisterSoftbusPublishCallback(const std::string & pkgName,const std::shared_ptr<ISoftbusPublishCallback> callback)90 int32_t SoftbusConnector::RegisterSoftbusPublishCallback(const std::string &pkgName,
91     const std::shared_ptr<ISoftbusPublishCallback> callback)
92 {
93 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
94     std::lock_guard<std::mutex> lock(publishCallbackMutex_);
95 #endif
96 
97     publishCallbackMap_.emplace(pkgName, callback);
98     return DM_OK;
99 }
100 
UnRegisterSoftbusPublishCallback(const std::string & pkgName)101 int32_t SoftbusConnector::UnRegisterSoftbusPublishCallback(const std::string &pkgName)
102 {
103 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
104     std::lock_guard<std::mutex> lock(publishCallbackMutex_);
105 #endif
106 
107     publishCallbackMap_.erase(pkgName);
108     return DM_OK;
109 }
110 
RegisterSoftbusStateCallback(const std::string & pkgName,const std::shared_ptr<ISoftbusStateCallback> callback)111 int32_t SoftbusConnector::RegisterSoftbusStateCallback(const std::string &pkgName,
112     const std::shared_ptr<ISoftbusStateCallback> callback)
113 {
114 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
115     std::lock_guard<std::mutex> lock(stateCallbackMutex_);
116 #endif
117 
118     stateCallbackMap_.emplace(pkgName, callback);
119     return DM_OK;
120 }
121 
UnRegisterSoftbusStateCallback(const std::string & pkgName)122 int32_t SoftbusConnector::UnRegisterSoftbusStateCallback(const std::string &pkgName)
123 {
124 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
125     std::lock_guard<std::mutex> lock(stateCallbackMutex_);
126 #endif
127 
128     stateCallbackMap_.erase(pkgName);
129     return DM_OK;
130 }
131 
PublishDiscovery(const DmPublishInfo & dmPublishInfo)132 int32_t SoftbusConnector::PublishDiscovery(const DmPublishInfo &dmPublishInfo)
133 {
134     PublishInfo publishInfo;
135     (void)memset_s(&publishInfo, sizeof(PublishInfo), 0, sizeof(PublishInfo));
136     publishInfo.publishId = dmPublishInfo.publishId;
137     publishInfo.mode = (DiscoverMode)dmPublishInfo.mode;
138     publishInfo.medium = ExchangeMedium::AUTO;
139     publishInfo.freq = (ExchangeFreq)dmPublishInfo.freq;
140     publishInfo.capability = DM_CAPABILITY_OSD;
141     publishInfo.ranging = dmPublishInfo.ranging;
142     LOGI("PublishDiscovery begin, publishId : %d, mode : 0x%x, ranging : %d", publishInfo.publishId, publishInfo.mode,
143         publishInfo.ranging);
144     int32_t ret = ::PublishLNN(DM_PKG_NAME, &publishInfo, &softbusPublishCallback_);
145     if (ret != DM_OK) {
146         LOGE("PublishLNN failed with ret %d.", ret);
147         return ERR_DM_PUBLISH_FAILED;
148     }
149     return DM_OK;
150 }
151 
UnPublishDiscovery(int32_t publishId)152 int32_t SoftbusConnector::UnPublishDiscovery(int32_t publishId)
153 {
154     LOGI("UnPublishDiscovery begin, publishId : %d", publishId);
155     int32_t ret = ::StopPublishLNN(DM_PKG_NAME, publishId);
156     if (ret != DM_OK) {
157         LOGE("StopPublishLNN failed with ret %d", ret);
158         return ERR_DM_PUBLISH_FAILED;
159     }
160     return DM_OK;
161 }
162 
StartDiscovery(const DmSubscribeInfo & dmSubscribeInfo)163 int32_t SoftbusConnector::StartDiscovery(const DmSubscribeInfo &dmSubscribeInfo)
164 {
165     SubscribeInfo subscribeInfo;
166     (void)memset_s(&subscribeInfo, sizeof(SubscribeInfo), 0, sizeof(SubscribeInfo));
167     subscribeInfo.subscribeId = dmSubscribeInfo.subscribeId;
168     subscribeInfo.mode = (DiscoverMode)dmSubscribeInfo.mode;
169     subscribeInfo.medium = (ExchangeMedium)dmSubscribeInfo.medium;
170     subscribeInfo.freq = (ExchangeFreq)dmSubscribeInfo.freq;
171     subscribeInfo.isSameAccount = dmSubscribeInfo.isSameAccount;
172     subscribeInfo.isWakeRemote = dmSubscribeInfo.isWakeRemote;
173     subscribeInfo.capability = dmSubscribeInfo.capability;
174     LOGI("StartDiscovery begin, subscribeId : %d, mode : 0x%x, medium : %d", subscribeInfo.subscribeId,
175         subscribeInfo.mode, subscribeInfo.medium);
176     int32_t ret = ::RefreshLNN(DM_PKG_NAME, &subscribeInfo, &softbusDiscoveryCallback_);
177     if (ret != DM_OK) {
178         LOGE("RefreshLNN failed with ret %d.", ret);
179         return ERR_DM_DISCOVERY_FAILED;
180     }
181     return DM_OK;
182 }
183 
StopDiscovery(uint16_t subscribeId)184 int32_t SoftbusConnector::StopDiscovery(uint16_t subscribeId)
185 {
186     LOGI("StopDiscovery begin, subscribeId:%d", (int32_t)subscribeId);
187     int32_t ret = ::StopRefreshLNN(DM_PKG_NAME, subscribeId);
188     if (ret != DM_OK) {
189         LOGE("StopRefreshLNN failed with ret %d", ret);
190         return ERR_DM_DISCOVERY_FAILED;
191     }
192     return DM_OK;
193 }
194 
JoinLnn(const std::string & deviceId)195 void SoftbusConnector::JoinLnn(const std::string &deviceId)
196 {
197     std::string connectAddr;
198     LOGI("SoftbusConnector::JoinLnn, deviceId :%s", GetAnonyString(deviceId).c_str());
199     ConnectionAddr *addrInfo = GetConnectAddr(deviceId, connectAddr);
200     if (addrInfo == nullptr) {
201         return;
202     }
203     int32_t ret = ::JoinLNN(DM_PKG_NAME, addrInfo, OnSoftbusJoinLNNResult);
204     if (ret != DM_OK) {
205         LOGE("JoinLNN failed with ret %d", ret);
206     }
207     return;
208 }
209 
GetUdidByNetworkId(const char * networkId,std::string & udid)210 int32_t SoftbusConnector::GetUdidByNetworkId(const char *networkId, std::string &udid)
211 {
212     LOGI("GetUdidByNetworkId for networkId = %s", GetAnonyString(std::string(networkId)).c_str());
213     uint8_t mUdid[UDID_BUF_LEN] = {0};
214     int32_t ret =
215         GetNodeKeyInfo(DM_PKG_NAME, networkId, NodeDeviceInfoKey::NODE_KEY_UDID, mUdid, sizeof(mUdid));
216     if (ret != DM_OK) {
217         LOGE("GetUdidByNetworkId GetNodeKeyInfo failed");
218         return ERR_DM_FAILED;
219     }
220     udid = reinterpret_cast<char *>(mUdid);
221     return DM_OK;
222 }
223 
GetUuidByNetworkId(const char * networkId,std::string & uuid)224 int32_t SoftbusConnector::GetUuidByNetworkId(const char *networkId, std::string &uuid)
225 {
226     LOGI("GetUuidByNetworkId for networkId = %s", GetAnonyString(std::string(networkId)).c_str());
227     uint8_t mUuid[UUID_BUF_LEN] = {0};
228     int32_t ret =
229         GetNodeKeyInfo(DM_PKG_NAME, networkId, NodeDeviceInfoKey::NODE_KEY_UUID, mUuid, sizeof(mUuid));
230     if (ret != DM_OK) {
231         LOGE("GetUuidByNetworkId GetNodeKeyInfo failed");
232         return ERR_DM_FAILED;
233     }
234     uuid = reinterpret_cast<char *>(mUuid);
235     return DM_OK;
236 }
237 
IsDeviceOnLine(const std::string & deviceId)238 bool SoftbusConnector::IsDeviceOnLine(const std::string &deviceId)
239 {
240     NodeBasicInfo *info = nullptr;
241     int32_t infoNum = 0;
242     if (GetAllNodeDeviceInfo(DM_PKG_NAME, &info, &infoNum) != DM_OK) {
243         LOGE("GetAllNodeDeviceInfo failed");
244         return false;
245     }
246     bool bDeviceOnline = false;
247     for (int32_t i = 0; i < infoNum; ++i) {
248         NodeBasicInfo *nodeBasicInfo = info + i;
249         if (nodeBasicInfo == nullptr) {
250             LOGE("nodeBasicInfo is empty for index %d, infoNum %d.", i, infoNum);
251             continue;
252         }
253         std::string networkId = nodeBasicInfo->networkId;
254         if (networkId == deviceId) {
255             LOGI("DM_IsDeviceOnLine device %s online", GetAnonyString(deviceId).c_str());
256             bDeviceOnline = true;
257             break;
258         }
259         uint8_t udid[UDID_BUF_LEN] = {0};
260         int32_t ret = GetNodeKeyInfo(DM_PKG_NAME, networkId.c_str(), NodeDeviceInfoKey::NODE_KEY_UDID, udid,
261                                      sizeof(udid));
262         if (ret != DM_OK) {
263             LOGE("DM_IsDeviceOnLine GetNodeKeyInfo failed");
264             break;
265         }
266         if (strcmp(reinterpret_cast<char *>(udid), deviceId.c_str()) == 0) {
267             LOGI("DM_IsDeviceOnLine device %s online", GetAnonyString(deviceId).c_str());
268             bDeviceOnline = true;
269             break;
270         }
271     }
272     FreeNodeInfo(info);
273     return bDeviceOnline;
274 }
275 
GetSoftbusSession()276 std::shared_ptr<SoftbusSession> SoftbusConnector::GetSoftbusSession()
277 {
278     return softbusSession_;
279 }
280 
HaveDeviceInMap(std::string deviceId)281 bool SoftbusConnector::HaveDeviceInMap(std::string deviceId)
282 {
283     std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
284     auto iter = discoveryDeviceInfoMap_.find(deviceId);
285     if (iter == discoveryDeviceInfoMap_.end()) {
286         LOGE("deviceInfo not found by deviceId %s", GetAnonyString(deviceId).c_str());
287         return false;
288     }
289     return true;
290 }
291 
GetConnectionIpAddress(const std::string & deviceId,std::string & ipAddress)292 int32_t SoftbusConnector::GetConnectionIpAddress(const std::string &deviceId, std::string &ipAddress)
293 {
294     DeviceInfo *deviceInfo = nullptr;
295     {
296         std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
297         auto iter = discoveryDeviceInfoMap_.find(deviceId);
298         if (iter == discoveryDeviceInfoMap_.end()) {
299             LOGE("deviceInfo not found by deviceId %s", GetAnonyString(deviceId).c_str());
300             return ERR_DM_FAILED;
301         }
302         deviceInfo = iter->second.get();
303     }
304 
305     if (deviceInfo->addrNum <= 0 || deviceInfo->addrNum >= CONNECTION_ADDR_MAX) {
306         LOGE("deviceInfo address num not valid, addrNum %d", deviceInfo->addrNum);
307         return ERR_DM_FAILED;
308     }
309     for (uint32_t i = 0; i < deviceInfo->addrNum; ++i) {
310         // currently, only support CONNECT_ADDR_WLAN
311         if (deviceInfo->addr[i].type != ConnectionAddrType::CONNECTION_ADDR_WLAN &&
312             deviceInfo->addr[i].type != ConnectionAddrType::CONNECTION_ADDR_ETH) {
313             continue;
314         }
315         ipAddress = deviceInfo->addr[i].info.ip.ip;
316         LOGI("DM_GetConnectionIpAddr get ip ok.");
317         return DM_OK;
318     }
319     LOGE("failed to get ipAddress for deviceId %s", GetAnonyString(deviceId).c_str());
320     return ERR_DM_FAILED;
321 }
322 
GetConnectAddrByType(DeviceInfo * deviceInfo,ConnectionAddrType type)323 ConnectionAddr *SoftbusConnector::GetConnectAddrByType(DeviceInfo *deviceInfo, ConnectionAddrType type)
324 {
325     if (deviceInfo == nullptr) {
326         return nullptr;
327     }
328     for (uint32_t i = 0; i < deviceInfo->addrNum; ++i) {
329         if (deviceInfo->addr[i].type == type) {
330             return &deviceInfo->addr[i];
331         }
332     }
333     return nullptr;
334 }
335 
GetConnectAddr(const std::string & deviceId,std::string & connectAddr)336 ConnectionAddr *SoftbusConnector::GetConnectAddr(const std::string &deviceId, std::string &connectAddr)
337 {
338     DeviceInfo *deviceInfo = nullptr;
339     {
340         std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
341         auto iter = discoveryDeviceInfoMap_.find(deviceId);
342         if (iter == discoveryDeviceInfoMap_.end()) {
343             LOGE("deviceInfo not found by deviceId %s", GetAnonyString(deviceId).c_str());
344             return nullptr;
345         }
346         deviceInfo = iter->second.get();
347     }
348 
349     if (deviceInfo->addrNum <= 0 || deviceInfo->addrNum >= CONNECTION_ADDR_MAX) {
350         LOGE("deviceInfo addrNum not valid, addrNum %d", deviceInfo->addrNum);
351         return nullptr;
352     }
353     nlohmann::json jsonPara;
354     ConnectionAddr *addr = nullptr;
355     addr = GetConnectAddrByType(deviceInfo, ConnectionAddrType::CONNECTION_ADDR_ETH);
356     if (addr != nullptr) {
357         LOGI("get ETH ConnectionAddr for deviceId %s", GetAnonyString(deviceId).c_str());
358         jsonPara[ETH_IP] = addr->info.ip.ip;
359         jsonPara[ETH_PORT] = addr->info.ip.port;
360         connectAddr = jsonPara.dump();
361         return addr;
362     }
363     addr = GetConnectAddrByType(deviceInfo, ConnectionAddrType::CONNECTION_ADDR_WLAN);
364     if (addr != nullptr) {
365         jsonPara[WIFI_IP] = addr->info.ip.ip;
366         jsonPara[WIFI_PORT] = addr->info.ip.port;
367         LOGI("get WLAN ConnectionAddr for deviceId %s", GetAnonyString(deviceId).c_str());
368         connectAddr = jsonPara.dump();
369         return addr;
370     }
371     addr = GetConnectAddrByType(deviceInfo, ConnectionAddrType::CONNECTION_ADDR_BR);
372     if (addr != nullptr) {
373         jsonPara[BR_MAC] = addr->info.br.brMac;
374         LOGI("get BR ConnectionAddr for deviceId %s", GetAnonyString(deviceId).c_str());
375         connectAddr = jsonPara.dump();
376         return addr;
377     }
378     addr = GetConnectAddrByType(deviceInfo, ConnectionAddrType::CONNECTION_ADDR_BLE);
379     if (addr != nullptr) {
380         jsonPara[BLE_MAC] = addr->info.ble.bleMac;
381         LOGI("get BLE ConnectionAddr for deviceId %s", GetAnonyString(deviceId).c_str());
382         connectAddr = jsonPara.dump();
383         return addr;
384     }
385     LOGE("failed to get ConnectionAddr for deviceId %s", GetAnonyString(deviceId).c_str());
386     return nullptr;
387 }
388 
ConvertDeviceInfoToDmDevice(const DeviceInfo & deviceInfo,DmDeviceInfo & dmDeviceInfo)389 void SoftbusConnector::ConvertDeviceInfoToDmDevice(const DeviceInfo &deviceInfo, DmDeviceInfo &dmDeviceInfo)
390 {
391     (void)memset_s(&dmDeviceInfo, sizeof(DmDeviceInfo), 0, sizeof(DmDeviceInfo));
392     if (memcpy_s(dmDeviceInfo.deviceId, sizeof(dmDeviceInfo.deviceId), deviceInfo.devId,
393                  std::min(sizeof(dmDeviceInfo.deviceId), sizeof(deviceInfo.devId))) != DM_OK) {
394         LOGE("ConvertDeviceInfoToDmDevice copy deviceId data failed");
395     }
396 
397     if (memcpy_s(dmDeviceInfo.deviceName, sizeof(dmDeviceInfo.deviceName), deviceInfo.devName,
398                  std::min(sizeof(dmDeviceInfo.deviceName), sizeof(deviceInfo.devName))) != DM_OK) {
399         LOGE("ConvertDeviceInfoToDmDevice copy deviceName data failed");
400     }
401     dmDeviceInfo.deviceTypeId = deviceInfo.devType;
402     dmDeviceInfo.range = deviceInfo.range;
403 }
404 
HandleDeviceOnline(const DmDeviceInfo & info)405 void SoftbusConnector::HandleDeviceOnline(const DmDeviceInfo &info)
406 {
407     LOGI("HandleDeviceOnline: start handle device online event.");
408     {
409         std::lock_guard<std::mutex> lock(stateCallbackMutex_);
410         for (auto &iter : stateCallbackMap_) {
411             iter.second->OnDeviceOnline(iter.first, info);
412         }
413     }
414 
415     {
416         std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
417         if (discoveryDeviceInfoMap_.empty()) {
418             return;
419         }
420     }
421     uint8_t udid[UDID_BUF_LEN] = {0};
422     int32_t ret =
423         GetNodeKeyInfo(DM_PKG_NAME, info.networkId, NodeDeviceInfoKey::NODE_KEY_UDID, udid, sizeof(udid));
424     if (ret != DM_OK) {
425         LOGE("GetNodeKeyInfo failed");
426         return;
427     }
428     std::string deviceId = reinterpret_cast<char *>(udid);
429     LOGI("device online, deviceId: %s", GetAnonyString(deviceId).c_str());
430     {
431         std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
432         discoveryDeviceInfoMap_.erase(deviceId);
433     }
434 }
435 
HandleDeviceOffline(const DmDeviceInfo & info)436 void SoftbusConnector::HandleDeviceOffline(const DmDeviceInfo &info)
437 {
438     LOGI("HandleDeviceOffline: start handle device offline event.");
439     {
440         std::lock_guard<std::mutex> lock(stateCallbackMutex_);
441         for (auto &iter : stateCallbackMap_) {
442             iter.second->OnDeviceOffline(iter.first, info);
443         }
444     }
445 }
446 
OnSoftbusPublishResult(int32_t publishId,PublishResult result)447 void SoftbusConnector::OnSoftbusPublishResult(int32_t publishId, PublishResult result)
448 {
449     LOGI("Callback In, publishId %d, result %d", publishId, result);
450 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
451     std::lock_guard<std::mutex> lock(publishCallbackMutex_);
452 #endif
453 
454     for (auto &iter : publishCallbackMap_) {
455         iter.second->OnPublishResult(iter.first, publishId, result);
456     }
457 }
458 
OnSoftbusJoinLNNResult(ConnectionAddr * addr,const char * networkId,int32_t result)459 void SoftbusConnector::OnSoftbusJoinLNNResult(ConnectionAddr *addr, const char *networkId, int32_t result)
460 {
461     LOGI("SoftbusConnector::OnSoftbusJoinLNNResult, result = %d.", result);
462 }
463 
OnSoftbusDeviceFound(const DeviceInfo * device)464 void SoftbusConnector::OnSoftbusDeviceFound(const DeviceInfo *device)
465 {
466     if (device == nullptr) {
467         LOGE("device is null");
468         return;
469     }
470     std::string deviceId = device->devId;
471     LOGI("SoftbusConnector::OnSoftbusDeviceFound device %s found, range : %d.", GetAnonyString(deviceId).c_str(),
472         device->range);
473 
474     if (!IsDeviceOnLine(deviceId)) {
475         std::shared_ptr<DeviceInfo> infoPtr = std::make_shared<DeviceInfo>();
476         DeviceInfo *srcInfo = infoPtr.get();
477         if (memcpy_s(srcInfo, sizeof(DeviceInfo), device, sizeof(DeviceInfo)) != 0) {
478             LOGE("save discovery device info failed");
479             return;
480         }
481         {
482             std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
483             discoveryDeviceInfoMap_[deviceId] = infoPtr;
484             // Remove the earliest element when reached the max size
485             if (discoveryDeviceInfoMap_.size() == SOFTBUS_DISCOVER_DEVICE_INFO_MAX_SIZE) {
486                 auto iter = discoveryDeviceInfoMap_.begin();
487                 discoveryDeviceInfoMap_.erase(iter->second->devId);
488             }
489         }
490     }
491 
492     DmDeviceInfo dmDeviceInfo;
493     ConvertDeviceInfoToDmDevice(*device, dmDeviceInfo);
494     {
495         std::lock_guard<std::mutex> lock(discoveryCallbackMutex_);
496         for (auto &iter : discoveryCallbackMap_) {
497             iter.second->OnDeviceFound(iter.first, dmDeviceInfo);
498         }
499     }
500 }
501 
OnSoftbusDiscoveryResult(int subscribeId,RefreshResult result)502 void SoftbusConnector::OnSoftbusDiscoveryResult(int subscribeId, RefreshResult result)
503 {
504     LOGI("In, subscribeId %d, result %d", subscribeId, result);
505     uint16_t originId = (uint16_t)(((uint32_t)subscribeId) & SOFTBUS_SUBSCRIBE_ID_MASK);
506     {
507         std::lock_guard<std::mutex> lock(discoveryCallbackMutex_);
508         if (result == REFRESH_LNN_SUCCESS) {
509             for (auto &iter : discoveryCallbackMap_) {
510                 iter.second->OnDiscoverySuccess(iter.first, originId);
511             }
512         } else {
513             for (auto &iter : discoveryCallbackMap_) {
514                 iter.second->OnDiscoveryFailed(iter.first, originId, result);
515             }
516         }
517     }
518 }
519 } // namespace DistributedHardware
520 } // namespace OHOS
521