1 // Copyright 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.
5 #ifndef DEVICE_BLUETOOTH_BLUETOOTH_DEVICE_CHROMEOS_H
6 #define DEVICE_BLUETOOTH_BLUETOOTH_DEVICE_CHROMEOS_H
10 #include "base/memory/scoped_ptr.h"
11 #include "base/memory/weak_ptr.h"
12 #include "chromeos/dbus/bluetooth_agent_service_provider.h"
13 #include "chromeos/dbus/bluetooth_device_client.h"
14 #include "dbus/object_path.h"
15 #include "device/bluetooth/bluetooth_device.h"
19 class BluetoothAdapterChromeOS
;
21 // The BluetoothDeviceChromeOS class implements BluetoothDevice for the
22 // Chrome OS platform.
23 class BluetoothDeviceChromeOS
24 : public device::BluetoothDevice
,
25 private chromeos::BluetoothAgentServiceProvider::Delegate
{
27 // BluetoothDevice override
28 virtual uint32
GetBluetoothClass() const OVERRIDE
;
29 virtual std::string
GetAddress() const OVERRIDE
;
30 virtual uint16
GetVendorID() const OVERRIDE
;
31 virtual uint16
GetProductID() const OVERRIDE
;
32 virtual uint16
GetDeviceID() const OVERRIDE
;
33 virtual bool IsPaired() const OVERRIDE
;
34 virtual bool IsConnected() const OVERRIDE
;
35 virtual bool IsConnectable() const OVERRIDE
;
36 virtual bool IsConnecting() const OVERRIDE
;
37 virtual ServiceList
GetServices() const OVERRIDE
;
38 virtual void GetServiceRecords(
39 const ServiceRecordsCallback
& callback
,
40 const ErrorCallback
& error_callback
) OVERRIDE
;
41 virtual void ProvidesServiceWithName(
42 const std::string
& name
,
43 const ProvidesServiceCallback
& callback
) OVERRIDE
;
44 virtual bool ExpectingPinCode() const OVERRIDE
;
45 virtual bool ExpectingPasskey() const OVERRIDE
;
46 virtual bool ExpectingConfirmation() const OVERRIDE
;
48 device::BluetoothDevice::PairingDelegate
* pairing_delegate
,
49 const base::Closure
& callback
,
50 const ConnectErrorCallback
& error_callback
) OVERRIDE
;
51 virtual void SetPinCode(const std::string
& pincode
) OVERRIDE
;
52 virtual void SetPasskey(uint32 passkey
) OVERRIDE
;
53 virtual void ConfirmPairing() OVERRIDE
;
54 virtual void RejectPairing() OVERRIDE
;
55 virtual void CancelPairing() OVERRIDE
;
56 virtual void Disconnect(
57 const base::Closure
& callback
,
58 const ErrorCallback
& error_callback
) OVERRIDE
;
59 virtual void Forget(const ErrorCallback
& error_callback
) OVERRIDE
;
60 virtual void ConnectToService(
61 const std::string
& service_uuid
,
62 const SocketCallback
& callback
) OVERRIDE
;
63 virtual void ConnectToProfile(
64 device::BluetoothProfile
* profile
,
65 const base::Closure
& callback
,
66 const ErrorCallback
& error_callback
) OVERRIDE
;
67 virtual void SetOutOfBandPairingData(
68 const device::BluetoothOutOfBandPairingData
& data
,
69 const base::Closure
& callback
,
70 const ErrorCallback
& error_callback
) OVERRIDE
;
71 virtual void ClearOutOfBandPairingData(
72 const base::Closure
& callback
,
73 const ErrorCallback
& error_callback
) OVERRIDE
;
76 // BluetoothDevice override
77 virtual std::string
GetDeviceName() const OVERRIDE
;
80 friend class BluetoothAdapterChromeOS
;
82 BluetoothDeviceChromeOS(BluetoothAdapterChromeOS
* adapter
,
83 const dbus::ObjectPath
& object_path
);
84 virtual ~BluetoothDeviceChromeOS();
86 // BluetoothAgentServiceProvider::Delegate override.
87 virtual void Release() OVERRIDE
;
88 virtual void RequestPinCode(const dbus::ObjectPath
& device_path
,
89 const PinCodeCallback
& callback
) OVERRIDE
;
90 virtual void DisplayPinCode(const dbus::ObjectPath
& device_path
,
91 const std::string
& pincode
) OVERRIDE
;
92 virtual void RequestPasskey(const dbus::ObjectPath
& device_path
,
93 const PasskeyCallback
& callback
) OVERRIDE
;
94 virtual void DisplayPasskey(const dbus::ObjectPath
& device_path
,
95 uint32 passkey
, uint16 entered
) OVERRIDE
;
96 virtual void RequestConfirmation(const dbus::ObjectPath
& device_path
,
98 const ConfirmationCallback
& callback
)
100 virtual void RequestAuthorization(const dbus::ObjectPath
& device_path
,
101 const ConfirmationCallback
& callback
)
103 virtual void AuthorizeService(const dbus::ObjectPath
& device_path
,
104 const std::string
& uuid
,
105 const ConfirmationCallback
& callback
) OVERRIDE
;
106 virtual void Cancel() OVERRIDE
;
108 // Internal method to initiate a connection to this device, and methods called
109 // by dbus:: on completion of the D-Bus method call.
110 void ConnectInternal(bool after_pairing
,
111 const base::Closure
& callback
,
112 const ConnectErrorCallback
& error_callback
);
113 void OnConnect(bool after_pairing
,
114 const base::Closure
& callback
);
115 void OnConnectError(bool after_pairing
,
116 const ConnectErrorCallback
& error_callback
,
117 const std::string
& error_name
,
118 const std::string
& error_message
);
120 // Called by dbus:: on completion of the D-Bus method call to register the
122 void OnRegisterAgent(const base::Closure
& callback
,
123 const ConnectErrorCallback
& error_callback
);
124 void OnRegisterAgentError(const ConnectErrorCallback
& error_callback
,
125 const std::string
& error_name
,
126 const std::string
& error_message
);
128 // Called by dbus:: on completion of the D-Bus method call to pair the device.
129 void OnPair(const base::Closure
& callback
,
130 const ConnectErrorCallback
& error_callback
);
131 void OnPairError(const ConnectErrorCallback
& error_callback
,
132 const std::string
& error_name
,
133 const std::string
& error_message
);
135 // Called by dbus:: on failure of the D-Bus method call to cancel pairing,
136 // there is no matching completion call since we don't do anything special
138 void OnCancelPairingError(const std::string
& error_name
,
139 const std::string
& error_message
);
141 // Internal method to set the device as trusted. Trusted devices can connect
142 // to us automatically, and we can connect to them after rebooting; it also
143 // causes the device to be remembered by the stack even if not paired.
144 // |success| to the callback indicates whether or not the request succeeded.
146 void OnSetTrusted(bool success
);
148 // Internal method to unregister the pairing agent and method called by dbus::
149 // on failure of the D-Bus method call. No completion call as success is
151 void UnregisterAgent();
152 void OnUnregisterAgentError(const std::string
& error_name
,
153 const std::string
& error_message
);
155 // Called by dbus:: on completion of the D-Bus method call to disconnect the
157 void OnDisconnect(const base::Closure
& callback
);
158 void OnDisconnectError(const ErrorCallback
& error_callback
,
159 const std::string
& error_name
,
160 const std::string
& error_message
);
162 // Called by dbus:: on failure of the D-Bus method call to unpair the device;
163 // there is no matching completion call since this object is deleted in the
164 // process of unpairing.
165 void OnForgetError(const ErrorCallback
& error_callback
,
166 const std::string
& error_name
,
167 const std::string
& error_message
);
169 // Run any outstanding pairing callbacks passing |status| as the result of
170 // pairing. Returns true if any callbacks were run, false if not.
171 bool RunPairingCallbacks(Status status
);
173 // Called by dbus:: on completion of the D-Bus method call to
174 // connect a peofile.
175 void OnConnectProfile(device::BluetoothProfile
* profile
,
176 const base::Closure
& callback
);
177 void OnConnectProfileError(device::BluetoothProfile
* profile
,
178 const ErrorCallback
& error_callback
,
179 const std::string
& error_name
,
180 const std::string
& error_message
);
182 // Return the object path of the device; used by BluetoothAdapterChromeOS
183 const dbus::ObjectPath
& object_path() const { return object_path_
; }
185 // The adapter that owns this device instance.
186 BluetoothAdapterChromeOS
* adapter_
;
188 // The dbus object path of the device object.
189 dbus::ObjectPath object_path_
;
191 // Number of ongoing calls to Connect().
192 int num_connecting_calls_
;
194 // During pairing this is set to an object that we don't own, but on which
195 // we can make method calls to request, display or confirm PIN Codes and
196 // Passkeys. Generally it is the object that owns this one.
197 PairingDelegate
* pairing_delegate_
;
199 // Flag to indicate whether a pairing delegate method has been called during
201 bool pairing_delegate_used_
;
203 // During pairing this is set to an instance of a D-Bus agent object
204 // intialized with our own class as its delegate.
205 scoped_ptr
<BluetoothAgentServiceProvider
> agent_
;
207 // During pairing these callbacks are set to those provided by method calls
208 // made on us by |agent_| and are called by our own method calls such as
209 // SetPinCode() and SetPasskey().
210 PinCodeCallback pincode_callback_
;
211 PasskeyCallback passkey_callback_
;
212 ConfirmationCallback confirmation_callback_
;
214 // Note: This should remain the last member so it'll be destroyed and
215 // invalidate its weak pointers before any other members are destroyed.
216 base::WeakPtrFactory
<BluetoothDeviceChromeOS
> weak_ptr_factory_
;
218 DISALLOW_COPY_AND_ASSIGN(BluetoothDeviceChromeOS
);
221 } // namespace chromeos
223 #endif // DEVICE_BLUETOOTH_BLUETOOTH_DEVICE_CHROMEOS_H