| Index: chrome/browser/geolocation/device_data_provider.h
|
| ===================================================================
|
| --- chrome/browser/geolocation/device_data_provider.h (revision 37395)
|
| +++ chrome/browser/geolocation/device_data_provider.h (working copy)
|
| @@ -1,28 +1,7 @@
|
| -// Copyright 2008, Google Inc.
|
| -//
|
| -// Redistribution and use in source and binary forms, with or without
|
| -// modification, are permitted provided that the following conditions are met:
|
| -//
|
| -// 1. Redistributions of source code must retain the above copyright notice,
|
| -// this list of conditions and the following disclaimer.
|
| -// 2. Redistributions in binary form must reproduce the above copyright notice,
|
| -// this list of conditions and the following disclaimer in the documentation
|
| -// and/or other materials provided with the distribution.
|
| -// 3. Neither the name of Google Inc. nor the names of its contributors may be
|
| -// used to endorse or promote products derived from this software without
|
| -// specific prior written permission.
|
| -//
|
| -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
| -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
| -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
| -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
| -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
| -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
| -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
| -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
| -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| -//
|
| +// Copyright (c) 2010 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.
|
| +
|
| // A device data provider provides data from the device that is used by a
|
| // NetworkLocationProvider to obtain a position fix. This data may be either
|
| // cell radio data or wifi data. For a given type of data, we use a singleton
|
| @@ -40,19 +19,21 @@
|
| // This file also declares the data structures used to represent cell radio data
|
| // and wifi data.
|
|
|
| -#ifndef GEARS_GEOLOCATION_DEVICE_DATA_PROVIDER_H__
|
| -#define GEARS_GEOLOCATION_DEVICE_DATA_PROVIDER_H__
|
| +#ifndef CHROME_BROWSER_GEOLOCATION_DEVICE_DATA_PROVIDER_H_
|
| +#define CHROME_BROWSER_GEOLOCATION_DEVICE_DATA_PROVIDER_H_
|
|
|
| #include <algorithm>
|
| +#include <functional>
|
| #include <set>
|
| +#include <string>
|
| #include <vector>
|
| -#include "gears/base/common/basictypes.h" // For int64
|
| -#include "gears/base/common/common.h"
|
| -#include "gears/base/common/mutex.h"
|
| -#include "gears/base/common/scoped_refptr.h" // For RefCount
|
| -#include "gears/base/common/string16.h"
|
| -#include "third_party/scoped_ptr/scoped_ptr.h"
|
|
|
| +#include "base/basictypes.h"
|
| +#include "base/lock.h"
|
| +#include "base/string16.h"
|
| +#include "base/string_util.h"
|
| +#include "base/scoped_ptr.h"
|
| +
|
| // The following data structures are used to store cell radio data and wifi
|
| // data. See the Geolocation API design document at
|
| // http://code.google.com/p/google-gears/wiki/LocationAPI for a more complete
|
| @@ -128,12 +109,12 @@
|
| return !Matches(other);
|
| }
|
|
|
| - std::string16 device_id;
|
| + string16 device_id;
|
| std::vector<CellData> cell_data;
|
| int home_mobile_network_code; // For the device's home network.
|
| int home_mobile_country_code; // For the device's home network.
|
| RadioType radio_type; // Mobile radio type.
|
| - std::string16 carrier; // Carrier name.
|
| + string16 carrier; // Carrier name.
|
| };
|
|
|
| // Wifi data relating to a single access point.
|
| @@ -144,19 +125,19 @@
|
| channel(kint32min),
|
| signal_to_noise(kint32min) {}
|
|
|
| - std::string16 mac_address;
|
| + string16 mac_address;
|
| int radio_signal_strength; // Measured in dBm
|
| int age; // Milliseconds since this access point was detected
|
| int channel;
|
| int signal_to_noise; // Ratio in dB
|
| - std::string16 ssid; // Network identifier
|
| + string16 ssid; // Network identifier
|
| };
|
|
|
| // This is to allow AccessPointData to be used in std::set. We order
|
| // lexicographically by MAC address.
|
| struct AccessPointDataLess : public std::less<AccessPointData> {
|
| - bool operator()(const AccessPointData &data1,
|
| - const AccessPointData &data2) const {
|
| + bool operator()(const AccessPointData& data1,
|
| + const AccessPointData& data2) const {
|
| return data1.mac_address < data2.mac_address;
|
| }
|
| };
|
| @@ -207,23 +188,25 @@
|
| DeviceDataProviderImplBase() : container_(NULL) {}
|
| virtual ~DeviceDataProviderImplBase() {}
|
|
|
| - virtual bool GetData(DataType *data) = 0;
|
| + virtual bool StartDataProvider() = 0;
|
|
|
| + virtual bool GetData(DataType* data) = 0;
|
| +
|
| // Sets the container of this class, which is of type DeviceDataProvider.
|
| // This is required to pass as a parameter when making the callback to
|
| // listeners.
|
| - void SetContainer(DeviceDataProvider<DataType> *container) {
|
| + void SetContainer(DeviceDataProvider<DataType>* container) {
|
| container_ = container;
|
| }
|
|
|
| typedef typename DeviceDataProvider<DataType>::ListenerInterface
|
| ListenerInterface;
|
| - void AddListener(ListenerInterface *listener) {
|
| - MutexLock mutex(&listeners_mutex_);
|
| + void AddListener(ListenerInterface* listener) {
|
| + AutoLock mutex(listeners_mutex_);
|
| listeners_.insert(listener);
|
| }
|
| - bool RemoveListener(ListenerInterface *listener) {
|
| - MutexLock mutex(&listeners_mutex_);
|
| + bool RemoveListener(ListenerInterface* listener) {
|
| + AutoLock mutex(listeners_mutex_);
|
| typename ListenersSet::iterator iter = find(listeners_.begin(),
|
| listeners_.end(),
|
| listener);
|
| @@ -238,7 +221,7 @@
|
| // Calls DeviceDataUpdateAvailable() on all registered listeners.
|
| typedef std::set<ListenerInterface*> ListenersSet;
|
| void NotifyListeners() {
|
| - MutexLock lock(&listeners_mutex_);
|
| + AutoLock lock(listeners_mutex_);
|
| for (typename ListenersSet::const_iterator iter = listeners_.begin();
|
| iter != listeners_.end();
|
| ++iter) {
|
| @@ -247,13 +230,16 @@
|
| }
|
|
|
| private:
|
| - DeviceDataProvider<DataType> *container_;
|
| + DeviceDataProvider<DataType>* container_;
|
|
|
| // The listeners to this class and their mutex.
|
| + // TODO(joth): Once we've established the client is always single threaded,
|
| + // remove mutex and instead capture client's MessageLoop to stage the
|
| + // NotifyListeners callback via.
|
| ListenersSet listeners_;
|
| - Mutex listeners_mutex_;
|
| + Lock listeners_mutex_;
|
|
|
| - DISALLOW_EVIL_CONSTRUCTORS(DeviceDataProviderImplBase);
|
| + DISALLOW_COPY_AND_ASSIGN(DeviceDataProviderImplBase);
|
| };
|
|
|
| typedef DeviceDataProviderImplBase<RadioData> RadioDataProviderImplBase;
|
| @@ -270,8 +256,10 @@
|
| // Interface to be implemented by listeners to a device data provider.
|
| class ListenerInterface {
|
| public:
|
| + // NOTE this may be called back in the context of the implementation private
|
| + // worker thread. (TODO Is there a naming convention to use for this?)
|
| virtual void DeviceDataUpdateAvailable(
|
| - DeviceDataProvider<DataType> *provider) = 0;
|
| + DeviceDataProvider<DataType>* provider) = 0;
|
| virtual ~ListenerInterface() {}
|
| };
|
|
|
| @@ -279,7 +267,7 @@
|
| // implementation used by the singleton instance. This factory approach is
|
| // used to abastract accross both platform-specific implementation and to
|
| // inject mock implementations for testing.
|
| - typedef DeviceDataProviderImplBase<DataType> *(*ImplFactoryFunction)(void);
|
| + typedef DeviceDataProviderImplBase<DataType>* (*ImplFactoryFunction)(void);
|
| static void SetFactory(ImplFactoryFunction factory_function_in) {
|
| factory_function_ = factory_function_in;
|
| }
|
| @@ -290,14 +278,16 @@
|
|
|
| // Adds a listener, which will be called back with DeviceDataUpdateAvailable
|
| // whenever new data is available. Returns the singleton instance.
|
| - static DeviceDataProvider *Register(ListenerInterface *listener) {
|
| + static DeviceDataProvider* Register(ListenerInterface* listener) {
|
| + // TODO(joth): The following comment applied when this was used in Gears;
|
| + // revisit if this is still needed once usage is established in Chromium.
|
| // We protect against Register and Unregister being called asynchronously
|
| // from different threads. This is the case when a device data provider is
|
| // used by a NetworkLocationProvider object. Register is always called from
|
| // the JavaScript thread. Unregister is called when NetworkLocationProvider
|
| // objects are destructed, which happens asynchronously once the
|
| // NetworkLocationProvider HTTP request has completed.
|
| - MutexLock mutex(&instance_mutex_);
|
| + AutoLock mutex(instance_mutex_);
|
| if (!instance_) {
|
| instance_ = new DeviceDataProvider();
|
| }
|
| @@ -309,8 +299,8 @@
|
|
|
| // Removes a listener. If this is the last listener, deletes the singleton
|
| // instance. Return value indicates success.
|
| - static bool Unregister(ListenerInterface *listener) {
|
| - MutexLock mutex(&instance_mutex_);
|
| + static bool Unregister(ListenerInterface* listener) {
|
| + AutoLock mutex(instance_mutex_);
|
| if (!instance_->RemoveListener(listener)) {
|
| return false;
|
| }
|
| @@ -324,41 +314,44 @@
|
| // Provides whatever data the provider has, which may be nothing. Return
|
| // value indicates whether this is all the data the provider could ever
|
| // obtain.
|
| - bool GetData(DataType *data) {
|
| + bool GetData(DataType* data) {
|
| return impl_->GetData(data);
|
| }
|
|
|
| private:
|
| // Private constructor and destructor, callers access singleton through
|
| // Register and Unregister.
|
| - DeviceDataProvider() {
|
| + DeviceDataProvider() : count_(0) {
|
| assert(factory_function_);
|
| impl_.reset((*factory_function_)());
|
| impl_->SetContainer(this);
|
| + bool started = impl_->StartDataProvider();
|
| + assert(started);
|
| }
|
| virtual ~DeviceDataProvider() {}
|
|
|
| void Ref() {
|
| - count_.Ref();
|
| + ++count_;
|
| }
|
| // Returns true when the ref count transitions from 1 to 0.
|
| bool Unref() {
|
| - return count_.Unref();
|
| + --count_;
|
| + return count_ == 0;
|
| }
|
|
|
| - void AddListener(ListenerInterface *listener) {
|
| + void AddListener(ListenerInterface* listener) {
|
| impl_->AddListener(listener);
|
| }
|
|
|
| - bool RemoveListener(ListenerInterface *listener) {
|
| + bool RemoveListener(ListenerInterface* listener) {
|
| return impl_->RemoveListener(listener);
|
| }
|
|
|
| - static DeviceDataProviderImplBase<DataType> *DefaultFactoryFunction();
|
| + static DeviceDataProviderImplBase<DataType>* DefaultFactoryFunction();
|
|
|
| // The singleton instance of this class and its mutex.
|
| - static DeviceDataProvider *instance_;
|
| - static Mutex instance_mutex_;
|
| + static DeviceDataProvider* instance_;
|
| + static Lock instance_mutex_;
|
|
|
| // The factory function used to create the singleton instance.
|
| static ImplFactoryFunction factory_function_;
|
| @@ -366,19 +359,18 @@
|
| // The internal implementation.
|
| scoped_ptr<DeviceDataProviderImplBase<DataType> > impl_;
|
|
|
| - RefCount count_;
|
| + int count_;
|
|
|
| DISALLOW_EVIL_CONSTRUCTORS(DeviceDataProvider);
|
| };
|
|
|
| // static
|
| template<typename DataType>
|
| -Mutex DeviceDataProvider<DataType>::instance_mutex_;
|
| +Lock DeviceDataProvider<DataType>::instance_mutex_;
|
|
|
| // static
|
| template<typename DataType>
|
| -DeviceDataProvider<DataType> *DeviceDataProvider<DataType>::instance_ =
|
| - NULL;
|
| +DeviceDataProvider<DataType>* DeviceDataProvider<DataType>::instance_ = NULL;
|
|
|
| // static
|
| template<typename DataType>
|
| @@ -388,4 +380,4 @@
|
| typedef DeviceDataProvider<RadioData> RadioDataProvider;
|
| typedef DeviceDataProvider<WifiData> WifiDataProvider;
|
|
|
| -#endif // GEARS_GEOLOCATION_DEVICE_DATA_PROVIDER_H__
|
| +#endif // CHROME_BROWSER_GEOLOCATION_DEVICE_DATA_PROVIDER_H_
|
|
|