blob: 13363b26c1ebcce7b7267597f435f011b49167aa [file] [log] [blame]
// Copyright 2018 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_SERVICES_SECURE_CHANNEL_BLE_SCANNER_IMPL_H_
#define CHROMEOS_SERVICES_SECURE_CHANNEL_BLE_SCANNER_IMPL_H_
#include <memory>
#include <vector>
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "chromeos/services/secure_channel/ble_scanner.h"
#include "chromeos/services/secure_channel/ble_service_data_helper.h"
#include "device/bluetooth/bluetooth_adapter.h"
namespace device {
class BluetoothDevice;
class BluetoothDiscoverySession;
} // namespace device
namespace chromeos {
namespace secure_channel {
class BleServiceDataHelper;
class BleSynchronizerBase;
// Concrete BleScanner implementation.
class BleScannerImpl : public BleScanner,
public device::BluetoothAdapter::Observer {
public:
class Factory {
public:
static Factory* Get();
static void SetFactoryForTesting(Factory* test_factory);
virtual std::unique_ptr<BleScanner> BuildInstance(
Delegate* delegate,
BleServiceDataHelper* service_data_helper,
BleSynchronizerBase* ble_synchronizer,
scoped_refptr<device::BluetoothAdapter> adapter);
private:
static Factory* test_factory_;
};
~BleScannerImpl() override;
private:
friend class SecureChannelBleScannerImplTest;
// Extracts the service data corresponding to the ProximityAuth service UUID.
// This is encapsulated within a class because device::BluetoothDevice does
// not provide a way to override this functionality for tests.
class ServiceDataProvider {
public:
virtual ~ServiceDataProvider();
virtual const std::vector<uint8_t>* ExtractProximityAuthServiceData(
device::BluetoothDevice* bluetooth_device);
};
BleScannerImpl(Delegate* delegate,
BleServiceDataHelper* service_data_helper,
BleSynchronizerBase* ble_synchronizer,
scoped_refptr<device::BluetoothAdapter> adapter);
// BleScanner:
void HandleScanFilterChange() override;
// device::BluetoothAdapter::Observer:
void DeviceAdvertisementReceived(device::BluetoothAdapter* adapter,
device::BluetoothDevice* device,
int16_t rssi,
const std::vector<uint8_t>& eir) override;
void UpdateDiscoveryStatus();
bool IsDiscoverySessionActive();
void ResetDiscoverySessionIfNotActive();
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 HandlePotentialScanResult(
const std::string& service_data,
const BleServiceDataHelper::DeviceWithBackgroundBool& potential_result,
device::BluetoothDevice* bluetooth_device);
void SetServiceDataProviderForTesting(
std::unique_ptr<ServiceDataProvider> service_data_provider);
BleServiceDataHelper* service_data_helper_;
BleSynchronizerBase* ble_synchronizer_;
scoped_refptr<device::BluetoothAdapter> adapter_;
std::unique_ptr<ServiceDataProvider> service_data_provider_;
bool is_initializing_discovery_session_ = false;
bool is_stopping_discovery_session_ = false;
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_{this};
DISALLOW_COPY_AND_ASSIGN(BleScannerImpl);
};
} // namespace secure_channel
} // namespace chromeos
#endif // CHROMEOS_SERVICES_SECURE_CHANNEL_BLE_SCANNER_IMPL_H_