Index: chromeos/dbus/fake_bluetooth_device_client.cc |
diff --git a/chromeos/dbus/fake_bluetooth_device_client.cc b/chromeos/dbus/fake_bluetooth_device_client.cc |
deleted file mode 100644 |
index 8e086562a55366479c78b9449c4ed07372494d5f..0000000000000000000000000000000000000000 |
--- a/chromeos/dbus/fake_bluetooth_device_client.cc |
+++ /dev/null |
@@ -1,1652 +0,0 @@ |
-// 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. |
- |
-#include "chromeos/dbus/fake_bluetooth_device_client.h" |
- |
-#include <fcntl.h> |
-#include <sys/socket.h> |
-#include <sys/types.h> |
-#include <unistd.h> |
- |
-#include <algorithm> |
-#include <string> |
-#include <utility> |
- |
-#include "base/location.h" |
-#include "base/logging.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/rand_util.h" |
-#include "base/single_thread_task_runner.h" |
-#include "base/stl_util.h" |
-#include "base/thread_task_runner_handle.h" |
-#include "base/threading/worker_pool.h" |
-#include "base/time/time.h" |
-#include "chromeos/dbus/dbus_thread_manager.h" |
-#include "chromeos/dbus/fake_bluetooth_adapter_client.h" |
-#include "chromeos/dbus/fake_bluetooth_agent_manager_client.h" |
-#include "chromeos/dbus/fake_bluetooth_agent_service_provider.h" |
-#include "chromeos/dbus/fake_bluetooth_gatt_service_client.h" |
-#include "chromeos/dbus/fake_bluetooth_input_client.h" |
-#include "chromeos/dbus/fake_bluetooth_profile_manager_client.h" |
-#include "chromeos/dbus/fake_bluetooth_profile_service_provider.h" |
-#include "dbus/file_descriptor.h" |
-#include "third_party/cros_system_api/dbus/service_constants.h" |
- |
-namespace { |
- |
-// Default interval between simulated events. |
-const int kSimulationIntervalMs = 750; |
- |
-// Minimum and maximum bounds for randomly generated RSSI values. |
-const int kMinRSSI = -90; |
-const int kMaxRSSI = -30; |
- |
-// The default value of connection info properties from GetConnInfo(). |
-const int kUnkownPower = 127; |
- |
-// This is meant to delay the removal of a pre defined device until the |
-// developer has time to see it. |
-const int kVanishingDevicePairTimeMultiplier = 4; |
- |
-// Meant to delay a pair request for an observable amount of time. |
-const int kIncomingSimulationPairTimeMultiplier = 45; |
- |
-// Meant to delay a request that asks for pair requests for an observable |
-// amount of time. |
-const int kIncomingSimulationStartPairTimeMultiplier = 30; |
- |
-// This allows the PIN code dialog to be shown for a long enough time to see |
-// the PIN code UI in detail. |
-const int kPinCodeDevicePairTimeMultiplier = 7; |
- |
-// This allows the pairing dialog to be shown for a long enough time to see |
-// its UI in detail. |
-const int kSimulateNormalPairTimeMultiplier = 3; |
- |
-void SimulatedProfileSocket(int fd) { |
- // Simulate a server-side socket of a profile; read data from the socket, |
- // write it back, and then close. |
- char buf[1024]; |
- ssize_t len; |
- ssize_t count; |
- |
- len = read(fd, buf, sizeof buf); |
- if (len < 0) { |
- close(fd); |
- return; |
- } |
- |
- count = len; |
- len = write(fd, buf, count); |
- if (len < 0) { |
- close(fd); |
- return; |
- } |
- |
- close(fd); |
-} |
- |
-void SimpleErrorCallback(const std::string& error_name, |
- const std::string& error_message) { |
- VLOG(1) << "Bluetooth Error: " << error_name << ": " << error_message; |
-} |
- |
-} // namespace |
- |
-namespace chromeos { |
- |
-const char FakeBluetoothDeviceClient::kTestPinCode[] = "123456"; |
-const int FakeBluetoothDeviceClient::kTestPassKey = 123456; |
- |
-const char FakeBluetoothDeviceClient::kPairingMethodNone[] = "None"; |
-const char FakeBluetoothDeviceClient::kPairingMethodPinCode[] = "PIN Code"; |
-const char FakeBluetoothDeviceClient::kPairingMethodPassKey[] = "PassKey"; |
- |
-const char FakeBluetoothDeviceClient::kPairingActionConfirmation[] = |
- "Confirmation"; |
-const char FakeBluetoothDeviceClient::kPairingActionDisplay[] = "Display"; |
-const char FakeBluetoothDeviceClient::kPairingActionFail[] = "Fail"; |
-const char FakeBluetoothDeviceClient::kPairingActionRequest[] = "Request"; |
- |
-const char FakeBluetoothDeviceClient::kPairedDevicePath[] = |
- "/fake/hci0/dev0"; |
-const char FakeBluetoothDeviceClient::kPairedDeviceAddress[] = |
- "00:11:22:33:44:55"; |
-const char FakeBluetoothDeviceClient::kPairedDeviceName[] = |
- "Fake Device"; |
-const uint32 FakeBluetoothDeviceClient::kPairedDeviceClass = 0x000104; |
- |
-const char FakeBluetoothDeviceClient::kLegacyAutopairPath[] = |
- "/fake/hci0/dev1"; |
-const char FakeBluetoothDeviceClient::kLegacyAutopairAddress[] = |
- "28:CF:DA:00:00:00"; |
-const char FakeBluetoothDeviceClient::kLegacyAutopairName[] = |
- "Bluetooth 2.0 Mouse"; |
-const uint32 FakeBluetoothDeviceClient::kLegacyAutopairClass = 0x002580; |
- |
-const char FakeBluetoothDeviceClient::kDisplayPinCodePath[] = |
- "/fake/hci0/dev2"; |
-const char FakeBluetoothDeviceClient::kDisplayPinCodeAddress[] = |
- "28:37:37:00:00:00"; |
-const char FakeBluetoothDeviceClient::kDisplayPinCodeName[] = |
- "Bluetooth 2.0 Keyboard"; |
-const uint32 FakeBluetoothDeviceClient::kDisplayPinCodeClass = 0x002540; |
- |
-const char FakeBluetoothDeviceClient::kVanishingDevicePath[] = |
- "/fake/hci0/dev3"; |
-const char FakeBluetoothDeviceClient::kVanishingDeviceAddress[] = |
- "01:02:03:04:05:06"; |
-const char FakeBluetoothDeviceClient::kVanishingDeviceName[] = |
- "Vanishing Device"; |
-const uint32 FakeBluetoothDeviceClient::kVanishingDeviceClass = 0x000104; |
- |
-const char FakeBluetoothDeviceClient::kConnectUnpairablePath[] = |
- "/fake/hci0/dev4"; |
-const char FakeBluetoothDeviceClient::kConnectUnpairableAddress[] = |
- "7C:ED:8D:00:00:00"; |
-const char FakeBluetoothDeviceClient::kConnectUnpairableName[] = |
- "Unpairable Device"; |
-const uint32 FakeBluetoothDeviceClient::kConnectUnpairableClass = 0x002580; |
- |
-const char FakeBluetoothDeviceClient::kDisplayPasskeyPath[] = |
- "/fake/hci0/dev5"; |
-const char FakeBluetoothDeviceClient::kDisplayPasskeyAddress[] = |
- "00:0F:F6:00:00:00"; |
-const char FakeBluetoothDeviceClient::kDisplayPasskeyName[] = |
- "Bluetooth 2.1+ Keyboard"; |
-const uint32 FakeBluetoothDeviceClient::kDisplayPasskeyClass = 0x002540; |
- |
-const char FakeBluetoothDeviceClient::kRequestPinCodePath[] = |
- "/fake/hci0/dev6"; |
-const char FakeBluetoothDeviceClient::kRequestPinCodeAddress[] = |
- "00:24:BE:00:00:00"; |
-const char FakeBluetoothDeviceClient::kRequestPinCodeName[] = |
- "PIN Device"; |
-const uint32 FakeBluetoothDeviceClient::kRequestPinCodeClass = 0x240408; |
- |
-const char FakeBluetoothDeviceClient::kConfirmPasskeyPath[] = |
- "/fake/hci0/dev7"; |
-const char FakeBluetoothDeviceClient::kConfirmPasskeyAddress[] = |
- "20:7D:74:00:00:00"; |
-const char FakeBluetoothDeviceClient::kConfirmPasskeyName[] = |
- "Phone"; |
-const uint32 FakeBluetoothDeviceClient::kConfirmPasskeyClass = 0x7a020c; |
- |
-const char FakeBluetoothDeviceClient::kRequestPasskeyPath[] = |
- "/fake/hci0/dev8"; |
-const char FakeBluetoothDeviceClient::kRequestPasskeyAddress[] = |
- "20:7D:74:00:00:01"; |
-const char FakeBluetoothDeviceClient::kRequestPasskeyName[] = |
- "Passkey Device"; |
-const uint32 FakeBluetoothDeviceClient::kRequestPasskeyClass = 0x7a020c; |
- |
-const char FakeBluetoothDeviceClient::kUnconnectableDevicePath[] = |
- "/fake/hci0/dev9"; |
-const char FakeBluetoothDeviceClient::kUnconnectableDeviceAddress[] = |
- "20:7D:74:00:00:02"; |
-const char FakeBluetoothDeviceClient::kUnconnectableDeviceName[] = |
- "Unconnectable Device"; |
-const uint32 FakeBluetoothDeviceClient::kUnconnectableDeviceClass = 0x7a020c; |
- |
-const char FakeBluetoothDeviceClient::kUnpairableDevicePath[] = |
- "/fake/hci0/devA"; |
-const char FakeBluetoothDeviceClient::kUnpairableDeviceAddress[] = |
- "20:7D:74:00:00:03"; |
-const char FakeBluetoothDeviceClient::kUnpairableDeviceName[] = |
- "Unpairable Device"; |
-const uint32 FakeBluetoothDeviceClient::kUnpairableDeviceClass = 0x002540; |
- |
-const char FakeBluetoothDeviceClient::kJustWorksPath[] = |
- "/fake/hci0/devB"; |
-const char FakeBluetoothDeviceClient::kJustWorksAddress[] = |
- "00:0C:8A:00:00:00"; |
-const char FakeBluetoothDeviceClient::kJustWorksName[] = |
- "Just-Works Device"; |
-const uint32 FakeBluetoothDeviceClient::kJustWorksClass = 0x240428; |
- |
-const char FakeBluetoothDeviceClient::kLowEnergyPath[] = |
- "/fake/hci0/devC"; |
-const char FakeBluetoothDeviceClient::kLowEnergyAddress[] = |
- "00:1A:11:00:15:30"; |
-const char FakeBluetoothDeviceClient::kLowEnergyName[] = |
- "Bluetooth 4.0 Heart Rate Monitor"; |
-const uint32 FakeBluetoothDeviceClient::kLowEnergyClass = |
- 0x000918; // Major class "Health", Minor class "Heart/Pulse Rate Monitor." |
- |
-const char FakeBluetoothDeviceClient::kPairedUnconnectableDevicePath[] = |
- "/fake/hci0/devD"; |
-const char FakeBluetoothDeviceClient::kPairedUnconnectableDeviceAddress[] = |
- "20:7D:74:00:00:04"; |
-const char FakeBluetoothDeviceClient::kPairedUnconnectableDeviceName[] = |
- "Paired Unconnectable Device"; |
-const uint32 FakeBluetoothDeviceClient::kPairedUnconnectableDeviceClass = |
- 0x000104; |
- |
-FakeBluetoothDeviceClient::Properties::Properties( |
- const PropertyChangedCallback& callback) |
- : BluetoothDeviceClient::Properties( |
- NULL, |
- bluetooth_device::kBluetoothDeviceInterface, |
- callback) { |
-} |
- |
-FakeBluetoothDeviceClient::Properties::~Properties() { |
-} |
- |
-void FakeBluetoothDeviceClient::Properties::Get( |
- dbus::PropertyBase* property, |
- dbus::PropertySet::GetCallback callback) { |
- VLOG(1) << "Get " << property->name(); |
- callback.Run(false); |
-} |
- |
-void FakeBluetoothDeviceClient::Properties::GetAll() { |
- VLOG(1) << "GetAll"; |
-} |
- |
-void FakeBluetoothDeviceClient::Properties::Set( |
- dbus::PropertyBase *property, |
- dbus::PropertySet::SetCallback callback) { |
- VLOG(1) << "Set " << property->name(); |
- if (property->name() == trusted.name()) { |
- callback.Run(true); |
- property->ReplaceValueWithSetValue(); |
- } else { |
- callback.Run(false); |
- } |
-} |
- |
-FakeBluetoothDeviceClient::SimulatedPairingOptions::SimulatedPairingOptions() {} |
- |
-FakeBluetoothDeviceClient::SimulatedPairingOptions::~SimulatedPairingOptions() { |
-} |
- |
-FakeBluetoothDeviceClient::IncomingDeviceProperties:: |
- IncomingDeviceProperties() {} |
- |
-FakeBluetoothDeviceClient::IncomingDeviceProperties:: |
- ~IncomingDeviceProperties() {} |
- |
-FakeBluetoothDeviceClient::FakeBluetoothDeviceClient() |
- : simulation_interval_ms_(kSimulationIntervalMs), |
- discovery_simulation_step_(0), |
- incoming_pairing_simulation_step_(0), |
- pairing_cancelled_(false), |
- connection_rssi_(kUnkownPower), |
- transmit_power_(kUnkownPower), |
- max_transmit_power_(kUnkownPower) { |
- scoped_ptr<Properties> properties(new Properties( |
- base::Bind(&FakeBluetoothDeviceClient::OnPropertyChanged, |
- base::Unretained(this), dbus::ObjectPath(kPairedDevicePath)))); |
- properties->address.ReplaceValue(kPairedDeviceAddress); |
- properties->bluetooth_class.ReplaceValue(kPairedDeviceClass); |
- properties->name.ReplaceValue("Fake Device (Name)"); |
- properties->alias.ReplaceValue(kPairedDeviceName); |
- properties->paired.ReplaceValue(true); |
- properties->trusted.ReplaceValue(true); |
- properties->adapter.ReplaceValue( |
- dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath)); |
- |
- std::vector<std::string> uuids; |
- uuids.push_back("00001800-0000-1000-8000-00805f9b34fb"); |
- uuids.push_back("00001801-0000-1000-8000-00805f9b34fb"); |
- properties->uuids.ReplaceValue(uuids); |
- |
- properties->modalias.ReplaceValue("usb:v05ACp030Dd0306"); |
- |
- properties_map_.insert(dbus::ObjectPath(kPairedDevicePath), |
- properties.Pass()); |
- device_list_.push_back(dbus::ObjectPath(kPairedDevicePath)); |
- |
- properties.reset(new Properties(base::Bind( |
- &FakeBluetoothDeviceClient::OnPropertyChanged, base::Unretained(this), |
- dbus::ObjectPath(kPairedUnconnectableDevicePath)))); |
- properties->address.ReplaceValue(kPairedUnconnectableDeviceAddress); |
- properties->bluetooth_class.ReplaceValue(kPairedUnconnectableDeviceClass); |
- properties->name.ReplaceValue("Fake Device 2 (Unconnectable)"); |
- properties->alias.ReplaceValue(kPairedUnconnectableDeviceName); |
- properties->paired.ReplaceValue(true); |
- properties->trusted.ReplaceValue(true); |
- properties->adapter.ReplaceValue( |
- dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath)); |
- |
- properties->uuids.ReplaceValue(uuids); |
- |
- properties->modalias.ReplaceValue("usb:v05ACp030Dd0306"); |
- |
- properties_map_.insert(dbus::ObjectPath(kPairedUnconnectableDevicePath), |
- properties.Pass()); |
- device_list_.push_back(dbus::ObjectPath(kPairedUnconnectableDevicePath)); |
-} |
- |
-FakeBluetoothDeviceClient::~FakeBluetoothDeviceClient() { |
-} |
- |
-void FakeBluetoothDeviceClient::Init(dbus::Bus* bus) { |
-} |
- |
-void FakeBluetoothDeviceClient::AddObserver(Observer* observer) { |
- observers_.AddObserver(observer); |
-} |
- |
-void FakeBluetoothDeviceClient::RemoveObserver(Observer* observer) { |
- observers_.RemoveObserver(observer); |
-} |
- |
-std::vector<dbus::ObjectPath> FakeBluetoothDeviceClient::GetDevicesForAdapter( |
- const dbus::ObjectPath& adapter_path) { |
- if (adapter_path == |
- dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath)) |
- return device_list_; |
- else |
- return std::vector<dbus::ObjectPath>(); |
-} |
- |
-FakeBluetoothDeviceClient::Properties* |
-FakeBluetoothDeviceClient::GetProperties(const dbus::ObjectPath& object_path) { |
- PropertiesMap::const_iterator iter = properties_map_.find(object_path); |
- if (iter != properties_map_.end()) |
- return iter->second; |
- return NULL; |
-} |
- |
-FakeBluetoothDeviceClient::SimulatedPairingOptions* |
-FakeBluetoothDeviceClient::GetPairingOptions( |
- const dbus::ObjectPath& object_path) { |
- PairingOptionsMap::const_iterator iter = |
- pairing_options_map_.find(object_path); |
- if (iter != pairing_options_map_.end()) |
- return iter->second; |
- return iter != pairing_options_map_.end() ? iter->second : nullptr; |
-} |
- |
-void FakeBluetoothDeviceClient::Connect( |
- const dbus::ObjectPath& object_path, |
- const base::Closure& callback, |
- const ErrorCallback& error_callback) { |
- VLOG(1) << "Connect: " << object_path.value(); |
- Properties* properties = GetProperties(object_path); |
- |
- if (properties->connected.value() == true) { |
- // Already connected. |
- callback.Run(); |
- return; |
- } |
- |
- if (properties->paired.value() != true && |
- object_path != dbus::ObjectPath(kConnectUnpairablePath) && |
- object_path != dbus::ObjectPath(kLowEnergyPath)) { |
- // Must be paired. |
- error_callback.Run(bluetooth_device::kErrorFailed, "Not paired"); |
- return; |
- } else if (properties->paired.value() == true && |
- (object_path == dbus::ObjectPath(kUnconnectableDevicePath) || |
- object_path == |
- dbus::ObjectPath(kPairedUnconnectableDevicePath))) { |
- // Must not be paired |
- error_callback.Run(bluetooth_device::kErrorFailed, |
- "Connection fails while paired"); |
- return; |
- } |
- |
- // The device can be connected. |
- properties->connected.ReplaceValue(true); |
- callback.Run(); |
- |
- // Expose GATT services if connected to LE device. |
- if (object_path == dbus::ObjectPath(kLowEnergyPath)) { |
- FakeBluetoothGattServiceClient* gatt_service_client = |
- static_cast<FakeBluetoothGattServiceClient*>( |
- DBusThreadManager::Get()->GetBluetoothGattServiceClient()); |
- gatt_service_client->ExposeHeartRateService( |
- dbus::ObjectPath(kLowEnergyPath)); |
- } |
- |
- AddInputDeviceIfNeeded(object_path, properties); |
-} |
- |
-void FakeBluetoothDeviceClient::Disconnect( |
- const dbus::ObjectPath& object_path, |
- const base::Closure& callback, |
- const ErrorCallback& error_callback) { |
- VLOG(1) << "Disconnect: " << object_path.value(); |
- Properties* properties = GetProperties(object_path); |
- |
- if (!properties->connected.value()) { |
- error_callback.Run("org.bluez.Error.NotConnected", "Not Connected"); |
- return; |
- } |
- |
- // Hide the Heart Rate Service if disconnected from LE device. |
- if (object_path == dbus::ObjectPath(kLowEnergyPath)) { |
- FakeBluetoothGattServiceClient* gatt_service_client = |
- static_cast<FakeBluetoothGattServiceClient*>( |
- DBusThreadManager::Get()->GetBluetoothGattServiceClient()); |
- gatt_service_client->HideHeartRateService(); |
- } |
- |
- callback.Run(); |
- properties->connected.ReplaceValue(false); |
-} |
- |
-void FakeBluetoothDeviceClient::ConnectProfile( |
- const dbus::ObjectPath& object_path, |
- const std::string& uuid, |
- const base::Closure& callback, |
- const ErrorCallback& error_callback) { |
- VLOG(1) << "ConnectProfile: " << object_path.value() << " " << uuid; |
- |
- FakeBluetoothProfileManagerClient* fake_bluetooth_profile_manager_client = |
- static_cast<FakeBluetoothProfileManagerClient*>( |
- DBusThreadManager::Get()->GetBluetoothProfileManagerClient()); |
- FakeBluetoothProfileServiceProvider* profile_service_provider = |
- fake_bluetooth_profile_manager_client->GetProfileServiceProvider(uuid); |
- if (profile_service_provider == NULL) { |
- error_callback.Run(kNoResponseError, "Missing profile"); |
- return; |
- } |
- |
- if (object_path == dbus::ObjectPath(kPairedUnconnectableDevicePath)) { |
- error_callback.Run(bluetooth_device::kErrorFailed, "unconnectable"); |
- return; |
- } |
- |
- // Make a socket pair of a compatible type with the type used by Bluetooth; |
- // spin up a thread to simulate the server side and wrap the client side in |
- // a D-Bus file descriptor object. |
- int socket_type = SOCK_STREAM; |
- if (uuid == FakeBluetoothProfileManagerClient::kL2capUuid) |
- socket_type = SOCK_SEQPACKET; |
- |
- int fds[2]; |
- if (socketpair(AF_UNIX, socket_type, 0, fds) < 0) { |
- error_callback.Run(kNoResponseError, "socketpair call failed"); |
- return; |
- } |
- |
- int args; |
- args = fcntl(fds[1], F_GETFL, NULL); |
- if (args < 0) { |
- error_callback.Run(kNoResponseError, "failed to get socket flags"); |
- return; |
- } |
- |
- args |= O_NONBLOCK; |
- if (fcntl(fds[1], F_SETFL, args) < 0) { |
- error_callback.Run(kNoResponseError, "failed to set socket non-blocking"); |
- return; |
- } |
- |
- base::WorkerPool::GetTaskRunner(false)->PostTask( |
- FROM_HERE, |
- base::Bind(&SimulatedProfileSocket, |
- fds[0])); |
- |
- scoped_ptr<dbus::FileDescriptor> fd(new dbus::FileDescriptor(fds[1])); |
- |
- // Post the new connection to the service provider. |
- BluetoothProfileServiceProvider::Delegate::Options options; |
- |
- profile_service_provider->NewConnection( |
- object_path, |
- fd.Pass(), |
- options, |
- base::Bind(&FakeBluetoothDeviceClient::ConnectionCallback, |
- base::Unretained(this), |
- object_path, |
- callback, |
- error_callback)); |
-} |
- |
-void FakeBluetoothDeviceClient::DisconnectProfile( |
- const dbus::ObjectPath& object_path, |
- const std::string& uuid, |
- const base::Closure& callback, |
- const ErrorCallback& error_callback) { |
- VLOG(1) << "DisconnectProfile: " << object_path.value() << " " << uuid; |
- |
- FakeBluetoothProfileManagerClient* fake_bluetooth_profile_manager_client = |
- static_cast<FakeBluetoothProfileManagerClient*>( |
- DBusThreadManager::Get()->GetBluetoothProfileManagerClient()); |
- FakeBluetoothProfileServiceProvider* profile_service_provider = |
- fake_bluetooth_profile_manager_client->GetProfileServiceProvider(uuid); |
- if (profile_service_provider == NULL) { |
- error_callback.Run(kNoResponseError, "Missing profile"); |
- return; |
- } |
- |
- profile_service_provider->RequestDisconnection( |
- object_path, |
- base::Bind(&FakeBluetoothDeviceClient::DisconnectionCallback, |
- base::Unretained(this), |
- object_path, |
- callback, |
- error_callback)); |
-} |
- |
-void FakeBluetoothDeviceClient::Pair( |
- const dbus::ObjectPath& object_path, |
- const base::Closure& callback, |
- const ErrorCallback& error_callback) { |
- VLOG(1) << "Pair: " << object_path.value(); |
- Properties* properties = GetProperties(object_path); |
- |
- if (properties->paired.value() == true) { |
- // Already paired. |
- callback.Run(); |
- return; |
- } |
- |
- SimulatePairing(object_path, false, callback, error_callback); |
-} |
- |
-void FakeBluetoothDeviceClient::CancelPairing( |
- const dbus::ObjectPath& object_path, |
- const base::Closure& callback, |
- const ErrorCallback& error_callback) { |
- VLOG(1) << "CancelPairing: " << object_path.value(); |
- pairing_cancelled_ = true; |
- callback.Run(); |
-} |
- |
-void FakeBluetoothDeviceClient::GetConnInfo( |
- const dbus::ObjectPath& object_path, |
- const ConnInfoCallback& callback, |
- const ErrorCallback& error_callback) { |
- Properties* properties = GetProperties(object_path); |
- if (!properties->connected.value()) { |
- error_callback.Run("org.bluez.Error.NotConnected", "Not Connected"); |
- return; |
- } |
- |
- callback.Run(connection_rssi_, transmit_power_, max_transmit_power_); |
-} |
- |
-void FakeBluetoothDeviceClient::BeginDiscoverySimulation( |
- const dbus::ObjectPath& adapter_path) { |
- VLOG(1) << "starting discovery simulation"; |
- |
- discovery_simulation_step_ = 1; |
- |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::DiscoverySimulationTimer, |
- base::Unretained(this)), |
- base::TimeDelta::FromMilliseconds(simulation_interval_ms_)); |
-} |
- |
-void FakeBluetoothDeviceClient::EndDiscoverySimulation( |
- const dbus::ObjectPath& adapter_path) { |
- VLOG(1) << "stopping discovery simulation"; |
- discovery_simulation_step_ = 0; |
-} |
- |
-void FakeBluetoothDeviceClient::BeginIncomingPairingSimulation( |
- const dbus::ObjectPath& adapter_path) { |
- VLOG(1) << "starting incoming pairing simulation"; |
- |
- incoming_pairing_simulation_step_ = 1; |
- |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::IncomingPairingSimulationTimer, |
- base::Unretained(this)), |
- base::TimeDelta::FromMilliseconds( |
- kIncomingSimulationStartPairTimeMultiplier * |
- simulation_interval_ms_)); |
-} |
- |
-void FakeBluetoothDeviceClient::EndIncomingPairingSimulation( |
- const dbus::ObjectPath& adapter_path) { |
- VLOG(1) << "stopping incoming pairing simulation"; |
- incoming_pairing_simulation_step_ = 0; |
-} |
- |
-void FakeBluetoothDeviceClient::SetSimulationIntervalMs(int interval_ms) { |
- simulation_interval_ms_ = interval_ms; |
-} |
- |
-void FakeBluetoothDeviceClient::CreateDevice( |
- const dbus::ObjectPath& adapter_path, |
- const dbus::ObjectPath& device_path) { |
- if (std::find(device_list_.begin(), |
- device_list_.end(), device_path) != device_list_.end()) |
- return; |
- |
- scoped_ptr<Properties> properties( |
- new Properties(base::Bind(&FakeBluetoothDeviceClient::OnPropertyChanged, |
- base::Unretained(this), device_path))); |
- properties->adapter.ReplaceValue(adapter_path); |
- |
- if (device_path == dbus::ObjectPath(kLegacyAutopairPath)) { |
- properties->address.ReplaceValue(kLegacyAutopairAddress); |
- properties->bluetooth_class.ReplaceValue(kLegacyAutopairClass); |
- properties->name.ReplaceValue("LegacyAutopair"); |
- properties->alias.ReplaceValue(kLegacyAutopairName); |
- |
- std::vector<std::string> uuids; |
- uuids.push_back("00001124-0000-1000-8000-00805f9b34fb"); |
- properties->uuids.ReplaceValue(uuids); |
- |
- } else if (device_path == dbus::ObjectPath(kDisplayPinCodePath)) { |
- properties->address.ReplaceValue(kDisplayPinCodeAddress); |
- properties->bluetooth_class.ReplaceValue(kDisplayPinCodeClass); |
- properties->name.ReplaceValue("DisplayPinCode"); |
- properties->alias.ReplaceValue(kDisplayPinCodeName); |
- |
- std::vector<std::string> uuids; |
- uuids.push_back("00001124-0000-1000-8000-00805f9b34fb"); |
- properties->uuids.ReplaceValue(uuids); |
- |
- } else if (device_path == dbus::ObjectPath(kVanishingDevicePath)) { |
- properties->address.ReplaceValue(kVanishingDeviceAddress); |
- properties->bluetooth_class.ReplaceValue(kVanishingDeviceClass); |
- properties->name.ReplaceValue("VanishingDevice"); |
- properties->alias.ReplaceValue(kVanishingDeviceName); |
- |
- } else if (device_path == dbus::ObjectPath(kConnectUnpairablePath)) { |
- properties->address.ReplaceValue(kConnectUnpairableAddress); |
- properties->bluetooth_class.ReplaceValue(kConnectUnpairableClass); |
- properties->name.ReplaceValue("ConnectUnpairable"); |
- properties->alias.ReplaceValue(kConnectUnpairableName); |
- |
- std::vector<std::string> uuids; |
- uuids.push_back("00001124-0000-1000-8000-00805f9b34fb"); |
- properties->uuids.ReplaceValue(uuids); |
- |
- } else if (device_path == dbus::ObjectPath(kDisplayPasskeyPath)) { |
- properties->address.ReplaceValue(kDisplayPasskeyAddress); |
- properties->bluetooth_class.ReplaceValue(kDisplayPasskeyClass); |
- properties->name.ReplaceValue("DisplayPasskey"); |
- properties->alias.ReplaceValue(kDisplayPasskeyName); |
- |
- std::vector<std::string> uuids; |
- uuids.push_back("00001124-0000-1000-8000-00805f9b34fb"); |
- properties->uuids.ReplaceValue(uuids); |
- |
- } else if (device_path == dbus::ObjectPath(kRequestPinCodePath)) { |
- properties->address.ReplaceValue(kRequestPinCodeAddress); |
- properties->bluetooth_class.ReplaceValue(kRequestPinCodeClass); |
- properties->name.ReplaceValue("RequestPinCode"); |
- properties->alias.ReplaceValue(kRequestPinCodeName); |
- |
- } else if (device_path == dbus::ObjectPath(kConfirmPasskeyPath)) { |
- properties->address.ReplaceValue(kConfirmPasskeyAddress); |
- properties->bluetooth_class.ReplaceValue(kConfirmPasskeyClass); |
- properties->name.ReplaceValue("ConfirmPasskey"); |
- properties->alias.ReplaceValue(kConfirmPasskeyName); |
- |
- } else if (device_path == dbus::ObjectPath(kRequestPasskeyPath)) { |
- properties->address.ReplaceValue(kRequestPasskeyAddress); |
- properties->bluetooth_class.ReplaceValue(kRequestPasskeyClass); |
- properties->name.ReplaceValue("RequestPasskey"); |
- properties->alias.ReplaceValue(kRequestPasskeyName); |
- |
- } else if (device_path == dbus::ObjectPath(kUnconnectableDevicePath)) { |
- properties->address.ReplaceValue(kUnconnectableDeviceAddress); |
- properties->bluetooth_class.ReplaceValue(kUnconnectableDeviceClass); |
- properties->name.ReplaceValue("UnconnectableDevice"); |
- properties->alias.ReplaceValue(kUnconnectableDeviceName); |
- |
- } else if (device_path == dbus::ObjectPath(kUnpairableDevicePath)) { |
- properties->address.ReplaceValue(kUnpairableDeviceAddress); |
- properties->bluetooth_class.ReplaceValue(kUnpairableDeviceClass); |
- properties->name.ReplaceValue("Fake Unpairable Device"); |
- properties->alias.ReplaceValue(kUnpairableDeviceName); |
- |
- } else if (device_path == dbus::ObjectPath(kJustWorksPath)) { |
- properties->address.ReplaceValue(kJustWorksAddress); |
- properties->bluetooth_class.ReplaceValue(kJustWorksClass); |
- properties->name.ReplaceValue("JustWorks"); |
- properties->alias.ReplaceValue(kJustWorksName); |
- |
- } else if (device_path == dbus::ObjectPath(kLowEnergyPath)) { |
- properties->address.ReplaceValue(kLowEnergyAddress); |
- properties->bluetooth_class.ReplaceValue(kLowEnergyClass); |
- properties->name.ReplaceValue("Heart Rate Monitor"); |
- properties->alias.ReplaceValue(kLowEnergyName); |
- |
- std::vector<std::string> uuids; |
- uuids.push_back(FakeBluetoothGattServiceClient::kHeartRateServiceUUID); |
- properties->uuids.ReplaceValue(uuids); |
- |
- } else { |
- NOTREACHED(); |
- |
- } |
- |
- properties_map_.insert(device_path, properties.Pass()); |
- device_list_.push_back(device_path); |
- FOR_EACH_OBSERVER(BluetoothDeviceClient::Observer, observers_, |
- DeviceAdded(device_path)); |
-} |
- |
-void FakeBluetoothDeviceClient::CreateDeviceWithProperties( |
- const dbus::ObjectPath& adapter_path, |
- const IncomingDeviceProperties& props) { |
- dbus::ObjectPath device_path(props.device_path); |
- if (std::find(device_list_.begin(), device_list_.end(), device_path) != |
- device_list_.end()) |
- return; |
- |
- scoped_ptr<Properties> properties( |
- new Properties(base::Bind(&FakeBluetoothDeviceClient::OnPropertyChanged, |
- base::Unretained(this), device_path))); |
- properties->adapter.ReplaceValue(adapter_path); |
- properties->name.ReplaceValue(props.device_name); |
- properties->alias.ReplaceValue(props.device_alias); |
- properties->address.ReplaceValue(props.device_address); |
- properties->bluetooth_class.ReplaceValue(props.device_class); |
- properties->trusted.ReplaceValue(props.is_trusted); |
- |
- if (props.is_trusted) |
- properties->paired.ReplaceValue(true); |
- |
- scoped_ptr<SimulatedPairingOptions> options(new SimulatedPairingOptions); |
- options->pairing_method = props.pairing_method; |
- options->pairing_auth_token = props.pairing_auth_token; |
- options->pairing_action = props.pairing_action; |
- options->incoming = props.incoming; |
- |
- properties_map_.insert(device_path, properties.Pass()); |
- device_list_.push_back(device_path); |
- pairing_options_map_.insert(device_path, options.Pass()); |
- FOR_EACH_OBSERVER(BluetoothDeviceClient::Observer, observers_, |
- DeviceAdded(device_path)); |
-} |
- |
-scoped_ptr<base::ListValue> |
-FakeBluetoothDeviceClient::GetBluetoothDevicesAsDictionaries() const { |
- scoped_ptr<base::ListValue> predefined_devices(new base::ListValue); |
- scoped_ptr<base::DictionaryValue> pairedDevice(new base::DictionaryValue); |
- pairedDevice->SetString("path", kPairedDevicePath); |
- pairedDevice->SetString("address", kPairedDeviceAddress); |
- pairedDevice->SetString("name", kPairedDeviceName); |
- pairedDevice->SetString("alias", kPairedDeviceName); |
- pairedDevice->SetString("pairingMethod", ""); |
- pairedDevice->SetString("pairingAuthToken", ""); |
- pairedDevice->SetString("pairingAction", ""); |
- pairedDevice->SetInteger("classValue", kPairedDeviceClass); |
- pairedDevice->SetBoolean("discoverable", true); |
- pairedDevice->SetBoolean("isTrusted", true); |
- pairedDevice->SetBoolean("paired", true); |
- pairedDevice->SetBoolean("incoming", false); |
- predefined_devices->Append(pairedDevice.Pass()); |
- |
- scoped_ptr<base::DictionaryValue> legacyDevice(new base::DictionaryValue); |
- legacyDevice->SetString("path", kLegacyAutopairPath); |
- legacyDevice->SetString("address", kLegacyAutopairAddress); |
- legacyDevice->SetString("name", kLegacyAutopairName); |
- legacyDevice->SetString("alias", kLegacyAutopairName); |
- legacyDevice->SetString("pairingMethod", ""); |
- legacyDevice->SetString("pairingAuthToken", ""); |
- legacyDevice->SetString("pairingAction", ""); |
- legacyDevice->SetInteger("classValue", kLegacyAutopairClass); |
- legacyDevice->SetBoolean("isTrusted", true); |
- legacyDevice->SetBoolean("discoverable", false); |
- legacyDevice->SetBoolean("paired", false); |
- legacyDevice->SetBoolean("incoming", false); |
- predefined_devices->Append(legacyDevice.Pass()); |
- |
- scoped_ptr<base::DictionaryValue> pin(new base::DictionaryValue); |
- pin->SetString("path", kDisplayPinCodePath); |
- pin->SetString("address", kDisplayPinCodeAddress); |
- pin->SetString("name", kDisplayPinCodeName); |
- pin->SetString("alias", kDisplayPinCodeName); |
- pin->SetString("pairingMethod", kPairingMethodPinCode); |
- pin->SetString("pairingAuthToken", kTestPinCode); |
- pin->SetString("pairingAction", kPairingActionDisplay); |
- pin->SetInteger("classValue", kDisplayPinCodeClass); |
- pin->SetBoolean("isTrusted", false); |
- pin->SetBoolean("discoverable", false); |
- pin->SetBoolean("paired", false); |
- pin->SetBoolean("incoming", false); |
- predefined_devices->Append(pin.Pass()); |
- |
- scoped_ptr<base::DictionaryValue> vanishing(new base::DictionaryValue); |
- vanishing->SetString("path", kVanishingDevicePath); |
- vanishing->SetString("address", kVanishingDeviceAddress); |
- vanishing->SetString("name", kVanishingDeviceName); |
- vanishing->SetString("alias", kVanishingDeviceName); |
- vanishing->SetString("pairingMethod", ""); |
- vanishing->SetString("pairingAuthToken", ""); |
- vanishing->SetString("pairingAction", ""); |
- vanishing->SetInteger("classValue", kVanishingDeviceClass); |
- vanishing->SetBoolean("isTrusted", false); |
- vanishing->SetBoolean("discoverable", false); |
- vanishing->SetBoolean("paired", false); |
- vanishing->SetBoolean("incoming", false); |
- predefined_devices->Append(vanishing.Pass()); |
- |
- scoped_ptr<base::DictionaryValue> connect_unpairable( |
- new base::DictionaryValue); |
- connect_unpairable->SetString("path", kConnectUnpairablePath); |
- connect_unpairable->SetString("address", kConnectUnpairableAddress); |
- connect_unpairable->SetString("name", kConnectUnpairableName); |
- connect_unpairable->SetString("pairingMethod", ""); |
- connect_unpairable->SetString("pairingAuthToken", ""); |
- connect_unpairable->SetString("pairingAction", ""); |
- connect_unpairable->SetString("alias", kConnectUnpairableName); |
- connect_unpairable->SetInteger("classValue", kConnectUnpairableClass); |
- connect_unpairable->SetBoolean("isTrusted", false); |
- connect_unpairable->SetBoolean("discoverable", false); |
- connect_unpairable->SetBoolean("paired", false); |
- connect_unpairable->SetBoolean("incoming", false); |
- predefined_devices->Append(connect_unpairable.Pass()); |
- |
- scoped_ptr<base::DictionaryValue> passkey(new base::DictionaryValue); |
- passkey->SetString("path", kDisplayPasskeyPath); |
- passkey->SetString("address", kDisplayPasskeyAddress); |
- passkey->SetString("name", kDisplayPasskeyName); |
- passkey->SetString("alias", kDisplayPasskeyName); |
- passkey->SetString("pairingMethod", kPairingMethodPassKey); |
- passkey->SetInteger("pairingAuthToken", kTestPassKey); |
- passkey->SetString("pairingAction", kPairingActionDisplay); |
- passkey->SetInteger("classValue", kDisplayPasskeyClass); |
- passkey->SetBoolean("isTrusted", false); |
- passkey->SetBoolean("discoverable", false); |
- passkey->SetBoolean("paired", false); |
- passkey->SetBoolean("incoming", false); |
- predefined_devices->Append(passkey.Pass()); |
- |
- scoped_ptr<base::DictionaryValue> request_pin(new base::DictionaryValue); |
- request_pin->SetString("path", kRequestPinCodePath); |
- request_pin->SetString("address", kRequestPinCodeAddress); |
- request_pin->SetString("name", kRequestPinCodeName); |
- request_pin->SetString("alias", kRequestPinCodeName); |
- request_pin->SetString("pairingMethod", ""); |
- request_pin->SetString("pairingAuthToken", ""); |
- request_pin->SetString("pairingAction", kPairingActionRequest); |
- request_pin->SetInteger("classValue", kRequestPinCodeClass); |
- request_pin->SetBoolean("isTrusted", false); |
- request_pin->SetBoolean("discoverable", false); |
- request_pin->SetBoolean("paired", false); |
- request_pin->SetBoolean("incoming", false); |
- predefined_devices->Append(request_pin.Pass()); |
- |
- scoped_ptr<base::DictionaryValue> confirm(new base::DictionaryValue); |
- confirm->SetString("path", kConfirmPasskeyPath); |
- confirm->SetString("address", kConfirmPasskeyAddress); |
- confirm->SetString("name", kConfirmPasskeyName); |
- confirm->SetString("alias", kConfirmPasskeyName); |
- confirm->SetString("pairingMethod", ""); |
- confirm->SetInteger("pairingAuthToken", kTestPassKey); |
- confirm->SetString("pairingAction", kPairingActionConfirmation); |
- confirm->SetInteger("classValue", kConfirmPasskeyClass); |
- confirm->SetBoolean("isTrusted", false); |
- confirm->SetBoolean("discoverable", false); |
- confirm->SetBoolean("paired", false); |
- confirm->SetBoolean("incoming", false); |
- predefined_devices->Append(confirm.Pass()); |
- |
- scoped_ptr<base::DictionaryValue> request_passkey(new base::DictionaryValue); |
- request_passkey->SetString("path", kRequestPasskeyPath); |
- request_passkey->SetString("address", kRequestPasskeyAddress); |
- request_passkey->SetString("name", kRequestPasskeyName); |
- request_passkey->SetString("alias", kRequestPasskeyName); |
- request_passkey->SetString("pairingMethod", kPairingMethodPassKey); |
- request_passkey->SetString("pairingAction", kPairingActionRequest); |
- request_passkey->SetInteger("pairingAuthToken", kTestPassKey); |
- request_passkey->SetInteger("classValue", kRequestPasskeyClass); |
- request_passkey->SetBoolean("isTrusted", false); |
- request_passkey->SetBoolean("discoverable", false); |
- request_passkey->SetBoolean("paired", false); |
- request_passkey->SetBoolean("incoming", false); |
- predefined_devices->Append(request_passkey.Pass()); |
- |
- scoped_ptr<base::DictionaryValue> unconnectable(new base::DictionaryValue); |
- unconnectable->SetString("path", kUnconnectableDevicePath); |
- unconnectable->SetString("address", kUnconnectableDeviceAddress); |
- unconnectable->SetString("name", kUnconnectableDeviceName); |
- unconnectable->SetString("alias", kUnconnectableDeviceName); |
- unconnectable->SetString("pairingMethod", ""); |
- unconnectable->SetString("pairingAuthToken", ""); |
- unconnectable->SetString("pairingAction", ""); |
- unconnectable->SetInteger("classValue", kUnconnectableDeviceClass); |
- unconnectable->SetBoolean("isTrusted", true); |
- unconnectable->SetBoolean("discoverable", false); |
- unconnectable->SetBoolean("paired", false); |
- unconnectable->SetBoolean("incoming", false); |
- predefined_devices->Append(unconnectable.Pass()); |
- |
- scoped_ptr<base::DictionaryValue> unpairable(new base::DictionaryValue); |
- unpairable->SetString("path", kUnpairableDevicePath); |
- unpairable->SetString("address", kUnpairableDeviceAddress); |
- unpairable->SetString("name", kUnpairableDeviceName); |
- unpairable->SetString("alias", kUnpairableDeviceName); |
- unpairable->SetString("pairingMethod", ""); |
- unpairable->SetString("pairingAuthToken", ""); |
- unpairable->SetString("pairingAction", kPairingActionFail); |
- unpairable->SetInteger("classValue", kUnpairableDeviceClass); |
- unpairable->SetBoolean("isTrusted", false); |
- unpairable->SetBoolean("discoverable", false); |
- unpairable->SetBoolean("paired", false); |
- unpairable->SetBoolean("incoming", false); |
- predefined_devices->Append(unpairable.Pass()); |
- |
- scoped_ptr<base::DictionaryValue> just_works(new base::DictionaryValue); |
- just_works->SetString("path", kJustWorksPath); |
- just_works->SetString("address", kJustWorksAddress); |
- just_works->SetString("name", kJustWorksName); |
- just_works->SetString("alias", kJustWorksName); |
- just_works->SetString("pairingMethod", ""); |
- just_works->SetString("pairingAuthToken", ""); |
- just_works->SetString("pairingAction", ""); |
- just_works->SetInteger("classValue", kJustWorksClass); |
- just_works->SetBoolean("isTrusted", false); |
- just_works->SetBoolean("discoverable", false); |
- just_works->SetBoolean("paired", false); |
- just_works->SetBoolean("incoming", false); |
- predefined_devices->Append(just_works.Pass()); |
- |
- scoped_ptr<base::DictionaryValue> low_energy(new base::DictionaryValue); |
- low_energy->SetString("path", kLowEnergyPath); |
- low_energy->SetString("address", kLowEnergyAddress); |
- low_energy->SetString("name", kLowEnergyName); |
- low_energy->SetString("alias", kLowEnergyName); |
- low_energy->SetString("pairingMethod", ""); |
- low_energy->SetString("pairingAuthToken", ""); |
- low_energy->SetString("pairingAction", ""); |
- low_energy->SetInteger("classValue", kLowEnergyClass); |
- low_energy->SetBoolean("isTrusted", false); |
- low_energy->SetBoolean("discoverable", false); |
- low_energy->SetBoolean("paireed", false); |
- low_energy->SetBoolean("incoming", false); |
- predefined_devices->Append(low_energy.Pass()); |
- |
- scoped_ptr<base::DictionaryValue> paired_unconnectable( |
- new base::DictionaryValue); |
- paired_unconnectable->SetString("path", kPairedUnconnectableDevicePath); |
- paired_unconnectable->SetString("address", kPairedUnconnectableDeviceAddress); |
- paired_unconnectable->SetString("name", kPairedUnconnectableDeviceName); |
- paired_unconnectable->SetString("pairingMethod", ""); |
- paired_unconnectable->SetString("pairingAuthToken", ""); |
- paired_unconnectable->SetString("pairingAction", ""); |
- paired_unconnectable->SetString("alias", kPairedUnconnectableDeviceName); |
- paired_unconnectable->SetInteger("classValue", |
- kPairedUnconnectableDeviceClass); |
- paired_unconnectable->SetBoolean("isTrusted", false); |
- paired_unconnectable->SetBoolean("discoverable", true); |
- paired_unconnectable->SetBoolean("paired", true); |
- paired_unconnectable->SetBoolean("incoming", false); |
- predefined_devices->Append(paired_unconnectable.Pass()); |
- |
- return predefined_devices.Pass(); |
-} |
- |
-void FakeBluetoothDeviceClient::RemoveDevice( |
- const dbus::ObjectPath& adapter_path, |
- const dbus::ObjectPath& device_path) { |
- std::vector<dbus::ObjectPath>::iterator listiter = |
- std::find(device_list_.begin(), device_list_.end(), device_path); |
- if (listiter == device_list_.end()) |
- return; |
- |
- PropertiesMap::const_iterator iter = properties_map_.find(device_path); |
- Properties* properties = iter->second; |
- |
- VLOG(1) << "removing device: " << properties->alias.value(); |
- device_list_.erase(listiter); |
- |
- // Remove the Input interface if it exists. This should be called before the |
- // BluetoothDeviceClient::Observer::DeviceRemoved because it deletes the |
- // BluetoothDeviceChromeOS object, including the device_path referenced here. |
- FakeBluetoothInputClient* fake_bluetooth_input_client = |
- static_cast<FakeBluetoothInputClient*>( |
- DBusThreadManager::Get()->GetBluetoothInputClient()); |
- fake_bluetooth_input_client->RemoveInputDevice(device_path); |
- |
- if (device_path == dbus::ObjectPath(kLowEnergyPath)) { |
- FakeBluetoothGattServiceClient* gatt_service_client = |
- static_cast<FakeBluetoothGattServiceClient*>( |
- DBusThreadManager::Get()->GetBluetoothGattServiceClient()); |
- gatt_service_client->HideHeartRateService(); |
- } |
- |
- FOR_EACH_OBSERVER(BluetoothDeviceClient::Observer, observers_, |
- DeviceRemoved(device_path)); |
- |
- properties_map_.erase(iter); |
- PairingOptionsMap::const_iterator options_iter = |
- pairing_options_map_.find(device_path); |
- |
- if (options_iter != pairing_options_map_.end()) { |
- pairing_options_map_.erase(options_iter); |
- } |
-} |
- |
-void FakeBluetoothDeviceClient::OnPropertyChanged( |
- const dbus::ObjectPath& object_path, |
- const std::string& property_name) { |
- VLOG(2) << "Fake Bluetooth device property changed: " << object_path.value() |
- << ": " << property_name; |
- FOR_EACH_OBSERVER(BluetoothDeviceClient::Observer, observers_, |
- DevicePropertyChanged(object_path, property_name)); |
-} |
- |
-void FakeBluetoothDeviceClient::DiscoverySimulationTimer() { |
- if (!discovery_simulation_step_) |
- return; |
- |
- // Timer fires every .75s, the numbers below are arbitrary to give a feel |
- // for a discovery process. |
- VLOG(1) << "discovery simulation, step " << discovery_simulation_step_; |
- if (discovery_simulation_step_ == 2) { |
- CreateDevice(dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath), |
- dbus::ObjectPath(kLegacyAutopairPath)); |
- CreateDevice(dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath), |
- dbus::ObjectPath(kLowEnergyPath)); |
- |
- } else if (discovery_simulation_step_ == 4) { |
- UpdateDeviceRSSI(dbus::ObjectPath(kLowEnergyPath), |
- base::RandInt(kMinRSSI, kMaxRSSI)); |
- CreateDevice(dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath), |
- dbus::ObjectPath(kDisplayPinCodePath)); |
- CreateDevice(dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath), |
- dbus::ObjectPath(kVanishingDevicePath)); |
- |
- } else if (discovery_simulation_step_ == 7) { |
- CreateDevice(dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath), |
- dbus::ObjectPath(kConnectUnpairablePath)); |
- UpdateDeviceRSSI(dbus::ObjectPath(kLowEnergyPath), |
- base::RandInt(kMinRSSI, kMaxRSSI)); |
- |
- } else if (discovery_simulation_step_ == 8) { |
- CreateDevice(dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath), |
- dbus::ObjectPath(kDisplayPasskeyPath)); |
- CreateDevice(dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath), |
- dbus::ObjectPath(kRequestPinCodePath)); |
- UpdateDeviceRSSI(dbus::ObjectPath(kLowEnergyPath), |
- base::RandInt(kMinRSSI, kMaxRSSI)); |
- |
- } else if (discovery_simulation_step_ == 10) { |
- CreateDevice(dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath), |
- dbus::ObjectPath(kConfirmPasskeyPath)); |
- CreateDevice(dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath), |
- dbus::ObjectPath(kRequestPasskeyPath)); |
- CreateDevice(dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath), |
- dbus::ObjectPath(kUnconnectableDevicePath)); |
- CreateDevice(dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath), |
- dbus::ObjectPath(kUnpairableDevicePath)); |
- CreateDevice(dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath), |
- dbus::ObjectPath(kJustWorksPath)); |
- UpdateDeviceRSSI(dbus::ObjectPath(kLowEnergyPath), |
- base::RandInt(kMinRSSI, kMaxRSSI)); |
- |
- } else if (discovery_simulation_step_ == 13) { |
- UpdateDeviceRSSI(dbus::ObjectPath(kLowEnergyPath), |
- base::RandInt(kMinRSSI, kMaxRSSI)); |
- RemoveDevice(dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath), |
- dbus::ObjectPath(kVanishingDevicePath)); |
- } else if (discovery_simulation_step_ == 14) { |
- UpdateDeviceRSSI(dbus::ObjectPath(kLowEnergyPath), |
- base::RandInt(kMinRSSI, kMaxRSSI)); |
- return; |
- |
- } |
- |
- ++discovery_simulation_step_; |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::DiscoverySimulationTimer, |
- base::Unretained(this)), |
- base::TimeDelta::FromMilliseconds(simulation_interval_ms_)); |
-} |
- |
-void FakeBluetoothDeviceClient::IncomingPairingSimulationTimer() { |
- if (!incoming_pairing_simulation_step_) |
- return; |
- |
- VLOG(1) << "incoming pairing simulation, step " |
- << incoming_pairing_simulation_step_; |
- switch (incoming_pairing_simulation_step_) { |
- case 1: |
- CreateDevice(dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath), |
- dbus::ObjectPath(kConfirmPasskeyPath)); |
- SimulatePairing(dbus::ObjectPath(kConfirmPasskeyPath), true, |
- base::Bind(&base::DoNothing), |
- base::Bind(&SimpleErrorCallback)); |
- break; |
- case 2: |
- CreateDevice(dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath), |
- dbus::ObjectPath(kJustWorksPath)); |
- SimulatePairing(dbus::ObjectPath(kJustWorksPath), true, |
- base::Bind(&base::DoNothing), |
- base::Bind(&SimpleErrorCallback)); |
- break; |
- case 3: |
- CreateDevice(dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath), |
- dbus::ObjectPath(kDisplayPinCodePath)); |
- SimulatePairing(dbus::ObjectPath(kDisplayPinCodePath), true, |
- base::Bind(&base::DoNothing), |
- base::Bind(&SimpleErrorCallback)); |
- break; |
- case 4: |
- CreateDevice(dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath), |
- dbus::ObjectPath(kDisplayPasskeyPath)); |
- SimulatePairing(dbus::ObjectPath(kDisplayPasskeyPath), true, |
- base::Bind(&base::DoNothing), |
- base::Bind(&SimpleErrorCallback)); |
- break; |
- case 5: |
- CreateDevice(dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath), |
- dbus::ObjectPath(kRequestPinCodePath)); |
- SimulatePairing(dbus::ObjectPath(kRequestPinCodePath), true, |
- base::Bind(&base::DoNothing), |
- base::Bind(&SimpleErrorCallback)); |
- break; |
- case 6: |
- CreateDevice(dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath), |
- dbus::ObjectPath(kRequestPasskeyPath)); |
- SimulatePairing(dbus::ObjectPath(kRequestPasskeyPath), true, |
- base::Bind(&base::DoNothing), |
- base::Bind(&SimpleErrorCallback)); |
- break; |
- default: |
- return; |
- } |
- |
- ++incoming_pairing_simulation_step_; |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::IncomingPairingSimulationTimer, |
- base::Unretained(this)), |
- base::TimeDelta::FromMilliseconds(kIncomingSimulationPairTimeMultiplier * |
- simulation_interval_ms_)); |
-} |
- |
-void FakeBluetoothDeviceClient::SimulatePairing( |
- const dbus::ObjectPath& object_path, |
- bool incoming_request, |
- const base::Closure& callback, |
- const ErrorCallback& error_callback) { |
- pairing_cancelled_ = false; |
- |
- FakeBluetoothAgentManagerClient* fake_bluetooth_agent_manager_client = |
- static_cast<FakeBluetoothAgentManagerClient*>( |
- DBusThreadManager::Get()->GetBluetoothAgentManagerClient()); |
- FakeBluetoothAgentServiceProvider* agent_service_provider = |
- fake_bluetooth_agent_manager_client->GetAgentServiceProvider(); |
- CHECK(agent_service_provider != NULL); |
- |
- // Grab the device's pairing properties. |
- PairingOptionsMap::const_iterator iter = |
- pairing_options_map_.find(object_path); |
- |
- // If the device with path |object_path| has simulated pairing properties |
- // defined, then pair it based on its |pairing_method|. |
- if (iter != pairing_options_map_.end()) { |
- if (iter->second->pairing_action == kPairingActionFail) { |
- // Fails the pairing with an org.bluez.Error.Failed error. |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::FailSimulatedPairing, |
- base::Unretained(this), object_path, error_callback), |
- base::TimeDelta::FromMilliseconds(simulation_interval_ms_)); |
- } else if (iter->second->pairing_method == kPairingMethodNone || |
- iter->second->pairing_method.empty()) { |
- if (!iter->second->incoming) { |
- // Simply pair and connect the device. |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::CompleteSimulatedPairing, |
- base::Unretained(this), object_path, callback, |
- error_callback), |
- base::TimeDelta::FromMilliseconds( |
- kSimulateNormalPairTimeMultiplier * simulation_interval_ms_)); |
- } else { |
- agent_service_provider->RequestAuthorization( |
- object_path, |
- base::Bind(&FakeBluetoothDeviceClient::ConfirmationCallback, |
- base::Unretained(this), object_path, callback, |
- error_callback)); |
- } |
- } else if (iter->second->pairing_method == kPairingMethodPinCode) { |
- if (iter->second->pairing_action == kPairingActionDisplay) { |
- // Display a Pincode, and wait before acting as if the other end |
- // accepted it. |
- agent_service_provider->DisplayPinCode( |
- object_path, iter->second->pairing_auth_token); |
- |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::CompleteSimulatedPairing, |
- base::Unretained(this), object_path, callback, |
- error_callback), |
- base::TimeDelta::FromMilliseconds(kPinCodeDevicePairTimeMultiplier * |
- simulation_interval_ms_)); |
- } else if (iter->second->pairing_action == kPairingActionRequest) { |
- // Request a pin code. |
- agent_service_provider->RequestPinCode( |
- object_path, base::Bind(&FakeBluetoothDeviceClient::PinCodeCallback, |
- base::Unretained(this), object_path, |
- callback, error_callback)); |
- } else if (iter->second->pairing_action == kPairingActionConfirmation) { |
- error_callback.Run(kNoResponseError, "No confirm for pincode pairing."); |
- } |
- } else if (iter->second->pairing_method == kPairingMethodPassKey) { |
- // Display a passkey, and each interval act as if another key was entered |
- // for it. |
- if (iter->second->pairing_action == kPairingActionDisplay) { |
- agent_service_provider->DisplayPasskey( |
- object_path, std::stoi(iter->second->pairing_auth_token), 0); |
- |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, base::Bind(&FakeBluetoothDeviceClient::SimulateKeypress, |
- base::Unretained(this), 1, object_path, |
- callback, error_callback), |
- base::TimeDelta::FromMilliseconds(simulation_interval_ms_)); |
- } else if (iter->second->pairing_action == kPairingActionRequest) { |
- agent_service_provider->RequestPasskey( |
- object_path, base::Bind(&FakeBluetoothDeviceClient::PasskeyCallback, |
- base::Unretained(this), object_path, |
- callback, error_callback)); |
- } else if (iter->second->pairing_action == kPairingActionConfirmation) { |
- agent_service_provider->RequestConfirmation( |
- object_path, std::stoi(iter->second->pairing_auth_token), |
- base::Bind(&FakeBluetoothDeviceClient::ConfirmationCallback, |
- base::Unretained(this), object_path, callback, |
- error_callback)); |
- } |
- } |
- } else { |
- if (object_path == dbus::ObjectPath(kLegacyAutopairPath) || |
- object_path == dbus::ObjectPath(kConnectUnpairablePath) || |
- object_path == dbus::ObjectPath(kUnconnectableDevicePath) || |
- object_path == dbus::ObjectPath(kLowEnergyPath)) { |
- // No need to call anything on the pairing delegate, just wait 3 times |
- // the interval before acting as if the other end accepted it. |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::CompleteSimulatedPairing, |
- base::Unretained(this), object_path, callback, |
- error_callback), |
- base::TimeDelta::FromMilliseconds(kSimulateNormalPairTimeMultiplier * |
- simulation_interval_ms_)); |
- |
- } else if (object_path == dbus::ObjectPath(kDisplayPinCodePath)) { |
- // Display a Pincode, and wait before acting as if the other end accepted |
- // it. |
- agent_service_provider->DisplayPinCode(object_path, kTestPinCode); |
- |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::CompleteSimulatedPairing, |
- base::Unretained(this), object_path, callback, |
- error_callback), |
- base::TimeDelta::FromMilliseconds(kPinCodeDevicePairTimeMultiplier * |
- simulation_interval_ms_)); |
- |
- } else if (object_path == dbus::ObjectPath(kVanishingDevicePath)) { |
- // The vanishing device simulates being too far away, and thus times out. |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::TimeoutSimulatedPairing, |
- base::Unretained(this), object_path, error_callback), |
- base::TimeDelta::FromMilliseconds(kVanishingDevicePairTimeMultiplier * |
- simulation_interval_ms_)); |
- |
- } else if (object_path == dbus::ObjectPath(kDisplayPasskeyPath)) { |
- // Display a passkey, and each interval act as if another key was entered |
- // for it. |
- agent_service_provider->DisplayPasskey(object_path, kTestPassKey, 0); |
- |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, base::Bind(&FakeBluetoothDeviceClient::SimulateKeypress, |
- base::Unretained(this), 1, object_path, |
- callback, error_callback), |
- base::TimeDelta::FromMilliseconds(simulation_interval_ms_)); |
- |
- } else if (object_path == dbus::ObjectPath(kRequestPinCodePath)) { |
- // Request a Pincode. |
- agent_service_provider->RequestPinCode( |
- object_path, base::Bind(&FakeBluetoothDeviceClient::PinCodeCallback, |
- base::Unretained(this), object_path, callback, |
- error_callback)); |
- |
- } else if (object_path == dbus::ObjectPath(kConfirmPasskeyPath)) { |
- // Request confirmation of a Passkey. |
- agent_service_provider->RequestConfirmation( |
- object_path, kTestPassKey, |
- base::Bind(&FakeBluetoothDeviceClient::ConfirmationCallback, |
- base::Unretained(this), object_path, callback, |
- error_callback)); |
- |
- } else if (object_path == dbus::ObjectPath(kRequestPasskeyPath)) { |
- // Request a Passkey from the user. |
- agent_service_provider->RequestPasskey( |
- object_path, base::Bind(&FakeBluetoothDeviceClient::PasskeyCallback, |
- base::Unretained(this), object_path, callback, |
- error_callback)); |
- |
- } else if (object_path == dbus::ObjectPath(kUnpairableDevicePath)) { |
- // Fails the pairing with an org.bluez.Error.Failed error. |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::FailSimulatedPairing, |
- base::Unretained(this), object_path, error_callback), |
- base::TimeDelta::FromMilliseconds(simulation_interval_ms_)); |
- |
- } else if (object_path == dbus::ObjectPath(kJustWorksPath)) { |
- if (incoming_request) { |
- agent_service_provider->RequestAuthorization( |
- object_path, |
- base::Bind(&FakeBluetoothDeviceClient::ConfirmationCallback, |
- base::Unretained(this), object_path, callback, |
- error_callback)); |
- |
- } else { |
- // No need to call anything on the pairing delegate, just wait before |
- // acting as if the other end accepted it. |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::CompleteSimulatedPairing, |
- base::Unretained(this), object_path, callback, |
- error_callback), |
- base::TimeDelta::FromMilliseconds( |
- kSimulateNormalPairTimeMultiplier * simulation_interval_ms_)); |
- } |
- |
- } else { |
- error_callback.Run(kNoResponseError, "No pairing fake"); |
- } |
- } |
-} |
- |
-void FakeBluetoothDeviceClient::CompleteSimulatedPairing( |
- const dbus::ObjectPath& object_path, |
- const base::Closure& callback, |
- const ErrorCallback& error_callback) { |
- VLOG(1) << "CompleteSimulatedPairing: " << object_path.value(); |
- if (pairing_cancelled_) { |
- pairing_cancelled_ = false; |
- |
- error_callback.Run(bluetooth_device::kErrorAuthenticationCanceled, |
- "Cancelled"); |
- } else { |
- Properties* properties = GetProperties(object_path); |
- |
- properties->paired.ReplaceValue(true); |
- callback.Run(); |
- |
- AddInputDeviceIfNeeded(object_path, properties); |
- } |
-} |
- |
-void FakeBluetoothDeviceClient::TimeoutSimulatedPairing( |
- const dbus::ObjectPath& object_path, |
- const ErrorCallback& error_callback) { |
- VLOG(1) << "TimeoutSimulatedPairing: " << object_path.value(); |
- |
- error_callback.Run(bluetooth_device::kErrorAuthenticationTimeout, |
- "Timed out"); |
-} |
- |
-void FakeBluetoothDeviceClient::CancelSimulatedPairing( |
- const dbus::ObjectPath& object_path, |
- const ErrorCallback& error_callback) { |
- VLOG(1) << "CancelSimulatedPairing: " << object_path.value(); |
- |
- error_callback.Run(bluetooth_device::kErrorAuthenticationCanceled, |
- "Canceled"); |
-} |
- |
-void FakeBluetoothDeviceClient::RejectSimulatedPairing( |
- const dbus::ObjectPath& object_path, |
- const ErrorCallback& error_callback) { |
- VLOG(1) << "RejectSimulatedPairing: " << object_path.value(); |
- |
- error_callback.Run(bluetooth_device::kErrorAuthenticationRejected, |
- "Rejected"); |
-} |
- |
-void FakeBluetoothDeviceClient::FailSimulatedPairing( |
- const dbus::ObjectPath& object_path, |
- const ErrorCallback& error_callback) { |
- VLOG(1) << "FailSimulatedPairing: " << object_path.value(); |
- |
- error_callback.Run(bluetooth_device::kErrorFailed, "Failed"); |
-} |
- |
-void FakeBluetoothDeviceClient::AddInputDeviceIfNeeded( |
- const dbus::ObjectPath& object_path, |
- Properties* properties) { |
- // If the paired device is a HID device based on it's bluetooth class, |
- // simulate the Input interface. |
- FakeBluetoothInputClient* fake_bluetooth_input_client = |
- static_cast<FakeBluetoothInputClient*>( |
- DBusThreadManager::Get()->GetBluetoothInputClient()); |
- |
- if ((properties->bluetooth_class.value() & 0x001f03) == 0x000500) |
- fake_bluetooth_input_client->AddInputDevice(object_path); |
-} |
- |
-void FakeBluetoothDeviceClient::UpdateDeviceRSSI( |
- const dbus::ObjectPath& object_path, |
- int16 rssi) { |
- PropertiesMap::const_iterator iter = properties_map_.find(object_path); |
- if (iter == properties_map_.end()) { |
- VLOG(2) << "Fake device does not exist: " << object_path.value(); |
- return; |
- } |
- Properties* properties = iter->second; |
- DCHECK(properties); |
- properties->rssi.ReplaceValue(rssi); |
-} |
- |
-void FakeBluetoothDeviceClient::UpdateConnectionInfo( |
- uint16 connection_rssi, |
- uint16 transmit_power, |
- uint16 max_transmit_power) { |
- connection_rssi_ = connection_rssi; |
- transmit_power_ = transmit_power; |
- max_transmit_power_ = max_transmit_power; |
-} |
- |
-void FakeBluetoothDeviceClient::PinCodeCallback( |
- const dbus::ObjectPath& object_path, |
- const base::Closure& callback, |
- const ErrorCallback& error_callback, |
- BluetoothAgentServiceProvider::Delegate::Status status, |
- const std::string& pincode) { |
- VLOG(1) << "PinCodeCallback: " << object_path.value(); |
- |
- if (status == BluetoothAgentServiceProvider::Delegate::SUCCESS) { |
- PairingOptionsMap::const_iterator iter = |
- pairing_options_map_.find(object_path); |
- |
- bool success = true; |
- |
- // If the device has pairing options defined |
- if (iter != pairing_options_map_.end()) { |
- success = iter->second->pairing_auth_token == pincode; |
- } |
- |
- if (success) { |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::CompleteSimulatedPairing, |
- base::Unretained(this), object_path, callback, |
- error_callback), |
- base::TimeDelta::FromMilliseconds(kSimulateNormalPairTimeMultiplier * |
- simulation_interval_ms_)); |
- } else { |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::RejectSimulatedPairing, |
- base::Unretained(this), object_path, error_callback), |
- base::TimeDelta::FromMilliseconds(simulation_interval_ms_)); |
- } |
- |
- } else if (status == BluetoothAgentServiceProvider::Delegate::CANCELLED) { |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::CancelSimulatedPairing, |
- base::Unretained(this), object_path, error_callback), |
- base::TimeDelta::FromMilliseconds(simulation_interval_ms_)); |
- |
- } else if (status == BluetoothAgentServiceProvider::Delegate::REJECTED) { |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::RejectSimulatedPairing, |
- base::Unretained(this), object_path, error_callback), |
- base::TimeDelta::FromMilliseconds(simulation_interval_ms_)); |
- } |
-} |
- |
-void FakeBluetoothDeviceClient::PasskeyCallback( |
- const dbus::ObjectPath& object_path, |
- const base::Closure& callback, |
- const ErrorCallback& error_callback, |
- BluetoothAgentServiceProvider::Delegate::Status status, |
- uint32 passkey) { |
- VLOG(1) << "PasskeyCallback: " << object_path.value(); |
- |
- if (status == BluetoothAgentServiceProvider::Delegate::SUCCESS) { |
- PairingOptionsMap::const_iterator iter = |
- pairing_options_map_.find(object_path); |
- bool success = true; |
- |
- if (iter != pairing_options_map_.end()) { |
- success = static_cast<uint32>( |
- std::stoi(iter->second->pairing_auth_token)) == passkey; |
- } |
- |
- if (success) { |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::CompleteSimulatedPairing, |
- base::Unretained(this), object_path, callback, |
- error_callback), |
- base::TimeDelta::FromMilliseconds(kSimulateNormalPairTimeMultiplier * |
- simulation_interval_ms_)); |
- } else { |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::RejectSimulatedPairing, |
- base::Unretained(this), object_path, error_callback), |
- base::TimeDelta::FromMilliseconds(simulation_interval_ms_)); |
- } |
- |
- } else if (status == BluetoothAgentServiceProvider::Delegate::CANCELLED) { |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::CancelSimulatedPairing, |
- base::Unretained(this), object_path, error_callback), |
- base::TimeDelta::FromMilliseconds(simulation_interval_ms_)); |
- |
- } else if (status == BluetoothAgentServiceProvider::Delegate::REJECTED) { |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::RejectSimulatedPairing, |
- base::Unretained(this), object_path, error_callback), |
- base::TimeDelta::FromMilliseconds(simulation_interval_ms_)); |
- } |
-} |
- |
-void FakeBluetoothDeviceClient::ConfirmationCallback( |
- const dbus::ObjectPath& object_path, |
- const base::Closure& callback, |
- const ErrorCallback& error_callback, |
- BluetoothAgentServiceProvider::Delegate::Status status) { |
- VLOG(1) << "ConfirmationCallback: " << object_path.value(); |
- |
- if (status == BluetoothAgentServiceProvider::Delegate::SUCCESS) { |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::CompleteSimulatedPairing, |
- base::Unretained(this), object_path, callback, |
- error_callback), |
- base::TimeDelta::FromMilliseconds(kSimulateNormalPairTimeMultiplier * |
- simulation_interval_ms_)); |
- |
- } else if (status == BluetoothAgentServiceProvider::Delegate::CANCELLED) { |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::CancelSimulatedPairing, |
- base::Unretained(this), object_path, error_callback), |
- base::TimeDelta::FromMilliseconds(simulation_interval_ms_)); |
- |
- } else if (status == BluetoothAgentServiceProvider::Delegate::REJECTED) { |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::RejectSimulatedPairing, |
- base::Unretained(this), object_path, error_callback), |
- base::TimeDelta::FromMilliseconds(simulation_interval_ms_)); |
- } |
-} |
- |
-void FakeBluetoothDeviceClient::SimulateKeypress( |
- uint16 entered, |
- const dbus::ObjectPath& object_path, |
- const base::Closure& callback, |
- const ErrorCallback& error_callback) { |
- VLOG(1) << "SimulateKeypress " << entered << ": " << object_path.value(); |
- |
- FakeBluetoothAgentManagerClient* fake_bluetooth_agent_manager_client = |
- static_cast<FakeBluetoothAgentManagerClient*>( |
- DBusThreadManager::Get()->GetBluetoothAgentManagerClient()); |
- FakeBluetoothAgentServiceProvider* agent_service_provider = |
- fake_bluetooth_agent_manager_client->GetAgentServiceProvider(); |
- |
- // The agent service provider object could have been destroyed after the |
- // pairing is canceled. |
- if (!agent_service_provider) |
- return; |
- |
- agent_service_provider->DisplayPasskey(object_path, kTestPassKey, entered); |
- |
- if (entered < 7) { |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, base::Bind(&FakeBluetoothDeviceClient::SimulateKeypress, |
- base::Unretained(this), entered + 1, object_path, |
- callback, error_callback), |
- base::TimeDelta::FromMilliseconds(simulation_interval_ms_)); |
- |
- } else { |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&FakeBluetoothDeviceClient::CompleteSimulatedPairing, |
- base::Unretained(this), object_path, callback, |
- error_callback), |
- base::TimeDelta::FromMilliseconds(simulation_interval_ms_)); |
- } |
-} |
- |
-void FakeBluetoothDeviceClient::ConnectionCallback( |
- const dbus::ObjectPath& object_path, |
- const base::Closure& callback, |
- const ErrorCallback& error_callback, |
- BluetoothProfileServiceProvider::Delegate::Status status) { |
- VLOG(1) << "ConnectionCallback: " << object_path.value(); |
- |
- if (status == BluetoothProfileServiceProvider::Delegate::SUCCESS) { |
- callback.Run(); |
- } else if (status == BluetoothProfileServiceProvider::Delegate::CANCELLED) { |
- // TODO(keybuk): tear down this side of the connection |
- error_callback.Run(bluetooth_device::kErrorFailed, "Canceled"); |
- } else if (status == BluetoothProfileServiceProvider::Delegate::REJECTED) { |
- // TODO(keybuk): tear down this side of the connection |
- error_callback.Run(bluetooth_device::kErrorFailed, "Rejected"); |
- } |
-} |
- |
-void FakeBluetoothDeviceClient::DisconnectionCallback( |
- const dbus::ObjectPath& object_path, |
- const base::Closure& callback, |
- const ErrorCallback& error_callback, |
- BluetoothProfileServiceProvider::Delegate::Status status) { |
- VLOG(1) << "DisconnectionCallback: " << object_path.value(); |
- |
- if (status == BluetoothProfileServiceProvider::Delegate::SUCCESS) { |
- // TODO(keybuk): tear down this side of the connection |
- callback.Run(); |
- } else if (status == BluetoothProfileServiceProvider::Delegate::CANCELLED) { |
- error_callback.Run(bluetooth_device::kErrorFailed, "Canceled"); |
- } else if (status == BluetoothProfileServiceProvider::Delegate::REJECTED) { |
- error_callback.Run(bluetooth_device::kErrorFailed, "Rejected"); |
- } |
-} |
- |
-} // namespace chromeos |