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