1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chromeos/dbus/fake_nfc_device_client.h"
8 #include "base/logging.h"
9 #include "base/message_loop/message_loop.h"
10 #include "base/time/time.h"
11 #include "chromeos/dbus/dbus_thread_manager.h"
12 #include "chromeos/dbus/fake_nfc_adapter_client.h"
13 #include "chromeos/dbus/fake_nfc_record_client.h"
14 #include "chromeos/dbus/nfc_client_helpers.h"
15 #include "dbus/object_path.h"
16 #include "third_party/cros_system_api/dbus/service_constants.h"
20 using nfc_client_helpers::ObjectPathVector
;
22 const char FakeNfcDeviceClient::kDevicePath
[] = "/fake/device0";
23 const int FakeNfcDeviceClient::kDefaultSimulationTimeoutMilliseconds
= 10000;
25 FakeNfcDeviceClient::Properties::Properties(
26 const PropertyChangedCallback
& callback
)
27 : NfcDeviceClient::Properties(NULL
, callback
) {
30 FakeNfcDeviceClient::Properties::~Properties() {
33 void FakeNfcDeviceClient::Properties::Get(
34 dbus::PropertyBase
* property
,
35 dbus::PropertySet::GetCallback callback
) {
36 VLOG(1) << "Get " << property
->name();
40 void FakeNfcDeviceClient::Properties::GetAll() {
44 void FakeNfcDeviceClient::Properties::Set(
45 dbus::PropertyBase
* property
,
46 dbus::PropertySet::SetCallback callback
) {
47 VLOG(1) << "Set " << property
->name();
51 FakeNfcDeviceClient::FakeNfcDeviceClient()
52 : pairing_started_(false),
53 device_visible_(false),
54 simulation_timeout_(kDefaultSimulationTimeoutMilliseconds
) {
55 VLOG(1) << "Creating FakeNfcDeviceClient";
57 properties_
.reset(new Properties(
58 base::Bind(&FakeNfcDeviceClient::OnPropertyChanged
,
59 base::Unretained(this),
60 dbus::ObjectPath(kDevicePath
))));
63 FakeNfcDeviceClient::~FakeNfcDeviceClient() {
66 void FakeNfcDeviceClient::Init(dbus::Bus
* bus
) {
69 void FakeNfcDeviceClient::AddObserver(Observer
* observer
) {
70 observers_
.AddObserver(observer
);
73 void FakeNfcDeviceClient::RemoveObserver(Observer
* observer
) {
74 observers_
.RemoveObserver(observer
);
77 std::vector
<dbus::ObjectPath
> FakeNfcDeviceClient::GetDevicesForAdapter(
78 const dbus::ObjectPath
& adapter_path
) {
79 std::vector
<dbus::ObjectPath
> device_paths
;
80 if (device_visible_
&&
81 adapter_path
.value() == FakeNfcAdapterClient::kAdapterPath0
)
82 device_paths
.push_back(dbus::ObjectPath(kDevicePath
));
86 FakeNfcDeviceClient::Properties
*
87 FakeNfcDeviceClient::GetProperties(const dbus::ObjectPath
& object_path
) {
90 return properties_
.get();
93 void FakeNfcDeviceClient::Push(
94 const dbus::ObjectPath
& object_path
,
95 const base::DictionaryValue
& attributes
,
96 const base::Closure
& callback
,
97 const nfc_client_helpers::ErrorCallback
& error_callback
) {
98 VLOG(1) << "FakeNfcDeviceClient::Write called.";
101 if (!device_visible_
) {
102 LOG(ERROR
) << "Device not visible. Cannot push record.";
103 error_callback
.Run(nfc_error::kDoesNotExist
, "No such device.");
109 void FakeNfcDeviceClient::BeginPairingSimulation(int visibility_delay
,
110 int record_push_delay
) {
111 if (pairing_started_
) {
112 VLOG(1) << "Simulation already started.";
115 DCHECK(!device_visible_
);
116 DCHECK(visibility_delay
>= 0);
118 pairing_started_
= true;
120 base::MessageLoop::current()->PostDelayedTask(
122 base::Bind(&FakeNfcDeviceClient::MakeDeviceVisible
,
123 base::Unretained(this),
125 base::TimeDelta::FromMilliseconds(visibility_delay
));
128 void FakeNfcDeviceClient::EndPairingSimulation() {
129 if (!pairing_started_
) {
130 VLOG(1) << "No simulation started.";
133 if (device_visible_
) {
134 // Remove records, if they were added.
135 if (!properties_
->records
.value().empty()) {
136 FakeNfcRecordClient
* record_client
=
137 static_cast<FakeNfcRecordClient
*>(
138 DBusThreadManager::Get()->GetNfcRecordClient());
139 record_client
->SetDeviceRecordsVisible(false);
141 // Remove the device.
142 FOR_EACH_OBSERVER(Observer
, observers_
,
143 DeviceRemoved(dbus::ObjectPath(kDevicePath
)));
144 FakeNfcAdapterClient
* adapter_client
=
145 static_cast<FakeNfcAdapterClient
*>(
146 DBusThreadManager::Get()->GetNfcAdapterClient());
147 adapter_client
->UnsetDevice(dbus::ObjectPath(kDevicePath
));
148 device_visible_
= false;
150 pairing_started_
= false;
153 void FakeNfcDeviceClient::EnableSimulationTimeout(int simulation_timeout
) {
154 simulation_timeout_
= simulation_timeout
;
157 void FakeNfcDeviceClient::DisableSimulationTimeout() {
158 simulation_timeout_
= -1;
161 void FakeNfcDeviceClient::SetRecords(
162 const std::vector
<dbus::ObjectPath
>& record_paths
) {
163 if (!device_visible_
) {
164 VLOG(1) << "Device not visible.";
167 properties_
->records
.ReplaceValue(record_paths
);
170 void FakeNfcDeviceClient::ClearRecords() {
171 ObjectPathVector records
;
175 void FakeNfcDeviceClient::OnPropertyChanged(
176 const dbus::ObjectPath
& object_path
,
177 const std::string
& property_name
) {
178 FOR_EACH_OBSERVER(NfcDeviceClient::Observer
, observers_
,
179 DevicePropertyChanged(object_path
, property_name
));
182 void FakeNfcDeviceClient::MakeDeviceVisible(int record_push_delay
) {
183 if (!pairing_started_
) {
184 VLOG(1) << "Device pairing was cancelled.";
187 device_visible_
= true;
189 FakeNfcAdapterClient
* adapter_client
=
190 static_cast<FakeNfcAdapterClient
*>(
191 DBusThreadManager::Get()->GetNfcAdapterClient());
192 adapter_client
->SetDevice(dbus::ObjectPath(kDevicePath
));
193 FOR_EACH_OBSERVER(Observer
, observers_
,
194 DeviceAdded(dbus::ObjectPath(kDevicePath
)));
196 if (record_push_delay
< 0) {
197 // Don't simulate record push. Instead, skip directly to the timeout step.
198 if (simulation_timeout_
>= 0) {
199 base::MessageLoop::current()->PostDelayedTask(
201 base::Bind(&FakeNfcDeviceClient::HandleSimulationTimeout
,
202 base::Unretained(this)),
203 base::TimeDelta::FromMilliseconds(simulation_timeout_
));
208 base::MessageLoop::current()->PostDelayedTask(
210 base::Bind(&FakeNfcDeviceClient::MakeRecordsVisible
,
211 base::Unretained(this)),
212 base::TimeDelta::FromMilliseconds(record_push_delay
));
215 void FakeNfcDeviceClient::MakeRecordsVisible() {
216 if (!pairing_started_
) {
217 VLOG(1) << "Pairing was cancelled";
220 DCHECK(device_visible_
);
221 FakeNfcRecordClient
* record_client
=
222 static_cast<FakeNfcRecordClient
*>(
223 DBusThreadManager::Get()->GetNfcRecordClient());
224 record_client
->SetDeviceRecordsVisible(true);
226 if (simulation_timeout_
< 0)
229 base::MessageLoop::current()->PostDelayedTask(
231 base::Bind(&FakeNfcDeviceClient::HandleSimulationTimeout
,
232 base::Unretained(this)),
233 base::TimeDelta::FromMilliseconds(simulation_timeout_
));
236 void FakeNfcDeviceClient::HandleSimulationTimeout() {
237 if (simulation_timeout_
< 0) {
238 VLOG(1) << "Simulation timeout was cancelled. Nothing to do.";
241 EndPairingSimulation();
244 } // namespace chromeos