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