Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(344)

Unified Diff: net/base/net_util_win.cc

Issue 566243005: Cast: Allow extension to control wifi options on windows (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: posix fixed again Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« net/base/net_util.h ('K') | « net/base/net_util_posix.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/base/net_util_win.cc
diff --git a/net/base/net_util_win.cc b/net/base/net_util_win.cc
index cac92e39d54bbb391814190d1faf0ed440c61848..448bf85e9688d7ff86b9ce0bf6da45db4e32e1ba 100644
--- a/net/base/net_util_win.cc
+++ b/net/base/net_util_win.cc
@@ -11,6 +11,7 @@
#include "base/files/file_path.h"
#include "base/lazy_instance.h"
+#include "base/memory/lifetime_interface.h"
#include "base/memory/scoped_ptr.h"
#include "base/strings/string_piece.h"
#include "base/strings/string_util.h"
@@ -36,6 +37,8 @@ struct WlanApi {
typedef DWORD (WINAPI *WlanQueryInterfaceFunc)(
HANDLE, const GUID*, WLAN_INTF_OPCODE, VOID*, DWORD*, VOID**,
WLAN_OPCODE_VALUE_TYPE*);
+ typedef DWORD (WINAPI *WlanSetInterfaceFunc)(
+ HANDLE, const GUID*, WLAN_INTF_OPCODE, DWORD, const VOID*, VOID*);
typedef VOID (WINAPI *WlanFreeMemoryFunc)(VOID*);
typedef DWORD (WINAPI *WlanCloseHandleFunc)(HANDLE, VOID*);
@@ -54,6 +57,8 @@ struct WlanApi {
::GetProcAddress(module, "WlanEnumInterfaces"));
query_interface_func = reinterpret_cast<WlanQueryInterfaceFunc>(
::GetProcAddress(module, "WlanQueryInterface"));
+ set_interface_func = reinterpret_cast<WlanSetInterfaceFunc>(
+ ::GetProcAddress(module, "WlanSetInterface"));
free_memory_func = reinterpret_cast<WlanFreeMemoryFunc>(
::GetProcAddress(module, "WlanFreeMemory"));
close_handle_func = reinterpret_cast<WlanCloseHandleFunc>(
@@ -78,6 +83,7 @@ struct WlanApi {
WlanOpenHandleFunc open_handle_func;
WlanEnumInterfacesFunc enum_interfaces_func;
WlanQueryInterfaceFunc query_interface_func;
+ WlanSetInterfaceFunc set_interface_func;
WlanFreeMemoryFunc free_memory_func;
WlanCloseHandleFunc close_handle_func;
bool initialized;
@@ -215,9 +221,9 @@ bool GetNetworkList(NetworkInterfaceList* networks, int policy) {
return true;
}
-WifiPHYLayerProtocol GetWifiPHYLayerProtocol() {
- static base::LazyInstance<WlanApi>::Leaky lazy_wlanapi =
- LAZY_INSTANCE_INITIALIZER;
+namespace {
pauljensen 2014/09/16 15:01:18 I think moving this up into the anonymous namespac
hubbe 2014/09/16 21:06:50 Done.
+base::LazyInstance<WlanApi>::Leaky lazy_wlanapi =
+ LAZY_INSTANCE_INITIALIZER;
struct WlanApiHandleTraits {
typedef HANDLE Handle;
@@ -243,7 +249,9 @@ WifiPHYLayerProtocol GetWifiPHYLayerProtocol() {
lazy_wlanapi.Get().free_memory_func(ptr);
}
};
+};
pauljensen 2014/09/16 15:01:18 // namespace
hubbe 2014/09/16 21:06:51 No longer relevant.
+WifiPHYLayerProtocol GetWifiPHYLayerProtocol() {
const WlanApi& wlanapi = lazy_wlanapi.Get();
if (!wlanapi.initialized)
return WIFI_PHY_LAYER_PROTOCOL_NONE;
@@ -306,4 +314,58 @@ WifiPHYLayerProtocol GetWifiPHYLayerProtocol() {
}
}
+class WifiOptionSetter : public base::LifetimeInterface {
+ public:
+ WifiOptionSetter(int options) {
pauljensen 2014/09/16 15:01:18 indent
hubbe 2014/09/16 21:06:50 Done (finally configured emacs on my windows box,
+ const WlanApi& wlanapi = lazy_wlanapi.Get();
+ if (!wlanapi.initialized)
+ return;
+
+ DWORD cur_version = 0;
+ const DWORD kMaxClientVersion = 2;
pauljensen 2014/09/16 15:01:18 Please add a comment about where this 0 and 2 come
hubbe 2014/09/16 21:06:50 Gladly, but I don't know. I copied this from line
+ DWORD result = wlanapi.OpenHandle(
+ kMaxClientVersion, &cur_version, &client_);
+ if (result != ERROR_SUCCESS)
+ return;
+
+ WLAN_INTERFACE_INFO_LIST* interface_list_ptr = NULL;
+ result = wlanapi.enum_interfaces_func(client_, NULL, &interface_list_ptr);
+ if (result != ERROR_SUCCESS)
+ return;
+ scoped_ptr<WLAN_INTERFACE_INFO_LIST, WlanApiDeleter> interface_list(
+ interface_list_ptr);
+
+ // Assume at most one connected wifi interface.
pauljensen 2014/09/16 15:01:18 "at most one"? This function appears to loop thro
hubbe 2014/09/16 21:06:50 Oops, removed.
+ WLAN_INTERFACE_INFO* info = NULL;
+ for (unsigned i = 0; i < interface_list->dwNumberOfItems; ++i) {
+ if (options & WIFI_OPTIONS_DISABLE_SCAN) {
+ BOOL data = false;
+ wlanapi.set_interface_func(client_,
+ &info->InterfaceGuid,
+ wlan_intf_opcode_background_scan_enabled,
+ sizeof(data),
+ &data,
+ NULL);
+ }
+ if (options & WIFI_OPTIONS_MEDIA_STREAMING_MODE) {
+ BOOL data = true;
+ wlanapi.set_interface_func(client_,
+ &info->InterfaceGuid,
+ wlan_intf_opcode_media_streaming_mode,
+ sizeof(data),
+ &data,
+ NULL);
+ }
+ }
+ }
+
pauljensen 2014/09/16 15:01:18 Maybe I'm missing something, but shouldn't there b
hubbe 2014/09/16 21:06:51 If I'm reading the documentation correctly, the OS
+private:
+ WlanHandle client_;
+};
+
+scoped_ptr<base::LifetimeInterface> SetWifiOptions(int options) {
+ return scoped_ptr<base::LifetimeInterface>(
+ new WifiOptionSetter(options));
+}
+
} // namespace net
« net/base/net_util.h ('K') | « net/base/net_util_posix.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698