blob: 3daa169f8cf342be02967309a532e0451520a80a [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 DEVICE_BLUETOOTH_BLUETOOTH_ADAPTER_WINRT_H_
#define DEVICE_BLUETOOTH_BLUETOOTH_ADAPTER_WINRT_H_
#include <windows.devices.bluetooth.h>
#include <windows.devices.enumeration.h>
#include <windows.devices.radios.h>
#include <wrl/client.h>
#include <memory>
#include <string>
#include <vector>
#include "base/callback_forward.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/threading/thread_checker.h"
#include "device/bluetooth/bluetooth_adapter.h"
#include "device/bluetooth/bluetooth_export.h"
namespace base {
class ScopedClosureRunner;
}
namespace device {
class BluetoothAdvertisementWinrt;
class BluetoothDeviceWinrt;
class DEVICE_BLUETOOTH_EXPORT BluetoothAdapterWinrt : public BluetoothAdapter {
public:
// BluetoothAdapter:
std::string GetAddress() const override;
std::string GetName() const override;
void SetName(const std::string& name,
const base::Closure& callback,
const ErrorCallback& error_callback) override;
bool IsInitialized() const override;
bool IsPresent() const override;
bool CanPower() const override;
bool IsPowered() const override;
bool IsDiscoverable() const override;
void SetDiscoverable(bool discoverable,
const base::Closure& callback,
const ErrorCallback& error_callback) override;
bool IsDiscovering() const override;
UUIDList GetUUIDs() const override;
void CreateRfcommService(
const BluetoothUUID& uuid,
const ServiceOptions& options,
const CreateServiceCallback& callback,
const CreateServiceErrorCallback& error_callback) override;
void CreateL2capService(
const BluetoothUUID& uuid,
const ServiceOptions& options,
const CreateServiceCallback& callback,
const CreateServiceErrorCallback& error_callback) override;
void RegisterAdvertisement(
std::unique_ptr<BluetoothAdvertisement::Data> advertisement_data,
const CreateAdvertisementCallback& callback,
const AdvertisementErrorCallback& error_callback) override;
std::vector<BluetoothAdvertisement*> GetPendingAdvertisementsForTesting()
const override;
BluetoothLocalGattService* GetGattService(
const std::string& identifier) const override;
ABI::Windows::Devices::Radios::IRadio* GetRadioForTesting();
ABI::Windows::Devices::Enumeration::IDeviceWatcher*
GetPoweredRadioWatcherForTesting();
protected:
friend class BluetoothAdapterWin;
friend class BluetoothTestWinrt;
BluetoothAdapterWinrt();
~BluetoothAdapterWinrt() override;
void Init(InitCallback init_cb);
// BluetoothAdapter:
bool SetPoweredImpl(bool powered) override;
void AddDiscoverySession(
BluetoothDiscoveryFilter* discovery_filter,
const base::Closure& callback,
DiscoverySessionErrorCallback error_callback) override;
void RemoveDiscoverySession(
BluetoothDiscoveryFilter* discovery_filter,
const base::Closure& callback,
DiscoverySessionErrorCallback error_callback) override;
void SetDiscoveryFilter(
std::unique_ptr<BluetoothDiscoveryFilter> discovery_filter,
const base::Closure& callback,
DiscoverySessionErrorCallback error_callback) override;
void RemovePairingDelegateInternal(
BluetoothDevice::PairingDelegate* pairing_delegate) override;
// These are declared virtual so that they can be overridden by tests.
virtual HRESULT GetBluetoothAdapterStaticsActivationFactory(
ABI::Windows::Devices::Bluetooth::IBluetoothAdapterStatics** statics)
const;
virtual HRESULT GetDeviceInformationStaticsActivationFactory(
ABI::Windows::Devices::Enumeration::IDeviceInformationStatics** statics)
const;
virtual HRESULT GetRadioStaticsActivationFactory(
ABI::Windows::Devices::Radios::IRadioStatics** statics) const;
virtual HRESULT ActivateBluetoothAdvertisementLEWatcherInstance(
ABI::Windows::Devices::Bluetooth::Advertisement::
IBluetoothLEAdvertisementWatcher** instance) const;
virtual scoped_refptr<BluetoothAdvertisementWinrt> CreateAdvertisement()
const;
virtual std::unique_ptr<BluetoothDeviceWinrt> CreateDevice(
uint64_t raw_address);
private:
void OnGetDefaultAdapter(
base::ScopedClosureRunner on_init,
Microsoft::WRL::ComPtr<
ABI::Windows::Devices::Bluetooth::IBluetoothAdapter> adapter);
void OnCreateFromIdAsync(
base::ScopedClosureRunner on_init,
Microsoft::WRL::ComPtr<
ABI::Windows::Devices::Enumeration::IDeviceInformation>
device_information);
void OnRequestRadioAccess(
base::ScopedClosureRunner on_init,
ABI::Windows::Devices::Radios::RadioAccessStatus access_status);
void OnGetRadio(
base::ScopedClosureRunner on_init,
Microsoft::WRL::ComPtr<ABI::Windows::Devices::Radios::IRadio> radio);
void OnSetRadioState(
ABI::Windows::Devices::Radios::RadioAccessStatus access_status);
void OnRadioStateChanged(ABI::Windows::Devices::Radios::IRadio* radio,
IInspectable* object);
void OnPoweredRadioAdded(
ABI::Windows::Devices::Enumeration::IDeviceWatcher* watcher,
ABI::Windows::Devices::Enumeration::IDeviceInformation* info);
void OnPoweredRadioRemoved(
ABI::Windows::Devices::Enumeration::IDeviceWatcher* watcher,
ABI::Windows::Devices::Enumeration::IDeviceInformationUpdate* update);
void OnPoweredRadiosEnumerated(
ABI::Windows::Devices::Enumeration::IDeviceWatcher* watcher,
IInspectable* object);
void OnAdvertisementReceived(
ABI::Windows::Devices::Bluetooth::Advertisement::
IBluetoothLEAdvertisementWatcher* watcher,
ABI::Windows::Devices::Bluetooth::Advertisement::
IBluetoothLEAdvertisementReceivedEventArgs* received);
void OnRegisterAdvertisement(BluetoothAdvertisement* advertisement,
const CreateAdvertisementCallback& callback);
void OnRegisterAdvertisementError(
BluetoothAdvertisement* advertisement,
const AdvertisementErrorCallback& error_callback,
BluetoothAdvertisement::ErrorCode error_code);
void TryRemoveRadioStateChangedHandler();
void TryRemovePoweredRadioEventHandlers();
void RemoveAdvertisementReceivedHandler();
bool is_initialized_ = false;
std::string address_;
std::string name_;
std::unique_ptr<base::ScopedClosureRunner> on_init_;
Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth::IBluetoothAdapter>
adapter_;
Microsoft::WRL::ComPtr<ABI::Windows::Devices::Radios::IRadio> radio_;
base::Optional<EventRegistrationToken> radio_state_changed_token_;
Microsoft::WRL::ComPtr<ABI::Windows::Devices::Enumeration::IDeviceWatcher>
powered_radio_watcher_;
base::Optional<EventRegistrationToken> powered_radio_added_token_;
base::Optional<EventRegistrationToken> powered_radio_removed_token_;
base::Optional<EventRegistrationToken> powered_radios_enumerated_token_;
size_t num_powered_radios_ = 0;
std::vector<scoped_refptr<BluetoothAdvertisement>> pending_advertisements_;
size_t num_discovery_sessions_ = 0;
EventRegistrationToken advertisement_received_token_;
Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth::Advertisement::
IBluetoothLEAdvertisementWatcher>
ble_advertisement_watcher_;
THREAD_CHECKER(thread_checker_);
// Note: This should remain the last member so it'll be destroyed and
// invalidate its weak pointers before any other members are destroyed.
base::WeakPtrFactory<BluetoothAdapterWinrt> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(BluetoothAdapterWinrt);
};
} // namespace device
#endif // DEVICE_BLUETOOTH_BLUETOOTH_ADAPTER_WINRT_H_