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_record_client.h"
7 #include "base/logging.h"
8 #include "chromeos/dbus/dbus_thread_manager.h"
9 #include "chromeos/dbus/fake_nfc_device_client.h"
10 #include "chromeos/dbus/fake_nfc_tag_client.h"
11 #include "third_party/cros_system_api/dbus/service_constants.h"
17 // Gets and returns the value for |key| in |dictionary| as a string. If |key| is
18 // not found, returns an empty string.
19 std::string
GetStringValue(const base::DictionaryValue
& dictionary
,
20 const std::string
& key
) {
22 bool result
= dictionary
.GetString(key
, &value
);
24 // Simply return |value|. |value| will remain untouched if
25 // base::DictionaryValue::GetString returns false.
26 DCHECK(result
|| value
.empty());
30 // Gets and returns the value for |key| in |dictionary| as a double. If |key| is
31 // not found, returns 0.
32 double GetDoubleValue(const base::DictionaryValue
& dictionary
,
33 const std::string
& key
) {
35 bool result
= dictionary
.GetDouble(key
, &value
);
37 // Simply return |value|. |value| will remain untouched if
38 // base::DictionaryValue::GetString returns false.
39 DCHECK(result
|| !value
);
45 const char FakeNfcRecordClient::kDeviceSmartPosterRecordPath
[] =
46 "/fake/device/record0";
47 const char FakeNfcRecordClient::kDeviceTextRecordPath
[] =
48 "/fake/device/record1";
49 const char FakeNfcRecordClient::kDeviceUriRecordPath
[] = "/fake/device/record2";
50 const char FakeNfcRecordClient::kTagRecordPath
[] = "/fake/tag/record0";
52 FakeNfcRecordClient::Properties::Properties(
53 const PropertyChangedCallback
& callback
)
54 : NfcRecordClient::Properties(NULL
, callback
) {
57 FakeNfcRecordClient::Properties::~Properties() {
60 void FakeNfcRecordClient::Properties::Get(
61 dbus::PropertyBase
* property
,
62 dbus::PropertySet::GetCallback callback
) {
63 VLOG(1) << "Get " << property
->name();
67 void FakeNfcRecordClient::Properties::GetAll() {
69 if (!on_get_all_callback().is_null())
70 on_get_all_callback().Run();
73 void FakeNfcRecordClient::Properties::Set(
74 dbus::PropertyBase
* property
,
75 dbus::PropertySet::SetCallback callback
) {
76 VLOG(1) << "Set " << property
->name();
80 FakeNfcRecordClient::FakeNfcRecordClient()
81 : device_records_visible_(false),
82 tag_records_visible_(false) {
83 VLOG(1) << "Creating FakeNfcRecordClient";
85 device_smart_poster_record_properties_
.reset(new Properties(
86 base::Bind(&FakeNfcRecordClient::OnPropertyChanged
,
87 base::Unretained(this),
88 dbus::ObjectPath(kDeviceSmartPosterRecordPath
))));
89 device_smart_poster_record_properties_
->SetAllPropertiesReceivedCallback(
90 base::Bind(&FakeNfcRecordClient::OnPropertiesReceived
,
91 base::Unretained(this),
92 dbus::ObjectPath(kDeviceSmartPosterRecordPath
)));
94 device_text_record_properties_
.reset(new Properties(
95 base::Bind(&FakeNfcRecordClient::OnPropertyChanged
,
96 base::Unretained(this),
97 dbus::ObjectPath(kDeviceTextRecordPath
))));
98 device_text_record_properties_
->SetAllPropertiesReceivedCallback(
99 base::Bind(&FakeNfcRecordClient::OnPropertiesReceived
,
100 base::Unretained(this),
101 dbus::ObjectPath(kDeviceTextRecordPath
)));
103 device_uri_record_properties_
.reset(new Properties(
104 base::Bind(&FakeNfcRecordClient::OnPropertyChanged
,
105 base::Unretained(this),
106 dbus::ObjectPath(kDeviceUriRecordPath
))));
107 device_uri_record_properties_
->SetAllPropertiesReceivedCallback(
108 base::Bind(&FakeNfcRecordClient::OnPropertiesReceived
,
109 base::Unretained(this),
110 dbus::ObjectPath(kDeviceUriRecordPath
)));
112 tag_record_properties_
.reset(new Properties(
113 base::Bind(&FakeNfcRecordClient::OnPropertyChanged
,
114 base::Unretained(this),
115 dbus::ObjectPath(kTagRecordPath
))));
118 FakeNfcRecordClient::~FakeNfcRecordClient() {
121 void FakeNfcRecordClient::Init(dbus::Bus
* bus
) {
124 void FakeNfcRecordClient::AddObserver(Observer
* observer
) {
125 observers_
.AddObserver(observer
);
128 void FakeNfcRecordClient::RemoveObserver(Observer
* observer
) {
129 observers_
.RemoveObserver(observer
);
132 std::vector
<dbus::ObjectPath
> FakeNfcRecordClient::GetRecordsForDevice(
133 const dbus::ObjectPath
& device_path
) {
134 std::vector
<dbus::ObjectPath
> record_paths
;
135 if (device_records_visible_
&&
136 device_path
== dbus::ObjectPath(FakeNfcDeviceClient::kDevicePath
)) {
137 record_paths
.push_back(dbus::ObjectPath(kDeviceSmartPosterRecordPath
));
138 record_paths
.push_back(dbus::ObjectPath(kDeviceTextRecordPath
));
139 record_paths
.push_back(dbus::ObjectPath(kDeviceUriRecordPath
));
144 std::vector
<dbus::ObjectPath
> FakeNfcRecordClient::GetRecordsForTag(
145 const dbus::ObjectPath
& tag_path
) {
146 std::vector
<dbus::ObjectPath
> record_paths
;
147 if (tag_records_visible_
&& tag_path
.value() == FakeNfcTagClient::kTagPath
)
148 record_paths
.push_back(dbus::ObjectPath(kTagRecordPath
));
152 FakeNfcRecordClient::Properties
*
153 FakeNfcRecordClient::GetProperties(const dbus::ObjectPath
& object_path
) {
154 if (device_records_visible_
) {
155 if (object_path
.value() == kDeviceSmartPosterRecordPath
)
156 return device_smart_poster_record_properties_
.get();
157 if (object_path
.value() == kDeviceTextRecordPath
)
158 return device_text_record_properties_
.get();
159 if (object_path
.value() == kDeviceUriRecordPath
)
160 return device_uri_record_properties_
.get();
163 if (tag_records_visible_
&& object_path
.value() == kTagRecordPath
)
164 return tag_record_properties_
.get();
168 void FakeNfcRecordClient::SetDeviceRecordsVisible(bool visible
) {
169 if (device_records_visible_
== visible
) {
170 VLOG(1) << "Record visibility is already: " << visible
;
173 FakeNfcDeviceClient
* device_client
= static_cast<FakeNfcDeviceClient
*>(
174 DBusThreadManager::Get()->GetNfcDeviceClient());
175 if (!device_client
->device_visible()) {
176 VLOG(1) << "Cannot set records when device is not visible.";
180 device_client
->ClearRecords();
182 NfcRecordClient::Observer
, observers_
,
183 RecordRemoved(dbus::ObjectPath(kDeviceSmartPosterRecordPath
)));
184 FOR_EACH_OBSERVER(NfcRecordClient::Observer
, observers_
,
185 RecordRemoved(dbus::ObjectPath(kDeviceTextRecordPath
)));
186 FOR_EACH_OBSERVER(NfcRecordClient::Observer
, observers_
,
187 RecordRemoved(dbus::ObjectPath(kDeviceUriRecordPath
)));
188 device_records_visible_
= visible
;
191 device_records_visible_
= visible
;
192 std::vector
<dbus::ObjectPath
> record_paths
=
194 dbus::ObjectPath(FakeNfcDeviceClient::kDevicePath
));
195 device_client
->SetRecords(record_paths
);
197 // Reassign each property and send signals.
199 NfcRecordClient::Observer
, observers_
,
200 RecordAdded(dbus::ObjectPath(kDeviceSmartPosterRecordPath
)));
201 device_smart_poster_record_properties_
->type
.ReplaceValue(
202 nfc_record::kTypeSmartPoster
);
203 device_smart_poster_record_properties_
->uri
.ReplaceValue(
204 "http://fake.uri0.fake");
205 device_smart_poster_record_properties_
->mime_type
.ReplaceValue("text/fake");
206 device_smart_poster_record_properties_
->size
.ReplaceValue(128);
207 device_smart_poster_record_properties_
->
208 representation
.ReplaceValue("Fake Title");
209 device_smart_poster_record_properties_
->encoding
.ReplaceValue(
210 nfc_record::kEncodingUtf16
);
211 device_smart_poster_record_properties_
->language
.ReplaceValue("en");
212 OnPropertiesReceived(dbus::ObjectPath(kDeviceSmartPosterRecordPath
));
214 FOR_EACH_OBSERVER(NfcRecordClient::Observer
, observers_
,
215 RecordAdded(dbus::ObjectPath(kDeviceTextRecordPath
)));
216 device_text_record_properties_
->type
.ReplaceValue(nfc_record::kTypeText
);
217 device_text_record_properties_
->representation
.ReplaceValue(
218 "Kablosuz \xC4\xb0leti\xC5\x9fim");
219 device_text_record_properties_
->encoding
.ReplaceValue(
220 nfc_record::kEncodingUtf8
);
221 device_text_record_properties_
->language
.ReplaceValue("tr");
222 OnPropertiesReceived(dbus::ObjectPath(kDeviceTextRecordPath
));
224 FOR_EACH_OBSERVER(NfcRecordClient::Observer
, observers_
,
225 RecordAdded(dbus::ObjectPath(kDeviceUriRecordPath
)));
226 device_uri_record_properties_
->type
.ReplaceValue(nfc_record::kTypeUri
);
227 device_uri_record_properties_
->uri
.ReplaceValue("file://some/fake/path");
228 device_uri_record_properties_
->mime_type
.ReplaceValue("text/fake");
229 device_uri_record_properties_
->size
.ReplaceValue(512);
230 OnPropertiesReceived(dbus::ObjectPath(kDeviceUriRecordPath
));
233 void FakeNfcRecordClient::SetTagRecordsVisible(bool visible
) {
234 if (tag_records_visible_
== visible
) {
235 VLOG(1) << "Record visibility is already: " << visible
;
238 FakeNfcTagClient
* tag_client
= static_cast<FakeNfcTagClient
*>(
239 DBusThreadManager::Get()->GetNfcTagClient());
240 if (!tag_client
->tag_visible()) {
241 VLOG(1) << "Cannot set records when tag is not visible.";
245 tag_client
->ClearRecords();
246 FOR_EACH_OBSERVER(NfcRecordClient::Observer
, observers_
,
247 RecordRemoved(dbus::ObjectPath(kTagRecordPath
)));
248 tag_records_visible_
= visible
;
251 tag_records_visible_
= visible
;
252 std::vector
<dbus::ObjectPath
> record_paths
=
253 GetRecordsForTag(dbus::ObjectPath(FakeNfcTagClient::kTagPath
));
254 tag_client
->SetRecords(record_paths
);
256 // Reassign each property to its current value to trigger a property change
258 FOR_EACH_OBSERVER(NfcRecordClient::Observer
, observers_
,
259 RecordAdded(dbus::ObjectPath(kTagRecordPath
)));
260 tag_record_properties_
->type
.ReplaceValue(
261 tag_record_properties_
->type
.value());
262 tag_record_properties_
->representation
.ReplaceValue(
263 tag_record_properties_
->representation
.value());
264 tag_record_properties_
->encoding
.ReplaceValue(
265 tag_record_properties_
->encoding
.value());
266 tag_record_properties_
->language
.ReplaceValue(
267 tag_record_properties_
->language
.value());
268 tag_record_properties_
->uri
.ReplaceValue(
269 tag_record_properties_
->uri
.value());
270 tag_record_properties_
->mime_type
.ReplaceValue(
271 tag_record_properties_
->mime_type
.value());
272 tag_record_properties_
->size
.ReplaceValue(
273 tag_record_properties_
->size
.value());
274 tag_record_properties_
->action
.ReplaceValue(
275 tag_record_properties_
->action
.value());
276 OnPropertiesReceived(dbus::ObjectPath(kTagRecordPath
));
279 bool FakeNfcRecordClient::WriteTagRecord(
280 const base::DictionaryValue
& attributes
) {
281 if (attributes
.empty())
284 tag_record_properties_
->type
.ReplaceValue(
285 GetStringValue(attributes
, nfc_record::kTypeProperty
));
286 tag_record_properties_
->encoding
.ReplaceValue(
287 GetStringValue(attributes
, nfc_record::kEncodingProperty
));
288 tag_record_properties_
->language
.ReplaceValue(
289 GetStringValue(attributes
, nfc_record::kLanguageProperty
));
290 tag_record_properties_
->representation
.ReplaceValue(
291 GetStringValue(attributes
, nfc_record::kRepresentationProperty
));
292 tag_record_properties_
->uri
.ReplaceValue(
293 GetStringValue(attributes
, nfc_record::kUriProperty
));
294 tag_record_properties_
->mime_type
.ReplaceValue(
295 GetStringValue(attributes
, nfc_record::kMimeTypeProperty
));
296 tag_record_properties_
->action
.ReplaceValue(
297 GetStringValue(attributes
, nfc_record::kActionProperty
));
298 tag_record_properties_
->size
.ReplaceValue(static_cast<uint32
>(
299 GetDoubleValue(attributes
, nfc_record::kSizeProperty
)));
301 SetTagRecordsVisible(false);
302 SetTagRecordsVisible(true);
307 void FakeNfcRecordClient::OnPropertyChanged(
308 const dbus::ObjectPath
& object_path
,
309 const std::string
& property_name
) {
310 FOR_EACH_OBSERVER(NfcRecordClient::Observer
, observers_
,
311 RecordPropertyChanged(object_path
, property_name
));
314 void FakeNfcRecordClient::OnPropertiesReceived(
315 const dbus::ObjectPath
& object_path
) {
316 FOR_EACH_OBSERVER(NfcRecordClient::Observer
, observers_
,
317 RecordPropertiesReceived(object_path
));
320 } // namespace chromeos