@@ -52,9 +52,11 @@ WifiDirectMedium::WifiDirectMedium() {
5252 LOG (WARNING) << " Failed to get DispatcherQueue for current thread. "
5353 " ConnectAsync might fail if not called from UI thread." ;
5454 }
55+ is_interface_valid_ = IsWifiDirectServiceSupported ();
5556}
5657
5758WifiDirectMedium::~WifiDirectMedium () {
59+ is_interface_valid_ = false ;
5860 listener_executor_.Shutdown ();
5961 StopWifiDirect ();
6062 DisconnectWifiDirect ();
@@ -70,21 +72,79 @@ WifiDirectMedium::~WifiDirectMedium() {
7072 }
7173}
7274
73- bool WifiDirectMedium::IsInterfaceValid () const {
75+ bool WifiDirectMedium::IsWifiDirectServiceSupported () {
7476 HANDLE wifi_direct_handle = nullptr ;
7577 DWORD negotiated_version = 0 ;
7678 DWORD result = 0 ;
7779
7880 result =
7981 WFDOpenHandle (WFD_API_VERSION, &negotiated_version, &wifi_direct_handle);
80- if (result == ERROR_SUCCESS) {
81- LOG (INFO) << " WiFi can support WifiDirect" ;
82- WFDCloseHandle (wifi_direct_handle);
83- return true ;
82+ if (result != ERROR_SUCCESS) {
83+ LOG (ERROR) << " WiFi can't support WifiDirect" ;
84+ return false ;
8485 }
86+ LOG (INFO) << " WiFi can support WifiDirect" ;
87+ WFDCloseHandle (wifi_direct_handle);
8588
86- LOG (ERROR) << " WiFi can't support WifiDirect" ;
87- return false ;
89+ // Check if device support WinRT WiFiDirectService
90+ bool support_wifi_direct_service = false ;
91+ std::string service_name = " NC-validation" ;
92+
93+ // Create Advertiser object
94+ WiFiDirectServiceAdvertiser advertiser =
95+ WiFiDirectServiceAdvertiser (winrt::to_hstring (service_name));
96+ if (advertiser == nullptr ) {
97+ LOG (ERROR) << " Failed to create WiFiDirectServiceAdvertiser" ;
98+ return false ;
99+ }
100+
101+ advertiser.AutoAcceptSession (true );
102+ advertiser.PreferGroupOwnerMode (true );
103+ advertiser.ServiceStatus (WiFiDirectServiceStatus::Available);
104+ // Config Methods
105+ WiFiDirectServiceConfigurationMethod config_method =
106+ WiFiDirectServiceConfigurationMethod::Default; // NOLINT
107+
108+ advertiser.PreferredConfigurationMethods ().Clear ();
109+ advertiser.PreferredConfigurationMethods ().Append (config_method);
110+
111+ try {
112+ advertiser.Start ();
113+ LOG (INFO) << " Start WifiDirect GO Status: "
114+ << (int )advertiser.AdvertisementStatus ();
115+ if ((advertiser.AdvertisementStatus () ==
116+ WiFiDirectServiceAdvertisementStatus::Created) ||
117+ (advertiser.AdvertisementStatus () ==
118+ WiFiDirectServiceAdvertisementStatus::Started)) {
119+ LOG (INFO) << " WinRT WiFiDirectService is supported on this device." ;
120+ advertiser.PreferredConfigurationMethods ().Clear ();
121+ advertiser.Stop ();
122+ support_wifi_direct_service = true ;
123+ } else {
124+ if (advertiser.AdvertisementStatus () ==
125+ WiFiDirectServiceAdvertisementStatus::Aborted) {
126+ LOG (INFO) << " Failed to start WifiDirect GO with error code: "
127+ << (int )advertiser.ServiceError ();
128+ }
129+ LOG (INFO) << " WinRT WiFiDirectService is not supported on this device." ;
130+ support_wifi_direct_service = false ;
131+ }
132+ } catch (std::exception exception) {
133+ LOG (ERROR) << __func__ << " : Stop WifiDirect GO failed. Exception: "
134+ << exception.what ();
135+ } catch (const winrt::hresult_error& error) {
136+ LOG (ERROR) << __func__ << " : Stop WifiDirect GO failed. WinRT exception: "
137+ << error.code () << " : " << winrt::to_string (error.message ());
138+ } catch (...) {
139+ LOG (ERROR) << __func__ << " : Unknown exeption." ;
140+ }
141+ advertiser = nullptr ;
142+
143+ return support_wifi_direct_service;
144+ }
145+
146+ bool WifiDirectMedium::IsInterfaceValid () const {
147+ return is_interface_valid_;
88148}
89149
90150// Discoverer connects to server socket
0 commit comments