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