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_ 110