2 * Copyright (C) 2021- Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
9 #include "SMBWSDiscovery.h"
12 #include "FileItemList.h"
13 #include "ServiceBroker.h"
14 #include "network/IWSDiscovery.h"
15 #include "utils/StringUtils.h"
16 #include "utils/log.h"
18 #include "platform/posix/filesystem/SMBWSDiscoveryListener.h"
28 using namespace std::chrono
;
29 using namespace WSDiscovery
;
33 std::unique_ptr
<IWSDiscovery
> IWSDiscovery::GetInstance()
35 return std::make_unique
<WSDiscovery::CWSDiscoveryPosix
>();
38 std::atomic
<bool> CWSDiscoveryPosix::m_isInitialized
{false};
40 CWSDiscoveryPosix::CWSDiscoveryPosix()
42 // Set our wsd_instance ID to seconds since epoch
43 auto epochduration
= system_clock::now().time_since_epoch();
44 wsd_instance_id
= epochduration
.count() * system_clock::period::num
/ system_clock::period::den
;
46 m_WSDListenerUDP
= std::make_unique
<CWSDiscoveryListenerUDP
>();
47 m_isInitialized
= true;
50 CWSDiscoveryPosix::~CWSDiscoveryPosix()
55 bool CWSDiscoveryPosix::StopServices()
57 m_WSDListenerUDP
->Stop();
62 bool CWSDiscoveryPosix::StartServices()
64 m_WSDListenerUDP
->Start();
69 bool CWSDiscoveryPosix::IsRunning()
71 return m_WSDListenerUDP
->IsRunning();
74 bool CWSDiscoveryPosix::GetServerList(CFileItemList
& items
)
77 std::unique_lock
<CCriticalSection
> lock(m_critWSD
);
79 for (const auto& item
: m_vecWSDInfo
)
81 auto found
= item
.computer
.find('/');
83 if (found
!= std::string::npos
)
84 host
= item
.computer
.substr(0, found
);
87 if (item
.xaddrs_host
.empty())
89 host
= item
.xaddrs_host
;
92 CFileItemPtr pItem
= std::make_shared
<CFileItem
>(host
);
93 pItem
->SetPath("smb://" + host
+ '/');
94 pItem
->m_bIsFolder
= true;
101 bool CWSDiscoveryPosix::GetCached(const std::string
& strHostName
, std::string
& strIpAddress
)
103 const std::string match
= strHostName
+ "/";
105 std::unique_lock
<CCriticalSection
> lock(m_critWSD
);
106 for (const auto& item
: m_vecWSDInfo
)
108 if (!item
.computer
.empty() && StringUtils::StartsWithNoCase(item
.computer
, match
))
110 strIpAddress
= item
.xaddrs_host
;
111 CLog::Log(LOGDEBUG
, LOGWSDISCOVERY
, "CWSDiscoveryPosix::Lookup - {} -> {}", strHostName
,
120 void CWSDiscoveryPosix::SetItems(std::vector
<wsd_req_info
> entries
)
123 std::unique_lock
<CCriticalSection
> lock(m_critWSD
);
124 m_vecWSDInfo
= std::move(entries
);
127 } // namespace WSDiscovery