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