forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
fake_radio_winrt.cc
135 lines (108 loc) · 4.29 KB
/
fake_radio_winrt.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// 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.
#include "device/bluetooth/test/fake_radio_winrt.h"
#include <utility>
#include "base/bind.h"
#include "base/test/bind_test_util.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/win/async_operation.h"
namespace device {
namespace {
using ABI::Windows::Devices::Radios::Radio;
using ABI::Windows::Devices::Radios::RadioAccessStatus;
using ABI::Windows::Devices::Radios::RadioAccessStatus_Allowed;
using ABI::Windows::Devices::Radios::RadioAccessStatus_DeniedBySystem;
using ABI::Windows::Devices::Radios::RadioKind;
using ABI::Windows::Devices::Radios::RadioState;
using ABI::Windows::Devices::Radios::RadioState_Off;
using ABI::Windows::Devices::Radios::RadioState_On;
using ABI::Windows::Foundation::Collections::IVectorView;
using ABI::Windows::Foundation::IAsyncOperation;
using ABI::Windows::Foundation::ITypedEventHandler;
using Microsoft::WRL::Make;
} // namespace
FakeRadioWinrt::FakeRadioWinrt() = default;
FakeRadioWinrt::~FakeRadioWinrt() = default;
HRESULT FakeRadioWinrt::SetStateAsync(
RadioState value,
IAsyncOperation<RadioAccessStatus>** operation) {
auto async_op = Make<base::win::AsyncOperation<RadioAccessStatus>>();
set_state_callback_ = async_op->callback();
// Schedule a callback that will run |set_state_callback_| with Status_Allowed
// and invokes |state_changed_handler_| if |value| is different from |state_|.
// Capturing |this| as safe here, as the callback won't be run if
// |cancelable_closure_| gets destroyed first.
cancelable_closure_.Reset(base::BindLambdaForTesting([this, value] {
std::move(set_state_callback_).Run(RadioAccessStatus_Allowed);
if (std::exchange(state_, value) != value)
state_changed_handler_->Invoke(this, nullptr);
}));
base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
cancelable_closure_.callback());
*operation = async_op.Detach();
return S_OK;
}
HRESULT FakeRadioWinrt::add_StateChanged(
ITypedEventHandler<Radio*, IInspectable*>* handler,
EventRegistrationToken* event_cookie) {
state_changed_handler_ = handler;
return S_OK;
}
HRESULT FakeRadioWinrt::remove_StateChanged(
EventRegistrationToken event_cookie) {
state_changed_handler_.Reset();
return S_OK;
}
HRESULT FakeRadioWinrt::get_State(RadioState* value) {
*value = state_;
return S_OK;
}
HRESULT FakeRadioWinrt::get_Name(HSTRING* value) {
return E_NOTIMPL;
}
HRESULT FakeRadioWinrt::get_Kind(RadioKind* value) {
return E_NOTIMPL;
}
void FakeRadioWinrt::SimulateAdapterPowerFailure() {
DCHECK(set_state_callback_);
// Cancel the task scheduled in SetStateAsync() and run the stored callback
// with an error code.
cancelable_closure_.Reset(base::BindOnce(std::move(set_state_callback_),
RadioAccessStatus_DeniedBySystem));
base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
cancelable_closure_.callback());
}
void FakeRadioWinrt::SimulateAdapterPoweredOn() {
state_ = RadioState_On;
DCHECK(state_changed_handler_);
state_changed_handler_->Invoke(this, nullptr);
}
void FakeRadioWinrt::SimulateAdapterPoweredOff() {
state_ = RadioState_Off;
DCHECK(state_changed_handler_);
state_changed_handler_->Invoke(this, nullptr);
}
FakeRadioStaticsWinrt::FakeRadioStaticsWinrt() = default;
FakeRadioStaticsWinrt::~FakeRadioStaticsWinrt() = default;
HRESULT FakeRadioStaticsWinrt::GetRadiosAsync(
IAsyncOperation<IVectorView<Radio*>*>** value) {
return E_NOTIMPL;
}
HRESULT FakeRadioStaticsWinrt::GetDeviceSelector(HSTRING* device_selector) {
return E_NOTIMPL;
}
HRESULT FakeRadioStaticsWinrt::FromIdAsync(HSTRING device_id,
IAsyncOperation<Radio*>** value) {
return E_NOTIMPL;
}
HRESULT FakeRadioStaticsWinrt::RequestAccessAsync(
IAsyncOperation<RadioAccessStatus>** operation) {
auto async_op = Make<base::win::AsyncOperation<RadioAccessStatus>>();
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::BindOnce(async_op->callback(), RadioAccessStatus_Allowed));
*operation = async_op.Detach();
return S_OK;
}
} // namespace device