Torne (Richard Coles) | c2e0dbd | 2013-05-09 18:35:53 +0100 | [diff] [blame] | 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 DEVICE_BLUETOOTH_BLUETOOTH_PROFILE_H_ |
| 6 | #define DEVICE_BLUETOOTH_BLUETOOTH_PROFILE_H_ |
| 7 | |
| 8 | #include <string> |
| 9 | |
| 10 | #include "base/callback.h" |
| 11 | #include "base/memory/ref_counted.h" |
| 12 | |
| 13 | namespace device { |
| 14 | |
| 15 | class BluetoothDevice; |
| 16 | class BluetoothProfileMac; |
| 17 | class BluetoothSocket; |
| 18 | class MockBluetoothProfile; |
| 19 | |
| 20 | // BluetoothProfile represents an implementation of either a client or server |
| 21 | // of a particular specified profile (aka service or protocol in other |
| 22 | // standards). |
| 23 | // |
| 24 | // Profile implementations are created by registering them through the static |
| 25 | // BluetoothProfile::Register() method and are always identified by a UUID |
| 26 | // which in any method may be specified in the short or long form. |
| 27 | // |
| 28 | // The lifecycle of BluetoothProfile instances is managed by the implementation |
| 29 | // but they are guaranteed to exist once provided to a Register() callback until |
| 30 | // the instance's Unregister() method is called, so others may hold on to |
| 31 | // pointers to them. |
| 32 | class BluetoothProfile { |
| 33 | public: |
| 34 | // Options used to register a BluetoothProfile object. |
| 35 | struct Options { |
| 36 | Options(); |
| 37 | ~Options(); |
| 38 | |
| 39 | // Human readable name of the Profile, e.g. "Health Device". |
| 40 | // Exported in the adapter's SDP or GATT tables where relevant. |
| 41 | std::string name; |
| 42 | |
| 43 | // RFCOMM channel used by the profile. |
| 44 | // Exported in the adapter's SDP or GATT tables where relevant. |
| 45 | uint16 channel; |
| 46 | |
| 47 | // L2CAP PSM number. |
| 48 | // Exported in the adapter's SDP or GATT tables where relevant. |
| 49 | uint16 psm; |
| 50 | |
| 51 | // Specifies whether pairing (and encryption) is required to be able to |
| 52 | // connect. Defaults to false. |
| 53 | bool require_authentication; |
| 54 | |
| 55 | // Specifies whether user authorization is required to be able to connect. |
| 56 | // Defaults to false. |
| 57 | bool require_authorization; |
| 58 | |
| 59 | // Specifies whether this profile will be automatically connected if any |
| 60 | // other profile of a device conects to the host. |
| 61 | // Defaults to false. |
| 62 | bool auto_connect; |
| 63 | |
| 64 | // Implemented version of the profile. |
| 65 | // Exported in the adapter's SDP or GATT tables where relevant. |
| 66 | uint16 version; |
| 67 | |
| 68 | // Implemented feature set of the profile. |
| 69 | // Exported in the adapter's SDP or GATT tables where relevant. |
| 70 | uint16 features; |
| 71 | }; |
| 72 | |
| 73 | // Register an implementation of the profile with UUID |uuid| and |
| 74 | // additional details specified in |options|. The corresponding profile |
| 75 | // object will be created and returned by |callback|. If the profile cannot |
| 76 | // be registered, NULL will be passed. |
| 77 | // |
| 78 | // This pointer is not owned by the receiver, but will not be freed unless |
| 79 | // its Unregister() method is called. |
| 80 | typedef base::Callback<void(BluetoothProfile*)> ProfileCallback; |
| 81 | static void Register(const std::string& uuid, |
| 82 | const Options& options, |
| 83 | const ProfileCallback& callback); |
| 84 | |
| 85 | // Unregister the profile. This deletes the profile object so, once called, |
| 86 | // any pointers to the profile should be discarded. |
| 87 | virtual void Unregister() = 0; |
| 88 | |
| 89 | // Set the connection callback for the profile to |callback|, any successful |
| 90 | // connection initiated by BluetoothDevice::ConnectToProfile() or incoming |
| 91 | // connections from devices, will have a BluetoothSocket created and passed |
| 92 | // to this callback. |
| 93 | // |
| 94 | // The socket will be closed when all references are released; none of the |
| 95 | // BluetoothProfile, or BluetoothAdapter or BluetoothDevice objects are |
| 96 | // guaranteed to hold a reference so this may outlive all of them. |
| 97 | typedef base::Callback<void( |
| 98 | const BluetoothDevice*, |
| 99 | scoped_refptr<BluetoothSocket>)> ConnectionCallback; |
| 100 | virtual void SetConnectionCallback(const ConnectionCallback& callback) = 0; |
| 101 | |
| 102 | protected: |
| 103 | BluetoothProfile(); |
| 104 | virtual ~BluetoothProfile(); |
| 105 | }; |
| 106 | |
| 107 | } // namespace device |
| 108 | |
| 109 | #endif // DEVICE_BLUETOOTH_BLUETOOTH_PROFILE_H_ |