• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "softbus_connector.h"
17 
18 #include <securec.h>
19 #include <unistd.h>
20 
21 #include "dm_anonymous.h"
22 #include "dm_constants.h"
23 #include "dm_device_info.h"
24 #include "dm_log.h"
25 #include "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     if (!device->isOnline) {
532         std::shared_ptr<DeviceInfo> infoPtr = std::make_shared<DeviceInfo>();
533         DeviceInfo *srcInfo = infoPtr.get();
534         int32_t ret = memcpy_s(srcInfo, sizeof(DeviceInfo), device, sizeof(DeviceInfo));
535         if (ret != DM_OK) {
536             LOGE("save discovery device info failed, ret: %d.", ret);
537             return;
538         }
539         {
540 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
541             std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
542 #endif
543 
544             if (discoveryDeviceInfoMap_.find(deviceId) == discoveryDeviceInfoMap_.end()) {
545                 discoveryDeviceIdQueue_.emplace(deviceId);
546             }
547             discoveryDeviceInfoMap_[deviceId] = infoPtr;
548 
549             // Remove the earliest element when reached the max size
550             if (discoveryDeviceIdQueue_.size() == SOFTBUS_DISCOVER_DEVICE_INFO_MAX_SIZE) {
551                 discoveryDeviceInfoMap_.erase(discoveryDeviceIdQueue_.front());
552                 discoveryDeviceIdQueue_.pop();
553             }
554         }
555     }
556 
557     DmDeviceBasicInfo dmDeviceBasicInfo;
558     ConvertDeviceInfoToDmDevice(*device, dmDeviceBasicInfo);
559 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
560     std::lock_guard<std::mutex> lock(discoveryCallbackMutex_);
561 #endif
562 
563     for (auto &iter : discoveryCallbackMap_) {
564         iter.second->OnDeviceFound(iter.first, dmDeviceBasicInfo, device->range, device->isOnline);
565     }
566 }
567 
OnSoftbusDiscoveryResult(int subscribeId,RefreshResult result)568 void SoftbusConnector::OnSoftbusDiscoveryResult(int subscribeId, RefreshResult result)
569 {
570     uint16_t originId = static_cast<uint16_t>((static_cast<uint32_t>(subscribeId)) & SOFTBUS_SUBSCRIBE_ID_MASK);
571 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
572     std::lock_guard<std::mutex> lock(discoveryCallbackMutex_);
573 #endif
574 
575     if (result == REFRESH_LNN_SUCCESS) {
576         LOGI("[SOFTBUS]start to discovery device successfully with subscribeId: %d, result: %d.", subscribeId, result);
577         for (auto &iter : discoveryCallbackMap_) {
578             iter.second->OnDiscoverySuccess(iter.first, originId);
579         }
580     } else {
581         LOGE("[SOFTBUS]fail to discovery device with subscribeId: %d, result: %d.", subscribeId, result);
582         for (auto &iter : discoveryCallbackMap_) {
583             iter.second->OnDiscoveryFailed(iter.first, originId, result);
584         }
585     }
586 }
587 
GetDeviceUdidByUdidHash(const std::string & udidHash)588 std::string SoftbusConnector::GetDeviceUdidByUdidHash(const std::string &udidHash)
589 {
590     std::lock_guard<std::mutex> lock(deviceUdidLocks_);
591     for (auto &iter : deviceUdidMap_) {
592         if (iter.second == udidHash) {
593             return iter.first;
594         }
595     }
596     LOGE("fail to GetUdidByUdidHash, udidHash: %s", GetAnonyString(udidHash).c_str());
597     return udidHash;
598 }
599 
GetDeviceUdidHashByUdid(const std::string & udid)600 std::string SoftbusConnector::GetDeviceUdidHashByUdid(const std::string &udid)
601 {
602     {
603         std::lock_guard<std::mutex> lock(deviceUdidLocks_);
604         auto iter = deviceUdidMap_.find(udid);
605         if (iter != deviceUdidMap_.end()) {
606             return deviceUdidMap_[udid];
607         }
608     }
609 
610     char udidHash[DM_MAX_DEVICE_ID_LEN] = {0};
611     if (DmSoftbusAdapterCrypto::GetUdidHash(udid, (uint8_t *)udidHash) != DM_OK) {
612         LOGE("get udidhash by udid: %s failed.", GetAnonyString(udid).c_str());
613         return "";
614     }
615     LOGI("get udidhash: %s by udid: %s.", GetAnonyString(udidHash).c_str(),
616         GetAnonyString(udid).c_str());
617     std::lock_guard<std::mutex> lock(deviceUdidLocks_);
618     deviceUdidMap_[udid] = udidHash;
619     return udidHash;
620 }
621 
EraseUdidFromMap(const std::string & udid)622 void SoftbusConnector::EraseUdidFromMap(const std::string &udid)
623 {
624     std::lock_guard<std::mutex> lock(deviceUdidLocks_);
625     auto iter = deviceUdidMap_.find(udid);
626     if (iter == deviceUdidMap_.end()) {
627         return;
628     }
629     size_t mapSize = deviceUdidMap_.size();
630     if (mapSize >= SOFTBUS_TRUSTDEVICE_UUIDHASH_INFO_MAX_SIZE) {
631         deviceUdidMap_.erase(udid);
632     }
633 }
634 
GetLocalDeviceName()635 std::string SoftbusConnector::GetLocalDeviceName()
636 {
637     NodeBasicInfo nodeBasicInfo;
638     int32_t ret = GetLocalNodeDeviceInfo(DM_PKG_NAME, &nodeBasicInfo);
639     if (ret != DM_OK) {
640         LOGE("[SOFTBUS]GetLocalNodeDeviceInfo failed, ret: %d.", ret);
641         return "";
642     }
643     return nodeBasicInfo.deviceName;
644 }
645 
GetLocalDeviceTypeId()646 int32_t SoftbusConnector::GetLocalDeviceTypeId()
647 {
648     NodeBasicInfo nodeBasicInfo;
649     int32_t ret = GetLocalNodeDeviceInfo(DM_PKG_NAME, &nodeBasicInfo);
650     if (ret != DM_OK) {
651         LOGE("[SOFTBUS]GetLocalNodeDeviceInfo failed, ret: %d.", ret);
652         return DmDeviceType::DEVICE_TYPE_UNKNOWN;
653     }
654     return nodeBasicInfo.deviceTypeId;
655 }
656 } // namespace DistributedHardware
657 } // namespace OHOS
658