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 "nlohmann/json.hpp"
27 #include "parameter.h"
28 #include "system_ability_definition.h"
29
30 namespace OHOS {
31 namespace DistributedHardware {
32 const int32_t SOFTBUS_SUBSCRIBE_ID_MASK = 0x0000FFFF;
33 const int32_t SOFTBUS_DISCOVER_DEVICE_INFO_MAX_SIZE = 100;
34 const int32_t SOFTBUS_TRUSTDEVICE_UUIDHASH_INFO_MAX_SIZE = 100;
35
36 constexpr const char* WIFI_IP = "WIFI_IP";
37 constexpr const char* WIFI_PORT = "WIFI_PORT";
38 constexpr const char* BR_MAC = "BR_MAC";
39 constexpr const char* BLE_MAC = "BLE_MAC";
40 constexpr const char* ETH_IP = "ETH_IP";
41 constexpr const char* ETH_PORT = "ETH_PORT";
42
43 SoftbusConnector::PulishStatus SoftbusConnector::publishStatus = SoftbusConnector::STATUS_UNKNOWN;
44 std::map<std::string, std::shared_ptr<DeviceInfo>> SoftbusConnector::discoveryDeviceInfoMap_ = {};
45 std::map<std::string, std::shared_ptr<ISoftbusStateCallback>> SoftbusConnector::stateCallbackMap_ = {};
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::mutex SoftbusConnector::discoveryCallbackMutex_;
51 std::mutex SoftbusConnector::discoveryDeviceInfoMutex_;
52 std::mutex SoftbusConnector::stateCallbackMutex_;
53 std::mutex SoftbusConnector::deviceUdidLocks_;
54
55 IPublishCb SoftbusConnector::softbusPublishCallback_ = {
56 .OnPublishResult = SoftbusConnector::OnSoftbusPublishResult,
57 };
58 IRefreshCallback SoftbusConnector::softbusDiscoveryCallback_ = {
59 .OnDeviceFound = SoftbusConnector::OnSoftbusDeviceFound,
60 .OnDiscoverResult = SoftbusConnector::OnSoftbusDiscoveryResult,
61 };
62
63 IRefreshCallback SoftbusConnector::softbusDiscoveryByIdCallback_ = {
64 .OnDeviceFound = SoftbusConnector::OnSoftbusDeviceDiscovery,
65 .OnDiscoverResult = SoftbusConnector::OnSoftbusDiscoveryResult,
66 };
67
SoftbusConnector()68 SoftbusConnector::SoftbusConnector()
69 {
70 softbusSession_ = std::make_shared<SoftbusSession>();
71 LOGD("SoftbusConnector constructor.");
72 }
73
~SoftbusConnector()74 SoftbusConnector::~SoftbusConnector()
75 {
76 LOGD("SoftbusConnector destructor.");
77 }
78
RegisterSoftbusDiscoveryCallback(const std::string & pkgName,const std::shared_ptr<ISoftbusDiscoveryCallback> callback)79 int32_t SoftbusConnector::RegisterSoftbusDiscoveryCallback(const std::string &pkgName,
80 const std::shared_ptr<ISoftbusDiscoveryCallback> callback)
81 {
82 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
83 std::lock_guard<std::mutex> lock(discoveryCallbackMutex_);
84 #endif
85
86 discoveryCallbackMap_.emplace(pkgName, callback);
87 return DM_OK;
88 }
89
UnRegisterSoftbusDiscoveryCallback(const std::string & pkgName)90 int32_t SoftbusConnector::UnRegisterSoftbusDiscoveryCallback(const std::string &pkgName)
91 {
92 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
93 std::lock_guard<std::mutex> lock(discoveryCallbackMutex_);
94 #endif
95
96 discoveryCallbackMap_.erase(pkgName);
97 return DM_OK;
98 }
99
RegisterSoftbusPublishCallback(const std::string & pkgName,const std::shared_ptr<ISoftbusPublishCallback> callback)100 int32_t SoftbusConnector::RegisterSoftbusPublishCallback(const std::string &pkgName,
101 const std::shared_ptr<ISoftbusPublishCallback> callback)
102 {
103 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
104 std::mutex registerCallback;
105 std::lock_guard<std::mutex> lock(registerCallback);
106 #endif
107
108 publishCallbackMap_.emplace(pkgName, callback);
109 return DM_OK;
110 }
111
UnRegisterSoftbusPublishCallback(const std::string & pkgName)112 int32_t SoftbusConnector::UnRegisterSoftbusPublishCallback(const std::string &pkgName)
113 {
114 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
115 std::mutex unRegisterCallback;
116 std::lock_guard<std::mutex> lock(unRegisterCallback);
117 #endif
118
119 publishCallbackMap_.erase(pkgName);
120 return DM_OK;
121 }
122
RegisterSoftbusStateCallback(const std::string & pkgName,const std::shared_ptr<ISoftbusStateCallback> callback)123 int32_t SoftbusConnector::RegisterSoftbusStateCallback(const std::string &pkgName,
124 const std::shared_ptr<ISoftbusStateCallback> callback)
125 {
126 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
127 std::lock_guard<std::mutex> lock(stateCallbackMutex_);
128 #endif
129 stateCallbackMap_.emplace(pkgName, callback);
130 return DM_OK;
131 }
132
UnRegisterSoftbusStateCallback(const std::string & pkgName)133 int32_t SoftbusConnector::UnRegisterSoftbusStateCallback(const std::string &pkgName)
134 {
135 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
136 std::lock_guard<std::mutex> lock(stateCallbackMutex_);
137 #endif
138 stateCallbackMap_.erase(pkgName);
139 return DM_OK;
140 }
141
PublishDiscovery(const DmPublishInfo & dmPublishInfo)142 int32_t SoftbusConnector::PublishDiscovery(const DmPublishInfo &dmPublishInfo)
143 {
144 PublishInfo publishInfo;
145 (void)memset_s(&publishInfo, sizeof(PublishInfo), 0, sizeof(PublishInfo));
146 publishInfo.publishId = dmPublishInfo.publishId;
147 publishInfo.mode = static_cast<DiscoverMode>(dmPublishInfo.mode);
148 publishInfo.medium = ExchangeMedium::AUTO;
149 publishInfo.freq = static_cast<ExchangeFreq>(dmPublishInfo.freq);
150 publishInfo.capability = DM_CAPABILITY_OSD;
151 publishInfo.ranging = dmPublishInfo.ranging;
152 LOGI("start, publishId: %d, mode: 0x%x, ranging: %d.", publishInfo.publishId, publishInfo.mode,
153 publishInfo.ranging);
154 int32_t ret = ::PublishLNN(DM_PKG_NAME, &publishInfo, &softbusPublishCallback_);
155 if (ret != DM_OK) {
156 LOGE("[SOFTBUS]PublishLNN failed, ret %d.", ret);
157 return ERR_DM_PUBLISH_FAILED;
158 }
159 return ret;
160 }
161
UnPublishDiscovery(int32_t publishId)162 int32_t SoftbusConnector::UnPublishDiscovery(int32_t publishId)
163 {
164 LOGI("UnPublishDiscovery begin, publishId: %d.", publishId);
165 int32_t ret = ::StopPublishLNN(DM_PKG_NAME, publishId);
166 if (ret != DM_OK) {
167 LOGE("[SOFTBUS]StopPublishLNN failed with ret: %d.", ret);
168 return ERR_DM_PUBLISH_FAILED;
169 }
170 return ret;
171 }
172
StartDiscovery(const DmSubscribeInfo & dmSubscribeInfo)173 int32_t SoftbusConnector::StartDiscovery(const DmSubscribeInfo &dmSubscribeInfo)
174 {
175 SubscribeInfo subscribeInfo;
176 (void)memset_s(&subscribeInfo, sizeof(SubscribeInfo), 0, sizeof(SubscribeInfo));
177 subscribeInfo.subscribeId = dmSubscribeInfo.subscribeId;
178 subscribeInfo.mode = static_cast<DiscoverMode>(dmSubscribeInfo.mode);
179 subscribeInfo.medium = static_cast<ExchangeMedium>(dmSubscribeInfo.medium);
180 subscribeInfo.freq = static_cast<ExchangeFreq>(dmSubscribeInfo.freq);
181 subscribeInfo.isSameAccount = dmSubscribeInfo.isSameAccount;
182 subscribeInfo.isWakeRemote = dmSubscribeInfo.isWakeRemote;
183 subscribeInfo.capability = dmSubscribeInfo.capability;
184 LOGI("StartDiscovery begin, subscribeId: %d, mode: 0x%x, medium: %d.", subscribeInfo.subscribeId,
185 subscribeInfo.mode, subscribeInfo.medium);
186 int32_t ret = ::RefreshLNN(DM_PKG_NAME, &subscribeInfo, &softbusDiscoveryCallback_);
187 if (ret != DM_OK) {
188 LOGE("[SOFTBUS]RefreshLNN failed, ret: %d.", ret);
189 return ERR_DM_DISCOVERY_FAILED;
190 }
191 return ret;
192 }
193
StartDiscovery(const uint16_t subscribeId)194 int32_t SoftbusConnector::StartDiscovery(const uint16_t subscribeId)
195 {
196 SubscribeInfo subscribeInfo;
197 (void)memset_s(&subscribeInfo, sizeof(SubscribeInfo), 0, sizeof(SubscribeInfo));
198 subscribeInfo.subscribeId = subscribeId;
199 subscribeInfo.mode = static_cast<DiscoverMode>(DmDiscoverMode::DM_DISCOVER_MODE_ACTIVE);
200 subscribeInfo.medium = static_cast<ExchangeMedium>(DmExchangeMedium::DM_AUTO);
201 subscribeInfo.freq = static_cast<ExchangeFreq>(DmExchangeFreq::DM_SUPER_HIGH);
202 subscribeInfo.isSameAccount = false;
203 subscribeInfo.isWakeRemote = false;
204 subscribeInfo.capability = DM_CAPABILITY_OSD;
205 LOGI("StartDiscovery by subscribeId begin, subscribeId: %d, mode: 0x%x, medium: %d.",
206 subscribeId, subscribeInfo.mode, subscribeInfo.medium);
207 int32_t ret = ::RefreshLNN(DM_PKG_NAME, &subscribeInfo, &softbusDiscoveryByIdCallback_);
208 if (ret != DM_OK) {
209 LOGE("[SOFTBUS]RefreshLNN failed, ret: %d.", ret);
210 return ERR_DM_DISCOVERY_FAILED;
211 }
212 return ret;
213 }
214
StopDiscovery(uint16_t subscribeId)215 int32_t SoftbusConnector::StopDiscovery(uint16_t subscribeId)
216 {
217 LOGI("StopDiscovery begin, subscribeId: %d.", (int32_t)subscribeId);
218 int32_t ret = ::StopRefreshLNN(DM_PKG_NAME, subscribeId);
219 if (ret != DM_OK) {
220 LOGE("[SOFTBUS]StopRefreshLNN failed, ret: %d.", ret);
221 return ERR_DM_DISCOVERY_FAILED;
222 }
223 return ret;
224 }
225
JoinLnn(const std::string & deviceId)226 void SoftbusConnector::JoinLnn(const std::string &deviceId)
227 {
228 std::string connectAddr;
229 LOGI("start, deviceId: %s.", GetAnonyString(deviceId).c_str());
230 ConnectionAddr *addrInfo = GetConnectAddr(deviceId, connectAddr);
231 if (addrInfo == nullptr) {
232 LOGE("addrInfo is nullptr.");
233 return;
234 }
235 int32_t ret = ::JoinLNN(DM_PKG_NAME, addrInfo, OnSoftbusJoinLNNResult);
236 if (ret != DM_OK) {
237 LOGE("[SOFTBUS]JoinLNN failed, ret: %d.", ret);
238 }
239 return;
240 }
241
GetUdidByNetworkId(const char * networkId,std::string & udid)242 int32_t SoftbusConnector::GetUdidByNetworkId(const char *networkId, std::string &udid)
243 {
244 LOGI("start, networkId: %s.", GetAnonyString(std::string(networkId)).c_str());
245 uint8_t tmpUdid[UDID_BUF_LEN] = {0};
246 int32_t ret = GetNodeKeyInfo(DM_PKG_NAME, networkId, NodeDeviceInfoKey::NODE_KEY_UDID, tmpUdid, sizeof(tmpUdid));
247 if (ret != DM_OK) {
248 LOGE("[SOFTBUS]GetNodeKeyInfo failed, ret: %d.", ret);
249 return ERR_DM_FAILED;
250 }
251 udid = reinterpret_cast<char *>(tmpUdid);
252 return ret;
253 }
254
GetUuidByNetworkId(const char * networkId,std::string & uuid)255 int32_t SoftbusConnector::GetUuidByNetworkId(const char *networkId, std::string &uuid)
256 {
257 LOGI("start, networkId: %s.", GetAnonyString(std::string(networkId)).c_str());
258 uint8_t tmpUuid[UUID_BUF_LEN] = {0};
259 int32_t ret = GetNodeKeyInfo(DM_PKG_NAME, networkId, NodeDeviceInfoKey::NODE_KEY_UUID, tmpUuid, sizeof(tmpUuid));
260 if (ret != DM_OK) {
261 LOGE("[SOFTBUS]GetNodeKeyInfo failed, ret: %d.", ret);
262 return ERR_DM_FAILED;
263 }
264 uuid = reinterpret_cast<char *>(tmpUuid);
265 return ret;
266 }
267
GetSoftbusSession()268 std::shared_ptr<SoftbusSession> SoftbusConnector::GetSoftbusSession()
269 {
270 return softbusSession_;
271 }
272
HaveDeviceInMap(std::string deviceId)273 bool SoftbusConnector::HaveDeviceInMap(std::string deviceId)
274 {
275 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
276 std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
277 #endif
278
279 auto iter = discoveryDeviceInfoMap_.find(deviceId);
280 if (iter == discoveryDeviceInfoMap_.end()) {
281 LOGE("deviceInfo not found by deviceId: %s.", GetAnonyString(deviceId).c_str());
282 return false;
283 }
284 return true;
285 }
286
GetConnectionIpAddress(const std::string & deviceId,std::string & ipAddress)287 int32_t SoftbusConnector::GetConnectionIpAddress(const std::string &deviceId, std::string &ipAddress)
288 {
289 DeviceInfo *deviceInfo = nullptr;
290 {
291 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
292 std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
293 #endif
294
295 auto iter = discoveryDeviceInfoMap_.find(deviceId);
296 if (iter == discoveryDeviceInfoMap_.end()) {
297 LOGE("deviceInfo not found by deviceId: %s.", GetAnonyString(deviceId).c_str());
298 return ERR_DM_FAILED;
299 }
300 deviceInfo = iter->second.get();
301 }
302
303 if (deviceInfo->addrNum <= 0 || deviceInfo->addrNum >= CONNECTION_ADDR_MAX) {
304 LOGE("deviceInfo address num not valid, addrNum: %d.", deviceInfo->addrNum);
305 return ERR_DM_FAILED;
306 }
307 for (uint32_t i = 0; i < deviceInfo->addrNum; ++i) {
308 // currently, only support CONNECT_ADDR_WLAN
309 if (deviceInfo->addr[i].type != ConnectionAddrType::CONNECTION_ADDR_WLAN &&
310 deviceInfo->addr[i].type != ConnectionAddrType::CONNECTION_ADDR_ETH) {
311 continue;
312 }
313 ipAddress = deviceInfo->addr[i].info.ip.ip;
314 LOGI("DM_GetConnectionIpAddr get ip ok.");
315 return DM_OK;
316 }
317 LOGE("failed to get ipAddress for deviceId: %s.", GetAnonyString(deviceId).c_str());
318 return ERR_DM_FAILED;
319 }
320
GetConnectAddrByType(DeviceInfo * deviceInfo,ConnectionAddrType type)321 ConnectionAddr *SoftbusConnector::GetConnectAddrByType(DeviceInfo *deviceInfo, ConnectionAddrType type)
322 {
323 if (deviceInfo == nullptr) {
324 return nullptr;
325 }
326 for (uint32_t i = 0; i < deviceInfo->addrNum; ++i) {
327 if (deviceInfo->addr[i].type == type) {
328 return &deviceInfo->addr[i];
329 }
330 }
331 return nullptr;
332 }
333
GetConnectAddr(const std::string & deviceId,std::string & connectAddr)334 ConnectionAddr *SoftbusConnector::GetConnectAddr(const std::string &deviceId, std::string &connectAddr)
335 {
336 DeviceInfo *deviceInfo = nullptr;
337 {
338 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
339 std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
340 #endif
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 if (deviceInfo->addrNum <= 0 || deviceInfo->addrNum >= CONNECTION_ADDR_MAX) {
349 LOGE("deviceInfo addrNum not valid, addrNum: %d.", deviceInfo->addrNum);
350 return nullptr;
351 }
352 nlohmann::json jsonPara;
353 ConnectionAddr *addr = GetConnectAddrByType(deviceInfo, ConnectionAddrType::CONNECTION_ADDR_ETH);
354 if (addr != nullptr) {
355 LOGI("[SOFTBUS]get ETH ConnectionAddr for deviceId: %s.", GetAnonyString(deviceId).c_str());
356 jsonPara[ETH_IP] = addr->info.ip.ip;
357 jsonPara[ETH_PORT] = addr->info.ip.port;
358 connectAddr = jsonPara.dump();
359 return addr;
360 }
361 addr = GetConnectAddrByType(deviceInfo, ConnectionAddrType::CONNECTION_ADDR_WLAN);
362 if (addr != nullptr) {
363 jsonPara[WIFI_IP] = addr->info.ip.ip;
364 jsonPara[WIFI_PORT] = addr->info.ip.port;
365 LOGI("[SOFTBUS]get WLAN ConnectionAddr for deviceId: %s.", GetAnonyString(deviceId).c_str());
366 connectAddr = jsonPara.dump();
367 return addr;
368 }
369 addr = GetConnectAddrByType(deviceInfo, ConnectionAddrType::CONNECTION_ADDR_BR);
370 if (addr != nullptr) {
371 jsonPara[BR_MAC] = addr->info.br.brMac;
372 LOGI("[SOFTBUS]get BR ConnectionAddr for deviceId: %s.", GetAnonyString(deviceId).c_str());
373 connectAddr = jsonPara.dump();
374 return addr;
375 }
376 addr = GetConnectAddrByType(deviceInfo, ConnectionAddrType::CONNECTION_ADDR_BLE);
377 if (addr != nullptr) {
378 jsonPara[BLE_MAC] = addr->info.ble.bleMac;
379 connectAddr = jsonPara.dump();
380 return addr;
381 }
382 LOGE("[SOFTBUS]failed to get ConnectionAddr for deviceId: %s.", GetAnonyString(deviceId).c_str());
383 return nullptr;
384 }
385
ConvertDeviceInfoToDmDevice(const DeviceInfo & deviceInfo,DmDeviceInfo & dmDeviceInfo)386 void SoftbusConnector::ConvertDeviceInfoToDmDevice(const DeviceInfo &deviceInfo, DmDeviceInfo &dmDeviceInfo)
387 {
388 (void)memset_s(&dmDeviceInfo, sizeof(DmDeviceInfo), 0, sizeof(DmDeviceInfo));
389 if (memcpy_s(dmDeviceInfo.deviceId, sizeof(dmDeviceInfo.deviceId), deviceInfo.devId,
390 std::min(sizeof(dmDeviceInfo.deviceId), sizeof(deviceInfo.devId))) != DM_OK) {
391 LOGE("ConvertDeviceInfoToDmDevice copy deviceId data failed.");
392 }
393
394 if (memcpy_s(dmDeviceInfo.deviceName, sizeof(dmDeviceInfo.deviceName), deviceInfo.devName,
395 std::min(sizeof(dmDeviceInfo.deviceName), sizeof(deviceInfo.devName))) != DM_OK) {
396 LOGE("ConvertDeviceInfoToDmDevice copy deviceName data failed.");
397 }
398 dmDeviceInfo.deviceTypeId = deviceInfo.devType;
399 dmDeviceInfo.range = deviceInfo.range;
400 }
401
ConvertDeviceInfoToDmDevice(const DeviceInfo & deviceInfo,DmDeviceBasicInfo & dmDeviceBasicInfo)402 void SoftbusConnector::ConvertDeviceInfoToDmDevice(const DeviceInfo &deviceInfo, DmDeviceBasicInfo &dmDeviceBasicInfo)
403 {
404 (void)memset_s(&dmDeviceBasicInfo, sizeof(DmDeviceBasicInfo), 0, sizeof(DmDeviceBasicInfo));
405 if (memcpy_s(dmDeviceBasicInfo.deviceId, sizeof(dmDeviceBasicInfo.deviceId), deviceInfo.devId,
406 std::min(sizeof(dmDeviceBasicInfo.deviceId), sizeof(deviceInfo.devId))) != DM_OK) {
407 LOGE("ConvertDeviceInfoToDmDevice copy deviceId data failed.");
408 }
409
410 if (memcpy_s(dmDeviceBasicInfo.deviceName, sizeof(dmDeviceBasicInfo.deviceName), deviceInfo.devName,
411 std::min(sizeof(dmDeviceBasicInfo.deviceName), sizeof(deviceInfo.devName))) != DM_OK) {
412 LOGE("ConvertDeviceInfoToDmDevice copy deviceName data failed.");
413 }
414 dmDeviceBasicInfo.deviceTypeId = deviceInfo.devType;
415 }
416
HandleDeviceOnline(DmDeviceInfo & info)417 void SoftbusConnector::HandleDeviceOnline(DmDeviceInfo &info)
418 {
419 LOGI("start handle device online event.");
420 {
421 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
422 std::lock_guard<std::mutex> lock(stateCallbackMutex_);
423 #endif
424 for (auto &iter : stateCallbackMap_) {
425 iter.second->OnDeviceOnline(iter.first, info);
426 }
427 }
428
429 LOGI("device online, deviceId: %s.", GetAnonyString(info.deviceId).c_str());
430 }
431
HandleDeviceOffline(const DmDeviceInfo & info)432 void SoftbusConnector::HandleDeviceOffline(const DmDeviceInfo &info)
433 {
434 LOGI("start handle device offline event.");
435 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
436 std::lock_guard<std::mutex> lock(stateCallbackMutex_);
437 #endif
438
439 for (auto &iter : stateCallbackMap_) {
440 iter.second->OnDeviceOffline(iter.first, info);
441 }
442
443 LOGI("device offline, deviceId: %s.", GetAnonyString(info.deviceId).c_str());
444 }
445
HandleDeviceNameChange(const DmDeviceInfo & info)446 void SoftbusConnector::HandleDeviceNameChange(const DmDeviceInfo &info)
447 {
448 LOGI("start handle device name change event.");
449 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
450 std::lock_guard<std::mutex> lock(stateCallbackMutex_);
451 #endif
452 for (auto &iter : stateCallbackMap_) {
453 iter.second->OnDeviceChanged(iter.first, info);
454 }
455 }
456
OnSoftbusPublishResult(int32_t publishId,PublishResult result)457 void SoftbusConnector::OnSoftbusPublishResult(int32_t publishId, PublishResult result)
458 {
459 LOGI("Callback In, publishId: %d, result: %d.", publishId, result);
460 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
461 std::mutex publishResult;
462 std::lock_guard<std::mutex> lock(publishResult);
463 #endif
464
465 for (auto &iter : publishCallbackMap_) {
466 iter.second->OnPublishResult(iter.first, publishId, result);
467 }
468 }
469
OnSoftbusJoinLNNResult(ConnectionAddr * addr,const char * networkId,int32_t result)470 void SoftbusConnector::OnSoftbusJoinLNNResult(ConnectionAddr *addr, const char *networkId, int32_t result)
471 {
472 (void)addr;
473 (void)networkId;
474 LOGD("[SOFTBUS]OnSoftbusJoinLNNResult, result: %d.", result);
475 }
476
OnSoftbusDeviceFound(const DeviceInfo * device)477 void SoftbusConnector::OnSoftbusDeviceFound(const DeviceInfo *device)
478 {
479 if (device == nullptr) {
480 LOGE("[SOFTBUS]device is null.");
481 return;
482 }
483 std::string deviceId = device->devId;
484 LOGI("[SOFTBUS]notify found device: %s found, range: %d, isOnline: %d.", GetAnonyString(deviceId).c_str(),
485 device->range, device->isOnline);
486 if (!device->isOnline) {
487 std::shared_ptr<DeviceInfo> infoPtr = std::make_shared<DeviceInfo>();
488 DeviceInfo *srcInfo = infoPtr.get();
489 int32_t ret = memcpy_s(srcInfo, sizeof(DeviceInfo), device, sizeof(DeviceInfo));
490 if (ret != DM_OK) {
491 LOGE("save discovery device info failed, ret: %d.", ret);
492 return;
493 }
494 {
495 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
496 std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
497 #endif
498
499 if (discoveryDeviceInfoMap_.find(deviceId) == discoveryDeviceInfoMap_.end()) {
500 discoveryDeviceIdQueue_.emplace(deviceId);
501 }
502 discoveryDeviceInfoMap_[deviceId] = infoPtr;
503
504 // Remove the earliest element when reached the max size
505 if (discoveryDeviceIdQueue_.size() == SOFTBUS_DISCOVER_DEVICE_INFO_MAX_SIZE) {
506 discoveryDeviceInfoMap_.erase(discoveryDeviceIdQueue_.front());
507 discoveryDeviceIdQueue_.pop();
508 }
509 }
510 }
511
512 DmDeviceInfo dmDeviceInfo;
513 ConvertDeviceInfoToDmDevice(*device, dmDeviceInfo);
514 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
515 std::lock_guard<std::mutex> lock(discoveryCallbackMutex_);
516 #endif
517
518 for (auto &iter : discoveryCallbackMap_) {
519 iter.second->OnDeviceFound(iter.first, dmDeviceInfo, device->isOnline);
520 }
521 }
522
OnSoftbusDeviceDiscovery(const DeviceInfo * device)523 void SoftbusConnector::OnSoftbusDeviceDiscovery(const DeviceInfo *device)
524 {
525 if (device == nullptr) {
526 LOGE("[SOFTBUS]device is null.");
527 return;
528 }
529 std::string deviceId = device->devId;
530 LOGI("[SOFTBUS]notify discover device: %s found, range: %d, isOnline: %d.", GetAnonyString(deviceId).c_str(),
531 device->range, device->isOnline);
532 if (!device->isOnline) {
533 std::shared_ptr<DeviceInfo> infoPtr = std::make_shared<DeviceInfo>();
534 DeviceInfo *srcInfo = infoPtr.get();
535 int32_t ret = memcpy_s(srcInfo, sizeof(DeviceInfo), device, sizeof(DeviceInfo));
536 if (ret != DM_OK) {
537 LOGE("save discovery device info failed, ret: %d.", ret);
538 return;
539 }
540 {
541 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
542 std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
543 #endif
544
545 if (discoveryDeviceInfoMap_.find(deviceId) == discoveryDeviceInfoMap_.end()) {
546 discoveryDeviceIdQueue_.emplace(deviceId);
547 }
548 discoveryDeviceInfoMap_[deviceId] = infoPtr;
549
550 // Remove the earliest element when reached the max size
551 if (discoveryDeviceIdQueue_.size() == SOFTBUS_DISCOVER_DEVICE_INFO_MAX_SIZE) {
552 discoveryDeviceInfoMap_.erase(discoveryDeviceIdQueue_.front());
553 discoveryDeviceIdQueue_.pop();
554 }
555 }
556 }
557
558 DmDeviceBasicInfo dmDeviceBasicInfo;
559 ConvertDeviceInfoToDmDevice(*device, dmDeviceBasicInfo);
560 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
561 std::lock_guard<std::mutex> lock(discoveryCallbackMutex_);
562 #endif
563
564 for (auto &iter : discoveryCallbackMap_) {
565 iter.second->OnDeviceFound(iter.first, dmDeviceBasicInfo, device->range, device->isOnline);
566 }
567 }
568
OnSoftbusDiscoveryResult(int subscribeId,RefreshResult result)569 void SoftbusConnector::OnSoftbusDiscoveryResult(int subscribeId, RefreshResult result)
570 {
571 uint16_t originId = static_cast<uint16_t>((static_cast<uint32_t>(subscribeId)) & SOFTBUS_SUBSCRIBE_ID_MASK);
572 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
573 std::lock_guard<std::mutex> lock(discoveryCallbackMutex_);
574 #endif
575
576 if (result == REFRESH_LNN_SUCCESS) {
577 LOGI("[SOFTBUS]start to discovery device successfully with subscribeId: %d, result: %d.", subscribeId, result);
578 for (auto &iter : discoveryCallbackMap_) {
579 iter.second->OnDiscoverySuccess(iter.first, originId);
580 }
581 } else {
582 LOGE("[SOFTBUS]fail to discovery device with subscribeId: %d, result: %d.", subscribeId, result);
583 for (auto iter = discoveryCallbackMap_.begin(); iter != discoveryCallbackMap_.end();) {
584 iter->second->OnDiscoveryFailed(iter->first, originId, result);
585 iter = discoveryCallbackMap_.erase(iter);
586 }
587 }
588 }
589
GetDeviceUdidByUdidHash(const std::string & udidHash)590 std::string SoftbusConnector::GetDeviceUdidByUdidHash(const std::string &udidHash)
591 {
592 std::lock_guard<std::mutex> lock(deviceUdidLocks_);
593 for (auto &iter : deviceUdidMap_) {
594 if (iter.second == udidHash) {
595 return iter.first;
596 }
597 }
598 LOGE("fail to GetUdidByUdidHash, udidHash: %s", GetAnonyString(udidHash).c_str());
599 return udidHash;
600 }
601
GetDeviceUdidHashByUdid(const std::string & udid)602 std::string SoftbusConnector::GetDeviceUdidHashByUdid(const std::string &udid)
603 {
604 {
605 std::lock_guard<std::mutex> lock(deviceUdidLocks_);
606 auto iter = deviceUdidMap_.find(udid);
607 if (iter != deviceUdidMap_.end()) {
608 return deviceUdidMap_[udid];
609 }
610 }
611
612 char udidHash[DM_MAX_DEVICE_ID_LEN] = {0};
613 if (DmSoftbusAdapterCrypto::GetUdidHash(udid, (uint8_t *)udidHash) != DM_OK) {
614 LOGE("get udidhash by udid: %s failed.", GetAnonyString(udid).c_str());
615 return "";
616 }
617 LOGI("get udidhash: %s by udid: %s.", GetAnonyString(udidHash).c_str(),
618 GetAnonyString(udid).c_str());
619 std::lock_guard<std::mutex> lock(deviceUdidLocks_);
620 deviceUdidMap_[udid] = udidHash;
621 return udidHash;
622 }
623
EraseUdidFromMap(const std::string & udid)624 void SoftbusConnector::EraseUdidFromMap(const std::string &udid)
625 {
626 std::lock_guard<std::mutex> lock(deviceUdidLocks_);
627 auto iter = deviceUdidMap_.find(udid);
628 if (iter == deviceUdidMap_.end()) {
629 return;
630 }
631 size_t mapSize = deviceUdidMap_.size();
632 if (mapSize >= SOFTBUS_TRUSTDEVICE_UUIDHASH_INFO_MAX_SIZE) {
633 deviceUdidMap_.erase(udid);
634 }
635 }
636
GetLocalDeviceName()637 std::string SoftbusConnector::GetLocalDeviceName()
638 {
639 NodeBasicInfo nodeBasicInfo;
640 int32_t ret = GetLocalNodeDeviceInfo(DM_PKG_NAME, &nodeBasicInfo);
641 if (ret != DM_OK) {
642 LOGE("[SOFTBUS]GetLocalNodeDeviceInfo failed, ret: %d.", ret);
643 return "";
644 }
645 return nodeBasicInfo.deviceName;
646 }
647
GetLocalDeviceTypeId()648 int32_t SoftbusConnector::GetLocalDeviceTypeId()
649 {
650 NodeBasicInfo nodeBasicInfo;
651 int32_t ret = GetLocalNodeDeviceInfo(DM_PKG_NAME, &nodeBasicInfo);
652 if (ret != DM_OK) {
653 LOGE("[SOFTBUS]GetLocalNodeDeviceInfo failed, ret: %d.", ret);
654 return DmDeviceType::DEVICE_TYPE_UNKNOWN;
655 }
656 return nodeBasicInfo.deviceTypeId;
657 }
658 } // namespace DistributedHardware
659 } // namespace OHOS
660