| // Copyright (c) 2012 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. |
| |
| #ifndef CHROME_BROWSER_CHROMEOS_EXTENSIONS_BLUETOOTH_EVENT_ROUTER_H_ |
| #define CHROME_BROWSER_CHROMEOS_EXTENSIONS_BLUETOOTH_EVENT_ROUTER_H_ |
| |
| #include <map> |
| |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/scoped_vector.h" |
| #include "chrome/browser/chromeos/bluetooth/bluetooth_adapter.h" |
| #include "chrome/browser/chromeos/bluetooth/bluetooth_socket.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/common/extensions/api/experimental_bluetooth.h" |
| |
| namespace chromeos { |
| |
| class ExtensionBluetoothEventRouter |
| : public chromeos::BluetoothAdapter::Observer { |
| public: |
| explicit ExtensionBluetoothEventRouter(Profile* profile); |
| virtual ~ExtensionBluetoothEventRouter(); |
| |
| const chromeos::BluetoothAdapter& adapter() const { return *adapter_.get(); } |
| |
| // GetMutableAdapter will never return NULL. |
| chromeos::BluetoothAdapter* GetMutableAdapter() { return adapter_.get(); } |
| |
| // Register the BluetoothSocket |socket| for use by the extensions system. |
| // This class will hold onto the socket for its lifetime, or until |
| // ReleaseSocket is called for the socket. Returns an id for the socket. |
| int RegisterSocket(scoped_refptr<BluetoothSocket> socket); |
| |
| // Release the BluetoothSocket corresponding to |id|. Returns true if |
| // the socket was found and released, false otherwise. |
| bool ReleaseSocket(int id); |
| |
| // Get the BluetoothSocket corresponding to |id|. |
| scoped_refptr<BluetoothSocket> GetSocket(int id); |
| |
| // Sets whether this Profile is responsible for the discovering state of the |
| // adapter. |
| void SetResponsibleForDiscovery(bool responsible); |
| bool IsResponsibleForDiscovery() const; |
| |
| // Sets whether or not DeviceAdded events will be dispatched to extensions. |
| void SetSendDiscoveryEvents(bool should_send); |
| |
| // Dispatch an event that takes a device as a parameter to all renderers. |
| void DispatchDeviceEvent( |
| const char* event_name, |
| const extensions::api::experimental_bluetooth::Device& device); |
| |
| // Override from chromeos::BluetoothAdapter::Observer |
| virtual void AdapterPresentChanged(chromeos::BluetoothAdapter* adapter, |
| bool present) OVERRIDE; |
| virtual void AdapterPoweredChanged(chromeos::BluetoothAdapter* adapter, |
| bool has_power) OVERRIDE; |
| virtual void AdapterDiscoveringChanged(chromeos::BluetoothAdapter* adapter, |
| bool discovering) OVERRIDE; |
| virtual void DeviceAdded(chromeos::BluetoothAdapter* adapter, |
| chromeos::BluetoothDevice* device) OVERRIDE; |
| |
| // Exposed for testing. |
| void SetAdapterForTest(chromeos::BluetoothAdapter* adapter) { |
| adapter_ = adapter; |
| } |
| private: |
| void DispatchBooleanValueEvent(const char* event_name, bool value); |
| |
| bool send_discovery_events_; |
| bool responsible_for_discovery_; |
| |
| Profile* profile_; |
| scoped_refptr<chromeos::BluetoothAdapter> adapter_; |
| |
| // The next id to use for referring to a BluetoothSocket. We avoid using |
| // the fd of the socket because we don't want to leak that information to |
| // the extension javascript. |
| int next_socket_id_; |
| |
| typedef std::map<int, scoped_refptr<BluetoothSocket> > SocketMap; |
| SocketMap socket_map_; |
| |
| typedef ScopedVector<extensions::api::experimental_bluetooth::Device> |
| DeviceList; |
| DeviceList discovered_devices_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ExtensionBluetoothEventRouter); |
| }; |
| |
| } // namespace chromeos |
| |
| #endif // CHROME_BROWSER_CHROMEOS_EXTENSIONS_BLUETOOTH_EVENT_ROUTER_H_ |