blob: e062d3ceba298ee0296ff1d9c726c170c6fa5756 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMEOS_COMPONENTS_TETHER_BLE_SCANNER_IMPL_H_
#define CHROMEOS_COMPONENTS_TETHER_BLE_SCANNER_IMPL_H_
#include <map>
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/optional.h"
#include "chromeos/components/tether/ble_scanner.h"
#include "components/cryptauth/remote_device_ref.h"
#include "device/bluetooth/bluetooth_adapter.h"
namespace base {
class TaskRunner;
} // namespace base
namespace device {
class BluetoothDevice;
class BluetoothDiscoverySession;
} // namespace device
namespace chromeos {
namespace secure_channel {
class BleServiceDataHelper;
class BleSynchronizerBase;
} // namespace secure_channel
namespace tether {
class TetherHostFetcher;
// Concrete BleScanner implementation.
class BleScannerImpl : public BleScanner,
public device::BluetoothAdapter::Observer {
public:
class Factory {
public:
static std::unique_ptr<BleScanner> NewInstance(
scoped_refptr<device::BluetoothAdapter> adapter,
secure_channel::BleServiceDataHelper* ble_service_data_helper,
secure_channel::BleSynchronizerBase* ble_synchronizer,
TetherHostFetcher* tether_host_fetcher);
static void SetInstanceForTesting(Factory* factory);
protected:
virtual std::unique_ptr<BleScanner> BuildInstance(
scoped_refptr<device::BluetoothAdapter> adapter,
secure_channel::BleServiceDataHelper* ble_service_data_helper,
secure_channel::BleSynchronizerBase* ble_synchronizer,
TetherHostFetcher* tether_host_fetcher);
private:
static Factory* factory_instance_;
};
~BleScannerImpl() override;
// BleScanner:
bool RegisterScanFilterForDevice(const std::string& device_id) override;
bool UnregisterScanFilterForDevice(const std::string& device_id) override;
bool ShouldDiscoverySessionBeActive() override;
bool IsDiscoverySessionActive() override;
protected:
BleScannerImpl(scoped_refptr<device::BluetoothAdapter> adapter,
secure_channel::BleServiceDataHelper* ble_service_data_helper,
secure_channel::BleSynchronizerBase* ble_synchronizer,
TetherHostFetcher* tether_host_fetcher);
// device::BluetoothAdapter::Observer:
void DeviceAdded(device::BluetoothAdapter* adapter,
device::BluetoothDevice* bluetooth_device) override;
void DeviceChanged(device::BluetoothAdapter* adapter,
device::BluetoothDevice* bluetooth_device) override;
private:
friend class BleScannerImplTest;
class ServiceDataProvider {
public:
virtual ~ServiceDataProvider() {}
virtual const std::vector<uint8_t>* GetServiceDataForUUID(
device::BluetoothDevice* bluetooth_device) = 0;
};
class ServiceDataProviderImpl : public ServiceDataProvider {
public:
ServiceDataProviderImpl();
~ServiceDataProviderImpl() override;
const std::vector<uint8_t>* GetServiceDataForUUID(
device::BluetoothDevice* bluetooth_device) override;
};
void SetTestDoubles(
std::unique_ptr<ServiceDataProvider> service_data_provider,
scoped_refptr<base::TaskRunner> test_task_runner);
bool IsDeviceRegistered(const std::string& device_id);
// A discovery session should stay active until it has been stopped. However,
// due to bugs in Bluetooth code, it is possible for a discovery status to
// transition to being off without a Stop() call ever succeeding. This
// function corrects the state of Bluetooth if such a bug occurs.
void ResetDiscoverySessionIfNotActive();
void UpdateDiscoveryStatus();
void EnsureDiscoverySessionActive();
void OnDiscoverySessionStarted(
std::unique_ptr<device::BluetoothDiscoverySession> discovery_session);
void OnStartDiscoverySessionError();
void EnsureDiscoverySessionNotActive();
void OnDiscoverySessionStopped();
void OnStopDiscoverySessionError();
void HandleDeviceUpdated(device::BluetoothDevice* bluetooth_device);
void CheckForMatchingScanFilters(device::BluetoothDevice* bluetooth_device,
const std::string& service_data);
void ScheduleStatusChangeNotification(bool discovery_session_active);
scoped_refptr<device::BluetoothAdapter> adapter_;
secure_channel::BleServiceDataHelper* ble_service_data_helper_;
secure_channel::BleSynchronizerBase* ble_synchronizer_;
TetherHostFetcher* tether_host_fetcher_;
std::unique_ptr<ServiceDataProvider> service_data_provider_;
std::vector<std::string> registered_remote_device_ids_;
bool is_initializing_discovery_session_ = false;
bool is_stopping_discovery_session_ = false;
scoped_refptr<base::TaskRunner> task_runner_;
std::unique_ptr<device::BluetoothDiscoverySession> discovery_session_;
std::unique_ptr<base::WeakPtrFactory<device::BluetoothDiscoverySession>>
discovery_session_weak_ptr_factory_;
base::WeakPtrFactory<BleScannerImpl> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(BleScannerImpl);
};
} // namespace tether
} // namespace chromeos
#endif // CHROMEOS_COMPONENTS_TETHER_BLE_SCANNER_IMPL_H_