From 37d7dc19de6832896c37d9a6a67b177a2d851ea1 Mon Sep 17 00:00:00 2001 From: Guogang Li Date: Fri, 11 Oct 2024 11:39:11 -0700 Subject: [PATCH] Change the method to stop Wi-Fi LAN advertising PiperOrigin-RevId: 684905306 --- .../implementation/windows/wifi_lan.h | 23 ++---- .../implementation/windows/wifi_lan_medium.cc | 78 ++++--------------- 2 files changed, 25 insertions(+), 76 deletions(-) diff --git a/internal/platform/implementation/windows/wifi_lan.h b/internal/platform/implementation/windows/wifi_lan.h index dcb4e765..fc351813 100644 --- a/internal/platform/implementation/windows/wifi_lan.h +++ b/internal/platform/implementation/windows/wifi_lan.h @@ -18,24 +18,31 @@ // Windows headers // clang-format off #include // NOLINT -#include // NOLINT // clang-format on // Standard C/C++ headers +#include +#include +#include #include #include #include #include +#include // Nearby connections headers #include "absl/base/thread_annotations.h" #include "absl/container/flat_hash_map.h" +#include "absl/functional/any_invocable.h" #include "absl/strings/string_view.h" #include "absl/synchronization/mutex.h" #include "absl/time/time.h" #include "absl/types/optional.h" +#include "internal/platform/byte_array.h" +#include "internal/platform/cancellation_flag.h" #include "internal/platform/count_down_latch.h" #include "internal/platform/exception.h" +#include "internal/platform/implementation/cancelable.h" #include "internal/platform/implementation/wifi_lan.h" #include "internal/platform/implementation/windows/scheduled_executor.h" #include "internal/platform/input_stream.h" @@ -250,11 +257,6 @@ class WifiLanMedium : public api::WifiLanMedium { std::unique_ptr ListenForService( int port = 0) override; - // DnsServiceDeRegister is a async process, after operation finish, callback - // will call this method to notify the waiting method StopAdvertising to - // continue. - void NotifyDnsServiceUnregistered(DWORD status); - absl::optional> GetDynamicPortRange() override { return absl::nullopt; @@ -312,8 +314,6 @@ class WifiLanMedium : public api::WifiLanMedium { DeviceWatcher sender, DeviceInformationUpdate deviceInfoUpdate); fire_and_forget Watcher_DeviceRemoved( DeviceWatcher sender, DeviceInformationUpdate deviceInfoUpdate); - static void Advertising_StopCompleted(DWORD Status, PVOID pQueryContext, - PDNS_SERVICE_INSTANCE pInstance); // Gets error message from exception pointer std::string GetErrorMessage(std::exception_ptr eptr); @@ -328,13 +328,6 @@ class WifiLanMedium : public api::WifiLanMedium { DnssdServiceInstance dnssd_service_instance_{nullptr}; DnssdRegistrationResult dnssd_regirstraion_result_{nullptr}; - // Stop advertising properties - DNS_SERVICE_INSTANCE dns_service_instance_{nullptr}; - DNS_SERVICE_REGISTER_REQUEST dns_service_register_request_; - std::unique_ptr dns_service_instance_name_{nullptr}; - std::unique_ptr dns_service_stop_latch_; - DWORD dns_service_stop_status_; - // Discovery properties DeviceWatcher device_watcher_{nullptr}; winrt::event_token device_watcher_added_event_token; diff --git a/internal/platform/implementation/windows/wifi_lan_medium.cc b/internal/platform/implementation/windows/wifi_lan_medium.cc index ef64ca47..9f672ece 100644 --- a/internal/platform/implementation/windows/wifi_lan_medium.cc +++ b/internal/platform/implementation/windows/wifi_lan_medium.cc @@ -173,26 +173,6 @@ bool WifiLanMedium::StartAdvertising(const NsdServiceInfo& nsd_service_info) { return false; } -// Win32 call only can use globel function or static method in class -void WifiLanMedium::Advertising_StopCompleted(DWORD Status, PVOID pQueryContext, - PDNS_SERVICE_INSTANCE pInstance) { - LOG(INFO) << "unregister with status=" << Status; - try { - WifiLanMedium* medium = static_cast(pQueryContext); - medium->NotifyDnsServiceUnregistered(Status); - } catch (...) { - LOG(ERROR) << "failed to notify the stop of DNS service instance." - << Status; - } -} - -void WifiLanMedium::NotifyDnsServiceUnregistered(DWORD status) { - if (dns_service_stop_latch_.get() != nullptr) { - dns_service_stop_status_ = status; - dns_service_stop_latch_.get()->CountDown(); - } -} - bool WifiLanMedium::StopAdvertising(const NsdServiceInfo& nsd_service_info) { // Need to use Win32 API to deregister the Dnssd instance if (!IsAdvertising()) { @@ -201,47 +181,7 @@ bool WifiLanMedium::StopAdvertising(const NsdServiceInfo& nsd_service_info) { return false; } - // Init DNS service instance - std::string instance_name = absl::StrFormat( - kMdnsInstanceNameFormat.data(), nsd_service_info.GetServiceName(), - nsd_service_info.GetServiceType()); - int port = nsd_service_info.GetPort(); - dns_service_instance_name_ = std::make_unique( - string_utils::StringToWideString(instance_name)); - - dns_service_instance_.pszInstanceName = - (LPWSTR)dns_service_instance_name_->c_str(); - dns_service_instance_.pszHostName = (LPWSTR)kMdnsHostName.data(); - dns_service_instance_.wPort = port; - - // Init DNS service register request - dns_service_register_request_.Version = DNS_QUERY_REQUEST_VERSION1; - dns_service_register_request_.InterfaceIndex = - 0; // all interfaces will be considered - dns_service_register_request_.unicastEnabled = false; - dns_service_register_request_.hCredentials = nullptr; - dns_service_register_request_.pServiceInstance = &dns_service_instance_; - dns_service_register_request_.pQueryContext = this; // callback use it - dns_service_register_request_.pRegisterCompletionCallback = - WifiLanMedium::Advertising_StopCompleted; - - dns_service_stop_latch_ = std::make_unique(1); - DWORD status = DnsServiceDeRegister(&dns_service_register_request_, nullptr); - - if (status != DNS_REQUEST_PENDING) { - LOG(ERROR) << "failed to stop mDNS advertising for service type =" - << nsd_service_info.GetServiceType(); - return false; - } - - // Wait for stop finish - dns_service_stop_latch_.get()->Await(); - dns_service_stop_latch_ = nullptr; - if (dns_service_stop_status_ != 0) { - LOG(INFO) << "failed to stop mDNS advertising for service type =" - << nsd_service_info.GetServiceType(); - return false; - } + dnssd_service_instance_ = nullptr; LOG(INFO) << "succeeded to stop mDNS advertising for service type =" << nsd_service_info.GetServiceType(); @@ -635,6 +575,22 @@ fire_and_forget WifiLanMedium::Watcher_DeviceUpdated( std::optional last_nsd_service_info = GetDiscoveredService(winrt::to_string(deviceInfoUpdate.Id())); if (!last_nsd_service_info.has_value()) { + if (IsConnectableIpAddress( + ipaddr_4bytes_to_dotdecimal_string(nsd_service_info.GetIPAddress()), + nsd_service_info.GetPort(), kConnectTimeout)) { + // If the device is not in the discovered service list, but it is + // connectable during update, we add it to the discovered service list. + LOG(INFO) << "device added for service name " + << nsd_service_info.GetServiceName() << ", address: " + << ipaddr_4bytes_to_dotdecimal_string( + nsd_service_info.GetIPAddress()) + << ":" << nsd_service_info.GetPort(); + UpdateDiscoveredService(winrt::to_string(deviceInfoUpdate.Id()), + nsd_service_info); + discovered_service_callback_.service_discovered_cb(nsd_service_info); + return fire_and_forget{}; + } + LOG(WARNING) << "Don't update WIFI_LAN device due to it is not in device list."; return fire_and_forget{};