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

Unified Diff: content/browser/geolocation/wifi_data_provider_chromeos.cc

Issue 6696022: Refactor WifiDataProviderChromeOs to implement WifiDataProviderImplBase directly. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix GeolocationDeviceDataProviderWifiData.CreateDestroy unit test. Created 9 years, 9 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
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);
+ }
+}
« no previous file with comments | « content/browser/geolocation/wifi_data_provider_chromeos.h ('k') | content/browser/geolocation/wifi_data_provider_common.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698