11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file.
41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chromeos/dbus/nfc_property_set.h"
61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/bind.h"
81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace chromeos {
111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)NfcPropertySet::NfcPropertySet(dbus::ObjectProxy* object_proxy,
131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                               const std::string& interface,
141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                               const PropertyChangedCallback& callback)
151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    : dbus::PropertySet(object_proxy, interface, callback) {
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)NfcPropertySet::~NfcPropertySet() {
19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void NfcPropertySet::ConnectSignals() {
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  object_proxy()->ConnectToSignal(
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      interface(),
241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      nfc_common::kPropertyChangedSignal,
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      base::Bind(&dbus::PropertySet::ChangedReceived, GetWeakPtr()),
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      base::Bind(&dbus::PropertySet::ChangedConnected, GetWeakPtr()));
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void NfcPropertySet::SetAllPropertiesReceivedCallback(
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::Closure& callback) {
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  on_get_all_callback_ = callback;
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void NfcPropertySet::Get(dbus::PropertyBase* property,
351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                         GetCallback callback) {
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  NOTREACHED() << "neard does not implement Get for properties.";
371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void NfcPropertySet::GetAll() {
401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  dbus::MethodCall method_call(
411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      interface(), nfc_common::kGetProperties);
421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  object_proxy()->CallMethod(&method_call,
431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                           dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                           base::Bind(&dbus::PropertySet::OnGetAll,
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                      GetWeakPtr()));
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void NfcPropertySet::OnGetAll(dbus::Response* response) {
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // First invoke the superclass implementation. If the call to GetAll was
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // successful, this will invoke the PropertyChangedCallback passed to the
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // constructor for each individual property received through the call and
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // make sure that the values of the properties have been cached. This way,
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // all received properties will be available when |on_get_all_callback_| is
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // run.
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  dbus::PropertySet::OnGetAll(response);
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (response) {
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    VLOG(2) << "NfcPropertySet::GetAll returned successfully.";
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (!on_get_all_callback_.is_null())
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      on_get_all_callback_.Run();
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void NfcPropertySet::Set(dbus::PropertyBase* property,
641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                         SetCallback callback) {
651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  dbus::MethodCall method_call(
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      interface(), nfc_common::kSetProperty);
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  dbus::MessageWriter writer(&method_call);
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  writer.AppendString(property->name());
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  property->AppendSetValueToWriter(&writer);
701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  object_proxy()->CallMethod(&method_call,
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                           dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                           base::Bind(&dbus::PropertySet::OnSet,
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                      GetWeakPtr(),
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                      property,
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                      callback));
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void NfcPropertySet::ChangedReceived(dbus::Signal* signal) {
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DCHECK(signal);
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  dbus::MessageReader reader(signal);
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  UpdatePropertyFromReader(&reader);
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace chromeos
85