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