diff --git a/wpiutil/src/main/native/linux/MulticastServiceAnnouncer.cpp b/wpiutil/src/main/native/linux/MulticastServiceAnnouncer.cpp index da60910535..1a7af39436 100644 --- a/wpiutil/src/main/native/linux/MulticastServiceAnnouncer.cpp +++ b/wpiutil/src/main/native/linux/MulticastServiceAnnouncer.cpp @@ -27,8 +27,38 @@ struct MulticastServiceAnnouncer::Impl { table.string_list_free(stringList); } } + + template + Impl(std::string_view serviceName, std::string_view serviceType, int port, + wpi::span> txt); }; +template +MulticastServiceAnnouncer::Impl::Impl(std::string_view serviceName, + std::string_view serviceType, int port, + wpi::span> txt) { + if (!this->table.IsValid()) { + return; + } + + this->serviceName = serviceName; + this->serviceType = serviceType; + this->port = port; + + std::vector txts; + for (auto&& i : txt) { + txts.push_back(fmt::format("{}={}", i.first, i.second)); + } + + std::vector txtArr; + for (auto&& i : txts) { + txtArr.push_back(i.c_str()); + } + + this->stringList = + this->table.string_list_new_from_array(txtArr.data(), txtArr.size()); +} + static void RegisterService(AvahiClient* client, MulticastServiceAnnouncer::Impl* impl); @@ -93,55 +123,13 @@ static void ClientCallback(AvahiClient* client, AvahiClientState state, MulticastServiceAnnouncer::MulticastServiceAnnouncer( std::string_view serviceName, std::string_view serviceType, int port, wpi::span> txt) { - pImpl = std::make_unique(); - - if (!pImpl->table.IsValid()) { - return; - } - - pImpl->serviceName = serviceName; - pImpl->serviceType = serviceType; - pImpl->port = port; - - std::vector txts; - for (auto&& i : txt) { - txts.push_back(fmt::format("{}={}", i.first, i.second)); - } - - std::vector txtArr; - for (auto&& i : txts) { - txtArr.push_back(i.c_str()); - } - - pImpl->stringList = - pImpl->table.string_list_new_from_array(txtArr.data(), txtArr.size()); + pImpl = std::make_unique(serviceName, serviceType, port, txt); } MulticastServiceAnnouncer::MulticastServiceAnnouncer( std::string_view serviceName, std::string_view serviceType, int port, wpi::span> txt) { - pImpl = std::make_unique(); - - if (!pImpl->table.IsValid()) { - return; - } - - pImpl->serviceName = serviceName; - pImpl->serviceType = serviceType; - pImpl->port = port; - - std::vector txts; - for (auto&& i : txt) { - txts.push_back(fmt::format("{}={}", i.first, i.second)); - } - - std::vector txtArr; - for (auto&& i : txts) { - txtArr.push_back(i.c_str()); - } - - pImpl->stringList = - pImpl->table.string_list_new_from_array(txtArr.data(), txtArr.size()); + pImpl = std::make_unique(serviceName, serviceType, port, txt); } MulticastServiceAnnouncer::~MulticastServiceAnnouncer() noexcept { diff --git a/wpiutil/src/main/native/windows/MulticastServiceAnnouncer.cpp b/wpiutil/src/main/native/windows/MulticastServiceAnnouncer.cpp index b24c9b7028..2327b8b828 100644 --- a/wpiutil/src/main/native/windows/MulticastServiceAnnouncer.cpp +++ b/wpiutil/src/main/native/windows/MulticastServiceAnnouncer.cpp @@ -35,59 +35,58 @@ struct MulticastServiceAnnouncer::Impl : ImplBase { std::vector keyPtrs; std::vector values; std::vector valuePtrs; + + template + Impl(std::string_view serviceName, std::string_view serviceType, int port, + wpi::span> txt); }; -MulticastServiceAnnouncer::MulticastServiceAnnouncer( - std::string_view serviceName, std::string_view serviceType, int port, - wpi::span> txt) { - pImpl = std::make_unique(); - - if (!pImpl->dynamicDns.CanDnsAnnounce) { +template +MulticastServiceAnnouncer::Impl::Impl(std::string_view serviceName, + std::string_view serviceType, int port, + wpi::span> txt) { + if (!dynamicDns.CanDnsAnnounce) { return; } - pImpl->port = port; + this->port = port; - wpi::SmallVector wideStorage; + wpi::SmallVector wideStorage; std::string hostName = wpi::GetHostname() + ".local"; for (auto&& i : txt) { wideStorage.clear(); - wpi::convertUTF8ToUTF16String(i.first, wideStorage); - pImpl->keys.emplace_back( - std::wstring{reinterpret_cast(wideStorage.data()), - wideStorage.size()}); + wpi::sys::windows::UTF8ToUTF16(i.first, wideStorage); + this->keys.emplace_back( + std::wstring{wideStorage.data(), wideStorage.size()}); wideStorage.clear(); - wpi::convertUTF8ToUTF16String(i.second, wideStorage); - pImpl->values.emplace_back( - std::wstring{reinterpret_cast(wideStorage.data()), - wideStorage.size()}); + wpi::sys::windows::UTF8ToUTF16(i.second, wideStorage); + this->values.emplace_back( + std::wstring{wideStorage.data(), wideStorage.size()}); } - for (size_t i = 0; i < pImpl->keys.size(); i++) { - pImpl->keyPtrs.emplace_back(pImpl->keys[i].c_str()); - pImpl->valuePtrs.emplace_back(pImpl->values[i].c_str()); + for (size_t i = 0; i < this->keys.size(); i++) { + this->keyPtrs.emplace_back(this->keys[i].c_str()); + this->valuePtrs.emplace_back(this->values[i].c_str()); } wpi::SmallString<128> storage; wideStorage.clear(); - wpi::convertUTF8ToUTF16String(hostName, wideStorage); + wpi::sys::windows::UTF8ToUTF16(hostName, wideStorage); - pImpl->hostName = std::wstring{ - reinterpret_cast(wideStorage.data()), wideStorage.size()}; + this->hostName = std::wstring{wideStorage.data(), wideStorage.size()}; wideStorage.clear(); if (wpi::ends_with_lower(serviceType, ".local")) { - wpi::convertUTF8ToUTF16String(serviceType, wideStorage); + wpi::sys::windows::UTF8ToUTF16(serviceType, wideStorage); } else { storage.clear(); storage.append(serviceType); storage.append(".local"); - wpi::convertUTF8ToUTF16String(storage.str(), wideStorage); + wpi::sys::windows::UTF8ToUTF16(storage.str(), wideStorage); } - pImpl->serviceType = std::wstring{ - reinterpret_cast(wideStorage.data()), wideStorage.size()}; + this->serviceType = std::wstring{wideStorage.data(), wideStorage.size()}; wideStorage.clear(); storage.clear(); @@ -98,75 +97,21 @@ MulticastServiceAnnouncer::MulticastServiceAnnouncer( storage.append(".local"); } - wpi::convertUTF8ToUTF16String(storage.str(), wideStorage); - pImpl->serviceInstanceName = std::wstring{ - reinterpret_cast(wideStorage.data()), wideStorage.size()}; + wpi::sys::windows::UTF8ToUTF16(storage.str(), wideStorage); + this->serviceInstanceName = + std::wstring{wideStorage.data(), wideStorage.size()}; } MulticastServiceAnnouncer::MulticastServiceAnnouncer( std::string_view serviceName, std::string_view serviceType, int port, wpi::span> txt) { - pImpl = std::make_unique(); + pImpl = std::make_unique(serviceName, serviceType, port, txt); +} - if (!pImpl->dynamicDns.CanDnsAnnounce) { - return; - } - - pImpl->port = port; - - wpi::SmallVector wideStorage; - std::string hostName = wpi::GetHostname() + ".local"; - - for (auto&& i : txt) { - wideStorage.clear(); - wpi::convertUTF8ToUTF16String(i.first, wideStorage); - pImpl->keys.emplace_back( - std::wstring{reinterpret_cast(wideStorage.data()), - wideStorage.size()}); - wideStorage.clear(); - wpi::convertUTF8ToUTF16String(i.second, wideStorage); - pImpl->values.emplace_back( - std::wstring{reinterpret_cast(wideStorage.data()), - wideStorage.size()}); - } - - for (size_t i = 0; i < pImpl->keys.size(); i++) { - pImpl->keyPtrs.emplace_back(pImpl->keys[i].c_str()); - pImpl->valuePtrs.emplace_back(pImpl->values[i].c_str()); - } - - wpi::SmallString<128> storage; - - wideStorage.clear(); - wpi::convertUTF8ToUTF16String(hostName, wideStorage); - - pImpl->hostName = std::wstring{ - reinterpret_cast(wideStorage.data()), wideStorage.size()}; - - wideStorage.clear(); - if (wpi::ends_with_lower(serviceType, ".local")) { - wpi::convertUTF8ToUTF16String(serviceType, wideStorage); - } else { - storage.clear(); - storage.append(serviceType); - storage.append(".local"); - wpi::convertUTF8ToUTF16String(storage.str(), wideStorage); - } - pImpl->serviceType = std::wstring{ - reinterpret_cast(wideStorage.data()), wideStorage.size()}; - - wideStorage.clear(); - storage.clear(); - storage.append(serviceName); - storage.append("."); - storage.append(serviceType); - if (!wpi::ends_with_lower(serviceType, ".local")) { - storage.append(".local"); - } - - wpi::convertUTF8ToUTF16String(storage.str(), wideStorage); - pImpl->serviceInstanceName = std::wstring{ - reinterpret_cast(wideStorage.data()), wideStorage.size()}; +MulticastServiceAnnouncer::MulticastServiceAnnouncer( + std::string_view serviceName, std::string_view serviceType, int port, + wpi::span> txt) { + pImpl = std::make_unique(serviceName, serviceType, port, txt); } MulticastServiceAnnouncer::~MulticastServiceAnnouncer() noexcept { diff --git a/wpiutil/src/main/native/windows/MulticastServiceResolver.cpp b/wpiutil/src/main/native/windows/MulticastServiceResolver.cpp index c9452517bd..115b43fd6e 100644 --- a/wpiutil/src/main/native/windows/MulticastServiceResolver.cpp +++ b/wpiutil/src/main/native/windows/MulticastServiceResolver.cpp @@ -41,18 +41,17 @@ MulticastServiceResolver::MulticastServiceResolver( return; } - wpi::SmallVector wideStorage; + wpi::SmallVector wideStorage; if (wpi::ends_with_lower(serviceType, ".local")) { - wpi::convertUTF8ToUTF16String(serviceType, wideStorage); + wpi::sys::windows::UTF8ToUTF16(serviceType, wideStorage); } else { wpi::SmallString<128> storage; storage.append(serviceType); storage.append(".local"); - wpi::convertUTF8ToUTF16String(storage.str(), wideStorage); + wpi::sys::windows::UTF8ToUTF16(storage.str(), wideStorage); } - pImpl->serviceType = std::wstring{ - reinterpret_cast(wideStorage.data()), wideStorage.size()}; + pImpl->serviceType = std::wstring{wideStorage.data(), wideStorage.size()}; } MulticastServiceResolver::~MulticastServiceResolver() noexcept {