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

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

Issue 2188933002: Revert of Reland: Geolocation: move from content/browser to device/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 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
new file mode 100644
index 0000000000000000000000000000000000000000..4f148667f6357abfb87d4cdc5d978e3236d91e36
--- /dev/null
+++ b/content/browser/geolocation/wifi_data_provider_chromeos.cc
@@ -0,0 +1,175 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Provides wifi scan API binding for chromeos, using proprietary APIs.
+
+#include "content/browser/geolocation/wifi_data_provider_chromeos.h"
+
+#include <stdint.h>
+
+#include "base/bind.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chromeos/network/geolocation_handler.h"
+#include "content/browser/geolocation/wifi_data_provider_manager.h"
+#include "content/public/browser/browser_thread.h"
+
+namespace content {
+
+namespace {
+
+// The time periods between successive polls of the wifi data.
+const int kDefaultPollingIntervalMilliseconds = 10 * 1000; // 10s
+const int kNoChangePollingIntervalMilliseconds = 2 * 60 * 1000; // 2 mins
+const int kTwoNoChangePollingIntervalMilliseconds = 10 * 60 * 1000; // 10 mins
+const int kNoWifiPollingIntervalMilliseconds = 20 * 1000; // 20s
+
+} // namespace
+
+WifiDataProviderChromeOs::WifiDataProviderChromeOs()
+ : started_(false), is_first_scan_complete_(false) {
+}
+
+WifiDataProviderChromeOs::~WifiDataProviderChromeOs() {
+}
+
+void WifiDataProviderChromeOs::StartDataProvider() {
+ DCHECK(CalledOnClientThread());
+
+ DCHECK(polling_policy_ == NULL);
+ polling_policy_.reset(
+ new GenericWifiPollingPolicy<kDefaultPollingIntervalMilliseconds,
+ kNoChangePollingIntervalMilliseconds,
+ kTwoNoChangePollingIntervalMilliseconds,
+ kNoWifiPollingIntervalMilliseconds>);
+
+ ScheduleStart();
+}
+
+void WifiDataProviderChromeOs::StopDataProvider() {
+ DCHECK(CalledOnClientThread());
+
+ polling_policy_.reset();
+ ScheduleStop();
+}
+
+bool WifiDataProviderChromeOs::GetData(WifiData* data) {
+ DCHECK(CalledOnClientThread());
+ DCHECK(data);
+ *data = wifi_data_;
+ return is_first_scan_complete_;
+}
+
+void WifiDataProviderChromeOs::DoStartTaskOnUIThread() {
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DoWifiScanTaskOnUIThread();
+}
+
+void WifiDataProviderChromeOs::DoWifiScanTaskOnUIThread() {
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ // This method could be scheduled after a ScheduleStop.
+ if (!started_)
+ return;
+
+ WifiData new_data;
+
+ if (GetAccessPointData(&new_data.access_point_data)) {
+ client_task_runner()->PostTask(
+ FROM_HERE,
+ base::Bind(&WifiDataProviderChromeOs::DidWifiScanTask, this, new_data));
+ } else {
+ client_task_runner()->PostTask(
+ FROM_HERE,
+ base::Bind(&WifiDataProviderChromeOs::DidWifiScanTaskNoResults, this));
+ }
+}
+
+void WifiDataProviderChromeOs::DidWifiScanTaskNoResults() {
+ DCHECK(CalledOnClientThread());
+ // Schedule next scan if started (StopDataProvider could have been called
+ // in between DoWifiScanTaskOnUIThread and this method).
+ if (started_)
+ ScheduleNextScan(polling_policy_->NoWifiInterval());
+}
+
+void WifiDataProviderChromeOs::DidWifiScanTask(const WifiData& new_data) {
+ DCHECK(CalledOnClientThread());
+ bool update_available = wifi_data_.DiffersSignificantly(new_data);
+ wifi_data_ = new_data;
+ // Schedule next scan if started (StopDataProvider could have been called
+ // in between DoWifiScanTaskOnUIThread and this method).
+ if (started_) {
+ polling_policy_->UpdatePollingInterval(update_available);
+ ScheduleNextScan(polling_policy_->PollingInterval());
+ }
+
+ if (update_available || !is_first_scan_complete_) {
+ is_first_scan_complete_ = true;
+ RunCallbacks();
+ }
+}
+
+void WifiDataProviderChromeOs::ScheduleNextScan(int interval) {
+ DCHECK(CalledOnClientThread());
+ DCHECK(started_);
+ BrowserThread::PostDelayedTask(
+ BrowserThread::UI,
+ FROM_HERE,
+ base::Bind(&WifiDataProviderChromeOs::DoWifiScanTaskOnUIThread, this),
+ base::TimeDelta::FromMilliseconds(interval));
+}
+
+void WifiDataProviderChromeOs::ScheduleStop() {
+ DCHECK(CalledOnClientThread());
+ DCHECK(started_);
+ started_ = false;
+}
+
+void WifiDataProviderChromeOs::ScheduleStart() {
+ DCHECK(CalledOnClientThread());
+ DCHECK(!started_);
+ started_ = true;
+ // 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.
+ BrowserThread::PostTask(
+ BrowserThread::UI,
+ FROM_HERE,
+ base::Bind(&WifiDataProviderChromeOs::DoStartTaskOnUIThread, this));
+}
+
+bool WifiDataProviderChromeOs::GetAccessPointData(
+ WifiData::AccessPointDataSet* result) {
+ // If wifi isn't enabled, we've effectively completed the task.
+ // Return true to indicate an empty access point list.
+ if (!chromeos::NetworkHandler::Get()->geolocation_handler()->wifi_enabled())
+ return true;
+
+ chromeos::WifiAccessPointVector access_points;
+ int64_t age_ms = 0;
+ if (!chromeos::NetworkHandler::Get()->geolocation_handler()->
+ GetWifiAccessPoints(&access_points, &age_ms)) {
+ return false;
+ }
+ for (const auto& access_point : access_points) {
+ AccessPointData ap_data;
+ ap_data.mac_address = base::ASCIIToUTF16(access_point.mac_address);
+ ap_data.radio_signal_strength = access_point.signal_strength;
+ ap_data.channel = access_point.channel;
+ ap_data.signal_to_noise = access_point.signal_to_noise;
+ ap_data.ssid = base::UTF8ToUTF16(access_point.ssid);
+ result->insert(ap_data);
+ }
+ // If the age is significantly longer than our long polling time, assume the
+ // data is stale and return false which will trigger a faster update.
+ if (age_ms > kTwoNoChangePollingIntervalMilliseconds * 2)
+ return false;
+ return true;
+}
+
+// static
+WifiDataProvider* WifiDataProviderManager::DefaultFactoryFunction() {
+ return new WifiDataProviderChromeOs();
+}
+
+} // namespace content

Powered by Google App Engine
This is Rietveld 408576698