| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 // Provides wifi scan API binding for chromeos, using proprietary APIs. | 5 // Provides wifi scan API binding for chromeos, using proprietary APIs. |
| 6 | 6 |
| 7 #include "content/browser/geolocation/wifi_data_provider_chromeos.h" | 7 #include "content/browser/geolocation/wifi_data_provider_chromeos.h" |
| 8 | 8 |
| 9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "chrome/browser/chromeos/cros/cros_library.h" | 10 #include "chrome/browser/chromeos/cros/cros_library.h" |
| 11 #include "chrome/browser/chromeos/cros/network_library.h" | 11 #include "chrome/browser/chromeos/cros/network_library.h" |
| 12 #include "content/browser/browser_thread.h" |
| 12 | 13 |
| 13 namespace { | 14 namespace { |
| 14 // The time periods between successive polls of the wifi data. | 15 // The time periods between successive polls of the wifi data. |
| 15 const int kDefaultPollingIntervalMilliseconds = 10 * 1000; // 10s | 16 const int kDefaultPollingIntervalMilliseconds = 10 * 1000; // 10s |
| 16 const int kNoChangePollingIntervalMilliseconds = 2 * 60 * 1000; // 2 mins | 17 const int kNoChangePollingIntervalMilliseconds = 2 * 60 * 1000; // 2 mins |
| 17 const int kTwoNoChangePollingIntervalMilliseconds = 10 * 60 * 1000; // 10 mins | 18 const int kTwoNoChangePollingIntervalMilliseconds = 10 * 60 * 1000; // 10 mins |
| 18 const int kNoWifiPollingIntervalMilliseconds = 20 * 1000; // 20s | 19 const int kNoWifiPollingIntervalMilliseconds = 20 * 1000; // 20s |
| 19 } | 20 } |
| 20 | 21 |
| 21 namespace chromeos { | 22 namespace chromeos { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 } | 66 } |
| 66 | 67 |
| 67 } // namespace | 68 } // namespace |
| 68 } // namespace chromeos | 69 } // namespace chromeos |
| 69 | 70 |
| 70 template<> | 71 template<> |
| 71 WifiDataProviderImplBase* WifiDataProvider::DefaultFactoryFunction() { | 72 WifiDataProviderImplBase* WifiDataProvider::DefaultFactoryFunction() { |
| 72 return new WifiDataProviderChromeOs(); | 73 return new WifiDataProviderChromeOs(); |
| 73 } | 74 } |
| 74 | 75 |
| 75 WifiDataProviderChromeOs::WifiDataProviderChromeOs() { | 76 WifiDataProviderChromeOs::WifiDataProviderChromeOs() : |
| 77 started_(false) { |
| 76 } | 78 } |
| 77 | 79 |
| 78 WifiDataProviderChromeOs::~WifiDataProviderChromeOs() { | 80 WifiDataProviderChromeOs::~WifiDataProviderChromeOs() { |
| 79 } | 81 } |
| 80 | 82 |
| 83 bool WifiDataProviderChromeOs::StartDataProvider() { |
| 84 DCHECK(CalledOnClientThread()); |
| 85 DCHECK(!started_); |
| 86 started_ = true; |
| 87 |
| 88 wlan_api_.reset(NewWlanApi()); |
| 89 if (wlan_api_ == NULL) { |
| 90 // Error! Can't do scans, so don't try and schedule one. |
| 91 is_first_scan_complete_ = true; |
| 92 return true; |
| 93 } |
| 94 |
| 95 DCHECK(polling_policy_ == NULL); |
| 96 polling_policy_.reset(NewPollingPolicy()); |
| 97 DCHECK(polling_policy_ != NULL); |
| 98 |
| 99 // Perform first scan ASAP regardless of the polling policy. If this scan |
| 100 // fails we'll retry at a rate in line with the polling policy. |
| 101 ScheduleNextScan(0); |
| 102 return true; |
| 103 } |
| 104 |
| 105 void WifiDataProviderChromeOs::StopDataProvider() { |
| 106 DCHECK(CalledOnClientThread()); |
| 107 started_ = false; |
| 108 wlan_api_.reset(); |
| 109 polling_policy_.reset(); |
| 110 } |
| 111 |
| 112 bool WifiDataProviderChromeOs::GetData(WifiData* data) { |
| 113 DCHECK(CalledOnClientThread()); |
| 114 DCHECK(data); |
| 115 *data = wifi_data_; |
| 116 return is_first_scan_complete_; |
| 117 } |
| 118 |
| 81 WifiDataProviderCommon::WlanApiInterface* | 119 WifiDataProviderCommon::WlanApiInterface* |
| 82 WifiDataProviderChromeOs::NewWlanApi(chromeos::NetworkLibrary* lib) { | 120 WifiDataProviderChromeOs::NewWlanApi(chromeos::NetworkLibrary* lib) { |
| 83 return new chromeos::NetworkLibraryWlanApi(lib); | 121 return new chromeos::NetworkLibraryWlanApi(lib); |
| 84 } | 122 } |
| 85 | 123 |
| 86 WifiDataProviderCommon::WlanApiInterface* | 124 WifiDataProviderCommon::WlanApiInterface* |
| 87 WifiDataProviderChromeOs::NewWlanApi() { | 125 WifiDataProviderChromeOs::NewWlanApi() { |
| 88 chromeos::CrosLibrary* cros_lib = chromeos::CrosLibrary::Get(); | 126 chromeos::CrosLibrary* cros_lib = chromeos::CrosLibrary::Get(); |
| 89 DCHECK(cros_lib); | 127 DCHECK(cros_lib); |
| 90 if (!cros_lib->EnsureLoaded()) | 128 if (!cros_lib->EnsureLoaded()) |
| 91 return NULL; | 129 return NULL; |
| 92 return NewWlanApi(cros_lib->GetNetworkLibrary()); | 130 return NewWlanApi(cros_lib->GetNetworkLibrary()); |
| 93 } | 131 } |
| 94 | 132 |
| 95 PollingPolicyInterface* WifiDataProviderChromeOs::NewPollingPolicy() { | 133 PollingPolicyInterface* WifiDataProviderChromeOs::NewPollingPolicy() { |
| 96 return new GenericPollingPolicy<kDefaultPollingIntervalMilliseconds, | 134 return new GenericPollingPolicy<kDefaultPollingIntervalMilliseconds, |
| 97 kNoChangePollingIntervalMilliseconds, | 135 kNoChangePollingIntervalMilliseconds, |
| 98 kTwoNoChangePollingIntervalMilliseconds, | 136 kTwoNoChangePollingIntervalMilliseconds, |
| 99 kNoWifiPollingIntervalMilliseconds>; | 137 kNoWifiPollingIntervalMilliseconds>; |
| 100 } | 138 } |
| 139 |
| 140 void WifiDataProviderChromeOs::DoWifiScanTask() { |
| 141 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 142 WifiData new_data; |
| 143 if (!wlan_api_->GetAccessPointData(&new_data.access_point_data)) { |
| 144 client_loop()->PostTask(FROM_HERE, NewRunnableMethod( |
| 145 this, &WifiDataProviderChromeOs::DidWifiScanTaskNoResults)); |
| 146 } |
| 147 else { |
| 148 client_loop()->PostTask(FROM_HERE, NewRunnableMethod( |
| 149 this, &WifiDataProviderChromeOs::DidWifiScanTask, |
| 150 new_data)); |
| 151 } |
| 152 } |
| 153 |
| 154 void WifiDataProviderChromeOs::DidWifiScanTaskNoResults() { |
| 155 DCHECK(CalledOnClientThread()); |
| 156 ScheduleNextScan(polling_policy_->NoWifiInterval()); |
| 157 MaybeNotifyListeners(false); |
| 158 } |
| 159 |
| 160 void WifiDataProviderChromeOs::DidWifiScanTask(const WifiData& new_data) { |
| 161 DCHECK(CalledOnClientThread()); |
| 162 bool update_available = wifi_data_.DiffersSignificantly(new_data); |
| 163 wifi_data_ = new_data; |
| 164 polling_policy_->UpdatePollingInterval(update_available); |
| 165 ScheduleNextScan(polling_policy_->PollingInterval()); |
| 166 MaybeNotifyListeners(update_available); |
| 167 } |
| 168 |
| 169 void WifiDataProviderChromeOs::MaybeNotifyListeners(bool update_available) { |
| 170 if (update_available || !is_first_scan_complete_) { |
| 171 is_first_scan_complete_ = true; |
| 172 NotifyListeners(); |
| 173 } |
| 174 } |
| 175 |
| 176 void WifiDataProviderChromeOs::ScheduleNextScan(int interval) { |
| 177 DCHECK(CalledOnClientThread()); |
| 178 if (started_) { |
| 179 BrowserThread::PostDelayedTask( |
| 180 BrowserThread::UI, |
| 181 FROM_HERE, |
| 182 NewRunnableMethod(this, |
| 183 &WifiDataProviderChromeOs::DoWifiScanTask), |
| 184 interval); |
| 185 } |
| 186 } |
| OLD | NEW |