Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/wifi/wifi_service.h" | 5 #include "components/wifi/wifi_service.h" |
| 6 | 6 |
| 7 #include <iphlpapi.h> | 7 #include <iphlpapi.h> |
| 8 #include <objbase.h> | 8 #include <objbase.h> |
| 9 #include <wlanapi.h> | 9 #include <wlanapi.h> |
| 10 | 10 |
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 284 | 284 |
| 285 // Connect to network |network_guid| using previosly stored profile if exists, | 285 // Connect to network |network_guid| using previosly stored profile if exists, |
| 286 // or just network sid. If |frequency| is not |kFrequencyUnknown| then | 286 // or just network sid. If |frequency| is not |kFrequencyUnknown| then |
| 287 // connects only to BSS which uses that frequency and returns | 287 // connects only to BSS which uses that frequency and returns |
| 288 // |ERROR_NOT_FOUND| if such BSS cannot be found. | 288 // |ERROR_NOT_FOUND| if such BSS cannot be found. |
| 289 DWORD Connect(const std::string& network_guid, Frequency frequency); | 289 DWORD Connect(const std::string& network_guid, Frequency frequency); |
| 290 | 290 |
| 291 // Disconnect from currently connected network if any. | 291 // Disconnect from currently connected network if any. |
| 292 DWORD Disconnect(); | 292 DWORD Disconnect(); |
| 293 | 293 |
| 294 // Get desired connection freqency if it was set using |SetProperties|. | |
| 295 // Default to |kFrequencyAny|. | |
| 296 Frequency GetDesiredFrequency(const std::string& network_guid); | |
| 297 | |
| 294 // Get DOT11_BSSID_LIST of desired BSSIDs to connect to |ssid| network on | 298 // Get DOT11_BSSID_LIST of desired BSSIDs to connect to |ssid| network on |
| 295 // given |frequency|. | 299 // given |frequency|. |
| 296 DWORD GetDesiredBssList(DOT11_SSID& ssid, | 300 DWORD GetDesiredBssList(DOT11_SSID& ssid, |
| 297 Frequency frequency, | 301 Frequency frequency, |
| 298 scoped_ptr<DOT11_BSSID_LIST>* desired_list); | 302 scoped_ptr<DOT11_BSSID_LIST>* desired_list); |
| 299 | 303 |
| 300 // Save temporary wireless profile for |network_guid|. | 304 // Save temporary wireless profile for |network_guid|. |
| 301 DWORD SaveTempProfile(const std::string& network_guid); | 305 DWORD SaveTempProfile(const std::string& network_guid); |
| 302 | 306 |
| 303 // Get previously stored |profile_xml| for |network_guid|. | 307 // Get previously stored |profile_xml| for |network_guid|. |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 332 WlanRegisterNotificationFunction WlanRegisterNotification_function_; | 336 WlanRegisterNotificationFunction WlanRegisterNotification_function_; |
| 333 WlanScanFunction WlanScan_function_; | 337 WlanScanFunction WlanScan_function_; |
| 334 // WlanSaveTemporaryProfile function may not be avaiable on Windows XP. | 338 // WlanSaveTemporaryProfile function may not be avaiable on Windows XP. |
| 335 WlanSaveTemporaryProfileFunction WlanSaveTemporaryProfile_function_; | 339 WlanSaveTemporaryProfileFunction WlanSaveTemporaryProfile_function_; |
| 336 | 340 |
| 337 // WLAN service handle. | 341 // WLAN service handle. |
| 338 HANDLE client_; | 342 HANDLE client_; |
| 339 // GUID of the currently connected interface, if any, otherwise the GUID of | 343 // GUID of the currently connected interface, if any, otherwise the GUID of |
| 340 // one of the WLAN interfaces. | 344 // one of the WLAN interfaces. |
| 341 GUID interface_guid_; | 345 GUID interface_guid_; |
| 346 // Temporary storage of network properties indexed by |network_guid|. | |
| 347 DictionaryValue temporary_network_properties_; | |
|
stevenjb
2013/11/26 18:00:34
How about 'connect_properties_' to better describe
mef
2013/11/26 19:00:13
Done.
| |
| 342 // Preserved WLAN profile xml. | 348 // Preserved WLAN profile xml. |
| 343 std::map<std::string, std::string> saved_profiles_xml_; | 349 std::map<std::string, std::string> saved_profiles_xml_; |
| 344 // Observer to get notified when network(s) have changed (e.g. connect). | 350 // Observer to get notified when network(s) have changed (e.g. connect). |
| 345 NetworkGuidListCallback networks_changed_observer_; | 351 NetworkGuidListCallback networks_changed_observer_; |
| 346 // Observer to get notified when network list has changed (scan complete). | 352 // Observer to get notified when network list has changed (scan complete). |
| 347 NetworkGuidListCallback network_list_changed_observer_; | 353 NetworkGuidListCallback network_list_changed_observer_; |
| 348 // Saved value of network location wizard show value. | 354 // Saved value of network location wizard show value. |
| 349 scoped_ptr<DWORD> saved_nw_category_wizard_; | 355 scoped_ptr<DWORD> saved_nw_category_wizard_; |
| 350 // MessageLoopProxy to post events on UI thread. | 356 // MessageLoopProxy to post events on UI thread. |
| 351 scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; | 357 scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 412 } | 418 } |
| 413 } | 419 } |
| 414 | 420 |
| 415 CheckError(error_code, kWiFiServiceError, error); | 421 CheckError(error_code, kWiFiServiceError, error); |
| 416 } | 422 } |
| 417 | 423 |
| 418 void WiFiServiceImpl::SetProperties( | 424 void WiFiServiceImpl::SetProperties( |
| 419 const std::string& network_guid, | 425 const std::string& network_guid, |
| 420 scoped_ptr<base::DictionaryValue> properties, | 426 scoped_ptr<base::DictionaryValue> properties, |
| 421 std::string* error) { | 427 std::string* error) { |
| 422 // This method is not implemented in first version as it is not used by | 428 // Temporary preserve WiFi properties (desired frequency, wifi password to use |
| 423 // Google Cast extension. | 429 // in StartConnect. |
| 424 CheckError(ERROR_CALL_NOT_IMPLEMENTED, kWiFiServiceError, error); | 430 DCHECK(properties->HasKey(onc::network_type::kWiFi)); |
|
stevenjb
2013/11/26 18:00:34
This should set |error| instead of CHECK
mef
2013/11/26 19:00:13
Done.
| |
| 431 temporary_network_properties_.SetWithoutPathExpansion(network_guid, | |
| 432 properties.release()); | |
| 425 } | 433 } |
| 426 | 434 |
| 427 void WiFiServiceImpl::GetVisibleNetworks(ListValue* network_list) { | 435 void WiFiServiceImpl::GetVisibleNetworks(ListValue* network_list) { |
| 428 DWORD error = EnsureInitialized(); | 436 DWORD error = EnsureInitialized(); |
| 429 | 437 |
| 430 if (error == ERROR_SUCCESS) { | 438 if (error == ERROR_SUCCESS) { |
| 431 NetworkList networks; | 439 NetworkList networks; |
| 432 error = GetVisibleNetworkList(&networks); | 440 error = GetVisibleNetworkList(&networks); |
| 433 if (error == ERROR_SUCCESS && !networks.empty()) { | 441 if (error == ERROR_SUCCESS && !networks.empty()) { |
| 434 SortNetworks(&networks); | 442 SortNetworks(&networks); |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 450 } | 458 } |
| 451 | 459 |
| 452 void WiFiServiceImpl::StartConnect(const std::string& network_guid, | 460 void WiFiServiceImpl::StartConnect(const std::string& network_guid, |
| 453 std::string* error) { | 461 std::string* error) { |
| 454 DVLOG(1) << "Start Connect: " << network_guid; | 462 DVLOG(1) << "Start Connect: " << network_guid; |
| 455 DWORD error_code = EnsureInitialized(); | 463 DWORD error_code = EnsureInitialized(); |
| 456 if (error_code == ERROR_SUCCESS) { | 464 if (error_code == ERROR_SUCCESS) { |
| 457 std::string connected_network_guid; | 465 std::string connected_network_guid; |
| 458 error_code = SaveCurrentConnectedNetwork(&connected_network_guid); | 466 error_code = SaveCurrentConnectedNetwork(&connected_network_guid); |
| 459 if (error_code == ERROR_SUCCESS) { | 467 if (error_code == ERROR_SUCCESS) { |
| 460 Frequency frequency = kFrequencyAny; | 468 Frequency frequency = GetDesiredFrequency(network_guid); |
| 461 // Connect only if network |network_guid| is not connected already. | 469 // Connect only if network |network_guid| is not connected already. |
|
tbarzic
2013/11/26 19:02:21
is |network_guid| unique for (ssid, frequency) pai
mef
2013/11/27 18:00:03
Good point, done. Currently connected band is not
| |
| 462 if (network_guid != connected_network_guid) | 470 if (network_guid != connected_network_guid) |
| 463 error_code = Connect(network_guid, frequency); | 471 error_code = Connect(network_guid, frequency); |
| 464 if (error_code == ERROR_SUCCESS) { | 472 if (error_code == ERROR_SUCCESS) { |
| 465 // Notify that previously connected network has changed. | 473 // Notify that previously connected network has changed. |
| 466 NotifyNetworkChanged(connected_network_guid); | 474 NotifyNetworkChanged(connected_network_guid); |
| 467 // Start waiting for network connection state change. | 475 // Start waiting for network connection state change. |
| 468 if (!networks_changed_observer_.is_null()) { | 476 if (!networks_changed_observer_.is_null()) { |
| 469 DisableNwCategoryWizard(); | 477 DisableNwCategoryWizard(); |
| 470 // Disable automatic network change notifications as they get fired | 478 // Disable automatic network change notifications as they get fired |
| 471 // when network is just connected, but not yet accessible (doesn't | 479 // when network is just connected, but not yet accessible (doesn't |
| (...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1038 } | 1046 } |
| 1039 | 1047 |
| 1040 // clean up | 1048 // clean up |
| 1041 if (available_network_list != NULL) { | 1049 if (available_network_list != NULL) { |
| 1042 WlanFreeMemory_function_(available_network_list); | 1050 WlanFreeMemory_function_(available_network_list); |
| 1043 } | 1051 } |
| 1044 | 1052 |
| 1045 return error; | 1053 return error; |
| 1046 } | 1054 } |
| 1047 | 1055 |
| 1056 WiFiService::Frequency WiFiServiceImpl::GetDesiredFrequency( | |
|
stevenjb
2013/11/26 18:00:34
GetConnectFrequency or GetFrequencyForConnect?
mef
2013/11/26 19:00:13
Done.
| |
| 1057 const std::string& network_guid) { | |
| 1058 // Check whether desired frequency is set in |temporary_network_properties_|. | |
| 1059 DictionaryValue* properties; | |
| 1060 DictionaryValue* wifi; | |
| 1061 int frequency; | |
| 1062 if (temporary_network_properties_.GetDictionaryWithoutPathExpansion( | |
| 1063 network_guid, | |
| 1064 &properties) && | |
|
stevenjb
2013/11/26 18:00:34
nit: OK (and a little clearer imho) to combine the
mef
2013/11/26 19:00:13
Done.
| |
| 1065 properties->GetDictionary(onc::network_type::kWiFi, &wifi) && | |
| 1066 wifi->GetInteger(onc::wifi::kFrequency, &frequency)) { | |
|
tbarzic
2013/11/26 19:02:21
should frequency be normalized (here or in SetProp
mef
2013/11/27 18:00:03
Done.
| |
| 1067 return static_cast<Frequency>(frequency); | |
| 1068 } | |
| 1069 return kFrequencyAny; | |
| 1070 } | |
| 1071 | |
| 1048 DWORD WiFiServiceImpl::GetDesiredBssList( | 1072 DWORD WiFiServiceImpl::GetDesiredBssList( |
| 1049 DOT11_SSID& ssid, | 1073 DOT11_SSID& ssid, |
| 1050 Frequency frequency, | 1074 Frequency frequency, |
| 1051 scoped_ptr<DOT11_BSSID_LIST>* desired_list) { | 1075 scoped_ptr<DOT11_BSSID_LIST>* desired_list) { |
| 1052 if (client_ == NULL) { | 1076 if (client_ == NULL) { |
| 1053 NOTREACHED(); | 1077 NOTREACHED(); |
| 1054 return ERROR_NOINTERFACE; | 1078 return ERROR_NOINTERFACE; |
| 1055 } | 1079 } |
| 1056 | 1080 |
| 1057 desired_list->reset(); | 1081 desired_list->reset(); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1122 } | 1146 } |
| 1123 } | 1147 } |
| 1124 | 1148 |
| 1125 // clean up | 1149 // clean up |
| 1126 if (bss_list != NULL) { | 1150 if (bss_list != NULL) { |
| 1127 WlanFreeMemory_function_(bss_list); | 1151 WlanFreeMemory_function_(bss_list); |
| 1128 } | 1152 } |
| 1129 return error; | 1153 return error; |
| 1130 } | 1154 } |
| 1131 | 1155 |
| 1132 | |
| 1133 DWORD WiFiServiceImpl::Connect(const std::string& network_guid, | 1156 DWORD WiFiServiceImpl::Connect(const std::string& network_guid, |
| 1134 Frequency frequency) { | 1157 Frequency frequency) { |
| 1135 if (client_ == NULL) { | 1158 if (client_ == NULL) { |
| 1136 NOTREACHED(); | 1159 NOTREACHED(); |
| 1137 return ERROR_NOINTERFACE; | 1160 return ERROR_NOINTERFACE; |
| 1138 } | 1161 } |
| 1139 | 1162 |
| 1140 DWORD error = ERROR_SUCCESS; | 1163 DWORD error = ERROR_SUCCESS; |
| 1141 DOT11_SSID ssid = SSIDFromGUID(network_guid); | 1164 DOT11_SSID ssid = SSIDFromGUID(network_guid); |
| 1142 scoped_ptr<DOT11_BSSID_LIST> desired_bss_list; | 1165 scoped_ptr<DOT11_BSSID_LIST> desired_bss_list; |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1265 NetworkGuidList changed_networks(1, network_guid); | 1288 NetworkGuidList changed_networks(1, network_guid); |
| 1266 message_loop_proxy_->PostTask( | 1289 message_loop_proxy_->PostTask( |
| 1267 FROM_HERE, | 1290 FROM_HERE, |
| 1268 base::Bind(networks_changed_observer_, changed_networks)); | 1291 base::Bind(networks_changed_observer_, changed_networks)); |
| 1269 } | 1292 } |
| 1270 } | 1293 } |
| 1271 | 1294 |
| 1272 WiFiService* WiFiService::Create() { return new WiFiServiceImpl(); } | 1295 WiFiService* WiFiService::Create() { return new WiFiServiceImpl(); } |
| 1273 | 1296 |
| 1274 } // namespace wifi | 1297 } // namespace wifi |
| OLD | NEW |