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..541fc3b19ed053f690eaf6c09ef47b43e75adcfe 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 true; |
+ } |
+ |
+ 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) { |
+ 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,51 @@ PollingPolicyInterface* WifiDataProviderChromeOs::NewPollingPolicy() { |
kTwoNoChangePollingIntervalMilliseconds, |
kNoWifiPollingIntervalMilliseconds>; |
} |
+ |
+void WifiDataProviderChromeOs::DoWifiScanTask() { |
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ WifiData new_data; |
+ if (!wlan_api_->GetAccessPointData(&new_data.access_point_data)) { |
+ client_loop()->PostTask(FROM_HERE, NewRunnableMethod( |
+ this, &WifiDataProviderChromeOs::DidWifiScanTaskNoResults)); |
+ } |
+ else { |
+ client_loop()->PostTask(FROM_HERE, NewRunnableMethod( |
+ this, &WifiDataProviderChromeOs::DidWifiScanTask, |
+ new_data)); |
+ } |
+} |
+ |
+void WifiDataProviderChromeOs::DidWifiScanTaskNoResults() { |
+ DCHECK(CalledOnClientThread()); |
+ ScheduleNextScan(polling_policy_->NoWifiInterval()); |
+ MaybeNotifyListeners(false); |
+} |
+ |
+void WifiDataProviderChromeOs::DidWifiScanTask(const WifiData& new_data) { |
+ DCHECK(CalledOnClientThread()); |
+ bool update_available = wifi_data_.DiffersSignificantly(new_data); |
+ wifi_data_ = new_data; |
+ polling_policy_->UpdatePollingInterval(update_available); |
+ ScheduleNextScan(polling_policy_->PollingInterval()); |
+ MaybeNotifyListeners(update_available); |
+} |
+ |
+void WifiDataProviderChromeOs::MaybeNotifyListeners(bool update_available) { |
+ 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); |
+ } |
+} |