1 /*
2 * Copyright (c) 2021 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_adapter.h"
17
18 #include <cstdlib>
19 #include <string>
20 #include <unistd.h>
21 #include <map>
22 #include <securec.h>
23
24 #include "softbus_bus_center.h"
25
26 #include "dm_device_info.h"
27 #include "dm_subscribe_info.h"
28
29 #include "anonymous_string.h"
30 #include "device_manager_errno.h"
31 #include "device_manager_log.h"
32 #include "softbus_session.h"
33 #if (defined(__LINUX__) || defined(__LITEOS_A__))
34 #include "ipc_server_listener_adapter.h"
35 #endif
36 #include "device_manager_notify.h"
37
38 #define DISTRIBUTED_HARDWARE_DEVICEMANAGER_SA_ID 4802
39 namespace OHOS {
40 namespace DistributedHardware {
41 namespace {
42 const std::string DEVICE_MANAGER_PACKAGE_NAME = "ohos.distributedhardware.devicemanager";
43 const char *DM_CAPABILITY_OSD = "osdCapability";
44 const int32_t CHECK_INTERVAL = 100000; // 100ms
45 const uint32_t SUBSCRIBE_ID_PREFIX_LEN = 16;
46 const int32_t SUBSCRIBE_ID_MASK = 0x0000FFFF;
47 const int32_t DISCOVER_DEVICEINFO_MAX_SIZE = 20;
48 }
49 std::map<std::string, std::vector<std::shared_ptr<SoftbusAdapter::SubscribeInfoAdapter>>>
50 SoftbusAdapter::subscribeInfos_;
51 std::map<std::string, std::shared_ptr<DeviceInfo>> SoftbusAdapter::discoverDeviceInfoMap_;
52 std::vector<std::shared_ptr<DeviceInfo>> SoftbusAdapter::discoverDeviceInfoVector_;
53 uint16_t SoftbusAdapter::subscribeIdPrefix = 0;
54 // std::mutex SoftbusAdapter::lock_;
55 INodeStateCb SoftbusAdapter::softbusNodeStateCb_ = {
56 .events = EVENT_NODE_STATE_ONLINE | EVENT_NODE_STATE_OFFLINE | EVENT_NODE_STATE_INFO_CHANGED,
57 .onNodeOnline = OnSoftBusDeviceOnline,
58 .onNodeOffline = OnSoftbusDeviceOffline,
59 .onNodeBasicInfoChanged = OnSoftbusDeviceInfoChanged
60 };
61 IDiscoveryCallback SoftbusAdapter::softbusDiscoverCallback_ = {
62 .OnDeviceFound = OnSoftbusDeviceFound,
63 .OnDiscoverFailed = OnSoftbusDiscoverFailed,
64 .OnDiscoverySuccess = OnSoftbusDiscoverySuccess
65 };
66 IPublishCallback SoftbusAdapter::servicePublishCallback_ = {
67 .OnPublishSuccess = PublishServiceCallBack::OnPublishSuccess,
68 .OnPublishFail = PublishServiceCallBack::OnPublishFail
69 };
70
RemoveDiscoverDeviceInfo(const std::string deviceId)71 void SoftbusAdapter::RemoveDiscoverDeviceInfo(const std::string deviceId)
72 {
73 discoverDeviceInfoMap_.erase(deviceId);
74 auto iter = discoverDeviceInfoVector_.begin();
75 while (iter != discoverDeviceInfoVector_.end()) {
76 if (strcmp(iter->get()->devId, deviceId.c_str()) == 0) {
77 iter = discoverDeviceInfoVector_.erase(iter);
78 } else {
79 ++iter;
80 }
81 }
82 }
83
OnDeviceStateChange(DmDeviceState state,DmDeviceInfo & deviceInfo)84 void SoftbusAdapter::OnDeviceStateChange(DmDeviceState state, DmDeviceInfo &deviceInfo)
85 {
86 std::list<std::string> pkgNameList = DeviceManagerNotify::GetInstance().GetPkgNameList();
87 for( auto pkgName : pkgNameList) {
88 DmDeviceState deviceState = static_cast<DmDeviceState>(state);
89 if (pkgName == "") {
90 DMLOG(DM_LOG_ERROR, "OnDeviceOnline, get para failed");
91 return;
92 }
93 switch (deviceState) {
94 case DEVICE_STATE_ONLINE:
95 DeviceManagerNotify::GetInstance().OnDeviceOnline(pkgName, deviceInfo);
96 break;
97 case DEVICE_STATE_OFFLINE:
98 DeviceManagerNotify::GetInstance().OnDeviceOffline(pkgName, deviceInfo);
99 break;
100 case DEVICE_INFO_CHANGED:
101 DeviceManagerNotify::GetInstance().OnDeviceChanged(pkgName, deviceInfo);
102 break;
103 default:
104 DMLOG(DM_LOG_ERROR, "unknown device state:%d", deviceState);
105 break;
106 }
107 }
108 }
109
OnSoftBusDeviceOnline(NodeBasicInfo * info)110 void SoftbusAdapter::OnSoftBusDeviceOnline(NodeBasicInfo *info)
111 {
112 if (info == nullptr) {
113 DMLOG(DM_LOG_ERROR, "OnSoftBusDeviceOnline NodeBasicInfo is nullptr");
114 return;
115 }
116 DmDeviceInfo dmDeviceInfo;
117
118 NodeBasicInfoCopyToDmDevice(dmDeviceInfo, *info);
119 #if (defined(__LINUX__) || defined(__LITEOS_A__))
120 IpcServerListenerAdapter::GetInstance().OnDeviceStateChange(DmDeviceState::DEVICE_STATE_ONLINE, dmDeviceInfo);
121 #else
122 OnDeviceStateChange(DmDeviceState::DEVICE_STATE_ONLINE, dmDeviceInfo);
123 #endif
124 uint8_t udid[UDID_BUF_LEN] = {0};
125 int32_t ret = GetNodeKeyInfo(DEVICE_MANAGER_PACKAGE_NAME.c_str(), info->networkId,
126 NodeDeviceInfoKey::NODE_KEY_UDID, udid, sizeof(udid));
127 if (ret != DEVICEMANAGER_OK) {
128 DMLOG(DM_LOG_ERROR, "GetNodeKeyInfo failed");
129 return;
130 }
131 std::string deviceId = (char *)udid;
132 DMLOG(DM_LOG_INFO, "device online, deviceId: %s", GetAnonyString(deviceId).c_str());
133 RemoveDiscoverDeviceInfo(deviceId);
134 }
135
OnSoftbusDeviceOffline(NodeBasicInfo * info)136 void SoftbusAdapter::OnSoftbusDeviceOffline(NodeBasicInfo *info)
137 {
138 if (info == nullptr) {
139 DMLOG(DM_LOG_ERROR, "OnSoftbusDeviceOffline NodeBasicInfo is nullptr");
140 return;
141 }
142 DmDeviceInfo dmDeviceInfo;
143
144 NodeBasicInfoCopyToDmDevice(dmDeviceInfo, *info);
145 #if (defined(__LINUX__) || defined(__LITEOS_A__))
146 IpcServerListenerAdapter::GetInstance().OnDeviceStateChange(DmDeviceState::DEVICE_STATE_OFFLINE, dmDeviceInfo);
147 #else
148 OnDeviceStateChange(DmDeviceState::DEVICE_STATE_OFFLINE, dmDeviceInfo);
149 #endif
150 }
151
OnSoftbusDeviceInfoChanged(NodeBasicInfoType type,NodeBasicInfo * info)152 void SoftbusAdapter::OnSoftbusDeviceInfoChanged(NodeBasicInfoType type, NodeBasicInfo *info)
153 {
154 DMLOG(DM_LOG_INFO, "OnSoftbusDeviceInfoChanged.");
155 // currently do nothing
156 (void)type;
157 (void)info;
158 }
159
SaveDiscoverDeviceInfo(const DeviceInfo * deviceInfo)160 void SoftbusAdapter::SaveDiscoverDeviceInfo(const DeviceInfo *deviceInfo)
161 {
162 std::shared_ptr<DeviceInfo> info = std::make_shared<DeviceInfo>();
163 DeviceInfo *infoPtr = info.get();
164 if (memcpy_s(infoPtr, sizeof(DeviceInfo), deviceInfo, sizeof(DeviceInfo)) != 0) {
165 DMLOG(DM_LOG_ERROR, "SoftbusAdapter::SaveDiscoverDeviceInfo failed.");
166 return;
167 }
168
169 std::string deviceId = deviceInfo->devId;
170 discoverDeviceInfoMap_[deviceId] = info;
171 discoverDeviceInfoVector_.push_back(info);
172
173 // Remove the earliest element when reached the max size
174 if (discoverDeviceInfoVector_.size() == DISCOVER_DEVICEINFO_MAX_SIZE) {
175 auto iter = discoverDeviceInfoVector_.begin();
176 std::string delDevId = iter->get()->devId;
177 discoverDeviceInfoMap_.erase(delDevId);
178 discoverDeviceInfoVector_.erase(iter);
179 }
180 }
181
OnSoftbusDeviceFound(const DeviceInfo * device)182 void SoftbusAdapter::OnSoftbusDeviceFound(const DeviceInfo *device)
183 {
184 if (device == nullptr) {
185 DMLOG(DM_LOG_ERROR, "deviceinfo is null");
186 return;
187 }
188
189 std::string deviceId = device->devId;
190 DMLOG(DM_LOG_INFO, "SoftbusAdapter::OnSoftbusDeviceFound device %s found.", GetAnonyString(deviceId).c_str());
191 if (IsDeviceOnLine(deviceId)) {
192 return;
193 }
194
195 SaveDiscoverDeviceInfo(device);
196 for (auto iter = subscribeInfos_.begin(); iter != subscribeInfos_.end(); ++iter) {
197 auto subInfovector = iter->second;
198 for (auto vectorIter = subInfovector.begin(); vectorIter != subInfovector.end(); ++vectorIter) {
199 auto info = vectorIter->get();
200 DMLOG(DM_LOG_INFO, "subscribe info capability:%s.", info->info.capability);
201 if (strcmp(DM_CAPABILITY_OSD, info->info.capability) != 0) {
202 DMLOG(DM_LOG_ERROR, "subscribe info capability invalid.");
203 }
204 uint16_t originId = (uint16_t)(((uint32_t)info->info.subscribeId) & SUBSCRIBE_ID_MASK);
205 std::string strPkgName = iter->first;
206 DmDeviceInfo dmDeviceInfo;
207
208 DeviceInfoCopyToDmDevice(dmDeviceInfo, *device);
209 #if (defined(__LINUX__) || defined(__LITEOS_A__))
210 IpcServerListenerAdapter::GetInstance().OnDeviceFound(strPkgName, originId, dmDeviceInfo);
211 #else
212 DeviceManagerNotify::GetInstance().OnDeviceFound(strPkgName, originId, dmDeviceInfo);
213 #endif
214 }
215 }
216 }
217
GetpkgNameBySubscribeId(int32_t adapterId,std::string & pkgName)218 bool SoftbusAdapter::GetpkgNameBySubscribeId(int32_t adapterId, std::string &pkgName)
219 {
220 for (auto iter = subscribeInfos_.begin(); iter != subscribeInfos_.end(); ++iter) {
221 std::vector<std::shared_ptr<SubscribeInfoAdapter>> &subinfoVector = iter->second;
222 auto vectorIter = subinfoVector.begin();
223 for (; vectorIter != subinfoVector.end(); ++vectorIter) {
224 if (vectorIter->get()->info.subscribeId == adapterId) {
225 pkgName = iter->first;
226 return true;
227 }
228 }
229 }
230 return false;
231 }
232
OnSoftbusDiscoverFailed(int subscribeId,DiscoveryFailReason failReason)233 void SoftbusAdapter::OnSoftbusDiscoverFailed(int subscribeId, DiscoveryFailReason failReason)
234 {
235 DMLOG(DM_LOG_INFO, "In, subscribeId %d, failReason %d", subscribeId, (int32_t)failReason);
236 std::string pkgName;
237 if (!GetpkgNameBySubscribeId(subscribeId, pkgName)) {
238 DMLOG(DM_LOG_ERROR, "OnSoftbusDiscoverFailed: pkgName not found");
239 return;
240 }
241
242 uint16_t originId = (uint16_t)(((uint32_t)subscribeId) & SUBSCRIBE_ID_MASK);
243 #if (defined(__LINUX__) || defined(__LITEOS_A__))
244 IpcServerListenerAdapter::GetInstance().OnDiscoverFailed(pkgName, originId, failReason);
245 #else
246 DeviceManagerNotify::GetInstance().OnDiscoverFailed(pkgName, originId, failReason);
247 #endif
248 }
249
OnSoftbusDiscoverySuccess(int subscribeId)250 void SoftbusAdapter::OnSoftbusDiscoverySuccess(int subscribeId)
251 {
252 DMLOG(DM_LOG_INFO, "In, subscribeId %d", subscribeId);
253 std::string pkgName;
254 if (!GetpkgNameBySubscribeId(subscribeId, pkgName)) {
255 DMLOG(DM_LOG_ERROR, "OnSoftbusDiscoverySuccess: pkgName not found");
256 return;
257 }
258 uint16_t originId = (uint16_t)(((uint32_t)subscribeId) & SUBSCRIBE_ID_MASK);
259 #if (defined(__LINUX__) || defined(__LITEOS_A__))
260 IpcServerListenerAdapter::GetInstance().OnDiscoverySuccess(pkgName, originId);
261 #else
262 DeviceManagerNotify::GetInstance().OnDiscoverySuccess(pkgName, originId);
263 #endif
264 }
265
GetsubscribeIdAdapter(std::string & pkgName,int16_t originId,int32_t & adapterId)266 bool SoftbusAdapter::GetsubscribeIdAdapter(std::string &pkgName, int16_t originId, int32_t &adapterId)
267 {
268 DMLOG(DM_LOG_INFO, "GetsubscribeIdAdapter in, pkgName: %s, originId:%d", pkgName.c_str(),
269 (int32_t)originId);
270 auto iter = subscribeInfos_.find(pkgName);
271 if (iter == subscribeInfos_.end()) {
272 DMLOG(DM_LOG_ERROR, "subscribeInfo not find for pkgName: %s", pkgName.c_str());
273 return false;
274 }
275
276 std::vector<std::shared_ptr<SubscribeInfoAdapter>> &subinfoVector = iter->second;
277 auto vectorIter = subinfoVector.begin();
278 for (; vectorIter != subinfoVector.end(); ++vectorIter) {
279 if (vectorIter->get()->subscribeIdOrigin == originId) {
280 DMLOG(DM_LOG_ERROR, "find adapterId:%d for pkgName: %s, originId:%d",
281 vectorIter->get()->info.subscribeId, pkgName.c_str(), (int32_t)originId);
282 adapterId = vectorIter->get()->info.subscribeId;
283 return true;
284 }
285 }
286 DMLOG(DM_LOG_ERROR, "subscribe not find. pkgName: %s, originId:%d", pkgName.c_str(), (int32_t)originId);
287 return false;
288 }
289
Init()290 int32_t SoftbusAdapter::Init()
291 {
292 int32_t ret;
293 int32_t retryTimes = 0;
294 do {
295 ret = RegNodeDeviceStateCb(DEVICE_MANAGER_PACKAGE_NAME.c_str(), &softbusNodeStateCb_);
296 if (ret != DEVICEMANAGER_OK) {
297 ++retryTimes;
298 DMLOG(DM_LOG_ERROR, "RegNodeDeviceStateCb failed with ret %d, retryTimes %d", ret, retryTimes);
299 usleep(CHECK_INTERVAL);
300 }
301 } while (ret != DEVICEMANAGER_OK);
302 DMLOG(DM_LOG_INFO, "RegNodeDeviceStateCb success.");
303 SoftbusSession::GetInstance().Start();
304
305 PublishInfo dmPublishInfo;
306 dmPublishInfo.publishId = DISTRIBUTED_HARDWARE_DEVICEMANAGER_SA_ID;
307 dmPublishInfo.mode = DiscoverMode::DISCOVER_MODE_ACTIVE;
308 dmPublishInfo.medium = ExchanageMedium::AUTO;
309 dmPublishInfo.freq = ExchangeFreq::HIGH;
310 dmPublishInfo.capability = DM_CAPABILITY_OSD;
311 dmPublishInfo.capabilityData = nullptr;
312 dmPublishInfo.dataLen = 0;
313 ret = PublishService(DEVICE_MANAGER_PACKAGE_NAME.c_str(), &dmPublishInfo, &servicePublishCallback_);
314 DMLOG(DM_LOG_INFO, "service publish result is : %d", ret);
315 return ret;
316 }
317
GetTrustDevices(const std::string & pkgName,NodeBasicInfo ** info,int32_t * infoNum)318 int32_t SoftbusAdapter::GetTrustDevices(const std::string &pkgName, NodeBasicInfo **info, int32_t *infoNum)
319 {
320 DMLOG(DM_LOG_INFO, "DM_GetSoftbusTrustDevices start, pkgName: %s", pkgName.c_str());
321 int32_t ret = GetAllNodeDeviceInfo(DEVICE_MANAGER_PACKAGE_NAME.c_str(), info, infoNum);
322 if (ret != 0) {
323 DMLOG(DM_LOG_ERROR, "GetAllNodeDeviceInfo failed with ret %d", ret);
324 return ret;
325 }
326 DMLOG(DM_LOG_INFO, "success, pkgName: %s, deviceCount %d", pkgName.c_str(), *infoNum);
327 return DEVICEMANAGER_OK;
328 }
329
StartDiscovery(std::string & pkgName,SubscribeInfo * info)330 int32_t SoftbusAdapter::StartDiscovery(std::string &pkgName, SubscribeInfo *info)
331 {
332 std::shared_ptr<SubscribeInfoAdapter> subinfo = nullptr;
333 if (subscribeInfos_.find(pkgName) == subscribeInfos_.end()) {
334 subscribeInfos_[pkgName] = {};
335 }
336
337 auto iter = subscribeInfos_.find(pkgName);
338 std::vector<std::shared_ptr<SubscribeInfoAdapter>> &subinfoVector = iter->second;
339 auto vectorIter = subinfoVector.begin();
340 for (; vectorIter != subinfoVector.end(); ++vectorIter) {
341 if (vectorIter->get()->subscribeIdOrigin == info->subscribeId) {
342 subinfo = *vectorIter;
343 break;
344 }
345 }
346 if (subinfo == nullptr) {
347 // std::lock_guard<std::mutex> autoLock(lock_);
348 subinfo = std::make_shared<SubscribeInfoAdapter>();
349 subinfo->subscribeIdOrigin = info->subscribeId;
350 subinfo->subscribeIdPrefix = subscribeIdPrefix++;
351 subinfo->info = *info;
352
353 uint32_t uSubscribeId = static_cast<uint32_t>(info->subscribeId);
354 uSubscribeId = (subinfo->subscribeIdPrefix << SUBSCRIBE_ID_PREFIX_LEN) | uSubscribeId;
355 subinfo->info.subscribeId = static_cast<int32_t>(uSubscribeId);
356 }
357 if (vectorIter == subinfoVector.end()) {
358 subinfoVector.push_back(subinfo);
359 }
360 DMLOG(DM_LOG_INFO, "StartDiscovery, pkgName: %s, subscribeId %d, prefix %d, origin %d",
361 pkgName.c_str(), subinfo->info.subscribeId, subinfo->subscribeIdPrefix, subinfo->subscribeIdOrigin);
362 DMLOG(DM_LOG_INFO, "Capability: %s", subinfo->info.capability);
363 int32_t ret = ::StartDiscovery(DEVICE_MANAGER_PACKAGE_NAME.c_str(), &subinfo->info, &softbusDiscoverCallback_);
364 if (ret != 0) {
365 DMLOG(DM_LOG_ERROR, "StartDiscovery failed with ret %d.", ret);
366 return DEVICEMANAGER_DISCOVERY_FAILED;
367 }
368 return DEVICEMANAGER_OK;
369 }
370
StopDiscovery(std::string & pkgName,uint16_t subscribeId)371 int32_t SoftbusAdapter::StopDiscovery(std::string &pkgName, uint16_t subscribeId)
372 {
373 int32_t subscribeIdAdapter = -1;
374 if (!GetsubscribeIdAdapter(pkgName, subscribeId, subscribeIdAdapter)) {
375 DMLOG(DM_LOG_ERROR, "StopDiscovery failed, subscribeId not match");
376 return DEVICEMANAGER_FAILED;
377 }
378
379 DMLOG(DM_LOG_INFO, "StopDiscovery begin, pkgName: %s, subscribeId:%d, subscribeIdAdapter:%d",
380 pkgName.c_str(), (int32_t)subscribeId, subscribeIdAdapter);
381 int32_t ret = ::StopDiscovery(DEVICE_MANAGER_PACKAGE_NAME.c_str(), subscribeIdAdapter);
382 if (ret != 0) {
383 DMLOG(DM_LOG_ERROR, "StopDiscovery failed with ret %d", ret);
384 return ret;
385 }
386
387 auto iter = subscribeInfos_.find(pkgName);
388 auto subinfoVector = iter->second;
389 auto vectorIter = subinfoVector.begin();
390 while (vectorIter != subinfoVector.end()) {
391 if (vectorIter->get()->subscribeIdOrigin == subscribeId) {
392 vectorIter = subinfoVector.erase(vectorIter);
393 break;
394 } else {
395 ++vectorIter;
396 }
397 }
398 if (subinfoVector.empty()) {
399 subscribeInfos_.erase(pkgName);
400 }
401 DMLOG(DM_LOG_INFO, "DM_StopSoftbusDiscovery completed, pkgName: %s", pkgName.c_str());
402 return DEVICEMANAGER_OK;
403 }
404
IsDeviceOnLine(std::string & deviceId)405 bool SoftbusAdapter::IsDeviceOnLine(std::string &deviceId)
406 {
407 NodeBasicInfo *info = nullptr;
408 int32_t infoNum = 0;
409
410 if (GetTrustDevices(DEVICE_MANAGER_PACKAGE_NAME.c_str(), &info, &infoNum) != DEVICEMANAGER_OK) {
411 DMLOG(DM_LOG_ERROR, "DM_IsDeviceOnLine DM_GetSoftbusTrustDevices failed");
412 return false;
413 }
414
415 bool bDeviceOnline = false;
416 for (int32_t i = 0; i < infoNum; ++i) {
417 NodeBasicInfo *nodeBasicInfo = info + i;
418 if (nodeBasicInfo == nullptr) {
419 DMLOG(DM_LOG_ERROR, "nodeBasicInfo is empty for index %d, infoNum %d.", i, infoNum);
420 continue;
421 }
422 std::string networkId = nodeBasicInfo->networkId;
423 if (networkId == deviceId) {
424 DMLOG(DM_LOG_INFO, "DM_IsDeviceOnLine device %s online", GetAnonyString(deviceId).c_str());
425 bDeviceOnline = true;
426 break;
427 }
428 uint8_t udid[UDID_BUF_LEN] = {0};
429 int32_t ret = GetNodeKeyInfo(DEVICE_MANAGER_PACKAGE_NAME.c_str(), networkId.c_str(),
430 NodeDeviceInfoKey::NODE_KEY_UDID, udid, sizeof(udid));
431 if (ret != DEVICEMANAGER_OK) {
432 DMLOG(DM_LOG_ERROR, "DM_IsDeviceOnLine GetNodeKeyInfo failed");
433 break;
434 }
435
436 if (strcmp((char *)udid, deviceId.c_str()) == 0) {
437 DMLOG(DM_LOG_INFO, "DM_IsDeviceOnLine devccie %s online", GetAnonyString(deviceId).c_str());
438 bDeviceOnline = true;
439 break;
440 }
441 }
442 FreeNodeInfo(info);
443 return bDeviceOnline;
444 }
445
GetConnectionIpAddr(std::string deviceId,std::string & ipAddr)446 int32_t SoftbusAdapter::GetConnectionIpAddr(std::string deviceId, std::string &ipAddr)
447 {
448 auto iter = discoverDeviceInfoMap_.find(deviceId);
449 if (iter == discoverDeviceInfoMap_.end()) {
450 DMLOG(DM_LOG_ERROR, "deviceInfo not found by deviceId %s", GetAnonyString(deviceId).c_str());
451 return DEVICEMANAGER_FAILED;
452 }
453
454 DeviceInfo *deviceInfo = iter->second.get();
455 if (deviceInfo->addrNum <= 0 || deviceInfo->addrNum >= CONNECTION_ADDR_MAX) {
456 DMLOG(DM_LOG_ERROR, "deviceInfo addrNum not valid, addrNum %d", deviceInfo->addrNum);
457 return DEVICEMANAGER_FAILED;
458 }
459
460 for (uint32_t i = 0; i < deviceInfo->addrNum; ++i) {
461 // currently, only support CONNECT_ADDR_WLAN
462 if (deviceInfo->addr[i].type != ConnectionAddrType::CONNECTION_ADDR_WLAN &&
463 deviceInfo->addr[i].type != ConnectionAddrType::CONNECTION_ADDR_ETH) {
464 continue;
465 }
466 ipAddr = deviceInfo->addr[i].info.ip.ip;
467 DMLOG(DM_LOG_INFO, "DM_GetConnectionIpAddr get ip ok.");
468 return DEVICEMANAGER_OK;
469 }
470 DMLOG(DM_LOG_ERROR, "failed to get ipAddr for deviceId %s", GetAnonyString(deviceId).c_str());
471 return DEVICEMANAGER_FAILED;
472 }
473
474 // eth >> wlan >> ble >> br
GetConnectAddrByType(DeviceInfo * deviceInfo,ConnectionAddrType type)475 ConnectionAddr *SoftbusAdapter::GetConnectAddrByType(DeviceInfo *deviceInfo, ConnectionAddrType type)
476 {
477 if (deviceInfo == nullptr) {
478 return nullptr;
479 }
480 for (uint32_t i = 0; i < deviceInfo->addrNum; ++i) {
481 if (deviceInfo->addr[i].type == type) {
482 return &deviceInfo->addr[i];
483 }
484 }
485 return nullptr;
486 }
487
GetConnectAddr(std::string deviceId)488 ConnectionAddr *SoftbusAdapter::GetConnectAddr(std::string deviceId)
489 {
490 auto iter = discoverDeviceInfoMap_.find(deviceId);
491 if (iter == discoverDeviceInfoMap_.end()) {
492 DMLOG(DM_LOG_ERROR, "deviceInfo not found by deviceId %s", GetAnonyString(deviceId).c_str());
493 return nullptr;
494 }
495
496 DeviceInfo *deviceInfo = iter->second.get();
497 if (deviceInfo->addrNum <= 0 || deviceInfo->addrNum >= CONNECTION_ADDR_MAX) {
498 DMLOG(DM_LOG_ERROR, "deviceInfo addrNum not valid, addrNum %d", deviceInfo->addrNum);
499 return nullptr;
500 }
501
502 ConnectionAddr *addr = nullptr;
503 addr = GetConnectAddrByType(deviceInfo, ConnectionAddrType::CONNECTION_ADDR_ETH);
504 if (addr != nullptr) {
505 DMLOG(DM_LOG_INFO, "get ETH ConnectionAddr for deviceId %s", GetAnonyString(deviceId).c_str());
506 return addr;
507 }
508
509 addr = GetConnectAddrByType(deviceInfo, ConnectionAddrType::CONNECTION_ADDR_WLAN);
510 if (addr != nullptr) {
511 DMLOG(DM_LOG_INFO, "get WLAN ConnectionAddr for deviceId %s", GetAnonyString(deviceId).c_str());
512 return addr;
513 }
514
515 addr = GetConnectAddrByType(deviceInfo, ConnectionAddrType::CONNECTION_ADDR_BLE);
516 if (addr != nullptr) {
517 DMLOG(DM_LOG_INFO, "get BLE ConnectionAddr for deviceId %s", GetAnonyString(deviceId).c_str());
518 return addr;
519 }
520
521 addr = GetConnectAddrByType(deviceInfo, ConnectionAddrType::CONNECTION_ADDR_BR);
522 if (addr != nullptr) {
523 DMLOG(DM_LOG_INFO, "get BR ConnectionAddr for deviceId %s", GetAnonyString(deviceId).c_str());
524 return addr;
525 }
526
527 DMLOG(DM_LOG_ERROR, "failed to get ConnectionAddr for deviceId %s", GetAnonyString(deviceId).c_str());
528 return nullptr;
529 }
530
NodeBasicInfoCopyToDmDevice(DmDeviceInfo & dmDeviceInfo,NodeBasicInfo & nodeBasicInfo)531 void SoftbusAdapter::NodeBasicInfoCopyToDmDevice(DmDeviceInfo &dmDeviceInfo, NodeBasicInfo &nodeBasicInfo)
532 {
533 (void)memset_s(&dmDeviceInfo, sizeof(DmDeviceInfo), 0, sizeof(DmDeviceInfo));
534 if (memcpy_s(dmDeviceInfo.deviceId, sizeof(dmDeviceInfo.deviceId), nodeBasicInfo.networkId,
535 std::min(sizeof(dmDeviceInfo.deviceId), sizeof(nodeBasicInfo.networkId))) != DEVICEMANAGER_OK) {
536 DMLOG(DM_LOG_ERROR, "memcpy failed");
537 }
538 if (memcpy_s(dmDeviceInfo.deviceName, sizeof(dmDeviceInfo.deviceName), nodeBasicInfo.deviceName,
539 std::min(sizeof(dmDeviceInfo.deviceName), sizeof(nodeBasicInfo.deviceName))) != DEVICEMANAGER_OK) {
540 DMLOG(DM_LOG_ERROR, "memcpy failed");
541 }
542 dmDeviceInfo.deviceTypeId = (DMDeviceType)nodeBasicInfo.deviceTypeId;
543 }
544
DeviceInfoCopyToDmDevice(DmDeviceInfo & dmDeviceInfo,const DeviceInfo & deviceInfo)545 void SoftbusAdapter::DeviceInfoCopyToDmDevice(DmDeviceInfo &dmDeviceInfo, const DeviceInfo &deviceInfo)
546 {
547 (void)memset_s(&dmDeviceInfo, sizeof(DmDeviceInfo), 0, sizeof(DmDeviceInfo));
548 if (memcpy_s(dmDeviceInfo.deviceId, sizeof(dmDeviceInfo.deviceId), deviceInfo.devId,
549 std::min(sizeof(dmDeviceInfo.deviceId), sizeof(deviceInfo.devId))) != DEVICEMANAGER_OK) {
550 DMLOG(DM_LOG_ERROR, "memcpy failed");
551 }
552 if (memcpy_s(dmDeviceInfo.deviceName, sizeof(dmDeviceInfo.deviceName), deviceInfo.devName,
553 std::min(sizeof(dmDeviceInfo.deviceName), sizeof(deviceInfo.devName))) != DEVICEMANAGER_OK) {
554 DMLOG(DM_LOG_ERROR, "memcpy failed");
555 }
556 dmDeviceInfo.deviceTypeId = (DMDeviceType)deviceInfo.devType;
557 }
558
OnPublishSuccess(int publishId)559 void PublishServiceCallBack::OnPublishSuccess(int publishId)
560 {
561 DMLOG(DM_LOG_INFO, "service publish succeed, publishId: %d", publishId);
562 }
563
OnPublishFail(int publishId,PublishFailReason reason)564 void PublishServiceCallBack::OnPublishFail(int publishId, PublishFailReason reason)
565 {
566 DMLOG(DM_LOG_INFO, "service publish failed, publishId: %d, reason: %d", publishId, reason);
567 }
568 } // namespace DistributedHardware
569 } // namespace OHOS