17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef CHROMEOS_DBUS_BLUETOOTH_AGENT_SERVICE_PROVIDER_H_
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define CHROMEOS_DBUS_BLUETOOTH_AGENT_SERVICE_PROVIDER_H_
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string>
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/basictypes.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/callback.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_export.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "dbus/bus.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "dbus/object_path.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace chromeos {
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// BluetoothAgentServiceProvider is used to provide a D-Bus object that
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// the bluetooth daemon can communicate with during a remote device pairing
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// request.
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Instantiate with a chosen D-Bus object path and delegate object, and pass
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// the D-Bus object path as the |agent_path| argument to the
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// chromeos::BluetoothAgentManagerClient::RegisterAgent() method.
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// After initiating the pairing process with a device, using the
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// chromeos::BluetoothDeviceClient::Pair() method, the Bluetooth daemon will
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// make calls to this agent object and they will be passed on to your Delegate
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// object for handling. Responses should be returned using the callbacks
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// supplied to those methods.
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class CHROMEOS_EXPORT BluetoothAgentServiceProvider {
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Interface for reacting to agent requests.
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class Delegate {
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   public:
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual ~Delegate() {}
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Possible status values that may be returned to callbacks. Success
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // indicates that a pincode or passkey has been obtained, or permission
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // granted; rejected indicates the user rejected the request or denied
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // permission; cancelled indicates the user cancelled the request
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // without confirming either way.
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    enum Status {
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SUCCESS,
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      REJECTED,
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CANCELLED
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    };
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The PinCodeCallback is used for the RequestPinCode() method, it should
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // be called with two arguments, the |status| of the request (success,
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // rejected or cancelled) and the |pincode| requested.
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    typedef base::Callback<void(Status, const std::string&)> PinCodeCallback;
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The PasskeyCallback is used for the RequestPasskey() method, it should
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // be called with two arguments, the |status| of the request (success,
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // rejected or cancelled) and the |passkey| requested, a numeric in the
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // range 0-999999,
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    typedef base::Callback<void(Status, uint32)> PasskeyCallback;
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The ConfirmationCallback is used for methods which request confirmation
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // or authorization, it should be called with one argument, the |status|
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // of the request (success, rejected or cancelled).
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    typedef base::Callback<void(Status)> ConfirmationCallback;
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This method will be called when the agent is unregistered from the
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Bluetooth daemon, generally at the end of a pairing request. It may be
67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // used to perform cleanup tasks. This corresponds to the
68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // org.bluez.Agent1.Release method and is renamed to avoid a conflict
69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // with base::Refcounted<T>.
70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    virtual void Released() = 0;
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This method will be called when the Bluetooth daemon requires a
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // PIN Code for authentication of the device with object path |device_path|,
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // the agent should obtain the code from the user and call |callback|
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // to provide it, or indicate rejection or cancellation of the request.
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    //
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // PIN Codes are generally required for Bluetooth 2.0 and earlier devices
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // for which there is no automatic pairing or special handling.
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void RequestPinCode(const dbus::ObjectPath& device_path,
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                const PinCodeCallback& callback) = 0;
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This method will be called when the Bluetooth daemon requires that the
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // user enter the PIN code |pincode| into the device with object path
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // |device_path| so that it may be authenticated. The Cancel() method
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // will be called to dismiss the display once pairing is complete or
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // cancelled.
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    //
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This is used for Bluetooth 2.0 and earlier keyboard devices, the
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // |pincode| will always be a six-digit numeric in the range 000000-999999
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // for compatibilty with later specifications.
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void DisplayPinCode(const dbus::ObjectPath& device_path,
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                const std::string& pincode) = 0;
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This method will be called when the Bluetooth daemon requires a
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Passkey for authentication of the device with object path |device_path|,
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // the agent should obtain the passkey from the user (a numeric in the
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // range 0-999999) and call |callback| to provide it, or indicate
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // rejection or cancellation of the request.
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    //
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Passkeys are generally required for Bluetooth 2.1 and later devices
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // which cannot provide input or display on their own, and don't accept
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // passkey-less pairing.
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void RequestPasskey(const dbus::ObjectPath& device_path,
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                const PasskeyCallback& callback) = 0;
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This method will be called when the Bluetooth daemon requires that the
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // user enter the Passkey |passkey| into the device with object path
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // |device_path| so that it may be authenticated. The Cancel() method
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // will be called to dismiss the display once pairing is complete or
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // cancelled.
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    //
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This is used for Bluetooth 2.1 and later devices that support input
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // but not display, such as keyboards. The Passkey is a numeric in the
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // range 0-999999 and should be always presented zero-padded to six
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // digits.
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    //
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // As the user enters the passkey onto the device, |entered| will be
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // updated to reflect the number of digits entered so far.
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void DisplayPasskey(const dbus::ObjectPath& device_path,
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                uint32 passkey, uint16 entered) = 0;
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This method will be called when the Bluetooth daemon requires that the
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // user confirm that the Passkey |passkey| is displayed on the screen
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // of the device with object path |object_path| so that it may be
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // authenticated. The agent should display to the user and ask for
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // confirmation, then call |callback| to provide their response (success,
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // rejected or cancelled).
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    //
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This is used for Bluetooth 2.1 and later devices that support display,
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // such as other computers or phones. The Passkey is a numeric in the
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // range 0-999999 and should be always present zero-padded to six
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // digits.
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void RequestConfirmation(const dbus::ObjectPath& device_path,
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     uint32 passkey,
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     const ConfirmationCallback& callback) = 0;
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This method will be called when the Bluetooth daemon requires
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // authorization of an incoming pairing attempt from the device with object
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // path |device_path| that would have otherwised triggered the just-works
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // pairing model.
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    //
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The agent should confirm the incoming pairing with the user and call
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // |callback| to provide their response (success, rejected or cancelled).
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void RequestAuthorization(const dbus::ObjectPath& device_path,
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      const ConfirmationCallback& callback) = 0;
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This method will be called when the Bluetooth daemon requires that the
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // user confirm that the device with object path |object_path| is
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // authorized to connect to the service with UUID |uuid|. The agent should
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // confirm with the user and call |callback| to provide their response
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // (success, rejected or cancelled).
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void AuthorizeService(const dbus::ObjectPath& device_path,
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  const std::string& uuid,
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  const ConfirmationCallback& callback) = 0;
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This method will be called by the Bluetooth daemon to indicate that
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // the request failed before a reply was returned from the device.
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void Cancel() = 0;
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~BluetoothAgentServiceProvider();
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Creates the instance where |bus| is the D-Bus bus connection to export
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the object onto, |object_path| is the object path that it should have
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // and |delegate| is the object to which all method calls will be passed
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // and responses generated from.
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static BluetoothAgentServiceProvider* Create(
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      dbus::Bus* bus,
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const dbus::ObjectPath& object_path,
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      Delegate* delegate);
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  BluetoothAgentServiceProvider();
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BluetoothAgentServiceProvider);
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace chromeos
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif  // CHROMEOS_DBUS_BLUETOOTH_AGENT_SERVICE_PROVIDER_H_
182