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 13namespace device { 14 15class BluetoothDevice; 16class BluetoothProfileMac; 17class BluetoothSocket; 18class 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. 32class 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