Chromium Code Reviews| Index: content/browser/geolocation/wifi_data_provider_chromeos.cc |
| diff --git a/content/browser/geolocation/wifi_data_provider_chromeos.cc b/content/browser/geolocation/wifi_data_provider_chromeos.cc |
| index 555f7aef7c7f4bb409ba779129cff115a695e475..d7b88dc59c0a5fa62be42195e8f6a512cf6e2698 100644 |
| --- a/content/browser/geolocation/wifi_data_provider_chromeos.cc |
| +++ b/content/browser/geolocation/wifi_data_provider_chromeos.cc |
| @@ -9,6 +9,7 @@ |
| #include "base/utf_string_conversions.h" |
| #include "chrome/browser/chromeos/cros/cros_library.h" |
| #include "chrome/browser/chromeos/cros/network_library.h" |
| +#include "content/browser/browser_thread.h" |
| namespace { |
| // The time periods between successive polls of the wifi data. |
| @@ -72,12 +73,49 @@ WifiDataProviderImplBase* WifiDataProvider::DefaultFactoryFunction() { |
| return new WifiDataProviderChromeOs(); |
| } |
| -WifiDataProviderChromeOs::WifiDataProviderChromeOs() { |
| +WifiDataProviderChromeOs::WifiDataProviderChromeOs() : |
| + started_(false) { |
| } |
| WifiDataProviderChromeOs::~WifiDataProviderChromeOs() { |
| } |
| +bool WifiDataProviderChromeOs::StartDataProvider() { |
| + DCHECK(CalledOnClientThread()); |
| + DCHECK(!started_); |
| + started_ = true; |
| + |
| + wlan_api_.reset(NewWlanApi()); |
| + if (wlan_api_ == NULL) { |
| + // Error! Can't do scans, so don't try and schedule one. |
| + is_first_scan_complete_ = true; |
| + return false; |
| + } |
| + |
| + DCHECK(polling_policy_ == NULL); |
| + polling_policy_.reset(NewPollingPolicy()); |
| + DCHECK(polling_policy_ != NULL); |
| + |
| + // Perform first scan ASAP regardless of the polling policy. If this scan |
| + // fails we'll retry at a rate in line with the polling policy. |
| + ScheduleNextScan(0); |
| + return true; |
| +} |
| + |
| +void WifiDataProviderChromeOs::StopDataProvider() { |
| + DCHECK(CalledOnClientThread()); |
| + started_ = false; |
| + wlan_api_.reset(); |
| + polling_policy_.reset(); |
| +} |
| + |
| +bool WifiDataProviderChromeOs::GetData(WifiData *data) { |
|
bulach
2011/03/16 18:01:00
nit: WifiData* data
John Knottenbelt
2011/03/16 18:20:14
Done.
|
| + DCHECK(CalledOnClientThread()); |
| + DCHECK(data); |
| + *data = wifi_data_; |
| + return is_first_scan_complete_; |
| +} |
| + |
| WifiDataProviderCommon::WlanApiInterface* |
| WifiDataProviderChromeOs::NewWlanApi(chromeos::NetworkLibrary* lib) { |
| return new chromeos::NetworkLibraryWlanApi(lib); |
| @@ -98,3 +136,46 @@ PollingPolicyInterface* WifiDataProviderChromeOs::NewPollingPolicy() { |
| kTwoNoChangePollingIntervalMilliseconds, |
| kNoWifiPollingIntervalMilliseconds>; |
| } |
| + |
| +void WifiDataProviderChromeOs::DoWifiScanTask() { |
| + CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + scoped_ptr<WifiData> new_data(new WifiData); |
| + if (!wlan_api_->GetAccessPointData(&new_data->access_point_data)) |
| + new_data.reset(); |
| + |
| + client_loop_->PostTask(FROM_HERE, NewRunnableMethod( |
| + this, &WifiDataProviderChromeOs::DidWifiScanTask, |
| + new_data.release())); |
|
bulach
2011/03/16 18:01:00
heh, the thing is that whilst in flight, new_data
John Knottenbelt
2011/03/16 18:20:14
Done.
|
| +} |
| + |
| +void WifiDataProviderChromeOs::DidWifiScanTask(WifiData* new_data) { |
|
bulach
2011/03/16 18:01:00
and this can be come a const WifiData& new_data
John Knottenbelt
2011/03/16 18:20:14
Done.
|
| + DCHECK(CalledOnClientThread()); |
| + scoped_ptr<WifiData> delete_new_data(new_data); |
| + |
| + bool update_available = false; |
| + if (!new_data) |
| + ScheduleNextScan(polling_policy_->NoWifiInterval()); |
| + else { |
| + update_available = wifi_data_.DiffersSignificantly(*new_data); |
| + wifi_data_ = *new_data; |
| + |
| + polling_policy_->UpdatePollingInterval(update_available); |
| + ScheduleNextScan(polling_policy_->PollingInterval()); |
| + } |
| + if (update_available || !is_first_scan_complete_) { |
| + is_first_scan_complete_ = true; |
| + NotifyListeners(); |
| + } |
| +} |
| + |
| +void WifiDataProviderChromeOs::ScheduleNextScan(int interval) { |
| + DCHECK(CalledOnClientThread()); |
| + if (started_) { |
| + BrowserThread::PostDelayedTask( |
| + BrowserThread::UI, |
| + FROM_HERE, |
| + NewRunnableMethod(this, |
| + &WifiDataProviderChromeOs::DoWifiScanTask), |
| + interval); |
| + } |
| +} |