blob: 4ff2480c21d336171cca3335d9819f7375e840e1 [file] [log] [blame]
// Copyright (c) 2013 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 DEVICE_BLUETOOTH_BLUETOOTH_PROFILE_H_
#define DEVICE_BLUETOOTH_BLUETOOTH_PROFILE_H_
#include <string>
#include "base/callback.h"
#include "base/memory/ref_counted.h"
namespace device {
class BluetoothDevice;
class BluetoothProfileMac;
class BluetoothSocket;
class MockBluetoothProfile;
// BluetoothProfile represents an implementation of either a client or server
// of a particular specified profile (aka service or protocol in other
// standards).
//
// Profile implementations are created by registering them through the static
// BluetoothProfile::Register() method and are always identified by a UUID
// which in any method may be specified in the short or long form.
//
// The lifecycle of BluetoothProfile instances is managed by the implementation
// but they are guaranteed to exist once provided to a Register() callback until
// the instance's Unregister() method is called, so others may hold on to
// pointers to them.
class BluetoothProfile {
public:
// Options used to register a BluetoothProfile object.
struct Options {
Options();
~Options();
// Human readable name of the Profile, e.g. "Health Device".
// Exported in the adapter's SDP or GATT tables where relevant.
std::string name;
// RFCOMM channel used by the profile.
// Exported in the adapter's SDP or GATT tables where relevant.
uint16 channel;
// L2CAP PSM number.
// Exported in the adapter's SDP or GATT tables where relevant.
uint16 psm;
// Specifies whether pairing (and encryption) is required to be able to
// connect. Defaults to false.
bool require_authentication;
// Specifies whether user authorization is required to be able to connect.
// Defaults to false.
bool require_authorization;
// Specifies whether this profile will be automatically connected if any
// other profile of a device conects to the host.
// Defaults to false.
bool auto_connect;
// Implemented version of the profile.
// Exported in the adapter's SDP or GATT tables where relevant.
uint16 version;
// Implemented feature set of the profile.
// Exported in the adapter's SDP or GATT tables where relevant.
uint16 features;
};
// Register an implementation of the profile with UUID |uuid| and
// additional details specified in |options|. The corresponding profile
// object will be created and returned by |callback|. If the profile cannot
// be registered, NULL will be passed.
//
// This pointer is not owned by the receiver, but will not be freed unless
// its Unregister() method is called.
typedef base::Callback<void(BluetoothProfile*)> ProfileCallback;
static void Register(const std::string& uuid,
const Options& options,
const ProfileCallback& callback);
// Unregister the profile. This deletes the profile object so, once called,
// any pointers to the profile should be discarded.
virtual void Unregister() = 0;
// Set the connection callback for the profile to |callback|, any successful
// connection initiated by BluetoothDevice::ConnectToProfile() or incoming
// connections from devices, will have a BluetoothSocket created and passed
// to this callback.
//
// The socket will be closed when all references are released; none of the
// BluetoothProfile, or BluetoothAdapter or BluetoothDevice objects are
// guaranteed to hold a reference so this may outlive all of them.
typedef base::Callback<void(
const BluetoothDevice*,
scoped_refptr<BluetoothSocket>)> ConnectionCallback;
virtual void SetConnectionCallback(const ConnectionCallback& callback) = 0;
protected:
BluetoothProfile();
virtual ~BluetoothProfile();
};
} // namespace device
#endif // DEVICE_BLUETOOTH_BLUETOOTH_PROFILE_H_