Home | History | Annotate | Download | only in location
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_EXTENSIONS_API_LOCATION_LOCATION_MANAGER_H_
      6 #define CHROME_BROWSER_EXTENSIONS_API_LOCATION_LOCATION_MANAGER_H_
      7 
      8 #include <string>
      9 
     10 #include "base/scoped_observer.h"
     11 #include "extensions/browser/browser_context_keyed_api_factory.h"
     12 #include "extensions/browser/extension_registry_observer.h"
     13 
     14 namespace content {
     15 class BrowserContext;
     16 struct Geoposition;
     17 }  // namespace content
     18 
     19 namespace extensions {
     20 class ExtensionRegistry;
     21 class LocationManager;
     22 class LocationRequest;
     23 
     24 namespace api {
     25 namespace location {
     26 
     27 struct Coordinates;
     28 
     29 }  // namespace location
     30 }  // namespace api
     31 
     32 // BrowserContext's manager of all location watch requests created by
     33 // chrome.location API. Lives in the UI thread.
     34 class LocationManager : public BrowserContextKeyedAPI,
     35                         public ExtensionRegistryObserver {
     36  public:
     37   explicit LocationManager(content::BrowserContext* context);
     38   virtual ~LocationManager();
     39 
     40   // Adds location request for the given extension, and starts the location
     41   // tracking.
     42   void AddLocationRequest(
     43       const std::string& extension_id,
     44       const std::string& request_name,
     45       const double* distance_update_threshold_meters,
     46       const double* time_between_updates_ms);
     47 
     48   // Cancels and removes the request with the given |name| for the given
     49   // extension.
     50   void RemoveLocationRequest(const std::string& extension_id,
     51                              const std::string& name);
     52 
     53   // BrowserContextKeyedAPI implementation.
     54   static BrowserContextKeyedAPIFactory<LocationManager>* GetFactoryInstance();
     55 
     56   // Convenience method to get the LocationManager for a context.
     57   static LocationManager* Get(content::BrowserContext* context);
     58 
     59  private:
     60   friend class LocationRequest;
     61   friend class BrowserContextKeyedAPIFactory<LocationManager>;
     62 
     63   typedef std::string ExtensionId;
     64   typedef scoped_refptr<LocationRequest> LocationRequestPointer;
     65   typedef std::multimap<ExtensionId, LocationRequestPointer> LocationRequestMap;
     66   typedef LocationRequestMap::iterator LocationRequestIterator;
     67 
     68   // Converts |position| from GeolocationProvider to the location API
     69   // |coordinates|.
     70   static void GeopositionToApiCoordinates(
     71       const content::Geoposition& position,
     72       api::location::Coordinates* coordinates);
     73 
     74   // Sends a location update to the extension.
     75   void SendLocationUpdate(const std::string& extension_id,
     76                           const std::string& request_name,
     77                           const content::Geoposition& position);
     78 
     79   // ExtensionRegistryObserver implementation.
     80   virtual void OnExtensionLoaded(content::BrowserContext* browser_context,
     81                                  const Extension* extension) OVERRIDE;
     82   virtual void OnExtensionUnloaded(
     83       content::BrowserContext* browser_context,
     84       const Extension* extension,
     85       UnloadedExtensionInfo::Reason reason) OVERRIDE;
     86 
     87   // BrowserContextKeyedAPI implementation.
     88   static const char* service_name() { return "LocationManager"; }
     89 
     90   content::BrowserContext* const browser_context_;
     91 
     92   // A map of our pending location requests, per extension.
     93   // Invariant: None of the LocationRequestLists are empty.
     94   LocationRequestMap location_requests_;
     95 
     96   ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
     97       extension_registry_observer_;
     98 
     99   DISALLOW_COPY_AND_ASSIGN(LocationManager);
    100 };
    101 
    102 }  // namespace extensions
    103 
    104 #endif  // CHROME_BROWSER_EXTENSIONS_API_LOCATION_LOCATION_MANAGER_H_
    105