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