15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_API_BLUETOOTH_BLUETOOTH_API_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_API_BLUETOOTH_BLUETOOTH_API_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/bluetooth/bluetooth_extension_function.h"
13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/common/extensions/api/bluetooth.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "device/bluetooth/bluetooth_device.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/browser_context_keyed_api_factory.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/event_router.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/extension_function.h"
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace content {
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class BrowserContext;
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace device {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BluetoothAdapter;
25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass BluetoothEventRouter;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The profile-keyed service that manages the bluetooth extension API.
32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// All methods of this class must be called on the UI thread.
33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// TODO(rpaquay): Rename this and move to separate file.
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class BluetoothAPI : public BrowserContextKeyedAPI,
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     public EventRouter::Observer {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Convenience method to get the BluetoothAPI for a browser context.
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static BluetoothAPI* Get(content::BrowserContext* context);
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static BrowserContextKeyedAPIFactory<BluetoothAPI>* GetFactoryInstance();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit BluetoothAPI(content::BrowserContext* context);
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~BluetoothAPI();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  BluetoothEventRouter* event_router();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // KeyedService implementation.
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Shutdown() OVERRIDE;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // EventRouter::Observer implementation.
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnListenerAdded(const EventListenerInfo& details) OVERRIDE;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnListenerRemoved(const EventListenerInfo& details) OVERRIDE;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // BrowserContextKeyedAPI implementation.
56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  friend class BrowserContextKeyedAPIFactory<BluetoothAPI>;
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static const char* service_name() { return "BluetoothAPI"; }
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static const bool kServiceRedirectedInIncognito = true;
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static const bool kServiceIsNULLWhileTesting = true;
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  content::BrowserContext* browser_context_;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Created lazily on first access.
64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_ptr<BluetoothEventRouter> event_router_;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace api {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass BluetoothGetAdapterStateFunction : public BluetoothExtensionFunction {
70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public:
71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DECLARE_EXTENSION_FUNCTION("bluetooth.getAdapterState",
72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                             BLUETOOTH_GETADAPTERSTATE)
73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected:
75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual ~BluetoothGetAdapterStateFunction();
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // BluetoothExtensionFunction:
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual bool DoWork(scoped_refptr<device::BluetoothAdapter> adapter) OVERRIDE;
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass BluetoothGetDevicesFunction : public BluetoothExtensionFunction {
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public:
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DECLARE_EXTENSION_FUNCTION("bluetooth.getDevices", BLUETOOTH_GETDEVICES)
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected:
86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual ~BluetoothGetDevicesFunction();
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // BluetoothExtensionFunction:
89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual bool DoWork(scoped_refptr<device::BluetoothAdapter> adapter) OVERRIDE;
90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass BluetoothGetDeviceFunction : public BluetoothExtensionFunction {
93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public:
94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DECLARE_EXTENSION_FUNCTION("bluetooth.getDevice", BLUETOOTH_GETDEVICE)
95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // BluetoothExtensionFunction:
97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual bool DoWork(scoped_refptr<device::BluetoothAdapter> adapter) OVERRIDE;
98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected:
100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual ~BluetoothGetDeviceFunction();
101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BluetoothStartDiscoveryFunction : public BluetoothExtensionFunction {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("bluetooth.startDiscovery",
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             BLUETOOTH_STARTDISCOVERY)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BluetoothStartDiscoveryFunction() {}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // BluetoothExtensionFunction:
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool DoWork(scoped_refptr<device::BluetoothAdapter> adapter) OVERRIDE;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSuccessCallback();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnErrorCallback();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BluetoothStopDiscoveryFunction : public BluetoothExtensionFunction {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DECLARE_EXTENSION_FUNCTION("bluetooth.stopDiscovery", BLUETOOTH_STOPDISCOVERY)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BluetoothStopDiscoveryFunction() {}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // BluetoothExtensionFunction:
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool DoWork(scoped_refptr<device::BluetoothAdapter> adapter) OVERRIDE;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSuccessCallback();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnErrorCallback();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace api
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_API_BLUETOOTH_BLUETOOTH_API_H_
138