| Index: content/browser/geolocation/wifi_data_provider_common.cc
|
| diff --git a/content/browser/geolocation/wifi_data_provider_common.cc b/content/browser/geolocation/wifi_data_provider_common.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..572455a6c4f3c1b1bf7797ecd1c645f4d7004f4e
|
| --- /dev/null
|
| +++ b/content/browser/geolocation/wifi_data_provider_common.cc
|
| @@ -0,0 +1,91 @@
|
| +// 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.
|
| +
|
| +#include "content/browser/geolocation/wifi_data_provider_common.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/location.h"
|
| +#include "base/single_thread_task_runner.h"
|
| +#include "base/strings/stringprintf.h"
|
| +#include "base/strings/utf_string_conversions.h"
|
| +
|
| +namespace content {
|
| +
|
| +base::string16 MacAddressAsString16(const uint8_t mac_as_int[6]) {
|
| + // mac_as_int is big-endian. Write in byte chunks.
|
| + // Format is XX-XX-XX-XX-XX-XX.
|
| + static const char* const kMacFormatString =
|
| + "%02x-%02x-%02x-%02x-%02x-%02x";
|
| + return base::ASCIIToUTF16(base::StringPrintf(kMacFormatString,
|
| + mac_as_int[0],
|
| + mac_as_int[1],
|
| + mac_as_int[2],
|
| + mac_as_int[3],
|
| + mac_as_int[4],
|
| + mac_as_int[5]));
|
| +}
|
| +
|
| +WifiDataProviderCommon::WifiDataProviderCommon()
|
| + : is_first_scan_complete_(false),
|
| + weak_factory_(this) {
|
| +}
|
| +
|
| +WifiDataProviderCommon::~WifiDataProviderCommon() {
|
| +}
|
| +
|
| +void WifiDataProviderCommon::StartDataProvider() {
|
| + DCHECK(wlan_api_ == NULL);
|
| + 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;
|
| + }
|
| +
|
| + 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);
|
| +}
|
| +
|
| +void WifiDataProviderCommon::StopDataProvider() {
|
| + wlan_api_.reset();
|
| + polling_policy_.reset();
|
| +}
|
| +
|
| +bool WifiDataProviderCommon::GetData(WifiData* data) {
|
| + *data = wifi_data_;
|
| + // If we've successfully completed a scan, indicate that we have all of the
|
| + // data we can get.
|
| + return is_first_scan_complete_;
|
| +}
|
| +
|
| +void WifiDataProviderCommon::DoWifiScanTask() {
|
| + bool update_available = false;
|
| + WifiData new_data;
|
| + if (!wlan_api_->GetAccessPointData(&new_data.access_point_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;
|
| + RunCallbacks();
|
| + }
|
| +}
|
| +
|
| +void WifiDataProviderCommon::ScheduleNextScan(int interval) {
|
| + client_task_runner()->PostDelayedTask(
|
| + FROM_HERE, base::Bind(&WifiDataProviderCommon::DoWifiScanTask,
|
| + weak_factory_.GetWeakPtr()),
|
| + base::TimeDelta::FromMilliseconds(interval));
|
| +}
|
| +
|
| +} // namespace content
|
|
|