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