Skip to content

Commit ee108c5

Browse files
hai007copybara-github
authored andcommitted
Wi-Fi Direct Service Implementation(9)
PiperOrigin-RevId: 845358747
1 parent 7be720d commit ee108c5

File tree

2 files changed

+69
-7
lines changed

2 files changed

+69
-7
lines changed

internal/platform/implementation/windows/wifi_direct.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ class WifiDirectMedium : public api::WifiDirectMedium {
227227
// Medium Status
228228
int medium_status_ = kMediumStatusIdle;
229229

230+
bool IsWifiDirectServiceSupported();
230231
bool IsIdle() { return medium_status_ == kMediumStatusIdle; }
231232
// Advertiser is accepting connection on server socket
232233
bool IsAccepting() { return (medium_status_ & kMediumStatusAccepting) != 0; }
@@ -284,6 +285,7 @@ class WifiDirectMedium : public api::WifiDirectMedium {
284285
fire_and_forget Watcher_DeviceStopped(DeviceWatcher sender,
285286
IInspectable inspectable);
286287

288+
bool is_interface_valid_ = false;
287289
WifiDirectCredentials* credentials_go_ = nullptr;
288290
WifiDirectCredentials credentials_gc_;
289291
std::string ip_address_local_;

internal/platform/implementation/windows/wifi_direct_medium.cc

Lines changed: 67 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

5758
WifiDirectMedium::~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

Comments
 (0)